{"name":"com.collhub/collhub","slug":"collhub","title":"CollHub","description":"Documents, projects, comments, workflows and data sources of your CollHub instance, as tools.","url":"https://mcp.market/server/collhub","rating":null,"grade":"C","score":68,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":3,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":null,"website":"https://collhub.com","version":"1.0.0","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@collhub/mcp","version":"1.0.0","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"The URL of your CollHub instance. Sign-in happens in your browser; no password is configured.","isRequired":true,"format":"string","value":"https://{tenant}.collhub.com","variables":{"tenant":{"description":"The subdomain of your CollHub instance, for example dgpa.","isRequired":true,"format":"string"}},"name":"COLLHUB_URL"}]}],"tools":[{"name":"add_bookmark","description":"Bookmark a document or a section for the user (their private pointer \\u2014 visible in their bookmarks panel). Pass document_id for a whole-document bookmark, or section_id (durable id from get_document_toc or a passage's #s uri) for one section \\u2014 section bookmarks keep resolving after the document is edited. Bookmarking the same target twice errors.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_comment","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"apply_project","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_collection","description":"Create a new collection. Collections group related documents with custom metadata schemas. Set is_hierarchical=true when the user asks for a \"hierarchical collection\" or \"collection with folders\".","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_data_source","description":"Create a new data source from JSON data. Columns and types are auto-inferred from the data. An \"id\" column (uuid, auto-generated) is added automatically. Use this to store structured data for data binding in documents (charts, tables, templates).","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_document","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_folder","description":"Create a folder inside a hierarchical collection. The collection must have is_hierarchical=true. Use parent_id to nest folders within other folders, or omit to create at the root level.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_label","description":"Create a label. A dot path creates missing parents as unassignable (\"legal.civile\"); returns the labels created; errors if the leaf exists (list_labels first). Write a meaningful `description`: it is embedded and used at ingestion to auto-extract the label. EXCLUSIVE AXIS: every attribute lands on the LEAF, never on an auto-created parent \\u2014 for mutually exclusive children (kind.*), create the","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_project","description":"Create a project in a hierarchical collection, scaffolded from a template, in one call. Its own markdown is the BRIEF: unless scaffold=false the template's skeleton \\u2014 patched with the summary/objective/context/scope/success_criteria seeds \\u2014 becomes the content, and the anchor documents (AGENTS.md, REFERENCES.md) are seeded as published children; references fills REFERENCES.md and links e","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_relationship","description":"Create a typed relationship from document_id to dst_document_id (type_id from list_relationship_types; for the inverse direction swap the endpoints). NOT for a plain reference a body link already derives \\u2014 see the guide's \"Relationships and cross-references\"; reserve it for the semantic types a link cannot encode (implementation, derivation, addressing, \\u2026), created even when a link sits ","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_comment","description":"Delete a comment from a document.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_records","description":"Delete records from a data source matching the given filters.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_relationship","description":"Delete a relationship from a document.","write_action":true,"price_micros":0,"input_schema":null},{"name":"diff_versions","description":"Compare two versions of a document and return a unified diff. Use get_document_history to discover available version numbers. Omit from_version to diff against an empty document (i.e. see everything added in to_version).","write_action":false,"price_micros":0,"input_schema":null},{"name":"edit_document","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"find","description":"BM25 keyword search in one collection \\u2014 exact terms, ranked by lexical relevance (search_documents for semantic queries). The top results carry their best passages with content and enclosing-section context (breadcrumb, span, durable uri); every result reports `matches`, its total matching passages. Passage ranges are half-open code points; passage_source says which extraction the evidence co","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_similar","description":"Documents in the same collection that resemble a given one, most similar first \\u2014 takes a document instead of a query, so it reaches near-duplicates, earlier/later versions and same-subject neighbours in other words, which keyword search cannot. The tail is autocut where similarity drops, generously on a single-subject corpus: treat the ORDER as the signal, not list membership. Scores are not ","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_collection","description":"Get full details of a collection including permissions and configuration. Its `instructions`, when set, say how documents there are written and handled: follow them for every document of the collection.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_document_history","description":"Get the version history of a document.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_document_info","description":"Get metadata for a document, or for MANY in one call (document_ids, max 200 \\u2014 one list read, every id answered in the order asked; a missing or unreadable one is an {error} entry, so an absence never needs a second call). Returns label_ids (the raw label id array); use include to request extra fields \\u2014 status_object (the current workflow step) is null unless included. The batch form serv","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_document_passages","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_document_toc","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_project_brief","description":"First project intake: the visible markdown brief plus document counters, to size the get_project_graph read. Counts cover every readable document in non-deleted branches (root, containers, hidden anchors, archived, unclassified); Tasks and Trackers are counted separately, by_kind/by_type include both. Returns source/version, truncation and next_offset (code points); possibly_depth_limited means co","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_project_graph","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_workflow","description":"Get the full definition of a workflow: all steps (states), transitions (directed edges between steps) and accepted_types \\u2014 the document types it applies to, as [{type_id, type_name}]. Use to understand the complete lifecycle graph before transitioning a document.","write_action":false,"price_micros":0,"input_schema":null},{"name":"insert_records","description":"Insert one or more records into an existing data source.","write_action":true,"price_micros":0,"input_schema":null},{"name":"list_bookmarks","description":"The user's private bookmarks on documents and sections. Section bookmarks carry a durable target_uri (collhub://documents/{id}#s{section_id}); section_gone: true = the section was edited away, inaccessible: true = the target is no longer readable.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_collections","description":"List available collections. Use this first to discover collection IDs before searching or browsing documents.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_comments","description":"List comments on one document, or on MANY in one call (document_ids, max 200 \\u2014 every id is answered, so an empty list is a fact; get_project_graph comment_counts says which nodes have any). Filter by source and resolved. Comments routinely correct the document they sit on: read them before acting on a body. Two system-maintained stamps per comment: section_id (the enclosing section) and locat","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_data_sources","description":"List available data sources. Returns source names and schemas.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_document_types","description":"List available document types that can be created \\u2014 the complete list, never a page. Call this before create_document to discover valid types. A type's `instructions` (own or inherited from its parent type) say how its documents are written \\u2014 what the body must and must not contain: FOLLOW them when you create or edit a document of that type.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_eligible_workflows","description":"List the workflows that can be applied to a document, based on its document type. Returns each workflow with its steps. To put the document into a workflow, call set_document_status with the id of that workflow's is_initial step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_folder","description":"List the contents of a folder or project, folders and projects first (an is_folder item can be listed further by its id). For navigating INSIDE a hierarchical collection \\u2014 a flat collection, or a hierarchical collection's top level, is listed with search_documents(collection_id). depth: 1 (default) immediate children, N levels, 0 the entire subtree; when depth != 1 each item carries parent_id","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_instances","description":"List the configured CollHub instances. Pass an instance name as the `instance` argument of any tool to target it; omit it to use the default. There is no persistent \"current instance\" \\u2014 routing is per call, so parallel sessions never interfere.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_labels","description":"List labels \\u2014 the complete list, never a page \\u2014 to find ids for update_labels or check existence before create_label. Empty fields are left out; the document_deny_* ACL lists only with include_deny.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_metadata_fields","description":"Metadata fields and their types. Without type_id: the collection-level fields (the filter fields for search_documents). With type_id: the EFFECTIVE schema of that document type in the collection \\u2014 collection fields merged with the type's own (a Task's assignee, due_date, priority, estimate). When WRITING metadata use each field's `metadata_key`, NOT its display name: type-scoped fields are pr","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_next_steps","description":"The valid transitions from a document's current workflow step \\u2014 one hop, each with the step it leads to; pass a returned step_id to set_document_status. Empty when the document is in no workflow or on a terminal step. For the whole lifecycle graph call get_workflow; to reach a step several hops away give set_document_status the destination \\u2014 it resolves the route.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_node_kinds","description":"The project ontology: the kinds apply_project accepts (group, description, lifecycle policy), the configured methodologies with their guidance, and contexts. SVG icons only with include_icons.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_principals","description":"Users and groups \\u2014 the directory behind principal-typed fields such as a Task's `assignee`, which accept a name on write but store a numeric id. `query` (case-insensitive substring of username, first/last name, email or group name) turns \"luca\" into the id; `ids` labels ids read back from a document. One id space for both. Only users, teams and dynamic teams can hold an assignment. Capped per","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_project_templates","description":"The project templates create_project can scaffold from \\u2014 each a brief skeleton + anchor documents, stamping its like-named methodology on the project.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_projects","description":"List projects across all collections (most recently modified first). A project is a special folder that anchors AI project workflows. Take one in with get_project_brief (brief + counts, sizes the graph read) then get_project_graph; list_folder walks its file tree, set_document_status advances its workflow.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_relationship_types","description":"List available relationship types \\u2014 the complete list, never a page. Call this before create_relationship to discover valid types and their directional labels.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_relationships","description":"A document's relationships, outgoing and incoming, with the related document and the directional label. Link-derived edges carry origin \"xref\" (no origin = made by hand) and SECTION granularity: from_section (the section holding the link) and to_section (the one addressed), each {id, document_id, heading, uri} \\u2014 `gone` when the body still cites a removed section, `unknown` when its tree was u","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_thread_messages","description":"Messages in a thread, chronological: role, content, attachments, tool calls. Paged \\u2014 the result is {thread_id, messages, next}, and `next` is the call for the following page whenever one exists (null when the thread ends here); limit 0 returns the whole thread in one call. Never treat a full page as the end of the thread.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_threads","description":"List AI chat threads. Returns id, name, type, status, and timestamps.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_workflows","description":"List all workflow definitions with their steps \\u2014 the complete list, never a page; enough to find a workflow's is_initial step. get_workflow gives the transitions, list_eligible_workflows the workflows applicable to a document.","write_action":false,"price_micros":0,"input_schema":null},{"name":"locate_regex","description":"Regex matches in a document's markdown: from/to (code points), a snippet per match, and content_revision. TO REPLACE A MATCH pass its from/to plus content_revision (as expect_revision) to edit_document with old_text OMITTED \\u2014 nothing re-typed, a stale range rejected. For targets inside prose, ::: blocks, table cells; for section-level targets get_document_toc already has the heading text and ","write_action":false,"price_micros":0,"input_schema":null},{"name":"login","description":"Log in to the instance in the browser \\u2014 only when the user asks. Plain: resumes the stored session, opens a browser only when there is none. `switch_user`: opens the browser on the login form (signing the browser out first), so a different account can be entered even when the browser is already signed in; the previous session ends once the new login has landed, so a switch that fails leaves t","write_action":false,"price_micros":0,"input_schema":null},{"name":"logout","description":"Sign out of the instance \\u2014 only when the user asks. Ends this host's session on the backend and forgets it here; the user's other sessions and the app stay signed in. The next call to that instance opens a browser login.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mark_headings","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"move_document","description":"Move a document to another folder, project or collection: parent_id for a container (folder or project root \\u2014 the document lands inside it), collection_id alone for that collection's root, both for a folder elsewhere. Content, versions, comments, labels, workflow status and relationships travel with it; edges to nodes left behind become cross-project links (visible via list_relationships, in ","write_action":false,"price_micros":0,"input_schema":null},{"name":"query_data_source","description":"Query rows from a data source. Supports PostgREST-style filters, column selection, ordering, and limits.","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_document","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_documents","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_stream","description":"Read a named stream from a document as text. System streams are \"draft\" (Markdown), \"data\" (JSON), \"style\" (CSS: the theme binding and the document's own rules) and \"theme\" (CSS: the private slot overlay); an application stream carries a typed extension (props.json, notes.md). A stream whose type is not textual errors instead of dumping bytes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remove_bookmark","description":"Remove one of the user's bookmarks (id from list_bookmarks).","write_action":true,"price_micros":0,"input_schema":null},{"name":"rename_document","description":"Rename a document by changing its `name` field. File-named documents keep their extension (\"Report Q3.pdf\"); typed documents keep plain titles (see the guide's \"Creating documents\"). Does not change collection, content, or version. To move across collections or folders, use move_document.","write_action":false,"price_micros":0,"input_schema":null},{"name":"renumber_document","description":"Re-sequence a document's already-numbered headings with Word-style multilevel numbers (1, 1.1, 1.1.1) from nesting + position, and remap the inline \\xA7refs using the same scheme so they stop drifting. By default only headings ALREADY carrying a number are re-sequenced \\u2014 the title and preamble headings (\"## Related\") stay clean. Do NOT use it to ADD numbers to a clean document: numbering is m","write_action":false,"price_micros":0,"input_schema":null},{"name":"replace_in_document","description":"Bulk regex find/replace across a document \\u2014 the sed/awk-style tool. Each rule: `pattern` (JS regex) + `replacement` with $1/$<name> captures and COMPUTED `…` values, where a capture resolves to its NUMERIC value (pattern \"\\xA7(?<n>\\\\d+)\" + replacement \"\\xA7…\" shifts every section number by 3 in ONE rule); an optional `where` guard (boolean, same language) skips matches. Rules apply in one cas","write_action":false,"price_micros":0,"input_schema":null},{"name":"resolve_comment","description":"Toggle the resolved status of a comment.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_documents","description":"Hybrid semantic + full-text search in one collection; collection_id=0 lists/filters across ALL collections (system fields only, no query). Structured filters need field names from list_metadata_fields; cursor pages. Each query hit reports WHERE it matched: by default the distinct sections holding its matches (breadcrumb + durable #s{id}, usable as read_document section_id) plus a matches count; de","write_action":false,"price_micros":0,"input_schema":null},{"name":"send_message","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"set_document_status","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"unlock_document","description":"Unlock a document after editing. Call this when done writing to release the lock. Unlocking PUBLISHES: it mints the new version and re-extracts the section tree, so a stale TOC (spans_fresh: false) is refreshed by this call \\u2014 there is no other refresh.","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_label","description":"Patch a label: rename, recolour, rewrite the description, or change its behaviour \\u2014 the only way to repair a label after creation (create_label errors on an existing path and puts every attribute on the leaf, so an auto-created parent is fixed only here: e.g. max_child_card:1 to make an existing group exclusive). `name` renames IN PLACE, descendants included \\u2014 the path is rebuilt, so any","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_labels","description":"Add or remove labels on a document. Use list_labels to discover available label IDs. Use get_document_info with include=[\"labels\"] to see current labels.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_metadata","description":"Set metadata field values on a document \\u2014 collection fields plus the document type's own (a Task's assignee, due_date, priority; list_metadata_fields with the type_id shows them). Keys are each field's metadata_key; bare type-field names are auto-prefixed to `type:`. Partial merge: only the given fields change; null removes one.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_records","description":"Update records in a data source matching the given filters.","write_action":true,"price_micros":0,"input_schema":null},{"name":"upload_document","description":"Upload a local file as a new document. Reads the file as binary, auto-detects the document type from the file extension (include it in the name), creates the document, writes content, commits, and unlocks in one step. Use this for importing files (markdown, PDF, images, etc.) into a collection.","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoami","description":"Who the server is logged in as on the instance: `user` (email, name) first, then the session (the host profile it belongs to) and the account (id, privileges, memberships). Answer a \"who am I logged in as\" question with the email.","write_action":false,"price_micros":0,"input_schema":null},{"name":"write_document","description":"Write markdown to an existing document: the whole content, or from a code-point position onward \\u2014 `from` REPLACES everything from that position to the end (to append, pass the document's length). Locks if needed, commits, leaves the document locked. Generated PDF types write to the draft stream. For a change inside existing content prefer edit_document. Every mention of another document in th","write_action":true,"price_micros":0,"input_schema":null},{"name":"write_stream","description":"","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":68,"grade":"C","scanned_at":"2026-09-21T13:01:59.712Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-21T13:01:59.674Z","components":{"code":{"score":25,"max":25,"notes":["2 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":4,"max":10,"notes":["verified namespace with website, no repo"]}},"findings":[{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"packages":[{"registryType":"npm","identifier":"@collhub/mcp","version":"1.0.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-09-21T10:29:41.709Z"}],"repo":{"found":false},"icon":{"url":"https://collhub.com/static/favicon.svg","source":"site"},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":"MIT","lastPushAt":null,"score":3}}}},"grade_history":[],"reviews":[]}