@archbee/mcp
v2.3.0
Published
A Model Context Protocol (MCP) server for the [Archbee API](https://docs.archbee.com/get-document). It lets an LLM client read, search, create, update and delete the documentation in your Archbee space.
Readme
Archbee MCP Server
A Model Context Protocol (MCP) server for the Archbee API. It lets an LLM client read, search, create, update and delete the documentation in your Archbee space.
With a space API key every tool acts on that one space, and docSpaceId never has to be passed in. With a team key (abteam_…) the assistant reaches every space in the team, and the space-level tools take a docSpaceId argument per call.
Tools
Read:
get_doc- Gets content of a document
- Input:
docId(string): Archbee document id
- Returns: content as markdown
get_all_docs- Gets content of all documents in the space
- Returns: documents, as
DocResponse[]
search_query- Searches docs by content; an empty query returns all docs
- Input:
query(string): text to look for inside documents
- Returns: documents containing the query, as
DocResponse[]
search_title- Searches docs by title
- Input:
query(string): text to look for in titles
- Returns: documents with a matching title, as
DocResponse[]
Write — these need an API key, space or team (the configurations below):
create_doc- Creates a document from Markdown or MDX content
- Input:
content(string): body as Markdown or MDX textformat(markdown|mdx, optional): usemdxfor JSX-style components such as<hint>or<Tabs>; directive-style (:::hint{type="info"}) works in both. Defaults tomarkdown- also optional:
title,parentDocId,slug,description,previewImgURL,hidden,icon
update_doc- Updates a document; only the fields you send are changed
- Input:
docId(string): document to update- optional:
content,format,title,parentDocId,slug,description,previewImgURL,hidden,icon
delete_doc- Permanently deletes a document, its uploaded files and images. Cannot be undone
- Input:
docId(string): document to deleterecursive(boolean, optional): required to delete a document that has nested children, which deletes them too
create_doc_space- Creates a doc space in the team
- Input:
name(string): name of the new space- optional:
isReviewSystemEnabled,isBranchingSystemEnabled,docSpaceGroupId,icon
update_doc_space- Updates settings of the configured space; only the parts you send are changed
- Input, all optional:
name(string): renames the spaceicon(string): left-nav iconhostnamePart({ hostname, hostnamePath }): custom hostname configurationspaceLinks({ label, docSpaceId }[]): links to other spaces; the list should start with the current spacepublicAccessControlPart: public access control and authentication configuration
delete_doc_space- Permanently deletes the configured space and every document in it. Cannot be undone, and the
API_KEYdies with it
- Permanently deletes the configured space and every document in it. Cannot be undone, and the
create_space_group- Creates a space group. Requires a team admin
- Input:
name(string): name of the new group- optional:
isAiEnabled,isReviewSystemEnabled,isBranchingSystemEnabled
delete_space_group- Deletes an empty space group. Requires a team admin
- Input:
docSpaceGroupId(string): group to delete
create_category- Creates a category (a folder in the space navigation)
- Input:
categoryName(string): name of the categoryparentDocId(string, optional): node to nest it under
delete_category- Deletes an empty category. Documents are never deleted
- Input:
categoryId(string): category to delete
An icon is either an emoji ("🚀"), or a JSON string naming an icon:
{"lucideIcon":"Rocket"}, {"faIcon":"fa-solid fa-rocket"} or {"apiMethod":"GET"}.
An empty string clears it; anything else is rejected.
Reusable resources — templates, content snippets and variables belong to the organization, not to a
space, so these take no docSpaceId. The list_* tools work with either key; the rest need a team key:
list_templates- Lists the saved document templates, with their content as markdown
create_template- Saves a new document template. A taken name (case-insensitive) returns the existing
template's id with
alreadyExists: trueinstead of creating a duplicate — the existing content is kept, so a different body needs a new name - Input:
name(string): name of the template- optional:
content,format,icon
- Saves a new document template. A taken name (case-insensitive) returns the existing
template's id with
apply_template- Creates a document from a template, copying its content verbatim
- Input:
templateId(string): template to apply- optional:
title(defaults to the template name),parentDocId,slug,icon
delete_template- Deletes a template by moving it to the organization's Archives space, where a person can restore it
- Input:
templateId(string): template to delete
list_content_snippets- Lists the reusable content snippets, with their content as markdown
create_content_snippet- Creates a content snippet. Requires a Scaling or Enterprise subscription. A taken name
(case-insensitive) returns the existing snippet's id with
alreadyExists: trueinstead of creating a duplicate — the existing content is kept, useupdate_content_snippetto change it - Input:
name(string): name of the snippet- optional:
content,format
- Creates a content snippet. Requires a Scaling or Enterprise subscription. A taken name
(case-insensitive) returns the existing snippet's id with
update_content_snippet- Renames a snippet, replaces its content, or both — reaching every document that embeds it
- Input:
snippetId(string): snippet to update- at least one of:
name,content(plus optionalformat)
delete_content_snippet- Permanently deletes a content snippet. Cannot be undone
- Input:
snippetId(string): snippet to delete
list_variables- Lists the content variables and glossary terms, with their values and overrides
- Input:
variableType(variable|glossary, optional): omit for both
create_variable- Creates a content variable or glossary term. Requires a Scaling or Enterprise subscription
- Input:
name(string): how documents reference it ({{name}}); unique within its type, letters, digits,-,_and.only, max 40 characters. Readers never see it in the glossaryvariableContent(string): value it resolves to (max 100 characters). For a glossary term this is the TERM readers see (max 40 characters)- optional:
description(max 250 characters; for a glossary term this is the DEFINITION readers see, and it is required),variableType,spaceTargetMap(per-space or per-language overrides)
update_variable- Updates a variable or glossary term; only the fields you send are changed
- Input:
variableId(string): variable to update- at least one of:
name,variableContent,description,variableType,spaceTargetMap(same field roles and limits ascreate_variable)
delete_variable- Permanently deletes a variable or glossary term. References to it stop resolving
- Input:
variableId(string): variable to delete
Setup
Add this server to your claude_desktop_config.json or .cursor/mcp.json
Environment Variables - base link
Read-only. Use this for a public space.
API_BASE: Link to your Archbee portal
Space must be public, with no access control (no password, jwt etc) Just copy-paste the link to the archbee space.
{
"mcpServers": {
"archbee": {
"command": "pnpm",
"args": ["dlx", "@archbee/mcp"],
"env": {
"API_BASE": "https://your-docs.io/"
}
}
}
}Environment Variables - space id
Required for the write tools, and also works for reading internal spaces.
You can get an API token from Space Settings in Archbee app.
SPACE_ID: Space id, taken from the space URL in the appAPI_KEY: Your Archbee API token for that Space
Use the live space id here. A PUBLISHED- or PREVIEW- snapshot id reads fine, but the API refuses every write through a snapshot credential.
A space API key belongs to one space, so this configuration reads and writes that space only. For every space in the team, use a team key instead.
{
"mcpServers": {
"archbee": {
"command": "pnpm",
"args": ["dlx", "@archbee/mcp"],
"env": {
"SPACE_ID": "<id-of-space>",
"API_KEY": "<api-key-of-space>"
}
}
}
}Environment Variables - team key
Reads and writes every space in the team. The organization super-admin creates the key in Settings → Organization settings → Organization API key; it is shown once, on creation, and cannot be read back afterwards. Revoking it stops every assistant configured with it.
API_KEY: Team key, starting withabteam_
A team key is accepted on the MCP endpoints only — the rest of the Public API and the CLI still take a space key.
No SPACE_ID: the key is not bound to a space, so the space travels per call. get_doc, get_all_docs, search_query, search_title, create_doc, update_doc, delete_doc, apply_template, create_category, delete_category, update_doc_space and delete_doc_space take a docSpaceId argument; create_doc_space, create_space_group, delete_space_group and every reusable-resource tool act on the organization and take none.
{
"mcpServers": {
"archbee": {
"command": "pnpm",
"args": ["dlx", "@archbee/mcp"],
"env": {
"API_KEY": "abteam_<team-key>"
}
}
}
}Environment Variables - other Archbee installs
Both API-key configurations talk to https://api.archbee.com by default — the same host the Archbee CLI and the public API reference use. Point them elsewhere with:
ARCHBEE_API_URL: Origin of your Archbee API, e.g.https://qa.archbee.comorhttp://localhost:4000
Give the origin only — the server appends /api/public-mcp itself. A value without a scheme is rejected rather than silently falling back to the cloud. API_BASE (the public-portal configuration) is a full link and ignores this.
{
"mcpServers": {
"archbee": {
"command": "pnpm",
"args": ["dlx", "@archbee/mcp"],
"env": {
"ARCHBEE_API_URL": "https://qa.archbee.com",
"API_KEY": "abteam_<team-key>"
}
}
}
}