AFFiNE MCP Server
AFFiNE MCP Server
A Model Context Protocol (MCP) server for AFFiNE. It exposes AFFiNE workspaces and documents to AI assistants over stdio (default) or HTTP (/mcp) and supports both AFFiNE Cloud and self-hosted deployments.
Table of Contents
Related MCP server: mcp-server-ispace-wiki
Overview
AFFiNE MCP Server is designed for three common scenarios:
Run a local stdio MCP server for Claude Code, Codex CLI, Cursor, or Claude Desktop
Expose a remote HTTP MCP endpoint for hosted or browser-connected clients
Automate AFFiNE workspace, document, database, organization, and comment workflows through a stable MCP tool surface
Highlights:
Supports AFFiNE Cloud and self-hosted AFFiNE instances
Supports stdio and HTTP transports
Supports token, cookie, and email/password authentication
Exposes 87 canonical MCP tools backed by AFFiNE GraphQL and WebSocket APIs
Includes semantic page composition, native template instantiation, database intent composition, capability and fidelity reporting, and workspace blueprint helpers
Includes Docker images, health probes, and end-to-end test coverage
Scope boundaries:
This server can access only server-backed AFFiNE workspaces
Browser-local workspaces stored only in local storage are not available through AFFiNE server APIs
AFFiNE Cloud requires API-token-based access for MCP usage; programmatic email/password sign-in is blocked by Cloudflare
New in v1.13.0: Added high-level semantic page, native template, fidelity, and workspace blueprint workflows, plus structured receipts and productized setup docs.
Choose Your Path
Goal | Start here |
Set up a local stdio server with the least friction | |
Run the server in Docker or another OCI runtime | |
Configure Claude Code, Claude Desktop, Codex CLI, or Cursor | |
Run the server remotely over HTTP or behind OAuth | |
Lock down tool exposure for least-privilege deployments | docs/configuration-and-deployment.md#least-privilege-tool-exposure |
Learn common AFFiNE workflows and tool sequences | |
Browse the tool catalog by domain |
Quick Start
1. Install the CLI
npm i -g affine-mcp-server
affine-mcp --versionYou can also run the package ad hoc:
npx -y -p affine-mcp-server affine-mcp -- --version2. Or run the server in Docker
docker run -d \
-p 3000:3000 \
-e MCP_TRANSPORT=http \
-e AFFINE_BASE_URL=https://your-affine-instance.com \
-e AFFINE_API_TOKEN=ut_your_token \
-e AFFINE_MCP_AUTH_MODE=bearer \
-e AFFINE_MCP_HTTP_TOKEN=your-strong-secret \
ghcr.io/dawncr0w/affine-mcp-server:latestThen point your client at:
{
"mcpServers": {
"affine": {
"type": "http",
"url": "http://localhost:3000/mcp",
"headers": {
"Authorization": "Bearer your-strong-secret"
}
}
}
}For Docker, health checks, and remote deployment details, see docs/configuration-and-deployment.md#docker.
3. Save credentials with interactive login
affine-mcp loginThis stores credentials in ~/.config/affine-mcp/config with mode 600.
For AFFiNE Cloud, use an API token from
Settings -> Integrations -> MCP ServerFor self-hosted AFFiNE, you can use either an API token or email/password
4. Register the server with your client
Claude Code project config:
{
"mcpServers": {
"affine": {
"command": "affine-mcp"
}
}
}Codex CLI:
codex mcp add affine -- affine-mcpMore client-specific setup is in docs/client-setup.md.
5. Verify the connection
affine-mcp status
affine-mcp doctorIf you want to expose the server remotely over HTTP instead of stdio, start with docs/configuration-and-deployment.md.
Compatibility Matrix
Target | Transport | Recommended auth | Recommended path |
Claude Code | stdio | Saved config or API token | |
Claude Desktop | stdio | Saved config or API token | |
Codex CLI | stdio | Saved config or API token | |
Cursor | stdio | Saved config or API token | |
Containerized remote deployment | HTTP | Bearer token or OAuth | |
Remote MCP clients | HTTP | Bearer token or OAuth | |
AFFiNE Cloud | stdio or HTTP | API token | |
Self-hosted AFFiNE | stdio or HTTP | API token, cookie, or email/password |
Tool Surface
tool-manifest.json is the source of truth for canonical tool names. The MCP server exposes those tools through tools/list and tools/call.
Domains:
Workspace: create, inspect, update, delete, and traverse workspaces
Organization: collections, collection-rule sync, workspace blueprints, and experimental organize or folder helpers
Documents: search, read, create, publish, move, tag, import/export, semantic composition, template inspection and native instantiation, capability and fidelity reporting, and text mutation
Databases: create columns, add rows, update cells, inspect schema, and compose database structures from intent
Comments: list, create, update, delete, resolve, and list unresolved threads
History: version history listing
Users and tokens: current user, sign-in, profile/settings, personal access tokens
Notifications: list and mark notifications as read
Blob storage: upload, delete, and cleanup blobs
For the grouped catalog, notes, and operational caveats, see docs/tool-reference.md.
Documentation Map
Document | Purpose |
First-run setup paths and verification | |
Client-specific configuration snippets and tips | |
Environment variables, auth modes, Docker, HTTP mode, and deployment guidance | |
End-to-end workflows and example tool sequences | |
Tool catalog grouped by domain | |
Contributor workflow | |
Security reporting |
Verify Your Setup
Useful CLI commands:
affine-mcp status- test the effective configurationaffine-mcp status --json- machine-readable status outputaffine-mcp doctor- diagnose config and connectivity issuesaffine-mcp show-config- print the effective config with secrets redactedaffine-mcp config-path- print the config file pathaffine-mcp snippet <claude|cursor|codex|all> [--env]- generate ready-to-paste client configaffine-mcp logout- remove stored credentials
For common failures, see:
Security and Scope
Never commit secrets or long-lived tokens
Prefer API tokens over cookies or passwords in production
Use HTTPS for non-local deployments
Rotate access tokens regularly
Restrict exposed tools with
AFFINE_DISABLED_GROUPSandAFFINE_DISABLED_TOOLSfor least-privilege setupsUse
/healthzand/readyzwhen running the HTTP server behind a container platform or load balancer
Development
Run the main quality gates before opening a PR:
npm run build
npm run test:tool-manifest
npm run pack:checkAdditional validation:
npm run test:comprehensiveboots a local Docker AFFiNE stack and validates the tool surfacenpm run test:e2eruns Docker, MCP, and Playwright togethernpm run test:playwrightruns the Playwright suite onlyFocused runners for the new high-level tool surface include
npm run test:create-placement,npm run test:capabilities-fidelity,npm run test:native-template,node tests/test-database-intent.mjs,node tests/test-semantic-page-composer.mjs,node tests/test-structured-receipts.mjs,node tests/test-organize-tools.mjs, andnode tests/test-supporting-tools.mjs
Local clone flow:
git clone https://github.com/dawncr0w/affine-mcp-server.git
cd affine-mcp-server
npm install
npm run build
node dist/index.jsRelease Notes
License
MIT License - see LICENSE.
Support
Open an issue on GitHub
Review AFFiNE product documentation at docs.affine.pro
Acknowledgments
Built for the AFFiNE knowledge base platform
Uses the Model Context Protocol specification
Powered by @modelcontextprotocol/sdk
Available Tools
95 toolsadd_database_columnAdd Database ColumnA
Add a column to an existing AFFiNE database block. Supports rich-text, select, multi-select, number, checkbox, link, date types.
Inputs: name (required), docId (required), databaseBlockId (required), type, +3 more.
add_database_rowAdd Database RowA
Add a row to an AFFiNE database block. Provide cell values mapped by column name or column ID. Title column text is stored on the row paragraph block. Select columns auto-create options by label.
Inputs: cells (required), docId (required), databaseBlockId (required), linkedDocId, +1 more.
add_doc_to_collectionAdd Doc To CollectionA
Add an existing document id to an AFFiNE collection allow-list. Use update_collection_rules instead when membership should be rule-driven.
Inputs: docId (required), collectionId (required), workspaceId.
add_organize_linkAdd Organize LinkA
Experimental: add a doc, tag, or collection link under an AFFiNE organize folder. Use move_organize_node for an existing link node instead of creating a duplicate link.
Inputs: type (required), folderId (required), targetId (required), index, +1 more.
add_surface_elementAdd Surface ElementA
Add a shape, connector, text, or group to the AFFiNE edgeless canvas surface. Shapes support rect/ellipse/diamond/triangle with fill, stroke, and text. Connectors draw arrows between shapes (by id) or between absolute points. Use for building diagrams programmatically. Style fields that don't apply to the chosen element type are reported in the response 'ignored' list (mirrors update_surface_element).
Inputs: type (required), docId (required), x, y, +26 more.
add_tag_to_docAdd Tag To DocumentA
Attach a workspace tag to a document, creating the workspace tag option if needed. This updates workspace metadata and attempts to sync the document's own metadata.
Inputs: tag (required), docId (required), workspaceId.
analyze_doc_fidelityAnalyze Document FidelityARead-onlyIdempotent
Inspect a document for markdown export fidelity risk, including unsupported AFFiNE block flavours and risky content paths.
Inputs: docId (required), workspaceId.
append_blockAppend BlockA
Append document blocks with canonical types and legacy aliases (supports placement + strict validation).
Inputs: type (required), docId (required), x, y, +33 more.
append_markdownAppend MarkdownB
Append markdown content to an existing AFFiNE document.
Inputs: docId (required), markdown (required), strict, placement, +1 more.
append_semantic_sectionAppend Semantic SectionB
Append a semantic section to an existing AFFiNE document by heading title and native block composition.
Inputs: docId (required), sectionTitle (required), bullets, callouts, +3 more.
cleanup_blobsCleanup Deleted BlobsADestructive
Permanently release blobs that were already marked deleted in a workspace. This is destructive cleanup and should be used only after confirming deleted blobs are no longer needed.
Inputs: workspaceId (required).
clear_doc_propertyClear Document PropertyC
Remove a custom property value from a document (property by id or name).
Inputs: docId (required), property (required), workspaceId.
compose_database_from_intentCompose Database From IntentA
Create a useful AFFiNE database/data-view from declarative intent. Supports task_board and issue_tracker presets with starter schema, kanban view, and optional starter rows.
Inputs: docId (required), intent (required), title, seedRows, +2 more.
create_collectionCreate CollectionA
Create a new AFFiNE sidebar collection with optional rules. This writes workspace sidebar metadata but does not create documents.
Inputs: name (required), rules, workspaceId.
create_commentCreate CommentA
Create a new comment on an existing document. This writes collaboration state; use update_comment when editing an existing comment instead.
Inputs: docId (required), content (required), docMode, docTitle, +2 more.
create_custom_propertyCreate Custom PropertyA
Create a workspace-wide custom property definition (text, number, checkbox, or date). Returns its propertyId.
Inputs: name (required), type (required), icon, workspaceId.
create_docCreate DocumentA
Create a new AFFiNE document with optional content. If parentDocId is provided, the new doc is linked into the sidebar tree immediately. If folderId is provided, the doc is placed inside that folder in the sidebar.
Inputs: title, content, folderId, parentDocId, +1 more.
create_doc_from_markdownCreate Document From MarkdownA
Create a new AFFiNE document and import markdown content. Use parentDocId to automatically embed the new doc into a parent, making it visible in the sidebar instead of being an orphan.
Inputs: markdown (required), title, strict, parentDocId, +1 more.
create_folderCreate FolderA
Experimental: create an AFFiNE organize folder node in the sidebar tree. This only changes sidebar organization, not document content.
Inputs: name (required), index, parentId, workspaceId.
create_semantic_pageCreate Semantic PageA
Create an AFFiNE-native page with intentional section structure and native block composition.
Inputs: title, pageType, sections, parentDocId, +1 more.
create_tagCreate TagA
Create a workspace-level tag entry for future reuse. This does not attach the tag to a document; use add_tag_to_doc for that.
Inputs: tag (required), workspaceId.
create_workspaceCreate WorkspaceA
Create a new workspace with initial document (accessible in UI)
Inputs: name (required), avatar.
create_workspace_blueprintCreate Workspace BlueprintA
Create a simple AFFiNE organize folder blueprint with one root folder and optional child folders. This is a convenience wrapper around create_folder.
Inputs: rootFolderName (required), workspaceId, childFolderNames.
current_userCurrent UserARead-onlyIdempotent
Return the currently authenticated AFFiNE user profile. Use this read-only check to verify credentials before workspace or document operations.
Inputs: no named parameters.
delete_blobDelete BlobADestructive
Delete a blob from AFFiNE workspace storage. Set permanently only when the blob should bypass recoverable deletion.
Inputs: key (required), workspaceId (required), permanently.
delete_blockDelete BlockADestructive
Delete a block by id. Removes descendants and unlinks from the parent's sys:children by default; set deleteChildren=false to keep descendants orphaned (for re-parenting), or pruneConnectors=true to also drop surface connectors referencing any deleted id. Refuses affine:page — use delete_doc for whole docs.
Inputs: docId (required), blockId (required), workspaceId, deleteChildren, +1 more.
delete_collectionDelete CollectionADestructive
Delete an AFFiNE sidebar collection. This removes the collection metadata but does not delete the documents it referenced.
Inputs: collectionId (required), workspaceId.
delete_commentDelete CommentADestructive
Delete an existing comment by id. This is destructive for that comment; use resolve_comment when you only want to mark a thread resolved.
Inputs: id (required).
delete_custom_propertyDelete Custom PropertyADestructive
Soft-delete a workspace custom property definition (by propertyId or name). Existing values are hidden.
Inputs: property (required), workspaceId.
delete_database_rowDelete Database RowBDestructive
Delete a row from an AFFiNE database block.
Inputs: docId (required), rowBlockId (required), databaseBlockId (required), workspaceId.
delete_docDelete DocumentADestructive
Delete a document by removing its workspace metadata entry and sending the AFFiNE WebSocket delete request for its content. This is destructive; use revoke_doc when you only need to remove public access.
Inputs: docId (required), workspaceId.
delete_folderDelete FolderADestructive
Experimental: delete an AFFiNE organize folder and every nested folder or link node. This is destructive for sidebar organization but does not delete target documents, tags, or collections.
Inputs: folderId (required), workspaceId.
delete_organize_linkDelete Organize LinkADestructive
Experimental: delete an AFFiNE organize doc, tag, or collection link node. This removes only the sidebar link, not the target resource.
Inputs: nodeId (required), workspaceId.
delete_surface_elementDelete Surface ElementADestructive
Delete a surface element by id. Set pruneConnectors=true to also delete any connectors whose source or target referenced the deleted element.
Inputs: docId (required), elementId (required), workspaceId, pruneConnectors.
delete_tagDelete TagADestructive
Delete a workspace-level tag and remove it from every document that references it. Accepts a tag id or name; an ambiguous name is rejected with the candidate ids.
Inputs: tag (required), workspaceId.
delete_workspaceDelete WorkspaceADestructive
Delete a workspace permanently
Inputs: id (required).
export_doc_markdownExport Document MarkdownBRead-onlyIdempotent
Export AFFiNE document content to markdown.
Inputs: docId (required), workspaceId, includeFrontmatter.
export_with_fidelity_reportExport With Fidelity ReportBRead-onlyIdempotent
Export document markdown together with a structured fidelity report that highlights markdown loss risk and unsupported AFFiNE-native content.
Inputs: docId (required), workspaceId, includeFrontmatter.
find_doc_by_titleFind Doc by TitleARead-onlyIdempotent
Resolve docs by exact title. Returns ALL matches up to limit (callers handle ambiguity). Case-sensitive by default; pass caseInsensitive: true to fold case. Reads workspace metadata — fast, no per-doc fetch. Unlike search_docs (which is always case-insensitive and capped at limit 20), this tool defaults to case-sensitive matching and returns up to limit matches (default 50, max 200). Prefer this over search_docs when you know the exact title and want every match. Returns: { query, caseInsensitive, matches: [{ id, title, createdAt, updatedAt, inTrash }], workspaceDocCount, truncated }.
Inputs: title (required), limit, workspaceId, caseInsensitive.
generate_access_tokenGenerate Access TokenA
Generate a new personal access token and return its one-time secret. This creates a credential; store the returned token securely because it may not be shown again.
Inputs: name (required), expiresAt.
get_capabilitiesGet CapabilitiesARead-onlyIdempotent
Return machine-readable capability flags for this MCP server, including block, database, collaboration, and export support.
Inputs: no named parameters.
get_collectionGet CollectionARead-onlyIdempotent
Read one AFFiNE sidebar collection by id, including rules and allow-list. Use list_collections first when the id is unknown.
Inputs: collectionId (required), workspaceId.
get_docGet DocumentARead-onlyIdempotent
Read GraphQL metadata for one document, such as title, summary, public state, roles, and timestamps. Use read_doc when you need block content.
Inputs: docId (required), workspaceId.
get_doc_iconGet Document IconARead-onlyIdempotent
Read the current sidebar icon of a document. Returns null when none is set.
Inputs: docId (required), workspaceId.
get_edgeless_canvasGet Edgeless CanvasARead-onlyIdempotent
Read the full edgeless canvas: all edgeless-positioned blocks (notes, frames, edgeless-text) with their xywh, plus all surface elements (shapes, connectors, text, groups). Includes aggregate bounding box and per-type element counts. Use this when you need to understand canvas layout end-to-end before placing new elements.
Inputs: docId (required), workspaceId.
get_folder_iconGet Folder IconARead-onlyIdempotent
Read the current sidebar icon of an organize folder. Returns null when none is set. Experimental.
Inputs: folderId (required), workspaceId.
get_orphan_docsGet Orphan DocumentsARead-onlyIdempotent
Find all documents that have no parent (not linked from any other doc via embed_linked_doc / embed_synced_doc blocks or inline LinkedPage references). Useful for workspace hygiene. Note: scans all docs — O(n). Each doc includes an inTrash flag.
Inputs: workspaceId.
get_workspaceGet WorkspaceARead-onlyIdempotent
Get details of a specific workspace
Inputs: id (required).
inspect_template_structureInspect Template StructureARead-onlyIdempotent
Inspect a template doc's native structure, tags, and fallback risk before instantiation.
Inputs: templateDocId (required), workspaceId.
instantiate_template_nativeInstantiate Template NativelyA
Instantiate a template using native AFFiNE block cloning when supported, falling back to markdown materialization only when necessary.
Inputs: templateDocId (required), title, variables, parentDocId, +3 more.
list_access_tokensList Access TokensARead-onlyIdempotent
List metadata for the current user's personal access tokens. Token secrets are not returned; use generate_access_token only when a new secret is needed.
Inputs: no named parameters.
list_childrenList Document ChildrenARead-onlyIdempotent
List the direct children of a document in the sidebar (embed_linked_doc / embed_synced_doc blocks and inline LinkedPage references). Returns docId, title, URL, and inTrash for each child.
Inputs: docId (required), workspaceId.
list_collectionsList CollectionsARead-onlyIdempotent
List AFFiNE sidebar collections and their rules. Use this read-only tool before updating, deleting, or adding documents to a collection.
Inputs: workspaceId.
list_commentsList CommentsARead-onlyIdempotent
List paginated comments for a document, including nested replies and resolution state. Use this before update_comment, delete_comment, or resolve_comment when you need the existing comment ids.
Inputs: docId (required), after, first, offset, +1 more.
list_doc_propertiesList Document PropertiesARead-onlyIdempotent
List the workspace custom-property definitions and a document's current values for them.
Inputs: docId (required), workspaceId.
list_docsList DocumentsARead-onlyIdempotent
List documents in a workspace (GraphQL). Each doc includes an inTrash flag.
Inputs: after, first, offset, workspaceId.
list_docs_by_tagList Documents By TagARead-onlyIdempotent
List documents that contain the requested tag. This is read-only and each result includes title metadata and an inTrash flag.
Inputs: tag (required), ignoreCase, workspaceId.
list_historiesList HistoriesBRead-onlyIdempotent
List doc histories (timestamps) for a doc.
Inputs: guid (required), take, before, workspaceId.
list_notificationsList NotificationsARead-onlyIdempotent
List the current user's AFFiNE notifications with optional unread filtering. This is read-only and returns notification ids, read state, level, and timestamps.
Inputs: after, first, offset, unreadOnly.
list_organize_nodesList Organize NodesARead-onlyIdempotent
Experimental: list AFFiNE sidebar organize folder and link nodes from the folders workspace DB. Use this before moving or deleting organize nodes.
Inputs: workspaceId.
list_surface_elementsList Surface ElementsARead-onlyIdempotent
List all shape/connector/text/group elements on the AFFiNE edgeless canvas surface. Returns raw xywh strings plus parsed {x,y,width,height} bounds, with Y.Text fields serialized to plain strings. Optional filters by element type or id.
Inputs: docId (required), type, elementId, workspaceId.
list_tagsList TagsARead-onlyIdempotent
List all workspace-level tags and the number of documents attached to each tag. Use this before tag mutation when the exact tag name or id is unknown.
Inputs: workspaceId.
list_workspacesList WorkspacesARead-onlyIdempotent
List all available AFFiNE workspaces
Inputs: no named parameters.
list_workspace_treeList Workspace TreeARead-onlyIdempotent
Returns the full document hierarchy as a tree (roots → children → grandchildren). Use depth to limit nesting (default: 3). Note: loads all docs — may be slow on large workspaces. Each node includes an inTrash flag.
Inputs: depth, workspaceId.
move_docMove Document in SidebarA
Move a doc in the AFFiNE sidebar by embedding it under a new parent. Optionally removes it from the old parent (fromParentDocId). If fromParentDocId is omitted, the doc is added to the new parent but not removed from the old one.
Inputs: docId (required), toParentDocId (required), workspaceId, fromParentDocId.
move_organize_nodeMove Organize NodeA
Experimental: move an AFFiNE organize folder or link node to another folder or root. This preserves the target document, tag, or collection and changes only sidebar placement.
Inputs: nodeId (required), index, parentId, workspaceId.
publish_docPublish DocumentA
Make a document publicly accessible through AFFiNE public sharing. This changes sharing state; use revoke_doc to disable public access later.
Inputs: docId (required), mode, workspaceId.
read_all_notificationsMark All Notifications ReadA
Mark every current-user notification as read. This mutates notification state; use list_notifications first when you need to inspect unread items.
Inputs: no named parameters.
read_database_cellsRead Database CellsARead-onlyIdempotent
Read row titles and database cell values from an AFFiNE database block.
Inputs: docId (required), databaseBlockId (required), columns, rowBlockIds, +1 more.
read_database_columnsRead Database ColumnsARead-onlyIdempotent
Read schema metadata for an AFFiNE database block, including columns, select options, and view column mappings. Useful for empty databases before any rows exist.
Inputs: docId (required), databaseBlockId (required), workspaceId.
read_docRead Document ContentARead-onlyIdempotent
Read document block content via WebSocket snapshot (blocks + plain text). Set includeMarkdown: true to also get the rendered markdown — useful when you need to read content without a separate export_doc_markdown call.
Inputs: docId (required), workspaceId, includeMarkdown.
remove_doc_from_collectionRemove Doc From CollectionA
Remove a document id from an AFFiNE collection allow-list. This does not delete the document or change collection rules.
Inputs: docId (required), collectionId (required), workspaceId.
remove_tag_from_docRemove Tag From DocumentA
Detach a tag from one document without deleting the workspace-level tag. Use delete_tag only when the tag should be removed from every document.
Inputs: tag (required), docId (required), workspaceId.
rename_folderRename FolderA
Experimental: rename an AFFiNE organize folder node. This changes sidebar metadata only and does not rename documents inside the folder.
Inputs: name (required), folderId (required), workspaceId.
replace_doc_with_markdownReplace Document With MarkdownA
Replace the main note content of a document with markdown content.
Inputs: docId (required), markdown (required), strict, workspaceId.
resolve_commentResolve CommentA
Set a comment thread's resolved state without changing its content. Use delete_comment only when the comment should be removed.
Inputs: id (required), resolved (required).
revoke_access_tokenRevoke Access TokenADestructive
Revoke an existing personal access token by id. This is destructive for API clients using that token; list tokens first if the id is unknown.
Inputs: id (required).
revoke_docRevoke DocumentADestructive
Disable public sharing for a document without deleting the document. Use delete_doc only when the document itself should be removed.
Inputs: docId (required), workspaceId.
search_docsSearch Documents by TitleARead-onlyIdempotent
Fast search for documents by title using workspace metadata. Much faster than exporting each doc. Returns docId, title, direct URL, and inTrash for each match.
Inputs: query (required), tag, limit, sortBy, +3 more.
set_doc_propertySet Document PropertyA
Set a document's custom property value (property by id or name). Value is validated against the property type (text/number/checkbox/date).
Inputs: docId (required), value (required), property (required), workspaceId.
sign_inSign InA
Sign in to AFFiNE using email and password; sets session cookies for subsequent calls.
Inputs: email (required), password (required).
update_collectionUpdate CollectionA
Rename an existing AFFiNE sidebar collection without changing its rules or allow-list.
Inputs: collectionId (required), name, workspaceId.
update_collection_rulesUpdate Collection RulesA
Replace an AFFiNE collection's rules and rebuild its allow-list from current workspace documents. This can change which docs appear in the collection.
Inputs: rules (required), collectionId (required), workspaceId.
update_commentUpdate CommentA
Replace the content of an existing comment. This preserves the comment thread; use create_comment for a new thread.
Inputs: id (required), content (required).
update_database_rowUpdate Database RowA
Batch update multiple cells on an existing AFFiNE database row. Include title in the cells map to update the Kanban row title.
Inputs: cells (required), docId (required), rowBlockId (required), databaseBlockId (required), +3 more.
update_doc_iconUpdate Document IconA
Set or clear the sidebar icon (the Notion-style emoji slot) on a document. Pass an emoji string, a full icon object, or null to remove it.
Inputs: icon (required), docId (required), workspaceId.
update_doc_titleUpdate Document TitleA
Rename a document — updates both the sidebar title (workspace metadata) and the doc's internal page block title.
Inputs: docId (required), title (required), workspaceId.
update_edgeless_blockUpdate Edgeless BlockA
Partially update a note/frame/edgeless-text block by id. x/y/width/height merge with current prop:xywh (move without resizing, or vice versa). background replaces prop:background (AFFiNE token or {light, dark} hex object). Fields that don't apply to the block's flavour come back under ignored.
Inputs: docId (required), blockId (required), x, y, +4 more.
update_folder_iconUpdate Folder IconA
Set or clear the sidebar icon on an organize folder. Pass an emoji string, a full icon object, or null to remove it. Experimental.
Inputs: icon (required), folderId (required), workspaceId.
update_frame_childrenUpdate Frame ChildrenA
Replace a frame block's contents wholesale. Accepts ids of surface elements (shapes/connectors/groups) AND edgeless blocks (notes/frames/edgeless-text) — all go into BlockSuite's prop:childElementIds map, matching what the editor writes when you drag members into a frame. Dragging the frame drags every owned member. Ids that don't resolve come back under 'missing'. By default the frame is resized to fit its new contents (plus padding + title band); set resizeToFit=false to leave xywh untouched. Pass [] to clear ownership (resize is skipped in that case).
Inputs: docId (required), blockId (required), childElementIds (required), padding, +2 more.
update_profileUpdate ProfileA
Update current user's profile information.
Inputs: name, avatarUrl.
update_settingsUpdate SettingsC
Update user settings and preferences.
Inputs: settings (required).
update_surface_elementUpdate Surface ElementA
Partially update a surface element by id. x/y/width/height merge with the element's current xywh (move without resizing, or vice versa). text/label/title replace their Y.Text wholesale. Fields that don't apply to the element's type are reported in the response 'ignored' list.
Inputs: docId (required), elementId (required), x, y, +26 more.
update_workspaceUpdate WorkspaceB
Update workspace settings
Inputs: id (required), public, enableAi.
upload_blobUpload BlobA
Upload a file or blob into AFFiNE workspace storage and return its blob key. This creates stored content but does not attach it to a document by itself.
Inputs: content (required), workspaceId (required), filename, contentType.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 95 tools
Each tool targets a specific resource and action, with clear differentiation (e.g., add_database_column vs add_database_row, read_doc vs get_doc). Overlapping operations like create_comment vs update_comment vs delete_comment are distinctly named.
Tools follow a mostly consistent verb_noun pattern (e.g., create_doc, list_tags). A few outliers like current_user and sign_in break the pattern, but overall the naming is predictable and readable.
95 tools is excessive for any server, even one covering broad functionality. Many specialized tools could be consolidated (e.g., multiple creation variants). The large count likely overwhelms agents.
The tool set covers all major workflows: CRUD for docs, databases, comments, tags, collections, surface elements, workspaces, auth, and blobs. Edge cases like orphan docs, fidelity reports, and template instantiation are included. No obvious gaps.
Maintenance
Related MCP Connectors
Read spaces, collections, pages and content; search docs and manage GitBook organization spaces.
Manage tickets, run agents and workflows, query tables, and search workspace knowledge.
Find, write, publish and check pages and API references in your DeveloperHub docs from an AI client
Securely search and manage workspace context files for AI agents and teams.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Aha! product management platform through GraphQL API. Supports retrieving features, requirements, and pages by reference number, as well as searching documents across Aha! workspaces.1MIT

mcp-server-ispace-wikiofficial
AlicenseAqualityDmaintenanceEnables AI assistants to perform CRUD operations, search, batch operations, and commenting on iSpace Wiki documents.32MIT- AlicenseNot gradedqualityBmaintenanceEnables ChatGPT to search and read documents in an AFFiNE Cloud workspace via MCP, secured by GitHub OAuth and an allowlist.MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to search, read, create, edit, and archive documents in a collaborative documentation service, plus manage collections, threaded comments, and backlinks. Includes MCP resources for direct URI-based content access and automatic rate-limit handling.-