AFFiNE MCP Server
Provides full read/write access to AFFiNE workspaces, documents, databases, journals, organizations, and comments, enabling creation, editing, organization, and deletion of content across self-hosted AFFiNE and AFFiNE Cloud.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AFFiNE MCP ServerCreate a doc called Weekly Plan with a checklist"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AFFiNE MCP Server (multi-tenant)
A Model Context Protocol (MCP) server for AFFiNE with full read/write access: create, edit, organize, and delete documents, workspaces, comments, and more. It runs over stdio or HTTP (/mcp) and supports self-hosted AFFiNE and AFFiNE Cloud.
This repository is a fork of affine-mcp-server by DAWNCR0W (MIT). Nearly all of the tool surface and the AFFiNE protocol work is theirs; see Credits. What this fork adds:
Multi-tenant mode — one deployment serves many AFFiNE users on many AFFiNE domains. Your application sends each user's AFFiNE URL and credentials per session; nothing is stored. See Multi-tenant mode.
Interactive API reference — an OpenAPI 3.1 spec generated from the running server and a Scalar page. See API reference.
Deployment notes for Dokploy and multi-account setups (
deploy/multi-account/).
Table of Contents
Related MCP server: Notion MCP Server
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
Multi-tenant HTTP mode: per-session AFFiNE domain and credentials, with a mandatory host allowlist
Supports stdio and HTTP transports
Coordinates concurrent writes per workspace through one shared MCP server; optional document revisions reject stale edits
Supports session-cookie and email/password authentication, plus compatible bearer tokens for older deployments
Exposes 107 canonical MCP tools backed by AFFiNE GraphQL and WebSocket APIs
Reads native database
created-by(user ID) andcreated-time(timestamp) columns from row metadata; missing or invalid metadata returnsnullwithout backfilling itSets and clears native AFFiNE Journal dates with
set_doc_journalIncludes 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
After a content write, transient workspace timestamp failures are retried up to three times with backoff. If metadata still cannot be confirmed, inspect the saved document before any repair; do not repeat the content edit. See document mutation recovery.
AFFiNE 0.27+ removed the legacy personal-access-token GraphQL API; this server no longer exposes token-management tools
AFFiNE Cloud requires browser-session authentication for this external GraphQL integration; programmatic email/password sign-in is blocked by Cloudflare
delete_docremoves workspace page metadata and requests content deletion. Some AFFiNE servers retain content despite acknowledging the request; the tool returns a partial result with a warning unless content absence is verified. Usetrash_docfor recoverable cleanup.
New in v3.2.1: Scripted cookie login now keeps session secrets out of process arguments, validates workspace access before saving credentials, and restores document pagination for ordinary workspace members.
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 | |
Let multiple agents write through one coordinated server | |
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
The published
ghcr.io/dawncr0w/affine-mcp-serverimage is the upstream project and does not include multi-tenant mode. To use this fork, build the image from this repository (docker build -t affine-mcp .).
docker run -d \
-p 3000:3000 \
-e MCP_TRANSPORT=http \
-e AFFINE_BASE_URL=https://your-affine-instance.com \
-e AFFINE_EMAIL=you@example.com \
-e AFFINE_PASSWORD=your-password \
-e AFFINE_MCP_AUTH_MODE=bearer \
-e AFFINE_MCP_HTTP_TOKEN=your-strong-secret \
ghcr.io/dawncr0w/affine-mcp-server:3.10.1Then 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.
HTTP deployments have two environment-only session limits:
Variable | Default | Purpose |
|
| Combined Streamable HTTP and legacy SSE session capacity, including sessions being initialized |
|
| Idle time before an inactive session is closed |
Short-lived Streamable HTTP clients, including cron jobs, should send DELETE /mcp
with their Mcp-Session-Id and authentication headers when finished. Exiting the
client process alone does not terminate its server-side session. A long idle
timeout can let abandoned sessions fill the limit and cause 503 / -32002
errors. Close unused sessions and choose an appropriate idle timeout before
raising the cap. See session capacity troubleshooting.
3. Save credentials with interactive login
affine-mcp loginThis stores credentials in $XDG_CONFIG_HOME/affine-mcp/config when XDG_CONFIG_HOME is set, otherwise in ~/.config/affine-mcp/config, with mode 600.
The login flow reuses the configured or saved AFFiNE URL when you press Enter at
the URL prompt. After authentication, workspace discovery displays the workspace
name first and falls back to Workspace name unavailable when profile metadata
has no name; the full ID remains visible. An invalid numeric selection is rejected
and prompted again. Enter q or send end-of-file to cancel without writing a new
config. A failed discovery request is reported as a failure; it is not treated as
a completed login.
For AFFiNE Cloud, paste the Cookie request header from a signed-in browser session
For self-hosted AFFiNE, use email/password (recommended) or a signed-in session cookie
AFFINE_API_TOKENremains available only for deployments that still accept a compatible GraphQL bearer token
The prompt defaults to AFFINE_BASE_URL from the environment or the saved config file, so pressing Enter keeps an already-configured self-hosted URL instead of switching back to AFFiNE Cloud.
For a self-hosted instance reached over plain HTTP on a trusted private network, AFFINE_ALLOW_INSECURE_HTTP=true must be set for the login run as well as for the server. The opt-in is read from the environment first and then from the saved config file.
To avoid re-running login when a session expires, persist the account credentials instead of the session cookie:
affine-mcp login --save-credentialsWith the email/password method, this stores AFFINE_EMAIL and AFFINE_PASSWORD so the server signs in on its own and renews the session before it expires. The password is written to the mode-600 config file, so use a dedicated least-privilege AFFiNE account. Without this flag the CLI keeps storing only the session credential, which never renews by itself.
For scripted session-cookie setup, keep the cookie out of process arguments:
affine-mcp login --url https://app.affine.pro --cookie-stdin --workspace-id your-workspace-id --forcePaste the cookie at the hidden prompt, or pipe it from a trusted secret source. The CLI verifies --workspace-id against the authenticated account before saving it. Piped input requires --force when existing credentials would be replaced.
After login, inspect and switch the saved default workspace without signing in again:
affine-mcp workspaces
affine-mcp workspaces --json
affine-mcp workspace <workspace-id>workspaces lists names first and marks the current default. workspace validates
the requested ID with the active credentials and changes only the local default
(AFFINE_WORKSPACE_ID); it does not grant access to a workspace or change the
authenticated account. With no ID, it uses the same validated selection flow.
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 doctor
affine-mcp snippet codexThe recommended Codex form is a command-only registration line that keeps using
the current saved login. snippet claude and snippet cursor print JSON
configuration instead. Apply the generated snippet, then restart or reconnect
the MCP client so it starts a fresh server process.
For an explicit environment snapshot, add --env to any snippet command. It
copies the currently resolved URL, authentication, headers, workspace, and
relevant OAuth settings; client environment variables win over saved config at
runtime. Remove or regenerate copied credentials when they expire instead of
expecting a saved login to override them.
If you want to expose the server remotely over HTTP instead of stdio, start with docs/configuration-and-deployment.md. If an HTTP server already runs on the same host as your stdio client, use the private stdio HTTP bridge instead of starting another full server process.
Multi-tenant mode
Use this when your own application manages many AFFiNE users or domains. Instead of one
fixed AFFiNE account per process, each MCP session carries its own destination and
credentials in the headers of the initialize request:
docker build -t affine-mcp .
docker run -d -p 3000:3000 \
-e AFFINE_MCP_MULTI_TENANT=true \
-e AFFINE_MCP_TENANT_ALLOWED_HOSTS="affine.example.com,*.team.example.com" \
-e AFFINE_MCP_HTTP_TOKEN="$(openssl rand -hex 32)" \
affine-mcpPOST /mcp
Authorization: Bearer <AFFINE_MCP_HTTP_TOKEN>
X-Affine-Url: https://affine.example.com
X-Affine-Email: user@example.com
X-Affine-Password: ********AFFINE_MCP_HTTP_TOKENidentifies your application to the gateway. Keep it server-side.A session may only target hosts in
AFFINE_MCP_TENANT_ALLOWED_HOSTS; the server will not start without it.Credentials live in memory for the session and are never logged or written to disk.
Alternatives to email/password:
X-Affine-CookieorX-Affine-Token. Send exactly one method.
Full header reference, status codes, and operational notes: docs/configuration-and-deployment.md#multi-tenant-mode. For a single fixed account per deployment, see deploy/multi-account/README.md.
API reference
docs/openapi.json is an OpenAPI 3.1 description of the gateway (session lifecycle, tenant headers, status codes) and of all 106 tools exposed in multi-tenant mode, with their input and output schemas. It is machine-readable, so it also works as context for your own AI.
docs/index.html renders it with Scalar. Serve the docs folder over HTTP:
npx serve docsThe spec is generated from the running server, so it cannot drift from the code:
npm run build && npm run docs:openapiTools are MCP tools, not REST endpoints. They are listed under Webhooks in the reference
because OpenAPI has no concept of JSON-RPC methods; each is invoked as tools/call on POST /mcp.
Compatibility Matrix
Node.js 20.18.1 is the minimum supported runtime. CI validates the Node.js 20, 22, 24, and 26 release lines.
Target | Transport | Recommended auth | Recommended path |
Claude Code | stdio | Saved config | |
Claude Desktop | stdio | Saved config or session cookie | |
Codex CLI | stdio | Saved config or self-hosted email/password | |
Cursor | stdio | Saved config or session cookie | |
Containerized remote deployment | HTTP | Bearer token or OAuth | |
Remote MCP clients | HTTP | Bearer token or OAuth | |
AFFiNE Cloud | stdio or HTTP | Signed-in browser session cookie | |
Self-hosted AFFiNE | stdio or HTTP | Email/password or session cookie |
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; tool definitions returned by tools/list include MCP annotations that mark read-only, destructive, idempotent, and external-world behavior for client-side tool selection.
Every canonical tool also declares an MCP outputSchema for its structuredContent. Object results retain their existing top-level fields, while array and scalar results use stable { items }, { text }, or { value } envelopes. The existing text content remains unchanged for compatibility with clients that do not consume structured results.
get_capabilities exposes the full implemented list in
server.supportedTools and the currently enabled surface in
server.effective.profile and server.effective.enabledTools, after profiles,
disabled groups or tools, and auth-mode policy. Inspect tools/list when you
need the final set of callable tools.
Advertised input and output schemas omit the SDK-generated draft-07 $schema marker. Schema interpretation follows the client context, allowing clients that reject an explicit draft-07 declaration to consume the tool surface.
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, custom properties, import/export, semantic composition, template inspection and native instantiation, capability and fidelity reporting, and block-level mutation
Databases: create columns, add rows, update rows, inspect schema, and compose database structures from intent
Comments: list, create, update, delete, and resolve
History: version history listing
Users and authentication: current user, sign-in, and profile/settings
Notifications: list and mark notifications as read
Blob storage: upload, delete, and cleanup blobs
For new document content, use create_doc for an optional single plain-text
paragraph and create_doc_from_markdown for native headings, lists, links,
code blocks, and $$...$$/$...$ math equations. Both tools accept folderId for immediate organize-folder placement.
New pages record the authenticated AFFiNE account in the app's Created by
property, including semantic pages, template instances, and workspace welcome pages.
Existing creator records are preserved; older pages are not backfilled.
New database rows also record the authenticated AFFiNE account and creation time,
including rows composed from intent or inserted as paragraph blocks. Editing or
moving existing rows preserves their creation metadata; older rows are not backfilled.
Use AFFINE_TOOL_PROFILE=read_only, core, or authoring when a deployment should expose a smaller surface than the complete full default. This is the recommended path for hosted, browser-connected, or least-privilege deployments because it reduces agent choice overload while keeping the full tool catalog available as an opt-in surface. You can also combine profiles with AFFINE_DISABLED_GROUPS such as docs.database, destructive, or admin for finer control.
Full-note replacement with replace_doc_with_markdown is destructive and requires full without disabling the destructive group. core and authoring retain incremental editing through append_markdown and update_block.
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 | |
Edgeless canvas layout helpers and surface elements, worked end-to-end | |
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 workspaces [--json]- list accessible workspaces by name and mark the defaultaffine-mcp workspace [id]- validate and set the local default workspaceaffine-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
Core configuration uses environment > saved config > defaults. HTTP body/session
limits, proxy settings, WebSocket timeouts, and the HTTP compatibility escape
hatches are environment-only runtime flags; they are not read from the saved
KEY=value file. See configuration precedence and environment scope.
For a self-hosted deployment with a non-standard GraphQL route, use
affine-mcp login --graphql-path /your/graphql/path or set
AFFINE_GRAPHQL_PATH; show-config --json prints the exact resolved
graphqlEndpoint without exposing secrets. Generated workspace and document URLs
use the configured AFFiNE base URL, so a custom GraphQL path does not become part
of a browser link.
For common failures, see:
Security and Scope
Never commit passwords, session cookies, or compatible bearer tokens
Use a dedicated least-privilege AFFiNE account for unattended deployments
Email/password HTTP sessions share one login and never fall back to anonymous backend requests after authentication failure
Use HTTPS for non-local deployments
Keep remote HTTP MCP listeners authenticated; bearer mode refuses a non-loopback bind without
AFFINE_MCP_HTTP_TOKENSend MCP bearer tokens in the
Authorizationheader, never in the URLRe-run
affine-mcp loginwhen a saved browser session expiresFor GUI clients, verify
command -v affine-mcpandcommand -v node; an absolute script path does not fix a#!/usr/bin/env nodeshebang when the GUI process has no Node.js directory inPATH. See GUI client PATH troubleshooting.Restrict exposed tools with
AFFINE_DISABLED_GROUPSandAFFINE_DISABLED_TOOLSfor least-privilege setupsTreat OAuth mode as a shared AFFiNE service-account deployment: it defaults to
read_only, and write-capable profiles requireAFFINE_OAUTH_ALLOW_SERVICE_WRITES=trueUse
/healthzand/readyzwhen running the HTTP server behind a container platform or load balancerSet HTTP body, session, idle, and shutdown limits explicitly for high-volume deployments
Development
Run the main quality gates before opening a PR:
npm run ciAdditional validation:
npm testverifies tool metadata, test-suite coverage, and the fast regression suite without requiring a live AFFiNE instancenpm 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,npm run test:mutation-ack,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
Live tests can mutate or delete AFFiNE data. They allow loopback targets by
default and refuse non-loopback targets unless the disposable target is
explicitly enabled and confirmed as documented in CONTRIBUTING.md. Never run
them against production.
Local clone flow:
git clone https://github.com/febrianrz/affine_mcp.git
cd affine-mcp-server
npm install
npm run build
node dist/index.jsRelease Notes
License
MIT License - see LICENSE. The original copyright notice is retained as the license requires.
Credits
This project exists because of DAWNCR0W and the contributors to
affine-mcp-server, which this repository is forked from
(imported at v3.10.2, commit 4bd2994; see UPSTREAM.md). The tool surface, AFFiNE GraphQL/WebSocket
integration, document model handling, and test suite are their work. Please star and support the original project.
Multi-tenant mode, the OpenAPI/Scalar reference, and the deployment notes are additions in this fork.
Support
Fork-specific issues (multi-tenant mode, API reference): open an issue on febrianrz/affine_mcp
Core tool behavior also exists upstream: DAWNCR0W/affine-mcp-server issues
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
107 toolsadd_database_columnAdd Database ColumnA
Add a column to an existing AFFiNE database block. Supports title, rich-text, select, multi-select, number, checkbox, link, and date types. A title addition is rejected when the current database snapshot already has a title column.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Column display name | |
| type | No | Column type | rich-text |
| docId | Yes | Document ID containing the database | |
| width | No | Column width in pixels (default 200) | |
| options | No | Predefined options for select/multi-select columns | |
| workspaceId | No | Workspace ID (optional if default set) | |
| databaseBlockId | Yes | Block ID of the affine:database block | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| name | No | |
| type | No | |
| added | No | |
| error | No | |
| details | No | |
| columnId | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds real value with the title-uniqueness rejection rule and the supported type list, but says nothing about where the new column is placed, whether options are ignored for non-select types, or that expectedRevision guards against stale writes — that last point lives only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose, then capability, then the single failure condition. No filler and nothing repeated from the schema beyond a brief type roll-up.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full-coverage schema, an output schema present, and annotations covering the safety profile, the description covers what is needed to call the tool. Minor gaps remain: no mention of column placement/ordering or whether `options` applies only to select types.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the enum for `type` and a detailed note on `expectedRevision`, so the schema does the heavy lifting. The description's type enumeration merely restates the enum; its only added semantic is the interaction between type='title' and an existing title column.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource pair ('Add a column to an existing AFFiNE database block'), which clearly separates it from row-oriented siblings like add_database_row or read_database_columns. It stops short of naming a sibling or explaining when reading columns first is advisable, so it is clear but not differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the mutation verb and the 'existing database block" precondition, and one constraint (title rejection) is stated. There is no explicit guidance on prerequisites (reading columns first, obtaining databaseBlockId) or on choosing this tool versus compose_database_from_intent for bulk setup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cells | Yes | Map of column name (or column ID) to cell value. Rich-text and title values accept strings or delta arrays. For LinkedPage references, use insert: " " with reference.type="LinkedPage" and the target pageId; visible labels are resolved by AFFiNE. For select columns, pass the display label (option auto-created if new). | |
| docId | Yes | Document ID containing the database | |
| linkedDocId | No | Link this row to an existing doc by ID. The row will open the linked doc in center peek when clicked. | |
| workspaceId | No | Workspace ID (optional if default set) | |
| databaseBlockId | Yes | Block ID of the affine:database block | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| added | No | |
| error | No | |
| details | No | |
| causeCode | No | |
| cellCount | No | |
| retryable | No | |
| rowBlockId | No | |
| linkedDocId | No | |
| databaseBlockId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, non-destructive and open-world. The description adds real context beyond them: title column text is stored on the row paragraph block as a side effect, and select columns auto-create missing options by label. It does not mention the stale-revision rejection path even though expectedRevision exists, so it is not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences with no filler, and the core action leads. Each sentence carries a distinct fact: purpose, cell mapping, title storage location, select option behavior. Nothing is repeated and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema is present, so return values need no explanation. The description covers purpose, cell shape, and the two non-obvious write side effects (title paragraph block, auto-created select options) for a 6-parameter mutation tool with a nested object. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema's cells description already covers delta arrays, LinkedPage references and select labels in more detail than the description's one-line summary. The description's 'mapped by column name or column ID' adds no meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Add a row to an AFFiNE database block.' That is unambiguous and distinguishes it from update_database_row and delete_database_row by verb alone. It does not name those siblings explicitly, which keeps it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the description instructs how to supply cell values, which suggests this is the tool for populating a database block. It never states when to use add_database_row versus update_database_row, nor any prerequisites such as whether the database block must already exist. Adequate but with a clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| collectionId | Yes | AFFiNE collection id from list_collections or create_collection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| name | No | |
| error | No | |
| rules | No | |
| details | No | |
| allowList | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write (readOnlyHint=false), non-idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds the useful 'allow-list' framing that clarifies this is explicit membership granting, but it does not address the non-idempotent hint — what happens on re-adding an existing member — or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the core action first and the disambiguation second. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and annotations cover safety. For a mutation with openWorldHint and non-idempotent semantics, a note on duplicate-membership behavior would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only 3 parameters, so collectionId, docId, and workspaceId are already fully documented in the schema. The description mentions the doc id and collection concept but adds no format, ordering, or fallback detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add an existing document id to an AFFiNE collection allow-list') and names the sibling that covers the other membership model. An agent can distinguish this from update_collection_rules without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use update_collection_rules instead when membership should be rule-driven. That is a clear when-to-use-alternative signal, but it gives no prerequisites for this tool itself (e.g. doc must exist, collection must exist, what happens if the doc is already a member).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_mindmap_nodeAdd Native Mindmap NodeA
Add one native child shape to parentId inside mindmapId. beforeId optionally inserts before a sibling; otherwise append. Returns nodeId. Persists hierarchy and layout together. Maximum 500 nodes, depth 64; shape nodes only.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| docId | Yes | ||
| beforeId | No | ||
| parentId | Yes | ||
| mindmapId | Yes | ||
| workspaceId | No | ||
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| nodes | No | |
| style | No | |
| layout | No | |
| locked | No | |
| nodeId | No | |
| rootId | No | |
| details | No | |
| causeCode | No | |
| mindmapId | No | |
| nodeCount | No | |
| retryable | No | |
| layoutType | No | |
| workspaceId | No | |
| lockedBySelf | No | |
| surfaceBlockId | No | |
| lockedByAncestor | No | |
| recoveryGuidance | No | |
| supportedLayouts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the readOnly/destructive/idempotent profile. The description adds concrete limits (500 nodes, depth 64), the shape-only restriction, and that hierarchy and layout persist together, though auth/permission behavior is absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences; operation and ordering are front-loaded before limits and return details. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values, annotations cover safety, and the description adds limits and layout persistence. It is nearly complete, though it could clarify the role of docId/workspaceId for an agent unfamiliar with the hierarchy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 14% schema description coverage, the description usefully defines beforeId insertion semantics and the parentId/mindmapId relationship. However, required docId and text plus optional workspaceId remain unexplained, so it only partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Add one native child shape') and names the exact parent/mindmap scoping. This clearly distinguishes it from update_mindmap_node and reparent_mindmap_node.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains beforeId ordering versus append and constrains the operation to shape nodes, but does not state when to prefer this over update/reparent siblings or any when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Type of target represented by the organize link. | |
| index | No | Optional fractional index. Defaults to append-after-last. | |
| folderId | Yes | AFFiNE organize folder node id. | |
| targetId | Yes | Target doc/tag/collection id | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| data | No | |
| type | No | |
| error | No | |
| index | No | |
| details | No | |
| parentId | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond the annotations by labeling the tool Experimental and warning that using it on an existing node can create a duplicate link.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with no wasted text. The experimental warning and the core action are front-loaded, followed immediately by the key alternative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has complete schema coverage, annotations, and an output schema, so the description does not need to explain parameters or return values. It covers purpose, experimental status, and the main duplicate-link pitfall, though it could say slightly more about the create-vs-move boundary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters including folderId, targetId, type, index, and workspaceId. The description does not add syntax or meaning beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: adding a doc, tag, or collection link under an AFFiNE organize folder. It also explicitly distinguishes the tool from move_organize_node, so an agent can select it correctly without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a direct usage rule: use move_organize_node for an existing link node instead of creating a duplicate link. This names the alternative and the condition that selects it, leaving little ambiguity about when to use add_organize_link.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X position on canvas (shape/text; default 0). | |
| y | No | Y position on canvas (shape/text; default 0). | |
| mode | No | Connector mode: 0=straight, 1=orthogonal (elbow), 2=curve (default 2). Connector only. | |
| text | No | Text content (shape/text) or connector label. Replaces existing Y.Text on update. | |
| type | Yes | Element type | |
| color | No | Text color. Shape default `#000000` — keep unless the fill is dark, then pass a contrasting hex. Canvas text default `--affine-text-primary-color` (theme-adaptive). Shape/text. | |
| docId | Yes | Document ID | |
| index | No | BlockSuite fractional-index string controlling z-order. On add, defaults to a key above every existing element's index (new elements render on top). On update, replaces the stored value — pass a key less than some existing index to send-to-back, or greater to bring-to-front. Use the value returned by list_surface_elements to pick a specific position. | |
| label | No | Connector label (stored as text on the connector). Connector only. | |
| title | No | Group title. Group only. | |
| width | No | Width (shape default 100, text default 200). | |
| filled | No | Whether shape is filled (default true). Shape only. | |
| height | No | Height (shape default 100, text default 30). | |
| radius | No | Corner radius for rect (0.1 = rounded). Shape only. | |
| stroke | No | Connector stroke color (default '--affine-text-primary-color' — theme-adaptive, near-black in light / near-white in dark). Accepts any CSS color or AFFiNE palette token. Connector only. | |
| children | No | Child element ids. Group only. | |
| fontSize | No | Font size (shape default 20, text default 16). Shape/text. | |
| sourceId | No | Connector source element id. Connector only. | |
| targetId | No | Connector target element id. Connector only. | |
| fillColor | No | Fill color. Prefer the `--affine-palette-shape-<color>` family (yellow/orange/red/magenta/purple/navy/blue/green/teal/grey/white/black). These are fixed colors — AFFiNE shape colors are not theme-adaptive by design. Shape only. | |
| shapeType | No | Shape type (default rect). Shape only. | |
| fontWeight | No | Font weight (shape default 600, text default 400). Shape/text. | |
| strokeColor | No | Stroke color. Prefer the `--affine-palette-line-<color>` family (same color names as fillColor). Fixed colors, not theme-adaptive. Shape only. | |
| strokeStyle | No | Stroke style. Shape/connector. | |
| strokeWidth | No | Stroke width (default 2). Shape/connector. | |
| workspaceId | No | Workspace ID (optional if default set) | |
| sourcePosition | No | Source [x,y]: relative [0-1] if sourceId set, absolute otherwise. Connector only. | |
| targetPosition | No | Target [x,y]: relative [0-1] if targetId set, absolute otherwise. Connector only. When both source/target are bound by id and neither position is provided, endpoints snap to the BlockSuite side-midpoint facing the other endpoint so connectors flow in a clear direction. Pass [0.5,0] top, [0.5,1] bottom, [0,0.5] left, [1,0.5] right to force a specific side. | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. | |
| rearEndpointStyle | No | Rear endpoint style (default Arrow). Connector only. | |
| frontEndpointStyle | No | Front endpoint style (default None). Connector only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| type | No | |
| added | No | |
| error | No | |
| details | No | |
| ignored | No | |
| causeCode | No | |
| elementId | No | |
| retryable | No | |
| surfaceBlockId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=false, so safety is covered; the description adds a genuinely non-obvious behavioral fact: inapplicable style fields are echoed back in a response 'ignored' list. It stops short of noting that the operation is non-idempotent (repeated calls create duplicates) or what permissions/docId scope are needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action, then element capabilities, use case, and the ignored-field caveat. No filler, though the parenthetical '(mirrors update_surface_element)' is slightly cryptic without direct routing language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 31 parameters and an output schema; the description defers parameter specifics to the (fully documented) schema and to the output schema for the 'ignored' list, which is appropriate. Missing is any note that this is a non-idempotent create (duplicate calls duplicate elements) or how docId/workspaceId must line up.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns one more by explaining connector binding semantics ('draw arrows between shapes (by id) or between absolute points') and which style families apply per element type, which reinforces how sourceId/targetId vs sourcePosition/targetPosition are chosen.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Add a shape, connector, text, or group to the AFFiNE edgeless canvas surface') and enumerates the element kinds, so an agent immediately knows the scope. It also implicitly separates itself from update_surface_element by noting the 'ignored' report 'mirrors update_surface_element'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use for building diagrams programmatically' gives a context cue, but there is no explicit when-not guidance or directive such as 'to modify an existing element use update_surface_element' / 'to inspect use list_surface_elements'. The routing to siblings is left to be inferred from the mention of the mirror behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_tag_to_docAdd Tag To DocumentA
Attach a workspace tag to a document, creating the workspace tag option if needed. Document tags are stored in workspace metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | Tag name to attach to the document. | |
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| tag | No | |
| code | No | |
| tags | No | |
| added | No | |
| docId | No | |
| error | No | |
| details | No | |
| warning | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| docMetaSynced | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety profile: readOnly=false, destructive=false, openWorld=true, idempotent=false. The description adds useful behavioral context beyond annotations: it may create a workspace tag option if missing and stores tags in workspace metadata. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and front-loads the core action. Every clause earns its place by adding the auto-creation side effect and the storage location.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema, full parameter schema coverage, and annotations, the description is nearly complete. It covers the key mutation side effect and storage behavior, though it could mention permissions or workspace context requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents docId, tag, and workspaceId semantics. The description adds only high-level context (workspace tag, document) and no additional parameter syntax or format details beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: attach a workspace tag to a document. It also distinguishes the operation by noting automatic workspace-tag creation when needed, which separates it from siblings like create_tag or remove_tag_from_doc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it by describing the attach operation, but it does not explicitly name alternatives such as remove_tag_from_doc, create_tag, or list_tags, nor does it state exclusions. Usage is inferable but not actively guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_doc_fidelityAnalyze Document FidelityARead-onlyIdempotent
Inspect a document for markdown export fidelity risk, including unsupported AFFiNE block flavours and risky content paths.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| exists | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No | |
| unsupportedBlocks | No | |
| conditionallyRiskyBlocks | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and openWorld behavior, so the safety profile is covered. The description adds meaningful scope beyond annotations by naming the specific fidelity risks it examines, giving the agent a clearer sense of what is checked.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single front-loaded sentence with no filler. It efficiently conveys the inspection target and risk categories.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, annotations cover behavior, and parameter documentation is complete. The main remaining gap is the lack of explicit routing guidance relative to export_with_fidelity_report, but otherwise the description is sufficient for this read-only analysis tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both docId and workspaceId are documented in the schema. The description does not add parameter-level guidance beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('inspect'), resource ('document'), and concrete inspection targets (markdown export fidelity risk, unsupported AFFiNE block flavours, risky content paths). It clearly distinguishes a fidelity-inspection tool from export tools, though it does not explicitly contrast with the sibling export_with_fidelity_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Inspect a document for markdown export fidelity risk' implies a pre-export or diagnostic use case, but it never states when to call this instead of export_with_fidelity_report or export_doc_markdown. No explicit when/when-not guidance or prerequisites are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_blockAppend BlockC
Append document blocks with canonical types and legacy aliases (supports placement + strict validation).
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X position on the edgeless canvas for frame/edgeless_text/note (default 0). Prefer ≥40px between sibling bounds; BlockSuite does not auto-arrange. | |
| y | No | Y position on the edgeless canvas for frame/edgeless_text/note (default 0). | |
| url | No | URL for bookmark/embeds. Runtime validation also enforces provider-specific hosts. | |
| html | No | Raw html for embed_html | |
| name | No | Attachment file name | |
| rows | No | Table row count | |
| size | No | Attachment/image file size in bytes | |
| text | No | Block content as plain text or a delta array. For LinkedPage references, set insert to one ASCII space and pass the pageId in reference attributes; visible labels are resolved by AFFiNE. | |
| type | Yes | Block type. Canonical: paragraph|heading|quote|list|code|divider|callout|latex|table|bookmark|image|attachment|embed_youtube|embed_github|embed_figma|embed_loom|embed_html|embed_linked_doc|embed_synced_doc|embed_iframe|database|data_view|surface_ref|frame|edgeless_text|note. Legacy aliases remain supported. | |
| docId | Yes | AFFiNE document id. | |
| embed | No | Attachment embed mode | |
| latex | No | Latex expression | |
| level | No | Heading level for type=heading | |
| style | No | List style for type=list | |
| width | No | Width for frame/edgeless_text/note. | |
| design | No | Design payload for embed_html | |
| height | No | Height for frame/edgeless_text/note. When `markdown` is set and height is omitted, an over-estimate is computed from the content — AFFiNE's render-time ResizeObserver corrects `prop:xywh` to the true DOM-measured height on first browser open. | |
| pageId | No | Target page/doc id for linked/synced doc embeds | |
| strict | No | Strict validation mode (default true) | |
| caption | No | Code caption when type is code | |
| checked | No | Todo state when type is todo | |
| columns | No | Table column count | |
| padding | No | Default padding (px) for `childElementIds` auto-sizing on frames (each side, plus +30px title band) and fallback gap for `stackAfter` (default 40). | |
| language | No | Code language when type is code | |
| markdown | No | When type='note', parse this markdown into heading/paragraph/list/code child blocks inside the note (BlockSuite-native: mirrors what happens when you paste markdown into an edgeless note). Takes precedence over 'text' for note children. Ignored for other block types. | |
| mimeType | No | Attachment mime type | |
| sourceId | No | Blob key returned by upload_blob for image/attachment | |
| viewMode | No | Initial data view preset for type=database or type=data_view. Defaults: database=table, data_view=kanban | |
| iframeUrl | No | Override iframe src for embed_iframe | |
| placement | No | Optional insertion target/position | |
| reference | No | Target id for surface_ref | |
| tableData | No | Plain-text cell contents for type='table', as rows of columns. Row count must equal `rows` and every row length must equal `columns`. Omit to create an empty table. | |
| background | No | Background for frame/note. Frame default 'transparent'. For notes, prefer AFFiNE's adaptive `--affine-note-background-<color>` family — `blue` / `purple` / `yellow` / `green` / `teal` / `red` / `orange` / `magenta` / `grey` / `white` / `black`. For specific per-theme colors, pass a `{light, dark}` hex object like `{light:'#fff', dark:'#252525'}`. | |
| refFlavour | No | Target flavour for surface_ref (e.g. affine:frame) | |
| stackAfter | No | Layout helper — position this block relative to one or more existing edgeless blocks. Picks the furthest anchor in `direction` for the stack axis, and centers the new block on the anchor group's union on the orthogonal axis (matches how BlockSuite aligns selection-derived blocks; reduces to inherit-anchor-x when widths match). Caller-provided x/y on the orthogonal axis still wins. Works for frame/note/edgeless_text. Example: `stackAfter: { blockId: [f1, f2, f3], gap: 80 }` stacks below whichever column frame ends lowest, centered across all three. Note heights shift at first render (page-root grows with the title, content notes shrink/grow with their children); give extra gap and fix up with `update_edgeless_block` if the down/right chain drifts. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| bookmarkStyle | No | Bookmark card style | |
| childElementIds | No | For type='frame' only. The frame's contents. Accepts ids of surface elements (shapes/connectors/groups) AND edgeless blocks (notes/frames/edgeless-text) — BlockSuite's prop:childElementIds holds both, matching what the editor writes when you drag a note into a frame. Dragging the frame drags every owned member. Ids that don't resolve come back under 'missing'. When width/height are omitted the frame is sized to the union of resolvable child bounds + padding + a 30px title band. | |
| tableCellDeltas | No | Rich-text deltas per cell for type="table", parallel to `tableData` as [row][column][delta]. A cell with deltas here overrides plain text at the same position. LinkedPage references require insert: " " and a pageId in reference attributes. | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| type | No | |
| docId | No | |
| error | No | |
| blockId | No | |
| details | No | |
| flavour | No | |
| appended | No | |
| blockType | No | |
| causeCode | No | |
| retryable | No | |
| legacyType | No | |
| workspaceId | No | |
| normalizedType | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), so the description is not required to restate safety. But it adds almost nothing behavioral: it name-drops "strict validation" without saying what strict rejects or that it defaults to true, gives no hint that appends are non-idempotent and can duplicate blocks, and says nothing about revision checks or the failure modes the 40-param surface implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no padding, so nothing is wasted. The parenthetical is slightly vague filler, but the text is compact and the primary action leads.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 40-parameter mutation tool with nested objects, edgeless-canvas geometry, and many overlapping siblings, one sentence is far short of complete: an agent gets no routing guidance, no sense of the edgeless-vs-document distinction, and no warning about strict-mode rejections. An output schema does exist, so return values need not be described, but the selection and behavioral context is largely absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each of the 40 parameters carries substantive inline documentation, so the baseline of 3 applies. The description contributes only the high-level notion of canonical types/legacy aliases, placement, and strict validation; it adds no semantics for any individual parameter beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb+resource pair ("Append document blocks") is unambiguous and the parenthetical adds that canonical types, legacy aliases, placement, and strict validation are involved. It never distinguishes itself from nearby siblings such as append_markdown, append_semantic_section, add_surface_element, or create_doc_from_markdown, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus the many alternative append/insert tools in the sibling list. No prerequisites, no exclusions, no note about document mode vs edgeless canvas, which the schema clearly supports.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_markdownAppend MarkdownB
Append markdown content to an existing AFFiNE document. $$...$$ and $...$ become native equations.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| strict | No | ||
| markdown | Yes | Markdown content to append | |
| placement | No | Optional insertion target/position | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| docId | No | |
| error | No | |
| lossy | No | |
| stats | No | |
| details | No | |
| appended | No | |
| blockIds | No | |
| warnings | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| appendedCount | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, non-idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description contributes the useful non-obvious conversion trait that $$...$$ and $...$ become native equations. It says nothing about what 'strict' mode changes, how placement affects the write, or the revision-conflict behavior implied by expectedRevision.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and target, with the equation-conversion note as a compact second clause. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained. Still, for a 6-parameter mutation tool with a nested placement object and an undocumented 'strict' flag, the description leaves real gaps about positioning and strictness that an agent must guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema already documents docId, markdown, workspaceId, and expectedRevision in detail. The description adds only markdown-body syntax behavior, not parameter meaning; the nested placement object and the 'strict' flag remain unexplained by both description and schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Append markdown content to an existing AFFiNE document'), which clearly separates it from create_doc_from_markdown and replace_doc_with_markdown by the word 'append'. However, it never names those siblings or explains the append-vs-replace distinction explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this over append_block, replace_doc_with_markdown, or create_doc_from_markdown, and no prerequisites or exclusions. The only implied usage is that the target document must already exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_semantic_sectionAppend Semantic SectionB
Append a semantic section to an existing AFFiNE document by heading title and native block composition.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| bullets | No | Bulleted items to append under the new section. | |
| callouts | No | Callout blocks to append under the new section. | |
| paragraphs | No | Paragraphs to append under the new section. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| sectionTitle | Yes | Heading text for the new semantic section. | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. | |
| afterSectionTitle | No | Optional existing section heading to append after. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| noteId | No | |
| details | No | |
| blockIds | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| sectionTitle | No | |
| appendedCount | No | |
| recoveryGuidance | No | |
| sectionHeadingId | No | |
| afterSectionTitle | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare that this is a non-read-only, non-idempotent, non-destructive mutation. The description adds useful append semantics (heading-based insertion, native block composition), but it does not disclose permissions, duplicate-heading behavior, or side effects beyond what annotations and schema convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single front-loaded sentence with no filler. It states the action and mechanism immediately, leaving details to the rich schema and annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is moderately complex with eight parameters, full schema coverage, an output schema, and annotations covering mutation safety. The description is minimal but sufficient because the schema handles parameter and return details; only finer behavioral nuances like duplicate-section handling are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all eight parameters are already documented. The description reinforces that sectionTitle and native block composition are central, but it does not add syntax, formatting, or behavioral detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Append') and resource ('semantic section') scoped to an existing AFFiNE document, and notes the heading-title/native-block mechanism. It is clear enough to distinguish from generic block or markdown appends, though it does not explicitly name the sibling alternatives it replaces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool instead of append_block, append_markdown, create_semantic_page, or other document-editing siblings. The phrase 'existing AFFiNE document' implies a context but does not state exclusions or routing conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | Yes | AFFiNE workspace id whose deleted blobs should be released. | |
| confirmWorkspaceId | Yes | Must exactly match workspaceId to confirm permanent blob cleanup. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| error | No | |
| status | No | |
| details | No | |
| success | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| blobsReleased | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint annotation already declares the safety profile, but the description adds meaningful context: the operation is permanent, applies only to already-deleted blobs, and requires prior confirmation. It stops short of describing whether the release is reversible or what errors occur on mismatched confirmation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and scope, followed by the destructive-use caution. Every clause earns its place with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full parameter descriptions, and rich annotations, the description supplies the essential missing nuance: permanence and the confirmation precondition. The only gap is not routing the agent away from delete_blob/upload_blob in sibling-heavy context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already explains workspaceId and the exact-match requirement for confirmWorkspaceId. The description adds no parameter-level detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: permanently release blobs that were already marked deleted, scoped to a workspace. The phrase 'already marked deleted' implicitly distinguishes it from delete_blob (which presumably performs the marking), but it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear precondition and caution: use only after confirming the deleted blobs are no longer needed, and it must be destructive cleanup. It does not explicitly contrast with delete_blob or upload_blob, so the exclusion guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_doc_propertyClear Document PropertyB
Remove a custom property value from a document (property by id or name).
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | ||
| property | Yes | Property id or name | |
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| cleared | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| propertyId | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the mutation profile is largely covered. The description adds useful scoping ('value from a document') but says nothing about what happens when the property is absent, whether clearing is reversible, or whether workspace context is required — all relevant for an openWorld, non-idempotent mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the parenthetical clarifies the property parameter efficiently. It could be slightly more informative without becoming verbose, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. However, an agent still lacks the sibling-routing information and workspace-scoping semantics needed to invoke this confidently alongside set_doc_property and delete_custom_property.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, and the description only reinforces the one parameter the schema already documents ('property by id or name'). Neither docId nor workspaceId is explained in the description, so it fails to compensate for the low schema coverage on a third of the inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Remove') and a specific resource ('a custom property value from a document'), so an agent knows the operation without opening the schema. It does not, however, differentiate itself explicitly from siblings like set_doc_property or delete_custom_property, which sound closely related.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this instead of set_doc_property, list_doc_properties, or delete_custom_property. The distinction between clearing a per-document value and deleting a property definition globally is left entirely to inference, which is a real risk given those siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compose_database_from_intentCompose Database From IntentB
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.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | Document ID containing the database | |
| title | No | Optional database title. Defaults to the intent preset title. | |
| intent | Yes | Declarative database intent to compose. | |
| seedRows | No | Optional starter rows. If omitted, the preset starter rows are used. | |
| placement | No | Optional insertion target/position | |
| workspaceId | No | Workspace ID (optional if default set) | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| lossy | No | |
| stats | No | |
| title | No | |
| views | No | |
| intent | No | |
| columns | No | |
| details | No | |
| viewIds | No | |
| warnings | No | |
| causeCode | No | |
| columnIds | No | |
| retryable | No | |
| rowBlockIds | No | |
| workspaceId | No | |
| primaryViewId | No | |
| databaseBlockId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a mutating (readOnlyHint=false), non-idempotent, non-destructive, open-world operation. The description adds what actually gets constructed (starter schema, kanban view, starter rows), which is real value, but it does not warn that repeated calls likely create duplicate databases or explain the stale-write guard implied by expectedRevision beyond the schema text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the action and immediately followed by the concrete presets and artifacts produced. No filler, though sentence two is essentially a feature list that could carry one clarifying clause about when to choose this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and annotations cover the safety profile. However, for a creator tool with nested placement parameters and a revision-based concurrency guard, the description omits the duplicate-creation caveat and the write-ordering behavior an agent needs to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters including the placement object and expectedRevision are already documented inline. The description only echoes the enum presets and the default starter-row behavior, adding no syntax, precedence, or interaction detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create a ... AFFiNE database/data-view', and narrows it to declarative-intent composition with named presets. That is enough to distinguish it from row/column-level siblings like add_database_row or add_database_column, though it never names an alternative sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by 'from declarative intent' plus the two preset names. It does not say when to prefer this over create_doc, instantiate_template_native, or manual add_database_column/add_database_row workflows, nor any prerequisites such as creating/reading the doc first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_collectionCreate CollectionB
Create a new AFFiNE sidebar collection with optional rules. This writes workspace sidebar metadata but does not create documents.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Collection name | |
| rules | No | Optional rule set to initialize the collection with. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| name | No | |
| error | No | |
| rules | No | |
| details | No | |
| allowList | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), so the bar is lower. The description adds real value by naming what is mutated ("workspace sidebar metadata") and what is not (documents), but says nothing about permissions, duplicate-name behavior, or whether rules are applied retroactively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and scope, zero filler. The non-document clarification is placed immediately after the core statement where it matters most.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and annotations plus a fully documented schema cover parameters. What remains thin is the relationship to update_collection_rules / add_doc_to_collection and any setup assumptions, but for a simple create call the description is nearly sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the nested filter/operator unions are thoroughly documented in the schema. The description only echoes "optional rules" and adds no semantics (e.g., what the allow-list means or how match:any interacts with filters), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a new AFFiNE sidebar collection with optional rules") and adds a negative scope clause ("does not create documents") that separates it from create_doc/create_semantic_page. It does not explicitly distinguish itself from update_collection, delete_collection or add_doc_to_collection, but the purpose itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance: nothing says use this first and then add_doc_to_collection, nor when to prefer update_collection over re-creating. The "does not create documents" line clarifies scope but is not a usage rule, so the agent must infer the workflow from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_commentCreate CommentA
Create a new comment on an existing document. This writes collaboration state; use update_comment when editing an existing comment instead.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | Document id that will receive the new comment. | |
| content | Yes | Plain comment text, a legacy { text } object, or a native AFFiNE { snapshot } payload. Plain text is converted to a renderable BlockSuite snapshot. | |
| docMode | No | Document surface for the comment. Defaults to page. | |
| docTitle | No | Optional document title stored with the comment metadata. | |
| mentions | No | Optional AFFiNE user ids to mention in the comment. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| kind | No | |
| docId | No | |
| error | No | |
| comment | No | |
| details | No | |
| causeCode | No | |
| commentId | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already disclose that this is a non-readonly, non-idempotent, non-destructive, open-world write. The description adds useful context by saying it writes collaboration state and requires an existing document, though it does not cover side effects such as mention notifications or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with no wasted wording. It front-loads the core action and immediately follows with the sibling-routing guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the full schema coverage, existing output schema, and annotations that cover the safety profile, the description provides enough context for correct invocation. No critical agent-facing detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already explains every parameter in detail. The description adds no parameter-specific syntax or constraints beyond what the schema provides, which is appropriate but not enriching.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: creating a new comment on an existing document. It also explicitly distinguishes this from update_comment, which is the closest sibling action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition and a direct alternative: use this tool to create a new comment, and use update_comment when editing an existing comment. This leaves little ambiguity for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_custom_propertyCreate Custom PropertyB
Create a workspace-wide custom property definition (text, number, checkbox, or date). Returns its propertyId.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Optional icon name | |
| name | Yes | Display name of the property | |
| type | Yes | Property value type | |
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| name | No | |
| type | No | |
| error | No | |
| index | No | |
| created | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| propertyId | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description usefully adds that a propertyId is returned for chaining, but says nothing about duplicate-name behavior (relevant given idempotentHint=false) or permission requirements for workspace-wide changes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and scope, followed by the return contract. No filler and nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, though naming propertyId is a nice touch. However, for a mutating create tool in a large sibling set, the description omits prerequisite context (how it relates to set_doc_property/list_doc_properties/delete_custom_property) and the meaning of the unlabeled workspaceId parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description restates the type enumeration already declared in the schema enum. The undocumented parameter, workspaceId, is not clarified in the description either — it's unclear whether workspaceId is optional or how the workspace-wide scope is resolved when it's omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Create a workspace-wide custom property definition") and scopes it with the allowed value types and the returned propertyId. The workspace-wide scope implicitly distinguishes it from doc-level operations like set_doc_property, but the sibling create/delete/list property tools are never named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, no prerequisite (e.g., that a definition must exist before set_doc_property can be used), and no mention of when NOT to use it. The only guidance is implied by "workspace-wide" and the existence of delete_custom_property.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_docCreate DocumentA
Create a new AFFiNE document with optional plain-text content stored as one paragraph. Use create_doc_from_markdown for native headings, lists, links, and code blocks. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Optional initial document title. | |
| content | No | Optional initial plain text stored as one paragraph. Use create_doc_from_markdown for structured Markdown. | |
| folderId | No | Optional folder ID to place the doc in. Use list_organize_nodes to find folder IDs. | |
| parentDocId | No | Optional parent doc to link the new doc under in the sidebar. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| docId | No | |
| error | No | |
| stage | No | |
| title | No | |
| status | No | |
| details | No | |
| folderId | No | |
| warnings | No | |
| causeCode | No | |
| retryable | No | |
| parentDocId | No | |
| workspaceId | No | |
| folderLinked | No | |
| folderNodeId | No | |
| linkedToParent | No | |
| contentPersisted | No | |
| recoveryGuidance | No | |
| metadataPersisted | No | |
| requiresManualRepair | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (not read-only, not destructive, not idempotent, open-world), so the description does not need to repeat it. The description adds useful behavioral detail: content is stored as one paragraph, and parentDocId/folderId cause immediate sidebar-tree linking or folder placement. It does not discuss creation of duplicate docs on repeated calls, but the non-idempotent annotation covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured and front-loaded: core action first, then the sibling alternative, then parameter-specific sidebar behavior. Every sentence contributes, though the parentDocId and folderId sentences could be slightly tighter and arguably mirror what is already in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and rich annotations, the description covers what an agent needs to choose and invoke this tool correctly: plain-text limitation, sibling alternative, and sidebar placement effects. It does not explain return shape or failure conditions, but those are covered by the output schema and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, including the plain-text/paragraph behavior and the sidebar semantics of parentDocId and folderId. The description adds no parameter guidance beyond what the schema already says, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new AFFiNE document') and immediately distinguishes it from the nearest sibling, create_doc_from_markdown, by contrasting plain-text content with structured Markdown support.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use this tool for plain-text single-paragraph content, and use create_doc_from_markdown for headings, lists, links, and code blocks. It also clarifies the sidebar consequences of parentDocId and folderId, so the agent knows what placement behavior to expect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_doc_from_markdownCreate Document From MarkdownA
Create a new AFFiNE document and import Markdown as native blocks, including $$...$$ equation blocks and $...$ inline equations. Use parentDocId to embed the new doc into a parent, or folderId to place it in an organize folder.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| strict | No | ||
| folderId | No | Optional folder ID to place the doc in. Use list_organize_nodes to find folder IDs. | |
| markdown | Yes | Markdown content to import | |
| parentDocId | No | If provided, the new doc is automatically embedded into this parent doc as a linked child (visible in sidebar). | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| docId | No | |
| error | No | |
| lossy | No | |
| stage | No | |
| stats | No | |
| title | No | |
| status | No | |
| details | No | |
| folderId | No | |
| warnings | No | |
| causeCode | No | |
| retryable | No | |
| parentDocId | No | |
| workspaceId | No | |
| folderLinked | No | |
| folderNodeId | No | |
| linkedToParent | No | |
| contentPersisted | No | |
| recoveryGuidance | No | |
| metadataPersisted | No | |
| requiresManualRepair | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, and openWorld=true, so the safety profile is covered. The description adds valuable beyond-schema behavior: the Markdown is converted into native blocks and $$...$$ / $...$ equations are preserved. It does not mention required permissions or side effects on a parent doc.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action and equation caveat front-loaded, followed by the placement options. No wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the create-and-import behavior is covered. However, `strict` semantics and workspace/permission preconditions are absent, which matters for a mutating, open-world tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description mostly restates what the schema already documents for parentDocId, folderId, and markdown. The `strict` flag, which materially changes parsing behavior, is undocumented in both the schema and the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb (create) and resource (AFFiNE document) plus the distinctive mechanism: importing Markdown as native blocks, including equation handling. It is clear, but it never names the sibling alternatives it differs from (create_doc, create_semantic_page, append_markdown, replace_doc_with_markdown), so differentiation is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives conditional guidance for two parameters (use parentDocId to embed, folderId to place), but that is parameter selection, not tool selection. There is no statement about when to use this instead of create_doc or append_markdown, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_folderCreate FolderA
Experimental: create an AFFiNE organize folder node in the sidebar tree. This only changes sidebar organization, not document content.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Folder name | |
| index | No | Optional fractional index. Defaults to append-after-last. | |
| parentId | No | Parent folder id. Omit for root-level folders. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| data | No | |
| type | No | |
| error | No | |
| index | No | |
| details | No | |
| parentId | No | |
| causeCode | No | |
| retryable | No | |
| storageDocId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-readonly, non-idempotent, non-destructive mutation, so the safety profile is covered. The description adds two genuinely useful facts the annotations don't carry — the 'Experimental' status and the fact that document content is untouched — but says nothing about permissions, failure modes, or what duplicate names do.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences with no filler; the experimental caveat and the scope boundary each earn their place. Slightly abrupt but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema and complete parameter documentation, the description only needs to frame purpose and scope, which it does. The remaining gap is not relating this tool to list_organize_nodes, move_organize_node, or rename_folder for follow-up operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so name, index, parentId, and workspaceId semantics are already documented in the schema, including the AFFINE_WORKSPACE_ID fallback. The description mentions no parameters at all, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('create an AFFiNE organize folder node in the sidebar tree') and immediately bounds the effect ('only changes sidebar organization, not document content'). That contrast is what separates it from create_collection or create_doc, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent can infer this is for sidebar tree organization only. There is no explicit guidance on when to prefer a folder over a collection, nor prerequisites such as needing a parent from list_organize_nodes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_mindmapCreate Native MindmapA
Create a native AFFiNE mindmap with one root shape in an existing document. Returns mindmapId/rootId for add_mindmap_node. Only right/left/balance are supported; down/up are unsupported by BlockSuite. Does not create a document or sidebar link.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| text | Yes | ||
| docId | Yes | ||
| style | No | ||
| layout | No | ||
| workspaceId | No | ||
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| nodes | No | |
| style | No | |
| layout | No | |
| locked | No | |
| nodeId | No | |
| rootId | No | |
| details | No | |
| causeCode | No | |
| mindmapId | No | |
| nodeCount | No | |
| retryable | No | |
| layoutType | No | |
| workspaceId | No | |
| lockedBySelf | No | |
| surfaceBlockId | No | |
| lockedByAncestor | No | |
| recoveryGuidance | No | |
| supportedLayouts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write profile (readOnly=false, destructive=false, idempotent=false, openWorld=true), so the description only needs to add what they don't cover. It does: return identifiers, the negative scope (no document, no sidebar link), and the BlockSuite layout limitation (down/up unsupported). It omits permission requirements and whether concurrent edits are guarded beyond the optional expectedRevision note.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and scope, followed by return value, constraint, and excluded side effects. No filler and nothing repeated from the schema beyond the one exception the description must explain.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the safety profile is covered by annotations plus the excluded side effects. The gap is parameter documentation: for an 8-parameter mutation at 13% coverage, x, y, style, and workspaceId are unexplained, so the description under-serves the schema's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 13% — just expectedRevision — so the description must compensate for seven undocumented parameters. It clarifies the layout domain (right/left/balance only, down/up rejected by BlockSuite) but says nothing about x/y positioning, style's 1-4 meaning, or workspaceId. Six of eight parameters remain semantically opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a native AFFiNE mindmap with one root shape in an existing document") and bounds the scope to a single root shape in a pre-existing doc. It also names the downstream sibling (add_mindmap_node) that consumes the returned ids, so an agent can place it in the workflow without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "in an existing document" plus "Does not create a document or sidebar link" routes the agent to the doc-creation tooling first, and "Returns mindmapId/rootId for add_mindmap_node" establishes the follow-on call. It stops short of naming create_doc explicitly as the prerequisite alternative, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_semantic_pageCreate Semantic PageC
Create an AFFiNE-native page with intentional section structure and native block composition.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Page title. | |
| pageType | No | Semantic page template to seed default sections. | |
| sections | No | Optional explicit section structure. If omitted, the page type defaults are used. | |
| parentDocId | No | Optional parent doc to link the new page under in the sidebar. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| stage | No | |
| title | No | |
| noteId | No | |
| pageId | No | |
| status | No | |
| details | No | |
| blockIds | No | |
| pageType | No | |
| warnings | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| parentLinked | No | |
| sectionCount | No | |
| contentPersisted | No | |
| recoveryGuidance | No | |
| metadataPersisted | No | |
| sectionHeadingIds | No | |
| requiresManualRepair | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, non-idempotent, non-destructive, open-world, so the safety profile is covered. The description adds nothing beyond a restatement of intent: it does not say what happens when pageType is omitted, whether defaults seed sections, whether a parent is required, or how it resolves workspace scope. For a non-idempotent write with an open-world hint, that is a real gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, verb and resource first. It is efficient, though the brevity borders on under-specification rather than tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the schema documents all five optional parameters, so return values and inputs need not be re-explained. But with zero required parameters and a non-idempotent write, the description should clarify defaults, override behavior, and workspace resolution; it leaves those to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is documented in structured fields and baseline 3 applies. The description's phrases 'section structure' and 'native block composition' loosely gesture at sections and pageType but add no format, precedence, or interaction detail (e.g., how explicit sections override pageType defaults) beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create an AFFiNE-native page') and adds a distinguishing qualifier about section structure and native block composition, which separates it from a plain doc-creation tool. It never names the sibling it is contrasted with (create_doc, instantiate_template_native), so the differentiation stays implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives among the many nearby creation tools (create_doc, create_doc_from_markdown, instantiate_template_native, append_semantic_section). The agent must infer that this is the structured-page path versus the markdown or template path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | Tag name to create in the workspace tag registry. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| tag | No | |
| code | No | |
| error | No | |
| created | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description usefully adds the 'registry entry only, no attachment' scope. However it never says what happens if the tag already exists — a critical behavior for a create tool flagged as non-idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the action first, then the disambiguation. Every clause earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values needn't be described, and annotations cover the safety profile. For a simple two-parameter create tool the only real missing piece is duplicate-tag handling, which keeps it just below full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (tag, workspaceId) are fully documented in the schema. The description's 'workspace-level' phrasing adds marginal context about the workspaceId, but nothing about format or constraints beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a workspace-level tag entry') and immediately distinguishes it from the sibling add_tag_to_doc, which is exactly the confusion an agent could have. No ambiguity about what gets created.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the when-not ('This does not attach the tag to a document') and names the alternative tool to use instead. This is the strongest possible routing guidance with no inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_workspaceCreate WorkspaceB
Create a new workspace with initial document (accessible in UI)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Workspace name | |
| avatar | No | Avatar emoji or URL |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| url | No | |
| code | No | |
| kind | No | |
| name | No | |
| error | No | |
| avatar | No | |
| status | No | |
| details | No | |
| message | No | |
| causeCode | No | |
| retryable | No | |
| firstDocId | No | |
| syncStatus | No | |
| workspaceId | No | |
| recoveryGuidance | No | |
| requiresManualRepair | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false, readOnlyHint=false, and non-idempotency, so the safety profile is covered. The description adds genuine context beyond that: creation also produces an initial document and the result is visible in the UI. It does not say whether duplicate names are rejected, what permissions are required, or what the initial document contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no padding. The parenthetical "(accessible in UI)" is slightly ambiguous — unclear whether it modifies the workspace or the initial document — but the overall length is well matched to the task.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't describe return values, and annotations cover the safety profile. However, for a creation tool with an undocumented side effect (initial document), it should say more about what that document is and any naming constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with only two parameters, both fully described in the schema, so the baseline is 3. The description adds no format, length, or uniqueness constraints for `name`, nor does it explain how `avatar` is interpreted as emoji versus URL.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Create a new workspace") and adds a distinguishing detail: it also creates an initial document. An agent can identify the operation without opening the schema. It stops short of naming how it differs from the sibling create_workspace_blueprint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives such as create_workspace_blueprint, nor any prerequisite or exclusion guidance. The agent must infer selection criteria from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| rootFolderName | Yes | Root folder name | |
| childFolderNames | No | Optional child folder names to seed under the root folder. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| childFolders | No | |
| rootFolderId | No | |
| storageDocId | No | |
| rootFolderName | No | |
| childFolderCount | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a non-read-only, non-destructive, non-idempotent operation, so the safety profile is covered structurally. The description adds that this is a composite of multiple folder creations, hinting at multi-step behavior, but it does not say whether the operation is atomic, what happens if a child folder name collides with an existing one, or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the resource definition front-loaded and the wrapper relationship placed immediately after where it is most useful for disambiguation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple convenience wrapper with full schema coverage, an output schema present, and annotations covering the safety profile, the description supplies what an agent needs to select and invoke it. The only shortfall is the absence of failure/collision semantics for a tool that creates several folders in one call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (workspaceId, rootFolderName, childFolderNames) are already documented, including the AFFINE_WORKSPACE_ID fallback. The description only restates the required/optional split implied by the schema, adding no new syntax, naming-constraint, or ordering semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Create) plus the resource (AFFiNE organize folder blueprint) and immediately defines the shape: one root folder plus optional children. The second sentence explicitly positions it as a wrapper around create_folder, so an agent can distinguish it from the sibling without inspecting either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Calling it a 'wrapper around create_folder' implies the choice (use this for multi-folder setup, plain create_folder for a single folder), but the description never states that when-to-use explicitly, nor does it mention anything about when not to use it (e.g., when child folders already exist or when folders must be created with differing settings).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
current_userCurrent UserARead-onlyIdempotent
Return the currently authenticated AFFiNE user profile. Use this read-only check to verify credentials before workspace or document operations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| name | No | |
| No | ||
| error | No | |
| details | No | |
| disabled | No | |
| avatarUrl | No | |
| causeCode | No | |
| retryable | No | |
| emailVerified | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so safety is covered by structured data. The description adds genuinely new context beyond that: this is a credential/identity check that should precede other workspace or document calls, which no annotation conveys. Minor gap: it does not say what happens when unauthenticated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the identity of the return value is front-loaded and the usage guidance follows immediately. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present (so return shape needn't be described), rich annotations, and no parameters, the description supplies all an agent needs: what is returned and when to call it. Nothing material is missing for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so per the baseline this scores 4. There is nothing for the description to disambiguate, and it correctly implies a zero-argument call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the currently authenticated AFFiNE user profile'), which is unambiguous and distinct from the neighboring sign_in (authentication) and update_profile (mutation) tools. An agent can identify exactly what this tool yields without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes the use case: 'verify credentials before workspace or document operations,' which gives the agent a concrete precondition workflow. It stops short of naming alternatives or exclusions (e.g., when not to call it), so it lands just below the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_blobDelete BlobADestructive
Delete a blob from AFFiNE workspace storage. Set permanently only when the blob should bypass recoverable deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Blob key returned by upload_blob or AFFiNE document metadata. | |
| confirmKey | No | Required when permanently=true and must exactly match key. | |
| permanently | No | If true, permanently delete the blob instead of marking it deleted. | |
| workspaceId | Yes | AFFiNE workspace id that owns the blob. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| key | No | |
| code | No | |
| kind | No | |
| error | No | |
| status | No | |
| deleted | No | |
| details | No | |
| success | No | |
| causeCode | No | |
| retryable | No | |
| permanently | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds genuinely new behavioral detail: deletion is recoverable by default and only permanent when bypassing recovery. It stops short of mentioning the confirmKey safeguard, which would make it a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, the core action front-loaded and the conditional flag guidance second. No filler, though the second sentence could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and all four params are documented, so the description needn't explain return values. The recoverable-vs-permanent semantics are covered; the only gap is the absence of the confirmKey requirement and sibling differentiation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already explains permanently ('permanently delete instead of marking it deleted') and confirmKey. The description's 'bypass recoverable deletion' phrasing reinforces the default-versus-permanent distinction but adds little beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Delete a blob') scoped to AFFiNE workspace storage, so it is clearly distinguishable from cleanup_blobs by intent. It does not explicitly name the sibling, keeping it below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence hints at when to use permanently=true ('only when the blob should bypass recoverable deletion'), which is useful guidance for the flag. However, it never says when to call delete_blob vs cleanup_blobs, nor notes the confirmKey prerequisite, so usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_blockDelete BlockADestructive
Delete a block by id and return snapshots of the removed content. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | Document ID | |
| blockId | Yes | Block id to delete. | |
| workspaceId | No | Workspace ID (optional if default set) | |
| deleteChildren | No | Also delete descendants (default true). | |
| pruneConnectors | No | Also delete connectors bound to any deleted id (default false). | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| reason | No | |
| blockId | No | |
| deleted | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| deletedIds | No | |
| deletedBlock | No | |
| deletedBlocks | No | |
| prunedConnectors | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and non-idempotent, and the description adds substantive behavior: returns snapshots of removed content, unlinks from the parent's sys:children, cascades descendants by default, prunes surface connectors on request, and hard-refuses affine:page. This goes well beyond what the annotations disclose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core action, then the default/flag semantics, then the refusal-plus-alternative. No filler; each clause routes a decision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still signals the snapshot return, and it covers the destructive default, connector scope, and the affine:page guard. For a destructive mutation with 6 params, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: the re-parenting rationale for deleteChildren=false and the surface-connector scope of pruneConnectors. That is value the schema itself does not carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Delete a block by id') with a clear return payload ('return snapshots of the removed content'), and explicitly distinguishes itself from delete_doc by refusing affine:page. An agent can pick the right tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use branching per flag: default cascades descendants, deleteChildren=false for re-parenting via orphaning, pruneConnectors=true for connector cleanup. It also names the alternative for whole-doc deletion, closing the loop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_collectionDelete CollectionADestructive
Delete an AFFiNE sidebar collection. This removes the collection metadata but does not delete the documents it referenced.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| collectionId | Yes | AFFiNE collection id from list_collections or create_collection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| details | No | |
| success | No | |
| causeCode | No | |
| retryable | No | |
| collectionId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the bar is lower, yet the description still earns credit by defining the destructiveness boundary: metadata is destroyed, referenced documents are preserved. It stops short of stating irreversibility or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero redundancy, with the destructive scope clarification front-loaded right after the action statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and an output schema present, the description needs only the action and the blast radius, both of which it supplies. Missing only auth/permission preconditions for a workspace-scoped destructive call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented inline (including that collectionId comes from list_collections or create_collection), so the baseline of 3 applies; the description adds no parameter-level detail beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete an AFFiNE sidebar collection') and immediately scopes the effect ('removes the collection metadata but does not delete the documents it referenced'), which separates it from delete_doc and trash_doc in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope note implies when this is the right call (removing a container, not its contents), but there is no explicit when-to-use guidance and no named alternative such as remove_doc_from_collection or update_collection for the case where the caller only wants to detach items.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Comment id returned by list_comments or create_comment. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| kind | No | |
| error | No | |
| details | No | |
| success | No | |
| causeCode | No | |
| commentId | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the description's 'This is destructive' is largely redundant, but it adds real nuance by scoping the damage ('for that comment') rather than the whole thread, which the annotations cannot express. It leaves open what happens to threaded replies, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short clauses, zero waste, with the action stated first and the disambiguation second — front-loaded exactly as it should be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and annotations cover safety and idempotency, so the definition is nearly complete for a one-parameter delete; the only missing piece is whether deleting a parent comment cascades to its replies, which matters for a destructive open-world operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the id parameter is already documented as coming from list_comments/create_comment; the description's 'by id' adds no syntax, format, or sourcing detail beyond that. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete an existing comment by id') and immediately contrasts with the sibling resolve_comment, so it is distinguishable from update_comment/resolve_comment without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (resolve_comment) and the condition that selects it ('when you only want to mark a thread resolved'), which is exactly the decision boundary an agent needs for this cluster of comment tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_custom_propertyDelete Custom PropertyADestructive
Soft-delete a workspace custom property definition (by propertyId or name). Existing values are hidden.
| Name | Required | Description | Default |
|---|---|---|---|
| property | Yes | Property id or name | |
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| name | No | |
| error | No | |
| deleted | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| propertyId | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructiveHint=true and idempotentHint=false; the description adds the crucial nuance that this is a soft delete whose existing values become hidden rather than purged, which the hints alone cannot convey. It does not say whether the operation can be reversed/restored, which is the one remaining behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no filler; the operation and its key consequence are front-loaded, and every clause (soft-delete, identifier options, hidden values) carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the soft-delete consequence is covered. However, for a destructive definition-removal tool the description omits the workspaceId parameter's meaning and whether the deletion is recoverable, leaving an agent to guess on scope and risk.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%: `property` is already documented in the schema as 'Property id or name', so the description merely repeats it, and `workspaceId` is left completely unexplained in both schema and description (including whether it is optional or defaults to the current workspace). No compensation for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Soft-delete a workspace custom property definition') plus the identifier forms accepted, and 'workspace custom property definition' clearly separates it from clear_doc_property or delete_tag. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'soft-delete' framing implies when this is appropriate (removing a property definition while retaining row history), but there is no explicit when-to-use/when-not guidance and no alternative named, e.g. clear_doc_property for clearing a single doc's value or delete_collection for other definition types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_database_rowDelete Database RowBDestructive
Delete a row from an AFFiNE database block.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | Document ID containing the database | |
| rowBlockId | Yes | Row paragraph block ID to delete | |
| workspaceId | No | Workspace ID (optional if default set) | |
| databaseBlockId | Yes | Block ID of the affine:database block | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| deleted | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| rowBlockId | No | |
| databaseBlockId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true. The description confirms the mutation scope (a database row) but adds no detail about cascading effects, irreversibility, or permissions; with annotations carrying the safety profile, this is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler. It is too terse for the risk profile, but that is a completeness issue rather than wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema and output schema cover inputs/outputs, and annotations cover the safety profile, so the essential contract is present. However, for a destructive row deletion, the description omits whether cells are removed, whether the operation is reversible, and how it relates to delete_block.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters are self-documented, including expectedRevision. The description names no parameters and adds no syntax or constraints beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Delete') and resource ('a row from an AFFiNE database block'), distinguishing it from add_database_row and update_database_row. It does not explicitly contrast with delete_block, so it is clear but not fully sibling-differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no when-to-use guidance, prerequisites, or alternatives. An agent must infer from the name that this is the row-specific delete versus delete_block.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_docDelete DocumentADestructive
Remove a document from the workspace list and request content deletion. AFFiNE servers may acknowledge this request while retaining readable content that still syncs. Content deletion is reported only after absence is verified; otherwise the result is partial with a warning. This is destructive; use trash_doc for recoverable cleanup or revoke_doc to remove public access.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| confirmDocId | Yes | Must exactly match docId to confirm permanent document deletion. | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| docId | No | |
| error | No | |
| deleted | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing a non-obvious server behavior: AFFiNE may acknowledge the request while retaining readable, still-syncing content, and the tool reports deletion only after absence is verified, otherwise returning a partial result with a warning. That is exactly the kind of eventual-consistency caveat an agent cannot infer from destructiveHint=true, and it materially changes how the caller should interpret the outcome.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action, then the risk caveat, then the sibling routing. Every sentence carries distinct information with no restatement of the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With full schema coverage, explicit annotations, and an output schema handling return values, the description only needs to supply risk and routing context — which it does comprehensively. Nothing needed to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so docId, workspaceId, confirmDocId and expectedRevision are all documented in the schema itself. The description adds no additional parameter-level detail (e.g., when expectedRevision should be supplied), so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove/delete) and resource (document), and immediately separates it from sibling operations by naming trash_doc and revoke_doc. An agent can tell exactly what this does and how it differs from the other deletion-adjacent tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'use trash_doc for recoverable cleanup or revoke_doc to remove public access.' The condition that selects this tool over its alternatives is stated, and the destructive framing reinforces when it is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| folderId | Yes | AFFiNE organize folder node id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| details | No | |
| success | No | |
| causeCode | No | |
| retryable | No | |
| deletedIds | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the description isn't carrying the safety burden alone. It still earns credit for the blast-radius detail that annotations cannot express: the deletion cascades through nested folders and link nodes, yet leaves target documents, tags, and collections intact. It stops short of covering failure behavior for a missing folderId or whether recovery is possible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The experimental warning and cascade scope lead, and the non-destructive caveat follows as a qualifier — exactly the right ordering for a destructive tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and the description adequately frames the mutation's effect. Minor gap: no mention of the AFFINE_WORKSPACE_ID prerequisite or whether a deleted folder can be restored, which matters for an irreversible operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both folderId and workspaceId are already documented in the schema. The description adds no param-level guidance (e.g., how to obtain a folder node id via list_organize_nodes), so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('delete an AFFiNE organize folder') and immediately bounds the scope ('every nested folder or link node'). This lets an agent distinguish it from delete_doc, delete_collection, and delete_organize_link without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Experimental' prefix and the cascade scope imply when this is appropriate, and clarifying that documents/tags/collections survive implicitly routes content deletion to delete_doc/delete_collection. But it never explicitly names an alternative or states a 'prefer X when you only want to unlink' condition, nor does it mention the workspaceId/env prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | AFFiNE organize node id from list_organize_nodes. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| nodeId | No | |
| details | No | |
| success | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered structurally. The description adds genuine value by narrowing the blast radius — only the sidebar link is removed, the underlying doc/tag/collection survives — which counters the alarm that destructiveHint raises, plus an experimental-status warning. It stops short of stating whether the delete is reversible or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste. The experimental warning and the scope-limiting clause are both front-loaded where an agent will read them before acting.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and both parameters are documented, so the description needn't cover returns. For a destructive mutation it covers scope and experimental status well; only the irreversibility/undo story is left implicit, which is a minor gap given the annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both nodeId and workspaceId fully documented including the AFFINE_WORKSPACE_ID fallback. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and a specific resource (AFFiNE organize doc/tag/collection link node), and immediately clarifies what is NOT being deleted (the target resource). This cleanly separates it from siblings like delete_doc, delete_tag, delete_collection, and delete_folder.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Experimental' prefix signals caution, but there is no explicit guidance on when to choose this over delete_doc/delete_tag, nor a stated prerequisite to obtain nodeId via list_organize_nodes (only implied by the schema). Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | Document ID | |
| elementId | Yes | Element ID to delete | |
| workspaceId | No | Workspace ID (optional if default set) | |
| pruneConnectors | No | Also delete connectors referencing this element (default false) | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| reason | No | |
| deleted | No | |
| details | No | |
| causeCode | No | |
| elementId | No | |
| retryable | No | |
| prunedConnectors | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and idempotentHint=false, so the core safety profile is known. The description adds meaningful cascade behavior: if pruneConnectors=true, connectors whose source or target referenced the deleted element are also deleted. That is a useful side effect beyond the annotations, though it omits concurrency and workspace-side effects covered by the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tightly written sentences with no waste. The primary action is front-loaded, followed immediately by the one important optional side-effect flag.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema, an output schema present, and annotations covering destructiveness and idempotency, the description supplies the main behavioral detail an agent needs: the pruneConnectors cascade. The concurrency semantics of expectedRevision are left to the schema, which is acceptable given full coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented, including expectedRevision and workspaceId. The description mentions elementId and adds a behavioral explanation for pruneConnectors, but largely restates what the schema already says. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Delete a surface element by id.' This clearly distinguishes it from sibling surface-element tools such as add_surface_element, list_surface_elements, and update_surface_element. However, it does not explicitly differentiate when to use delete_block or other deletion tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives one conditional usage detail: set pruneConnectors=true to also remove referencing connectors. Beyond that, it does not explain when to choose this tool versus delete_block or update_surface_element, nor does it mention any preconditions or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | Tag id or name to delete. Ambiguous tag names are rejected with candidate ids. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| tag | No | |
| code | No | |
| error | No | |
| tagId | No | |
| value | No | |
| deleted | No | |
| details | No | |
| warnings | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| affectedDocs | No | |
| docMetaSynced | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered. The description adds genuinely new behavior: the tag is stripped from every document that references it, and ambiguous names are rejected with candidate ids. It stops short of stating irreversibility or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the destructive action and its scope, followed by the input-handling rule. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering destructiveness and an output schema covering return values, the description supplies the two missing behavioral facts: cascade removal and ambiguity rejection. Only workspace scoping and permanence are absent, which keeps it short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description's clause about id-or-name and ambiguous rejection largely restates the schema's own tag description. The workspaceId parameter, including the AFFINE_WORKSPACE_ID fallback, is not mentioned in the description at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete a workspace-level tag) plus the blast radius (removed from every referencing document). 'Workspace-level' implicitly distinguishes it from remove_tag_from_doc, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The cascade wording hints at when this is appropriate rather than remove_tag_from_doc, but the description never states the condition or names the alternative. Usage is inferred, not specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_workspaceDelete WorkspaceBDestructive
Delete a workspace permanently and report success only when AFFiNE confirms the mutation.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workspace ID | |
| confirmWorkspaceId | Yes | Must exactly match id to confirm permanent workspace deletion. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| kind | No | |
| error | No | |
| deleted | No | |
| details | No | |
| message | No | |
| success | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is largely covered. The description usefully adds that success is reported only after AFFiNE confirms the mutation, but omits what else is destroyed (docs, folders, collections, members) and whether the action is recoverable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the destructive qualifier and confirmation semantics both land immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an irreversible, cascading workspace deletion with an output schema present, the description omits the scope of destruction (child docs, folders, tags, membership) and any recovery path. It is adequate but leaves the agent guessing about blast radius.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the confirmWorkspaceId match requirement is fully documented in the schema. The description adds nothing about the two required parameters, which is acceptable given full schema coverage — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (workspace) with the key qualifier 'permanently'. It is distinguishable from siblings like delete_doc or delete_folder by resource type, though it does not explicitly contrast with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives, no prerequisites (ownership/admin rights) stated, and no warning about when not to use it. 'Permanently' hints at caution but implies rather than instructs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_doc_markdownExport Document MarkdownCRead-onlyIdempotent
Export AFFiNE document content to markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| includeFrontmatter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| tags | No | |
| docId | No | |
| error | No | |
| lossy | No | |
| stats | No | |
| title | No | |
| exists | No | |
| details | No | |
| markdown | No | |
| warnings | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety is covered structurally. The description adds nothing beyond them: it says nothing about conversion fidelity (e.g., what markdown export loses), auth/workspace requirements, or the effect of the frontmatter option.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It is efficient, though the terseness is part of why behavioral and parameter detail is missing rather than a sign of disciplined drafting.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (3 params, one required) and an output schema exists, so return values need not be described. Still, for an export/conversion tool the frontmatter behavior and the fidelity trade-off versus export_with_fidelity_report are material omissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with includeFrontmatter carrying no description at all. The description does not compensate — it never mentions frontmatter, defaults, or what 'includeFrontmatter' adds to the output, leaving the one undocumented parameter unexplained in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Export') plus resource ('AFFiNE document content') and the output format (markdown), so the agent knows exactly what the call produces. It does not, however, distinguish itself from the sibling export_with_fidelity_report or explain how it differs from read_doc/get_doc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this over export_with_fidelity_report or simply reading the doc. No prerequisites, no when-not conditions, and no mention of alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_with_fidelity_reportExport With Fidelity ReportARead-onlyIdempotent
Export document markdown together with a structured fidelity report that highlights markdown loss risk and unsupported AFFiNE-native content.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| includeFrontmatter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| exists | No | |
| details | No | |
| fidelity | No | |
| markdown | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds what the report contains (loss risk, unsupported native content), which is genuine beyond-schema context, but it says nothing about report size, granularity, or whether the export is coupled to the report generation failing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the compound output is stated before any elaboration. It is efficient, though the brevity is part of why sibling differentiation is missing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present for the report and annotations covering the safety profile, most of the burden is already carried elsewhere. What remains missing is only the includeFrontmatter semantics and the sibling routing, which is a modest gap for a one-required-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%; docId and workspaceId are described in the schema, but includeFrontmatter has no description anywhere. The tool description adds no parameter-level meaning, so the one undocumented flag remains a genuine (if small) gap rather than a failure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (export) and compound resource (markdown + structured fidelity report) and names what the report covers (markdown loss risk, unsupported AFFiNE-native content). It is clear what the tool produces, but it never distinguishes itself from the closely related siblings export_doc_markdown and analyze_doc_fidelity, whose combined behavior this tool appears to wrap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'highlights markdown loss risk and unsupported AFFiNE-native content' implies the use case is exporting when content fidelity matters, but the description never says when to pick this over export_doc_markdown or analyze_doc_fidelity, nor does it state any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max matches to return (default: 50). | |
| title | Yes | The exact title to match. | |
| workspaceId | No | Workspace ID (optional if AFFINE_WORKSPACE_ID is set). | |
| caseInsensitive | No | If true, fold case for comparison (default: false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| query | No | |
| details | No | |
| matches | No | |
| causeCode | No | |
| retryable | No | |
| truncated | No | |
| caseInsensitive | No | |
| recoveryGuidance | No | |
| workspaceDocCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses the case-sensitivity default and its override, the performance profile ("reads workspace metadata — fast, no per-doc fetch"), the match ceiling and truncation behavior, and that ambiguity is deliberately not resolved. This is context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then the discriminating details. Dense but nearly every clause carries information, though the explicit "Returns: {...}" block is somewhat redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup tool with an output schema, everything an agent needs is present: scope, defaults, limits, case behavior, performance, and sibling routing. The return-shape restatement is slight surplus rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns more by clarifying cross-tool semantics the schema cannot — search_docs caps at 20 while here limit defaults to 50 and maxes at 200, and caseInsensitive is off by default. It does not mention workspaceId's env-var fallback, though the schema does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Resolve docs by exact title") plus the key behavioral distinction (returns ALL matches, ambiguity left to callers). An agent can immediately tell what this does and how it differs from search_docs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly contrasts with the sibling ("Unlike `search_docs`...") and gives the selection rule: "Prefer this over `search_docs` when you know the exact title and want every match." Both when-to-use and the alternative are named outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_capabilitiesGet CapabilitiesARead-onlyIdempotent
Return machine-readable capability flags for this MCP server, including static feature support and the effective enabled tool surface.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docs | No | |
| error | No | |
| server | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so safety is fully covered without the description. The description adds one useful non-obvious detail — that results reflect the *effective enabled* surface, not just static support — but says nothing about whether that reflects auth/config, or about latency or caching.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The key qualifier (effective enabled tool surface) is placed at the end where it gets emphasis, and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and with zero parameters there are no input semantics to cover. The only shortfall is the absence of any prompt about when calling this is worthwhile, which leaves the agent to infer the trigger condition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. The description correctly implies no inputs are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Return) and resource (machine-readable capability flags) with explicit scope: static feature support plus the effective enabled tool surface. Against a sibling set made up entirely of workspace/doc/content operations, this is unmistakably the server-introspection tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — an agent can infer it should call this to discover which features and tools are actually enabled. There is no explicit 'when to use' (e.g., before attempting a tool that may be gated), no exclusions, and no named alternative, so nothing is stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| collectionId | Yes | AFFiNE collection id from list_collections or create_collection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| name | No | |
| error | No | |
| rules | No | |
| details | No | |
| allowList | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered structurally. The description adds that the response includes rules and allow-list, but does not disclose error behavior for missing ids or auth/workspace requirements beyond what the schema says.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no waste; the core purpose is front-loaded and the routing hint follows immediately. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full annotation coverage, and 100% parameter coverage, the description only needs to state purpose and routing, which it does. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in-schema, so the schema carries the load. The description adds no format or syntax detail beyond the id-based lookup, matching the baseline for full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (one AFFiNE sidebar collection) with the scope qualifier 'by id' and names the payload contents (rules and allow-list). This clearly distinguishes it from list_collections and the mutation siblings (update_collection, delete_collection).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to list_collections when the id is unknown, which is the main selection ambiguity. No guidance on when-not-to-use or how it relates to sibling readers like get_doc, but the key alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| error | No | |
| value | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds genuinely useful context beyond that: this returns metadata only, not document body, which is the key behavioral fact an agent could otherwise get wrong by calling it expecting content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, the capability stated first and the disambiguation second. No filler, no restatement of the title, and every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema is present, so return values needn't be explained, and annotations cover the safety profile. What remains is a minor gap: nothing about error behavior for an invalid or inaccessible docId, or cross-workspace lookup constraints, but for a simple two-parameter read tool this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters carry their own descriptions, including the workspaceId omission rule tied to AFFINE_WORKSPACE_ID. The description says 'one document' but adds no syntax, format, or edge-case detail for docId beyond what the schema already states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read GraphQL metadata for one document') and enumerates the fields returned (title, summary, public state, roles, timestamps), which precisely delimits the tool from content access. It also explicitly contrasts with read_doc, so an agent can distinguish it from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear routing rule: 'Use read_doc when you need block content,' which tells the agent exactly when to pick the sibling instead. It does not address related discovery or permission siblings like list_docs, search_docs, or get_capabilities, but the primary use/avoid split is stated outright rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_doc_iconGet Document IconARead-onlyIdempotent
Read the current sidebar icon of a document. Returns null when none is set.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | The document whose icon to read. | |
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| icon | No | |
| kind | No | |
| docId | No | |
| error | No | |
| details | No | |
| hasIcon | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds a useful edge-case behavior: it returns null when no icon is set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core action front-loaded and the null-return edge case immediately after. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only getter with an output schema and strong annotations, the description covers the main action and the null case. The main omission is any explanation of the optional workspaceId parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%: docId is documented in the schema, but workspaceId has no schema description. The tool description does not explain what workspaceId means or when it should be supplied, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read the current sidebar icon of a document.' The read verb distinguishes it from update_doc_icon, though it does not explicitly mention get_folder_icon as the folder counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Read the current sidebar icon of a document,' but there is no explicit when-to-use guidance, no exclusions, and no named alternatives such as update_doc_icon or get_folder_icon.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | Document ID | |
| workspaceId | No | Workspace ID (optional if default set) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| bounds | No | |
| exists | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| elementCounts | No | |
| edgelessBlocks | No | |
| surfaceBlockId | No | |
| surfaceElements | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent, non-destructive profile. The description adds useful behavioral context about coverage—what element types are included, that positions are returned as xywh, and that bounding box and per-type counts are aggregated. It does not discuss pagination, ordering, or hidden/deleted elements, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences with no filler. It front-loads the primary purpose and return scope, then ends with a practical usage cue.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a present output schema, complete parameter descriptions, and annotations covering safety, the description gives enough additional context about what the tool returns and when to use it. Nothing essential for correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so docId and workspaceId are already documented in the schema. The description does not add parameter-specific meaning beyond implying that the tool reads a document's canvas. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ("Read") and a precisely scoped resource ("full edgeless canvas"), then enumerates what is included: edgeless-positioned blocks with xywh plus all surface elements. This scope distinguishes it from narrower siblings like list_surface_elements or get_doc, even without naming them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition: "Use this when you need to understand canvas layout end-to-end before placing new elements." It does not explicitly name alternatives or exclusions, so it falls short of full when/when-not guidance, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_folder_iconGet Folder IconBRead-onlyIdempotent
Read the current sidebar icon of an organize folder. Returns null when none is set. Experimental.
| Name | Required | Description | Default |
|---|---|---|---|
| folderId | Yes | The organize folder whose icon to read. | |
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| icon | No | |
| kind | No | |
| error | No | |
| details | No | |
| hasIcon | No | |
| folderId | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds two things the annotations do not: the null return when no icon is set, and an 'Experimental' stability warning. That is real added context, though mutation-adjacent details such as permission requirements are left out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no filler. The 'Experimental' note is terse but placed at the end where a stability caveat belongs. Slightly telegraphic, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile. The remaining gap is the undocumented workspaceId parameter and the lack of any pointer to update_folder_icon as the write counterpart, which leaves the definition just barely complete for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: folderId is documented in the schema, workspaceId is documented nowhere. The description's 'organize folder' restates the folderId description rather than explaining what workspaceId scopes or whether it defaults. With a coverage gap present, the description should compensate and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Read the current sidebar icon of an organize folder.' That resource phrasing implicitly separates it from get_doc_icon and from the mutating update_folder_icon. It does not explicitly name a sibling, but an agent can place it correctly from the resource alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no mention of the paired update_folder_icon for writing. Usage is only implied by the verb 'Read'. Adequate for a simple lookup, but the agent gets no routing help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mindmapGet Native MindmapARead-onlyIdempotent
Read and validate native mindmap hierarchy, ordered child IDs, text, collapsed state, geometry, and supported directions. Discover mindmapId via get_edgeless_canvas.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | ||
| mindmapId | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| nodes | No | |
| style | No | |
| layout | No | |
| locked | No | |
| rootId | No | |
| details | No | |
| causeCode | No | |
| mindmapId | No | |
| nodeCount | No | |
| retryable | No | |
| layoutType | No | |
| workspaceId | No | |
| lockedBySelf | No | |
| surfaceBlockId | No | |
| lockedByAncestor | No | |
| recoveryGuidance | No | |
| supportedLayouts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds the useful detail that the call validates the hierarchy and exposes ordered child IDs plus supported directions, but with an output schema present, disclosure of return contents is not strictly needed. It adds some value, not rich behavioral context (no error semantics for invalid IDs).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The core capability is stated first and the prerequisite ID-discovery hint follows, so it is properly front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With rich annotations, an output schema, and only three simple string parameters, the description covers what it does, what it returns, and how to obtain the required ID. Minor gaps remain around workspaceId's role and behavior on an invalid or missing mindmapId.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate: it does explain the origin of mindmapId via get_edgeless_canvas, which is the one non-obvious parameter. But docId and workspaceId (both opaque IDs, with docId reused as the pattern ref for mindmapId) receive no explanation of format, scope, or relationship.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Read and validate') plus the resource ('native mindmap hierarchy') and even enumerates the returned facets (ordered child IDs, text, collapsed state, geometry, directions). It distinguishes itself from the many mutation siblings (create_mindmap, add_mindmap_node, reparent_mindmap_node) simply by being the read side, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies a concrete discovery path for the required mindmapId ('Discover mindmapId via get_edgeless_canvas'), which is real when-to-use guidance an agent needs before calling. It does not, however, state when this read is unnecessary (e.g. vs. create_mindmap's return value) or any exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| count | No | |
| error | No | |
| details | No | |
| orphans | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive, so the bar is lower. The description still adds real value: it discloses the O(n) full-scan cost, the reference types scanned, and that each result carries an inTrash flag — none of which are in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core definition, then caveat, then result detail. No filler and each sentence contributes distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be described, and the inTrash flag is helpfully surfaced. However, for a tool whose only input is a workspace selector, leaving workspaceId's meaning and default scope undocumented is a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the sole parameter workspaceId is never mentioned in the description; its optionality (0 required) and default scope are left unexplained. Only the vague phrase 'scans all docs' hints at scope, which does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (find) and resource (documents with no parent) and operationally defines 'orphan' by naming the exact reference types (embed_linked_doc, embed_synced_doc, LinkedPage). This clearly separates it from siblings like list_docs or list_workspace_tree.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a motivation ('useful for workspace hygiene') which implies when to reach for it, but names no alternatives and sets no exclusions — an agent must infer that list_workspace_tree is the structural alternative. Usage is implied rather than specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workspaceGet WorkspaceBRead-onlyIdempotent
Get workspace details with best-effort profile metadata and a direct URL
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workspace ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| url | No | |
| code | No | |
| name | No | |
| error | No | |
| value | No | |
| avatar | No | |
| public | No | |
| details | No | |
| enableAi | No | |
| causeCode | No | |
| createdAt | No | |
| retryable | No | |
| permissions | No | |
| profileStatus | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The phrase 'best-effort profile metadata' usefully warns that profile fields may be incomplete or unreliable, but it doesn't say what 'best-effort' actually means or what happens when the ID is unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler and no repetition of the title. It is arguably too short for the 'best-effort' caveat it introduces, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A simple single-parameter read operation with full annotation coverage and an output schema, so the description needn't document return shape. It states the resource and the headline payload; only edge-case behavior (not found, partial metadata) is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is only one parameter ('id', documented as 'Workspace ID'), so the schema carries the semantics. The description adds nothing beyond that baseline about ID format, source, or whether slugs are accepted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb+resource combination ('Get workspace details') that cleanly separates it from list_workspaces and the create/update/delete sibling family. It also names what comes back (profile metadata, direct URL), though it never explicitly contrasts itself with list_workspaces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit when-to-use guidance, no prerequisites (e.g. needing a known workspace ID rather than a name), and no mention of when list_workspaces would be the better call. Usage is only inferable from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_template_structureInspect Template StructureARead-onlyIdempotent
Inspect a template doc's native structure, tags, and fallback risk before instantiation.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| templateDocId | Yes | The template doc to inspect. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| tags | No | |
| error | No | |
| title | No | |
| blocks | No | |
| noteId | No | |
| pageId | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| surfaceId | No | |
| blockCount | No | |
| workspaceId | No | |
| rootBlockIds | No | |
| templateDocId | No | |
| fallbackReasons | No | |
| recoveryGuidance | No | |
| nativeCloneSupported | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds that the result includes a 'fallback risk' judgement, which is genuinely extra behavioral context, but leaves that term undefined and says nothing about cost or depth of the inspection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the verb and the three things returned. Nothing is padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be spelled out, and annotations cover the safety profile for a two-parameter read. Only the undefined 'fallback risk' concept keeps it from being fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema. The description only echoes that a template doc is the subject and adds nothing about workspace scoping or what makes an id valid; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Inspect') plus a precise resource and three named aspects: native structure, tags, and fallback risk. It is clearly distinguishable from authoring/modification siblings, but it never names instantiate_template_native, the tool it logically precedes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'before instantiation' implies the workflow slot this tool occupies, which is useful context. However, it stops short of naming the alternative it gates or stating when inspection can be skipped, leaving the agent to infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
instantiate_template_nativeInstantiate Template NativelyB
Instantiate a template using native AFFiNE block cloning when supported, falling back to markdown materialization only when necessary.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Optional title for the new document. Defaults to the template title. | |
| variables | No | Key-value map of {{variable}} substitutions applied during cloning. | |
| parentDocId | No | Optional parent doc to link the instantiated doc under in the sidebar. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| preserveTags | No | If true (default), copy the template's tags onto the instantiated doc. | |
| allowFallback | No | If false, fail instead of falling back to markdown materialization when native cloning is unsupported. | |
| templateDocId | Yes | The template doc to instantiate. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| mode | No | |
| docId | No | |
| error | No | |
| stage | No | |
| title | No | |
| status | No | |
| details | No | |
| warnings | No | |
| causeCode | No | |
| retryable | No | |
| blockCount | No | |
| workspaceId | No | |
| rootBlockIds | No | |
| preservedTags | No | |
| linkedToParent | No | |
| contentPersisted | No | |
| recoveryGuidance | No | |
| metadataPersisted | No | |
| sourceTemplateDocId | No | |
| unresolvedVariables | No | |
| nativeCloneSupported | No | |
| requiresManualRepair | No | |
| replacedVariableCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds genuine behavioral context beyond the annotations: there are two execution paths (native cloning vs. markdown materialization) and the second is a degraded fallback. It does not say what side effects the markdown path has (fidelity loss, structure flattening) or that a new doc is created, which matters given idempotentHint=false and openWorldHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the primary mechanism comes before the fallback clause. It is efficient, though arguably too terse for a 7-parameter creation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the schema documents parameters thoroughly. But for a non-idempotent, open-world creation tool with a fallback path, the description omits what the fallback implies for fidelity and when the agent should set allowFallback=false, leaving the picture only adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters including variables, preserveTags, and allowFallback are already documented. The description names no parameters and adds no semantics beyond the schema, which is acceptable only at the baseline for full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Instantiate a template') plus the mechanism (native AFFiNE block cloning with markdown fallback), which distinguishes it from create_doc_from_markdown. It stops short of naming the sibling it replaces or complements, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Falling back to markdown materialization only when necessary' implies the preferred path and a conditional fallback, which is useful usage guidance. However it never states when to pick this over create_doc_from_markdown or how it relates to inspect_template_structure, leaving alternative selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | The parent doc whose children to list. | |
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| count | No | |
| docId | No | |
| error | No | |
| details | No | |
| children | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world, so the safety profile is covered. The description adds the shape of the result (docId, title, URL, inTrash) and the semantic definition of a child, but says nothing about depth limits, pagination, or whether inline references outside the sidebar are included — useful but modest added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both earning their place: the first defines scope and child semantics up front, the second gives the return shape. No filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with full annotations and an output schema, the description covers the essential ambiguity (what a 'child' is) and the return fields. The only real gap is the unexplained optional workspaceId, which is left entirely to the schema and isn't documented there either.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: docId is documented in the schema, but workspaceId has no description anywhere. The tool description mentions no parameters at all, so it does nothing to compensate for the undocumented workspaceId (e.g. whether it scopes the lookup or overrides the doc's workspace).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the direct children of a document in the sidebar') and then defines exactly what counts as a child (embed_linked_doc / embed_synced_doc blocks and inline LinkedPage references). This sharply separates it from list_docs, list_workspace_tree, and list_organize_nodes, which an agent might otherwise confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sidebar/child-block framing implies when this tool applies, but it never states when to prefer it over list_workspace_tree or get_orphan_docs, nor any prerequisites. Usage is inferable rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| items | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the useful prerequisite context before mutations and says it returns collection rules, but it does not add further behavioral detail such as pagination, permissions, or result scope beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted text, and the core purpose is front-loaded before the usage guidance. The phrase 'read-only' repeats the annotation slightly, but it does not harm efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, rich annotations, and a fully documented single parameter, the description gives enough context to call the tool correctly. It could be slightly stronger by clarifying how it relates to get_collection, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single workspaceId parameter is fully documented in the schema. The description adds no parameter-specific guidance, which is acceptable at baseline 3 when the schema already does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List AFFiNE sidebar collections and their rules.' It is clear what the tool returns, but it does not explicitly distinguish itself from the sibling get_collection beyond the plural 'List.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage context: 'Use this read-only tool before updating, deleting, or adding documents to a collection.' This tells the agent when to call it, though it does not name the specific alternative mutation tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Cursor from pageInfo.endCursor for fetching the next page. | |
| docId | Yes | Document id whose comments should be listed. | |
| first | No | Maximum number of comments to return from the AFFiNE pagination connection (1-200). | |
| offset | No | Zero-based offset used by AFFiNE pagination (maximum 1,000,000). Do not combine with after unless the AFFiNE API requires it. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| edges | No | |
| error | No | |
| details | No | |
| pageInfo | No | |
| causeCode | No | |
| retryable | No | |
| totalCount | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description still adds real behavioral context: results are paginated, and returned comments include nested replies and resolution state. What it omits is whether pagination applies to nested replies too and what the default page size is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the payload description is front-loaded ahead of the routing advice. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema and complete parameter descriptions, the description needs only to explain purpose and sequencing, which it does. The one gap is pagination mechanics for nested replies versus top-level comments, which an agent may need before paging through a large thread.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter (after, first, offset, docId, workspaceId) is documented in-schema with bounds, so the baseline of 3 applies. The word "paginated" loosely signals after/first/offset, but the description adds no syntax, defaults, or interaction rules beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List paginated comments for a document") plus the content scope: nested replies and resolution state. That scope statement alone distinguishes it from create_comment/update_comment and from unrelated list_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use this before update_comment, delete_comment, or resolve_comment when the existing comment ids are needed. It names three concrete alternatives and the condition that selects this tool over them, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_doc_propertiesList Document PropertiesARead-onlyIdempotent
List native workspace custom-property definitions and document values. Set includeLegacy to read older unscoped data separately for recovery; this never migrates or writes data.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | ||
| workspaceId | No | ||
| includeLegacy | No | Include retained pre-3.8.4 data in a separate legacy result for manual recovery |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| legacy | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| properties | No | |
| definitions | No | |
| workspaceId | No | |
| orphanValues | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is mostly covered; 'never migrates or writes data' is largely a restatement. The genuinely additive disclosure is that legacy pre-3.8.4 data comes back in a separate result for manual recovery, but return shape and pagination are left unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, then the flag caveat. No filler; only minor loss is that the legacy note interleaves behavior and parameter explanation in a single clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and annotations cover the safety profile. The remaining gap is the relationship between docId and workspaceId (are workspace-level definitions scoped by workspaceId?), which an agent would need to call this correctly in workspace contexts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% — docId (required) and workspaceId have no descriptions in either schema or description. The description compensates for one parameter by explaining includeLegacy's purpose and non-destructive nature, which goes beyond the schema's one-liner, but the two identity parameters remain entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'List native workspace custom-property definitions and document values.' This clearly separates it from mutating siblings like set_doc_property, clear_doc_property, and create_custom_property, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The includeLegacy guidance gives a real when-to-use condition ('for recovery'), and the 'never migrates or writes data' note scopes expectations. However, there is no guidance on when to choose this over get_doc or clear_doc_property, and it doesn't state whether workspaceId is needed alongside docId to see workspace-level definitions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_docsList DocumentsARead-onlyIdempotent
List documents in a workspace (GraphQL), falling back to bounded workspace metadata when GraphQL document access is denied. Each doc includes an inTrash flag; fallback summary, public, and defaultRole values are null. GraphQL and fallback cursors are not interchangeable; restart pagination without after if a cursor is rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Cursor from pageInfo.endCursor for fetching the next page. | |
| first | No | Maximum number of items to return from the AFFiNE pagination connection (1-200). | |
| offset | No | Zero-based offset used by AFFiNE pagination (maximum 1,000,000). Do not combine with after unless the AFFiNE API requires it. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| edges | No | |
| error | No | |
| details | No | |
| pageInfo | No | |
| causeCode | No | |
| retryable | No | |
| totalCount | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/idempotentHint already declared, the description still contributes genuine behavioral detail: it discloses that GraphQL denial triggers a degraded metadata-only fallback and that fallback fields (summary, public, defaultRole) come back null. That is exactly the kind of non-obvious degradation an agent needs. It does not mention rate limits or what the transition looks like to the caller, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the primary operation before the fallback and cursor caveat. Minor cost: the clause "fallback summary, public, and defaultRole values are null" references output fields not present in the schema or description context, so it's terse to the point of being slightly opaque.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and readOnly annotations cover the safety profile. For a paginated list tool with four optional parameters, the description covers the transport, the degraded path, the null-field consequence, and the cursor rule — nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above baseline by warning that GraphQL and fallback cursors are not interchangeable and must not be reused across modes — a semantic constraint the schema cannot express. It adds no detail on first/offset interplay, which is already handled by schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("List documents in a workspace") and names the underlying transport (GraphQL) plus a degraded mode. Scope is clear enough to separate it from get_doc/read_doc, but it never contrasts itself with search_docs or find_doc_by_title, which are the closest siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the fallback path and gives actionable cursor guidance ("restart pagination without after if a cursor is rejected"), which is real usage help. However it never states when an agent should choose this over search_docs, find_doc_by_title, list_children, or list_workspace_tree — that choice is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_docs_by_tagList Documents By TagBRead-onlyIdempotent
List documents that contain the requested tag. This is read-only and each result includes title metadata and an inTrash flag.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | Tag name to match against workspace tag labels. | |
| ignoreCase | No | Case-insensitive tag matching (default: true). | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| tag | No | |
| code | No | |
| docs | No | |
| error | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| totalDocs | No | |
| ignoreCase | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so 'This is read-only' is redundant rather than informative. The description does add that each result includes title metadata and an inTrash flag, which is behavioral context the annotations do not convey, but it is silent on pagination, result limits, and whether trashed docs are included or merely flagged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, with the core operation front-loaded and the result-shape note following. Minor waste in restating the read-only hint already present in annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and all three parameters are documented in the schema. For a simple read-only list tool the remaining gaps (pagination, scope across workspace) are small.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the tag, ignoreCase default, and workspaceId fallback are fully documented in the schema. The description adds nothing about parameter behavior beyond what is already structured, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus a clear qualifier ('List documents that contain the requested tag'), so an agent can tell it apart from list_docs, search_docs and find_doc_by_title by the tag filter alone. It stops short of explicitly naming those siblings, which keeps it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when this tool is preferable to list_docs, search_docs, find_doc_by_title, or how it pairs with list_tags. Usage is only inferable from the name and the phrase 'contain the requested tag'; there are no alternatives or exclusions offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_historiesList HistoriesCRead-onlyIdempotent
List doc histories (timestamps) for a doc.
| Name | Required | Description | Default |
|---|---|---|---|
| guid | Yes | ||
| take | No | Maximum history entries to return (1-200). | |
| before | No | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| items | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds only that entries are timestamps; it says nothing about ordering (newest first?), pagination behavior, or whether histories exist for trashed/unpublished docs. With annotations carrying the safety burden, a 3 is fair.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though the terseness comes at the cost of the missing guidance scored elsewhere rather than being gratuitous verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be explained. But for a paginated history lister with an undocumented 'before' cursor and 'take' cap, ordering and pagination semantics are essential and absent, leaving the agent unable to page correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 25% — only 'take' is documented in the schema. The description does not compensate: 'before' is unexplained (cursor? timestamp? exclusive/inclusive?), 'workspaceId' is unexplained despite the tool being scoped 'for a doc', and even 'guid' is only implied by 'for a doc'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List doc histories') and parenthetically clarifies the payload is timestamps. It does not, however, distinguish itself from nearby read siblings like read_doc or get_doc that might also surface history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites (does the doc need to be published/versioned?), and no alternative named. The agent must infer that this is the tool for version history versus get_doc or read_doc.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notificationsList NotificationsARead-onlyIdempotent
List one server page of current-user AFFiNE notifications in a stable envelope. The response preserves each edge cursor, server pageInfo, and serverTotalCount. unreadOnly is a client-side filter over only the fetched page; it does not change server counts or pageInfo.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Cursor from pagination.pageInfo.endCursor. Mutually exclusive with offset. | |
| first | No | Number of notifications to fetch (default 20, maximum 100). | |
| offset | No | Zero-based offset pagination. Mutually exclusive with after. | |
| unreadOnly | No | Return only unread notifications from the fetched server page; this is not a server-wide unread query. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| error | No | |
| items | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the response envelope behavior (edge cursors, pageInfo, serverTotalCount preserved) and, critically, warns that unreadOnly is a client-side filter over only the fetched page and does not affect server counts or pageInfo — a subtle semantic trap an agent would otherwise fall into.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is listed and scoped to a page, then the return shape, then the one behavioral caveat that matters. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% schema coverage, the description needn't restate return values or defaults; it covers scope, envelope, and filter semantics. Minor gaps remain around sort order and how to chain pages forward/backward.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns an extra point by reinforcing the unreadOnly semantics (page-scoped, does not alter counts or pageInfo) and tying the cursor to preserved pageInfo, which clarifies how `after` is obtained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (List ... current-user AFFiNE notifications) and scopes it precisely to 'one server page', which implicitly separates it from read_all_notifications. It stops short of naming that sibling, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the phrase 'one server page' suggests this for paginated browsing, but there is no explicit instruction on when to pick this over read_all_notifications, nor any prerequisite or exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| nodes | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| storageDocId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so safety is fully covered structurally. The description adds the 'Experimental' stability caveat and the fact that results come from the folders workspace DB, but says nothing about permissions, result shape, or volume/pagination. With rich annotations, a 3 is warranted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the scope statement and data source front-loaded ahead of the usage hint. The 'Experimental' marker earns its place as a stability signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A read-only list tool with a documented single optional parameter, full annotations, and an output schema, so return values need not be explained. What remains missing is minor: whether both folders and links are always returned together and any ordering/paging behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (workspaceId) and schema description coverage is 100%, so the schema already explains the omission rule tied to AFFINE_WORKSPACE_ID. The description adds nothing about the parameter, which is acceptable at full coverage but not above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and a specific resource (AFFiNE sidebar organize folder and link nodes) plus the data source (folders workspace DB), which distinguishes it from siblings like list_workspace_tree or list_collections. The 'Experimental' prefix also flags the tool's maturity, though it slightly muddies the core statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this before moving or deleting organize nodes' gives a concrete trigger and implicitly points to move_organize_node and delete_organize_link. It stops short of naming those siblings or stating when not to use it (e.g., when reading a full doc tree), so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by element type | |
| docId | Yes | Document ID | |
| elementId | No | Filter to a single element id | |
| workspaceId | No | Workspace ID (optional if default set) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| count | No | |
| docId | No | |
| error | No | |
| exists | No | |
| details | No | |
| elements | No | |
| causeCode | No | |
| retryable | No | |
| surfaceBlockId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds genuine behavioral detail beyond that: bounds are returned both as raw xywh strings and parsed objects, and Y.Text fields are flattened to plain strings — non-obvious serialization behavior an agent would otherwise have to discover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the action and scope before the return-format detail. The bounds/serialization sentence partially duplicates what the output schema likely carries, but it is dense and earns most of its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 100% schema coverage, complete annotations, and an output schema, the description need only cover scope and any surprises. It does both, including the Y.Text serialization caveat and the dual bounds representation. Only pagination or element-count limits for large canvases is arguably missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline applies. The description only restates that filtering is possible by element type or id, without adding syntax, defaults, or the interaction rule when both type and elementId are supplied — which is the one thing the schema leaves ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('List') and resource ('shape/connector/text/group elements on the AFFiNE edgeless canvas surface'), making the operation unambiguous. It does not, however, distinguish itself from the sibling get_edgeless_canvas, which an agent could easily confuse with this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the mention of optional filters by element type or id hints at narrowing a canvas read, but there is no explicit statement of when to call this versus get_edgeless_canvas or the add/update/delete_surface_element siblings. The agent must infer the read-only inspection scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| tags | No | |
| error | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| totalTags | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, so safety needs no restating. The description adds value beyond them by scoping the result as 'all' tags at workspace level (implying complete enumeration, not a filtered page) and specifying that attachment counts are included per tag, which is behavioral/dataset context the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. Content description comes first, the workflow rule second, so it is front-loaded with what the tool returns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape need not be described, and the single parameter is fully documented in schema. The description covers scope, content, and the pre-mutation workflow use case. Only marginal gaps remain (tag ordering or any result cap), which 'all' mostly neutralizes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter and schema description coverage is 100% — the schema already explains workspaceId and its AFFINE_WORKSPACE_ID fallback. The description adds nothing about the parameter, so baseline 3 applies; the schema does the work here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all workspace-level tags') plus exactly what each entry carries (document count per tag), which distinguishes it from the sibling list_docs_by_tag that goes the other direction. An agent can tell what it gets without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger: 'Use this before tag mutation when the exact tag name or id is unknown.' That resolves the main ambiguity (resolving a tag name/id prior to add_tag_to_doc or delete_tag). It stops short of naming the alternative lookup path for the reverse case (list_docs_by_tag), so not a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesList WorkspacesBRead-onlyIdempotent
List available AFFiNE workspaces with best-effort profile metadata and direct URLs
| Name | Required | Description | Default |
|---|---|---|---|
| includeProfile | No | Load workspace names and avatar references from realtime metadata. Set false for a faster GraphQL-only response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| items | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the key safety profile: readOnly, idempotent, non-destructive, and open-world. The description adds a useful caveat that profile metadata is 'best-effort' and that results include direct URLs, but it does not explain authentication needs, empty-result behavior, or pagination limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is one front-loaded sentence that states the core action and the notable output traits. There is no redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple read-only listing tool with rich annotations, a fully documented optional parameter, and an output schema. The description covers the essential behavior and caveats, though scope disambiguation from related workspace tools would make it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single optional includeProfile parameter already documents its default and the GraphQL-only tradeoff when set false. The description adds no parameter-specific semantics beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('List available AFFiNE workspaces') and adds useful scope details about metadata and direct URLs. It does not explicitly distinguish this flat listing from siblings like get_workspace or list_workspace_tree, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus alternatives such as get_workspace or list_workspace_tree. The listing intent is implied by the verb, but there are no stated conditions, exclusions, or alternative routes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Max nesting depth to return (default: 3, maximum: 20). | |
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| tree | No | |
| error | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| rootCount | No | |
| totalDocs | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, and the description adds real behavioral context on top: the full-load performance characteristic on large workspaces and the presence of an inTrash flag per node. It stops short of describing ordering, pagination, or failure behavior, but the performance caveat is exactly the kind of context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the output shape, then the scoping control, then caveats. The inTrash sentence is partially redundant given an output schema exists, so it is efficient but not maximally trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be explained, and the performance/trash notes are good. The remaining hole is the unaddressed workspaceId default and whether the tree is ordered — relevant for a tool whose entire purpose is producing a scoped hierarchy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: depth is fully documented in the schema, and the description merely restates its default. The workspaceId parameter is undocumented in both schema and description — it is never stated whether omitting it defaults to the current workspace or spans all workspaces, which materially changes the result.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Returns the full document hierarchy as a tree (roots → children → grandchildren)' — which clearly separates it from flat listers like list_docs and single-level listers like list_children. It does not name those siblings explicitly, so an agent must infer the distinction from the shape of the output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (use it to see the whole hierarchy) and it adds a warning that it 'loads all docs — may be slow on large workspaces.' However, it never says when to prefer list_docs or list_children instead, and the depth guidance is parameter behavior rather than selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_blockMove BlockA
Move an existing block without changing its id. Reuses append_block placement semantics and rejects document-root moves and cycles.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| blockId | Yes | Block id to move. | |
| placement | Yes | Destination parent or position, using append_block placement semantics. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| block | No | |
| error | No | |
| moved | No | |
| blockId | No | |
| details | No | |
| toIndex | No | |
| causeCode | No | |
| fromIndex | No | |
| retryable | No | |
| toParentId | No | |
| fromParentId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-readonly, non-idempotent, non-destructive, so the safety envelope is already given. The description adds real value beyond that: it guarantees block id stability, points to append_block for placement semantics, and discloses two hard failure modes (document-root moves and cycles). It doesn't mention atomicity or what happens on a stale expectedRevision, though the schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the core invariant is front-loaded in the first clause. Every clause carries distinct information (id stability, placement semantics, two rejection cases).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full schema coverage, and annotations, the description covers the essentials for a mutation: id preservation, placement source, and validation failures. Minor gaps remain around atomicity/revision-conflict behavior, but nothing an agent needs in order to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the nested placement object is already documented as 'using append_block placement semantics', so the description's reference to that semantics is largely a repeat. It adds only the id-preservation note tied to blockId, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource ('Move an existing block') plus a key invariant ('without changing its id'), which separates it from update_block and delete_block. It doesn't explicitly contrast with append_block or update_block beyond referencing append_block's placement semantics, so sibling differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the 'an existing block' framing and by the rejection rules (no document-root moves, no cycles), which tell the agent what inputs are invalid. However, there is no explicit when-to-use statement or named alternative (e.g. 'to create a new block use append_block').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_docMove Document in SidebarA
Move a doc in the AFFiNE sidebar. The destination link is validated and added before the optional source link is removed, cycles are rejected, and partial outcomes are reported explicitly.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | The doc to move. | |
| workspaceId | No | ||
| toParentDocId | Yes | The new parent doc that will contain the embed. | |
| fromParentDocId | No | The current parent doc to remove the embed from. If omitted, only adds to new parent. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| docId | No | |
| error | No | |
| moved | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| toParentDocId | No | |
| recoveryGuidance | No | |
| removedFromParent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing transactional ordering (destination link validated and added before the source link is removed), cycle rejection as a guardrail, and explicit reporting of partial outcomes. These are exactly the behaviors an agent cannot infer from destructiveHint=false and are essential for a non-idempotent mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the operation front-loaded and zero filler. The second sentence packs four distinct behavioral facts (validation, ordering, cycle rejection, partial reporting) without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape needn't be explained, and the mutation semantics are well covered. The only gap is workspaceId, which has no schema description and is not mentioned in the description either, leaving its role unscoped for a multi-workspace caller.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the schema already documents docId, toParentDocId and the optional fromParentDocId. The description adds the sequencing semantics — that the destination link is written first and the source link removed only afterward — which explains the practical consequence of omitting fromParentDocId beyond the schema's own note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: moving a doc within the AFFiNE sidebar. The sidebar framing implicitly separates it from move_block and move_organize_node, but neither sibling is named, so an agent must infer which move tool applies to which structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'in the AFFiNE sidebar' and 'the optional source link' signal this is a hierarchy re-parenting operation. There is no explicit when-to-use, no prerequisites, and no routing to the many sibling move tools (move_block, move_organize_node) that could be confused with it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Optional fractional index. Defaults to append-after-last. | |
| nodeId | Yes | AFFiNE organize node id from list_organize_nodes. | |
| parentId | No | Destination folder id. Omit for root-level placement. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| error | No | |
| index | No | |
| details | No | |
| parentId | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, non-destructive, non-idempotent, open-world. The description adds real value beyond that: it discloses the key invariant that only sidebar placement changes while the underlying document/tag/collection is preserved, and flags the experimental status.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, with the experimental caveat and the effect of the operation front-loaded. Nothing redundant with the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema and annotations are present, so the description need only cover scope and risk, which it does. Minor gaps remain: no mention of error behavior (e.g., moving a folder into itself) or whether the operation is reversible, which matters for an experimental mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter is documented, so baseline is 3. The phrase 'to another folder or root' reinforces the optionality of parentId, but no extra syntax or defaults (e.g., fractional index semantics) are added beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: moving an AFFiNE *organize* folder or link node to another folder or root. The 'organize/sidebar' framing distinguishes it from content-level siblings like move_doc or move_block, though it never names those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line about preserving the target document/tag/collection and changing only sidebar placement implicitly tells the agent this is a rearranging tool, not a content move. However, there is no explicit when-to-use vs. move_doc guidance, and the 'Experimental' tag signals risk without saying what to fall back to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_docPublish DocumentA
Make a document publicly accessible through AFFiNE public sharing. This changes sharing state; use revoke_doc to disable public access later.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Public document mode to publish. Omit to let AFFiNE use its default. | |
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| docId | No | |
| error | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the key behavioral trait beyond annotations: 'This changes sharing state,' which aligns with readOnlyHint=false and clarifies the mutation. It also communicates reversibility via 'revoke_doc,' which the annotations do not. It doesn't mention idempotency (annotation says non-idempotent) or permission/auth requirements, leaving a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero waste. The core action is front-loaded in the first sentence, with the reversibility note second.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be explained, and the annotations plus schema cover safety and parameters. The description still lacks any note on who can publish or what makes a document publicly reachable, but for a three-parameter, well-annotated tool it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with 3 parameters, so the schema already documents docId, workspaceId, and the Page/Edgeless mode enum. The description adds no parameter-level meaning beyond that baseline, so a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Make a document publicly accessible through AFFiNE public sharing'), which tells an agent exactly what the tool does. It also names the sibling tool 'revoke_doc' as the inverse operation, so it is distinguishable from related tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly points to 'revoke_doc' for disabling public access later, giving clear usage context and a named alternative. However, it doesn't state preconditions or when publication should be avoided (e.g. permission requirements, sensitive docs), so it stops short of a full when/when-not treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_all_notificationsMark All Notifications ReadB
Ask AFFiNE to mark every current-user notification as read. Inspect applied/status in the response; a false server result is reported as not_applied, not as success.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| error | No | |
| details | No | |
| message | No | |
| success | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, so the mutation profile is covered structurally. The one piece of genuinely additive context is the response semantics — that a false server result surfaces as not_applied rather than success — but it does not explain scope (all notifications? all workspaces?), whether already-read notifications cause failure, or permissions required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the action front-loaded and no filler. The second sentence is slightly compressed jargon ('applied/status') but is doing real work rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not enumerate return fields, yet it usefully flags the applied/status result shape. For a no-parameter, annotation-covered mutation the definition is close to sufficient; only scope and failure conditions remain unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No parameter claims are made or needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource: 'mark every current-user notification as read', which is unambiguous about the mutation. It does not explicitly name the sibling list_notifications as a non-mutating alternative, but the 'mark as read' phrasing is clearly distinguishable from listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no alternative tool is named. The only implied guidance is the instruction to inspect applied/status afterward, which is about verification rather than tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_database_cellsRead Database CellsARead-onlyIdempotent
Read row titles and database cell values from an AFFiNE database block. Rich-text titles and cells include both plain values and formatting-preserving deltas.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | Document ID containing the database | |
| columns | No | Optional column name or ID filter. | |
| rowBlockIds | No | Optional row block ID filter. Omit to return all rows. | |
| workspaceId | No | Workspace ID (optional if default set) | |
| databaseBlockId | Yes | Block ID of the affine:database block |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| rows | No | |
| error | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds one genuinely new fact – that rich-text titles/cells return both plain values and formatting-preserving deltas – but says nothing about volume, ordering, or missing-row behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero waste; the core action is front-loaded and the delta caveat follows. Nothing redundant or speculative is included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema descriptions plus rich annotations, the description only needs to frame the operation, which it does. A note on how filters interact or on result size would close the last gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters are already documented in-schema, giving a baseline of 3. The description does not mention the optional columns or rowBlockIds filters at all, so it adds no meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: read row titles and cell values from an AFFiNE database block. That is clearly distinct from the column-metadata sibling read_database_columns, though the description never names that sibling to reinforce the split.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the resource ('cell values'), with no explicit when-to-use or when-not-to-use. It does not tell the agent to prefer read_database_columns for schema and this tool for data, nor does it mention row/column filtering as the way to narrow scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | Document ID containing the database | |
| workspaceId | No | Workspace ID (optional if default set) | |
| databaseBlockId | Yes | Block ID of the affine:database block |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| title | No | |
| views | No | |
| columns | No | |
| details | No | |
| rowCount | No | |
| causeCode | No | |
| retryable | No | |
| columnCount | No | |
| titleColumnId | No | |
| databaseBlockId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, idempotent, non-destructive, and open-world behavior. The description adds useful context about what metadata is returned and when the tool is useful, but it does not disclose additional behavioral traits such as permissions, rate limits, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose and followed by a useful usage note. Every sentence earns its place and there is no redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that annotations cover safety, the schema fully documents parameters, and an output schema exists, the description supplies enough context to call the tool correctly. It could be slightly more complete by explicitly relating the tool to row-reading alternatives, but it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already fully documents the three parameters. The description does not add any parameter-specific meaning beyond what the schema provides, which matches the baseline of 3 when schema coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reading schema metadata for an AFFiNE database block. It further clarifies that this includes columns, select options, and view column mappings, which distinguishes it from sibling tools like read_database_cells and add_database_column.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition: useful for empty databases before any rows exist. However, it does not explicitly name alternatives such as read_database_cells when rows do exist, nor does it state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_docRead Document ContentARead-onlyIdempotent
Read document block content and its revision via WebSocket snapshot. Pass revision as expectedRevision on a document write to reject stale edits through a shared MCP server. Each block includes plain text and formatting-preserving deltas. Set includeMarkdown: true to also get rendered markdown, which can be lossy for unsupported inline attributes.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| includeMarkdown | No | If true, includes rendered markdown in the response. Equivalent to also calling export_doc_markdown. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| tags | No | |
| docId | No | |
| error | No | |
| title | No | |
| blocks | No | |
| exists | No | |
| details | No | |
| markdown | No | |
| revision | No | |
| causeCode | No | |
| plainText | No | |
| retryable | No | |
| blockCount | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/non-destructive, so the safety profile is covered; the description adds genuinely new context — the WebSocket snapshot read path, the block-level return shape with formatting-preserving deltas, and a lossiness warning for markdown on unsupported inline attributes. The phrase 'through a shared MCP server' is vague filler but the rest is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four front-loaded sentences, each carrying distinct information: purpose, concurrency workflow, return shape, and the markdown opt-in caveat. Minor waste in 'through a shared MCP server', which adds no decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value enumeration is unnecessary, and docId/workspaceId semantics are fully covered by the schema. For a read of possibly large documents, a note on block ordering or result size would close the remaining gap, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns a step up by explaining what the returned revision is for (as expectedRevision on writes) and by warning that includeMarkdown 'can be lossy for unsupported inline attributes' — a caveat the schema states neutrally as 'equivalent to export_doc_markdown'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Read document block content and its revision' — plus the mechanism ('via WebSocket snapshot') and what the payload contains (blocks with plain text and deltas). It does not, however, distinguish itself from the closely named sibling get_doc or from export_doc_markdown, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Useful cross-tool guidance is present: 'Pass revision as expectedRevision on a document write to reject stale edits', and the includeMarkdown flag is scoped ('also get rendered markdown'). But there is no explicit statement of when to choose read_doc over get_doc, list_docs, or export_doc_markdown, so the selection decision is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| collectionId | Yes | AFFiNE collection id from list_collections or create_collection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| name | No | |
| error | No | |
| rules | No | |
| details | No | |
| allowList | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false, so the key safety question is answered structurally; the description reinforces this by stating that the document and collection rules are untouched, which is genuinely useful context beyond the annotation. It stops short of covering permissions, behavior when the doc is not in the allow-list, or error semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste, with the core action front-loaded and the critical non-effect clarified immediately after.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema available and full parameter documentation, the remaining burden is behavioral scope, which the description addresses by ruling out deletion and rule changes. Minor gaps remain around idempotency (annotations say non-idempotent for what reads like a set-removal) and no-op/error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and includes AFFiNE-specific guidance (collectionId from list_collections or create_collection, workspaceId omission rule), so the schema carries the parameter burden. The description adds no syntax or format detail beyond it, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (remove a document id from an AFFiNE collection allow-list) and immediately distinguishes the operation from deletion via the negative clause. An agent can tell this apart from add_doc_to_collection, delete_collection, trash_doc and delete_doc without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'does not delete the document or change collection rules' clause clarifies scope, which implicitly guides usage, but there is no explicit when-to-use statement or named alternative for the inverse operation (add_doc_to_collection). Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | Tag name to detach from the document. | |
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| tag | No | |
| code | No | |
| tags | No | |
| docId | No | |
| error | No | |
| details | No | |
| removed | No | |
| warning | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| docMetaSynced | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare mutation/non-readonly, non-destructive, non-idempotent, and open-world behavior. The description adds important context that the workspace-level tag is not deleted, which is a key behavioral distinction beyond the annotations, though it does not discuss permissions or side effects further.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and followed immediately by the sibling alternative. There is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has annotations and an output schema, and the description covers the essential scope and the key alternative. It is complete enough for an agent to invoke this tool correctly without needing additional prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented in the input schema. The description does not add parameter-specific meaning beyond what the schema provides, which fits the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Detach a tag from one document.' It also explicitly distinguishes the operation from deleting the workspace-level tag, so an agent can tell it apart from delete_tag without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit alternative and condition: use delete_tag only when the tag should be removed from every document. This directly tells the agent when to use this tool versus the sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_folderRename FolderA
Experimental: rename an AFFiNE organize folder node. This changes sidebar metadata only and does not rename documents inside the folder.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Non-empty sidebar folder or collection name. | |
| folderId | Yes | AFFiNE organize folder node id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| name | No | |
| error | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive mutation, and the description adds genuinely new information beyond that: it is experimental, it mutates sidebar metadata only, and contained documents are untouched. It does not address permissions or the non-idempotent hint, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no waste, with the experimental status and the important negative scope ('does not rename documents inside') front-loaded where the agent will read them.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema, an output schema, and annotations, the description covers the one thing structured data cannot: that this is experimental and narrow in effect. Only the permission/auth expectations for a workspace-scoped mutation are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with all three parameters documented, including the conditional requirement on workspaceId, so the schema carries the load. The description contributes nothing parameter-specific beyond baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource ('rename an AFFiNE organize folder node') plus an explicit scope boundary that separates it from document-title operations in the sibling set such as update_doc_title. The agent can identify the target object type without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Experimental' tag and the note that it only touches sidebar metadata give implicit context, but there is no explicit when-to-use versus alternatives (e.g. update_folder_icon, move_organize_node, or update_doc_title for documents). Usage is inferable but not routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reparent_mindmap_nodeReparent Native Mindmap NodeA
Move a node with all descendants to a parent in the SAME native mindmap; beforeId optionally reorders siblings. Rejects root moves, cycles, missing/foreign IDs. Preserve collapsed state. One shared MCP server serializes workspace mutations; independent servers and native editors have no compare-and-swap protection.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | ||
| nodeId | Yes | ||
| beforeId | No | ||
| parentId | Yes | ||
| mindmapId | Yes | ||
| workspaceId | No | ||
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| nodes | No | |
| style | No | |
| layout | No | |
| locked | No | |
| nodeId | No | |
| rootId | No | |
| details | No | |
| causeCode | No | |
| mindmapId | No | |
| nodeCount | No | |
| retryable | No | |
| layoutType | No | |
| workspaceId | No | |
| lockedBySelf | No | |
| surfaceBlockId | No | |
| lockedByAncestor | No | |
| recoveryGuidance | No | |
| supportedLayouts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it enumerates rejection cases (root moves, cycles, missing or foreign IDs), states that collapsed state is preserved, and explains the concurrency model — one shared MCP server serializes workspace mutations while independent servers and native editors have no compare-and-swap protection. That is exactly the operational context annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false) cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the move semantics and tightly written; every sentence adds information. The concurrency sentence is telegraphic ('independent servers and native editors have no compare-and-swap protection'), forcing some unpacking, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the mutation's rejection rules, subtree behavior, and concurrency caveats are covered. The remaining gap is workspaceId and the identity parameters, which are neither described nor explained in prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 14%, so the description carries most of the burden. It does define beforeId's sibling-ordering role and constrains parentId to the same mindmap, but docId, mindmapId, nodeId, and workspaceId are left entirely to their bare string schemas, so roughly half the parameters gain no meaning here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (move/reparent) and resource (a node with all descendants) plus a hard scope constraint: the destination parent must live in the SAME native mindmap. That scope clause alone separates it from update_mindmap_node and add_mindmap_node, which do not perform subtree relocation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Use is implied by the verb (relocating an existing subtree) and the beforeId note hints at sibling reordering, but no sibling tool is named as the alternative and no when-not-to-use case is given. An agent must infer that plain field edits belong to update_mindmap_node rather than this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_doc_with_markdownReplace Document With MarkdownADestructive
Replace the main note content of a document with markdown content.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| strict | No | ||
| markdown | Yes | Markdown content to replace with | |
| allowEmpty | No | Set true to explicitly allow clearing the main note when Markdown produces no blocks. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| docId | No | |
| error | No | |
| lossy | No | |
| stats | No | |
| details | No | |
| replaced | No | |
| warnings | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds real value by narrowing the blast radius to the 'main note content' (implying other document elements survive), but it says nothing about irreversibility, the stale-write guard via expectedRevision, or the risk of silently clearing content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the destructive action and its target are stated first. Nothing is wasted and nothing needs reordering.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so the description does not need to explain return values. However, for a destructive six-parameter write tool sitting in a dense cluster of markdown tools (create_doc_from_markdown, append_markdown, export_doc_markdown), it leaves the sibling disambiguation and the concurrency/empty-content safeguards unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, above the threshold where the schema carries parameter meaning, so baseline 3 applies. The description adds no parameter-level information at all — notably silent on strict, allowEmpty, and expectedRevision, which are the parameters that change failure modes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Replace the main note content') plus the format ('with markdown content'), and the word 'main note' scopes the target precisely. It implicitly contrasts with append_markdown and create_doc_from_markdown via 'replace', but never names them, so an agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance. The 'replace' framing implies this is for full rewrites rather than incremental edits (append_markdown) or new documents (create_doc_from_markdown), but the routing is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_commentResolve CommentA
Set a comment thread's resolved state without changing its content. Use delete_comment only when the comment should be removed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Comment id returned by list_comments or create_comment. | |
| resolved | Yes | true marks the comment resolved; false reopens it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| kind | No | |
| error | No | |
| details | No | |
| success | No | |
| resolved | No | |
| causeCode | No | |
| commentId | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, non-idempotent, open-world, so the safety profile is covered elsewhere. The description adds one genuinely useful behavioral fact ('without changing its content') but says nothing about persistence, permissions, or what happens to a thread's replies when resolved — modest added value given annotations carry most of the load.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, action first, alternative second, with zero redundancy. Every clause carries information an agent would not get from the name alone.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the tool is a simple two-parameter state toggle whose safety profile is fully annotated. The only residual gap is a small ambiguity between 'comment thread's resolved state' and the param's 'marks the comment resolved', plus no mention of required permissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both 'id' (with its source: list_comments/create_comment) and 'resolved' (true resolves, false reopens) are fully documented in the schema. The description's phrase 'resolved state' merely echoes the param and adds no syntax or edge-case detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('set a comment thread's resolved state') and adds a scope qualifier ('without changing its content') that separates it from update_comment. It does not, however, name update_comment or delete_comment as siblings by comparison in the purpose sentence, so differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives one explicit when-not rule ('Use delete_comment only when the comment should be removed'), which steers the agent between resolving and deleting. It does not cover the equally plausible alternative update_comment, so guidance is clear but incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_docRestore Document from TrashAIdempotent
Restore a document from the AFFiNE trash without changing its content. This is safe to retry.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| docId | No | |
| error | No | |
| title | No | |
| status | No | |
| changed | No | |
| details | No | |
| inTrash | No | |
| causeCode | No | |
| retryable | No | |
| trashDate | No | |
| workspaceId | No | |
| readBackVerified | No | |
| recoveryGuidance | No | |
| previouslyInTrash | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare idempotentHint=true, destructiveHint=false and readOnlyHint=false, so 'safe to retry' largely restates structured data. 'Without changing its content' is genuinely new behavioral context (the restore preserves body content), but nothing is said about error handling, permission/auth requirements, or behavior when the doc is not in trash.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler, and the core action is front-loaded before the retry-safety note. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the annotations cover the safety/idempotency profile. What's missing is only the precondition that the document must currently be trashed and any failure mode, which would materially help an agent avoid a wrong call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (docId, workspaceId) carry their own descriptions, including the conditional guidance for omitting workspaceId. The description adds nothing beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource plus the state it acts on ('document from the AFFiNE trash'), which implicitly positions it as the inverse of trash_doc/delete_doc. It does not name those siblings explicitly, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — the agent must infer that this applies to documents that have already been trashed. There is no statement of preconditions, no 'use X instead if...' routing to trash_doc or delete_doc, and no note about what happens on a non-trashed docId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_docRevoke DocumentADestructive
Disable public sharing for a document without deleting the document. Use delete_doc only when the document itself should be removed.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| docId | No | |
| error | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, so the safety profile is carried structurally; the description usefully clarifies that the document is preserved while its sharing is disabled. It stops short of saying what is actually lost (existing public links being invalidated, external viewers losing access) or how repeat calls behave given idempotentHint=false. No contradiction with annotations, but 'without deleting' sits in mild tension with destructiveHint and could be read as reassuring.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary action and immediately followed by the disambiguation clause. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the annotations carry the destructive/idempotency signals. The one gap is the re-publish path: an agent revoking sharing has no stated route back via publish_doc, which matters for a reversible-looking operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (docId, workspaceId) are documented inline, including when workspaceId may be omitted. The description adds nothing beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (disable public sharing) plus the resource (a document) and states the key non-effect (the document is not deleted). This distinguishes it cleanly from delete_doc and trash_doc without requiring the agent to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent away from delete_doc with a stated condition ('only when the document itself should be removed'). It does not, however, mention publish_doc as the counterpart for re-enabling sharing, so the reverse direction is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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, plus offset/limit pagination state (hasMore, truncated, and nextOffset).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Optional tag filter (case-insensitive substring match against resolved tag names). | |
| limit | No | Max results to return (default: 20, maximum: 200). | |
| query | Yes | Search query — matched case-insensitively against doc titles. | |
| offset | No | Zero-based result offset for paging through matches (default: 0). | |
| sortBy | No | Sort by match relevance (default) or by updatedAt. | |
| matchMode | No | How to match titles (default: substring). | |
| workspaceId | No | Workspace ID (optional if default set). | |
| sortDirection | No | Sort direction for updatedAt sorting (default: desc). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| tag | No | |
| code | No | |
| error | No | |
| limit | No | |
| query | No | |
| offset | No | |
| sortBy | No | |
| details | No | |
| hasMore | No | |
| results | No | |
| causeCode | No | |
| matchMode | No | |
| retryable | No | |
| truncated | No | |
| nextOffset | No | |
| totalCount | No | |
| sortDirection | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read-only, idempotent profile, so the bar is lower. The description still adds useful context: the performance characteristic relative to exporting docs, and the exact per-match fields and pagination state (hasMore, truncated, nextOffset) an agent will receive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the purpose front-loaded and the performance benefit immediately after. The second sentence spends its length enumerating return fields that an output schema already covers, which is mild redundancy rather than wasted space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return-value enumeration is not strictly needed, but the performance note and pagination state are helpful. The one gap is any routing signal versus find_doc_by_title, which is the most likely confusion for an agent in this sibling set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all eight parameters including tag, matchMode, sortBy, and matchMode enums are already documented. The description contributes nothing about parameter syntax or behavior beyond the pagination terms it mentions in the return context, hitting the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (documents) with the qualifier that it matches on title using workspace metadata. However, it never acknowledges the closely related sibling find_doc_by_title, so an agent must infer the distinction itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Much faster than exporting each doc' implies this is the bulk-search path over per-document export, but that comparison is against a workflow, not an alternative tool. There is no explicit guidance on when to choose this over find_doc_by_title or list_docs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_doc_journalSet Document Journal DateAIdempotent
Set or clear AFFiNE's native Journal date for a document. Use YYYY-MM-DD or null to remove it; customJournal and custom properties are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Native journal date in YYYY-MM-DD format, or null to clear it | |
| docId | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| date | No | |
| docId | No | |
| error | No | |
| details | No | |
| updated | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent=true, destructiveHint=false and readOnly=false, so the safety frame is covered. The description usefully adds side-effect information the annotations cannot convey: customJournal and custom document properties are left intact when the native journal date changes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; the core action is front-loaded and the clearing/preservation caveats follow immediately. Every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description fully covers the set/clear semantics and preservation behavior for this narrow mutation. Minor gaps remain around required permissions and whether the document must already be journal-eligible, but nothing critical for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%: docId and workspaceId are undocumented in both schema and description. The one sentence about `date` merely restates the schema's own 'YYYY-MM-DD format, or null to clear it', so the description adds no compensating meaning for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb pair ('Set or clear') and a precise resource ('AFFiNE's native Journal date for a document'), and the word 'native' plus the note that customJournal properties are preserved separates it from custom-property siblings. It stops short of naming the alternative tool (e.g., set_doc_property) explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the accepted format (YYYY-MM-DD) and the exact condition for removal (null), so an agent knows both the set and clear paths. It does not spell out when to prefer this over custom properties or what preconditions (journal enabled on the workspace, doc existence) apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_doc_propertySet Document PropertyB
Set a document's custom property value (property by id or name). Value is validated against the property type (text/number/checkbox/date).
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | ||
| value | Yes | Value; coerced per property type (checkbox->bool, number, date YYYY-MM-DD, text) | |
| property | Yes | Property id or name | |
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| name | No | |
| type | No | |
| docId | No | |
| error | No | |
| value | No | |
| stored | No | |
| details | No | |
| updated | No | |
| causeCode | No | |
| retryable | No | |
| propertyId | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a non-read-only, non-destructive, open-world, non-idempotent operation. The description adds useful behavioral detail that the value is validated against the property type, but it does not explain why the operation is marked non-idempotent, what permissions may be required, or what happens when validation fails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with the core operation and validation behavior front-loaded. There is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema and annotations covering its safety profile, which reduces what the description must carry. Still, it lacks guidance on how this mutation differs from related property tools and leaves workspaceId semantics unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, and the description mostly repeats what the schema already documents for value and property. It does not explain docId or the optional workspaceId, and does not compensate for the undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: setting a document's custom property value. It also clarifies that the property can be identified by id or name. However, it does not differentiate this tool from nearby siblings such as clear_doc_property, list_doc_properties, or create_custom_property.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives. The description does not mention clear_doc_property for clearing a value, create_custom_property for defining a new property, or list_doc_properties for inspection. Usage is only implied by the verb 'set'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_mindmap_layoutSet Native Mindmap LayoutA
Set right, left, or balance and persist native node positions. Root stays anchored; collapsed flags remain unchanged. BlockSuite does not support down/up. This is a native mindmap, with editor-derived connectors.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | ||
| layout | Yes | ||
| mindmapId | Yes | ||
| workspaceId | No | ||
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| nodes | No | |
| style | No | |
| layout | No | |
| locked | No | |
| rootId | No | |
| details | No | |
| causeCode | No | |
| mindmapId | No | |
| nodeCount | No | |
| retryable | No | |
| layoutType | No | |
| workspaceId | No | |
| lockedBySelf | No | |
| surfaceBlockId | No | |
| lockedByAncestor | No | |
| recoveryGuidance | No | |
| supportedLayouts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavior beyond the annotations: it says native node positions are persisted, the root stays anchored, collapsed flags remain unchanged, and down/up layouts are unsupported. It is consistent with the annotations (mutating, not destructive), though it does not cover error or concurrency behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action and constraints. Each sentence adds a distinct operational fact with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema and annotations reduce the description burden, and the description covers the tool's key behavioral effects. Still, for a five-parameter mutation tool with low schema description coverage, it leaves important parameter semantics and prerequisites insufficiently explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20%, and the description does not compensate for most parameters. It mentions the layout values, but docId, mindmapId, workspaceId, and expectedRevision are left almost entirely undocumented outside the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and outcome: set the layout to right, left, or balance and persist native node positions. It also clarifies that this is a native mindmap with editor-derived connectors, which helps distinguish it from generic node or style operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states an important unsupported case: BlockSuite does not support down/up. However, it does not explicitly say when to use this tool instead of siblings like set_mindmap_style or set_mindmap_lock, so usage guidance remains implied rather than complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_mindmap_lockSet Native Mindmap LockA
Set the mindmap's native lockedBySelf flag. Nodes inherit the lock in AFFiNE. Unlock does not clear ancestor-group or independently locked node flags; read the returned effective locked state. Does not change layout or styles. This is an editor lock, not an access-control boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | ||
| locked | Yes | ||
| mindmapId | Yes | ||
| workspaceId | No | ||
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| nodes | No | |
| style | No | |
| layout | No | |
| locked | No | |
| rootId | No | |
| details | No | |
| causeCode | No | |
| mindmapId | No | |
| nodeCount | No | |
| retryable | No | |
| layoutType | No | |
| workspaceId | No | |
| lockedBySelf | No | |
| surfaceBlockId | No | |
| lockedByAncestor | No | |
| recoveryGuidance | No | |
| supportedLayouts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnly=false and destructive=false; the description goes well beyond with inheritance semantics ('nodes inherit the lock'), partial-unlock behavior (ancestor-group and independently locked flags persist), side-effect scoping ('does not change layout or styles'), and a security caveat. For a mutation tool this is unusually complete behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each carrying distinct information: the action, the inheritance rule, the unlock caveat, and the scope boundary. Nothing is repeated and the core action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be explained, and annotations cover safety. What remains thin is the optional workspaceId parameter and any permission requirement for locking a shared mindmap; otherwise the definition is sufficient to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20% — only expectedRevision is documented in the schema. The description clarifies what the `locked` boolean actually means (native lockedBySelf flag, inherited by nodes) but says nothing about workspaceId's optional role or the docId/mindmapId relationship. Partial compensation, consistent with a 3 when coverage is low.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Set the mindmap's native lockedBySelf flag') and names the exact flag being mutated, which no sibling tool touches. It explicitly excludes set_mindmap_layout and set_mindmap_style, so an agent can route correctly among the mindmap siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for the operation ('editor lock, not an access-control boundary') and tells the caller to read the returned effective locked state after unlocking, which is a concrete follow-up instruction. It does not explicitly say when to use this versus an access-control mechanism (e.g. publish/revoke), leaving that to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_mindmap_styleSet Native Mindmap StyleA
Switch native style ONE=1, TWO=2, THREE=3, FOUR=4. Persists the preset on all nodes, sizes and layout; native connectors follow style. Keeps IDs, hierarchy, collapsed state and root anchor. Rejects locked maps/nodes.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | ||
| style | Yes | ||
| mindmapId | Yes | ||
| workspaceId | No | ||
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| nodes | No | |
| style | No | |
| layout | No | |
| locked | No | |
| rootId | No | |
| details | No | |
| causeCode | No | |
| mindmapId | No | |
| nodeCount | No | |
| retryable | No | |
| layoutType | No | |
| workspaceId | No | |
| lockedBySelf | No | |
| surfaceBlockId | No | |
| lockedByAncestor | No | |
| recoveryGuidance | No | |
| supportedLayouts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses exactly what is mutated (nodes, sizes, layout, native connectors) and what is preserved (IDs, hierarchy, collapsed state, root anchor), which is valuable for a non-destructive-but-mutating call. It also states a failure mode (locked maps/nodes), though it says nothing about expectedRevision conflicts or permission requirements. No contradiction with destructiveHint=false or readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short clauses, front-loaded with the action and then the side effects and constraints; there is no filler. The leading 'ONE=1, TWO=2' enumeration is the one genuinely wasteful and confusing fragment.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, and the mutation profile is covered. However, for a 5-parameter mutation tool with 20% schema coverage, the description should at minimum identify workspaceId and expectedRevision and clarify the style value domain; those omissions leave the agent guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20%, so the description must compensate, and it only partially does: it gestures at the style values via the ONE/TWO/THREE/FOUR labels but never explains what each preset looks like or that style is the integer 1-4. workspaceId and expectedRevision are not mentioned in the description at all, leaving half the parameters to the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'Switch native style' names a specific verb and resource, and the tool is clearly distinguishable from sibling set_mindmap_layout by talking about presets/connectors rather than layout structure. The 'ONE=1, TWO=2...' mapping is cryptic phrasing that muddies rather than sharpens the purpose statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this applies a preset to an existing mindmap, and 'Rejects locked maps/nodes' gives a precondition. There is no explicit when-to-use guidance and no pointer to alternatives such as set_mindmap_layout or set_mindmap_lock, which is a real gap given how similar those siblings are.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sign_inSign InA
Sign in to AFFiNE using email and password; sets session cookies for subsequent calls.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | AFFiNE account email address. | ||
| password | Yes | AFFiNE account password. Use a dedicated least-privilege account for unattended deployments. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| details | No | |
| signedIn | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, open-world, non-destructive, so the agent already knows this mutates externally-visible state. The description adds the concrete mechanism — session cookies persisted for later calls — which explains the mutation and its downstream effect, though it omits failure/expiry behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded clause naming the action, credentials, and side effect, with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and both parameters are documented, so return values and inputs need no explanation here. What remains thin is session lifecycle detail — expiry, reuse, and behavior on invalid credentials — which matters for an auth entry point but is not strictly required to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters carry their own descriptions, so the description adds nothing beyond what the schema states. Baseline 3 applies since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Sign in to AFFiNE') plus the credential mechanism, which no sibling tool does. It does not explicitly contrast with the closest sibling (current_user), but the auth scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Sets session cookies for subsequent calls' implies this is the prerequisite step before other authenticated tools, which is actionable context. There is no explicit statement about when not to use it (e.g., when a session already exists) or how to re-authenticate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trash_docMove Document to TrashAIdempotent
Move a document to the AFFiNE trash without deleting its content. This is recoverable with restore_doc and safe to retry.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| docId | No | |
| error | No | |
| title | No | |
| status | No | |
| changed | No | |
| details | No | |
| inTrash | No | |
| causeCode | No | |
| retryable | No | |
| trashDate | No | |
| workspaceId | No | |
| readBackVerified | No | |
| recoveryGuidance | No | |
| previouslyInTrash | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and idempotentHint=true, and the description reinforces this with 'without deleting its content' and 'safe to retry.' It adds useful context beyond the annotations by noting that the operation is recoverable with restore_doc.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loads the core action, and every clause adds relevant meaning about safety, recoverability, and retry behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, full schema coverage, existing annotations, and an output schema, the description provides enough context to call the tool correctly. It explains the operation's effect and recovery path without needing to repeat schema details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already explains docId and workspaceId. The description adds no parameter-specific details beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: moving a document to the AFFiNE trash. The phrase 'without deleting its content' distinguishes this from permanent deletion and makes the trash semantics explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context by framing this as a recoverable trash operation and naming restore_doc as the recovery path. It does not explicitly contrast with delete_doc or move_doc, but the intended use case is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_blockUpdate BlockA
Partially update one paragraph, heading, quote, list, or code block while preserving its block id. Omitted fields remain unchanged. Paragraph/heading/quote conversions preserve ids; cross-flavour conversions are rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Replacement block text. Delta arrays preserve inline attributes. For LinkedPage references, set insert to one ASCII space and pass the pageId in reference attributes; visible labels are resolved by AFFiNE. Omit to preserve the current text. | |
| type | No | Resulting logical block type. | |
| docId | Yes | AFFiNE document id. | |
| level | No | Heading level. Only valid when the resulting type is heading. | |
| style | No | Resulting list style. Only valid for list blocks. | |
| blockId | Yes | Block id to update. | |
| checked | No | Todo checked state. Only valid for a list whose resulting style is todo. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| block | No | |
| error | No | |
| blockId | No | |
| changed | No | |
| details | No | |
| updated | No | |
| previous | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-readonly, open-world, non-idempotent, non-destructive mutation. The description adds important behavioral details beyond that: omitted fields are preserved, block ids are retained, and cross-flavour type conversions are rejected. It does not discuss permissions or concurrency, but expectedRevision is documented in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place. The core operation and scope are front-loaded, followed by partial-update semantics and conversion constraints with no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter mutation tool with full schema descriptions, annotations, and an output schema, the description covers the essential behavior well: partial updates, id preservation, and conversion restrictions. It could be slightly stronger by explicitly routing agents to append_block/move_block for non-update operations, but it is otherwise complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema by clarifying that omitted fields remain unchanged and that only certain type conversions preserve ids while cross-flavour conversions are rejected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource scope: partially update one existing paragraph, heading, quote, list, or code block while preserving its block id. This naturally distinguishes it from sibling tools such as append_block, move_block, and delete_block without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly establishes the in-place partial-update context and notes that omitted fields remain unchanged. It also states a useful exclusion: paragraph/heading/quote conversions are allowed, but cross-flavour conversions are rejected. It does not explicitly name alternatives like append_block or move_block, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_collectionUpdate CollectionA
Rename an existing AFFiNE sidebar collection without changing its rules or allow-list.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Updated collection name | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| collectionId | Yes | AFFiNE collection id from list_collections or create_collection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| name | No | |
| error | No | |
| rules | No | |
| details | No | |
| allowList | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this is a non-read-only, non-destructive mutation with open-world behavior and no idempotency guarantee. The description adds useful behavioral scope by saying the tool only renames the collection and leaves its rules and allow-list untouched, which is the key side-effect boundary an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted text. It states the action and the key boundary immediately, which is appropriate for a simple update tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple rename mutation, the description, annotations, complete schema coverage, and output schema together give the agent enough to invoke the tool correctly. Nothing essential about the operation's scope or side effects is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines collectionId, name, and workspaceId. The description implies that the relevant parameters are the collection identifier and new name, but it does not add format, constraints, or workspace-selection guidance beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Rename an existing AFFiNE sidebar collection.' It also distinguishes the operation from adjacent operations by clarifying that rules and allow-list are not changed, which helps separate it from update_collection_rules and collection membership tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: use this to rename an existing collection, and do not use it to change rules or allow-list membership. It does not explicitly name the alternative tools, but the scope exclusion is explicit enough to route the agent away from update_collection_rules and add/remove doc operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rules | Yes | Rule set used to rebuild the collection allow-list. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| collectionId | Yes | AFFiNE collection id from list_collections or create_collection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| rules | No | |
| details | No | |
| allowList | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| collectionId | No | |
| matchedCount | No | |
| matchedDocIds | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already disclose that this is a non-readonly, open-world, non-idempotent mutation. The description adds meaningful context: rules are replaced and the allow-list is rebuilt from current workspace documents, which may change collection membership. It does not discuss permissions, reversibility, or what happens to the previous rules beyond the word 'Replace'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences, front-loads the action, and every sentence contributes useful information about behavior or effect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and fully described parameters, the description mainly needs to explain the mutation's effect. It does that well by noting the allow-list rebuild and possible membership changes, but it omits guidance about alternatives and prerequisites such as workspace configuration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including detailed nested filter semantics, so the schema carries the parameter explanation. The description does not add any parameter-level meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it replaces an AFFiNE collection's rules and rebuilds the allow-list. This clearly distinguishes it from generic collection updates and manual doc membership tools, though it does not name the sibling alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus add_doc_to_collection, remove_doc_from_collection, or update_collection. The second sentence warns about an effect but does not provide usage conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_commentUpdate CommentA
Replace the content of an existing comment. This preserves the comment thread; use create_comment for a new thread.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Comment id returned by list_comments or create_comment. | |
| content | Yes | Replacement comment content accepted by AFFiNE. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| kind | No | |
| error | No | |
| details | No | |
| success | No | |
| causeCode | No | |
| commentId | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnly=false, destructive=false, openWorld=true). The description adds real value by stating the operation replaces rather than appends and preserves the thread, but says nothing about permissions or the fact that annotations mark it non-idempotent, which is mildly at odds with 'replace' semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both load-bearing; the primary action is front-loaded and the sibling disambiguation follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and fully documented params, the description covers the essentials for a simple two-parameter mutation. It could add a note on content format expectations or permissions, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented there, including the provenance of the id. The description adds no information about the string-vs-object content alternatives, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replace the content of an existing comment') and immediately contrasts with create_comment, so an agent can distinguish it from the other comment siblings without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes new-thread creation to create_comment and implicitly scopes this to existing comments. It does not mention when to use delete_comment or resolve_comment instead, so the routing is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cells | Yes | Map of column name (or column ID) to new cell value. Rich-text and title values accept strings or delta arrays. For LinkedPage references, use insert: " " with reference.type="LinkedPage" and the target pageId; visible labels are resolved by AFFiNE. Use `title` for the built-in row title. | |
| docId | Yes | Document ID containing the database | |
| rowBlockId | Yes | Row paragraph block ID | |
| linkedDocId | No | Link this row to an existing doc by ID. The row will open the linked doc in center peek when clicked. | |
| workspaceId | No | Workspace ID (optional if default set) | |
| createOption | No | For select and multi-select columns, create the option label if it does not exist (default true) | |
| databaseBlockId | Yes | Block ID of the affine:database block | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| details | No | |
| updated | No | |
| causeCode | No | |
| cellCount | No | |
| retryable | No | |
| rowBlockId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=false and openWorld=true, so the safety profile is covered. The description adds that the target row must be 'existing' and how the title maps to the Kanban row title, but it says nothing about partial-failure behavior for a batch, revision conflicts, or how linkedDocId affects the row.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, the write action is front-loaded, and the second sentence carries actionable guidance rather than filler. No waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema and a fully documented 8-parameter schema relieve much of the burden, but for a nested-map batch mutation marked non-idempotent the description should say what happens on partial application or stale revision. As written it is thin relative to the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including a detailed cells map description and expectedRevision semantics, so the schema does the heavy lifting. The description's note about including `title` in the cells map largely restates the schema's 'Use `title` for the built-in row title', though the Kanban framing adds a small amount of context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: batch-update multiple cells on an existing AFFiNE database row. An agent can distinguish this from update_table_cell and add_database_row by the 'database row' + 'cells' phrasing, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the row must already exist, and cells is the batch mechanism. There is no guidance on when to prefer this over update_block, update_table_cell, or read_database_cells first, and no exclusions or prerequisites such as required permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | Yes | Emoji shorthand ("🧪"), a full object ({type:"emoji",unicode:"🧪"} or {type:"affine-icon",name:"FlagPanel",color:"var(--affine-v2-block-callout-icon-red)"}), or null to remove the icon. `name` must be an @blocksuite/icons export without the `Icon` suffix (e.g. "FlagPanel", "DirectionSignPanel"); unknown names render as no icon. | |
| docId | Yes | The document whose icon to update. | |
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| icon | No | |
| kind | No | |
| docId | No | |
| error | No | |
| cleared | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-readonly, non-idempotent, non-destructive, open-world mutation; the description is consistent with that and adds meaningful behavior: passing null removes the icon, and unknown icon names silently render as no icon (a silent-failure trait worth disclosing). It does not clarify why idempotency is flagged false or what happens on an unknown docId, but the added disclosure is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the core action front-loaded and the accepted value forms immediately after. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the mutation profile, the description supplies enough to invoke correctly. The only shortfall is the unexplained optional workspaceId and no mention of error behavior when docId is invalid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% and the icon parameter is already well documented in the schema, including the three accepted shapes; the description restates the shorthand/object/null trichotomy rather than adding new semantics. The workspaceId parameter remains undocumented in both places, which is the notable gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb pair (set/clear) and a precise resource (the sidebar emoji icon on a document), with a nice disambiguating gloss ('Notion-style emoji slot'). It implicitly separates itself from update_folder_icon by saying 'on a document', but never names the icon-related siblings, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It makes the two usage modes (set vs. clear via null) clear, which is useful context for choosing behavior. However, it never names alternatives such as get_doc_icon (to read current icon first) or update_folder_icon, and gives no prerequisite or permission guidance. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_doc_titleUpdate Document TitleA
Rename a document — updates both the sidebar title (workspace metadata) and the doc's internal page block title.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | The doc to rename. | |
| title | Yes | New title. | |
| workspaceId | No | ||
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| kind | No | |
| docId | No | |
| error | No | |
| title | No | |
| details | No | |
| updated | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavior: the rename updates both workspace metadata and the document's internal page block title. That dual write is useful context not conveyed by readOnlyHint/destructiveHint. It does not discuss conflict behavior or stale revision handling, but the schema documents expectedRevision.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It states the action and the two affected title locations efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple mutation, and the description covers the key effect: both title locations are updated. Annotations and the schema cover safety, freshness checks, and parameter details, though the description could say more about the expectedRevision behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so most parameters are already documented in the schema. The description does not add parameter-specific guidance and only indirectly hints at workspace metadata. The undocumented workspaceId parameter is not compensated for in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Rename a document.' It also clarifies the dual target of the rename, updating both sidebar title and internal page block title. It is clear, though it does not explicitly differentiate itself from nearby tools such as update_block or update_doc_icon.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool does but gives no guidance on when to use it versus alternatives. It does not mention prerequisites, related tools, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| docId | Yes | Document ID | |
| width | No | ||
| height | No | ||
| blockId | Yes | Block id (flavour affine:note/affine:frame/affine:edgeless-text). | |
| background | No | Note/frame only. Prefer `--affine-note-background-<color>` or `{light, dark}` hex. | |
| workspaceId | No | Workspace ID (optional if default set) | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| blockId | No | |
| changed | No | |
| details | No | |
| flavour | No | |
| ignored | No | |
| updated | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover mutation safety (destructiveHint=false, idempotentHint=false, openWorldHint=true). The description adds important behavior beyond annotations: x/y/width/height merge with current prop:xywh, background replaces prop:background, and inapplicable fields are returned under 'ignored'. It does not discuss stale-write rejection or non-idempotent retry implications, but those are partly covered elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three dense sentences, front-loaded with the core action, followed by the spatial merge semantics and background replacement behavior. Every sentence earns its place, and there is no repetition of schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description need not explain return values, and it still mentions the 'ignored' field behavior. It covers the key merge/replace semantics for the block properties, though it omits sibling differentiation and does not mention expectedRevision or workspaceId usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 56%, so the description must add meaning for under-documented parameters. It does so by explaining that x/y/width/height merge with prop:xywh and that background replaces prop:background using an AFFiNE token or {light, dark} hex object; this meaningfully supplements the schema, though expectedRevision is only explained in the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Partially update a ... block by id') and names the supported block flavours (note/frame/edgeless-text). It does not distinguish this from siblings such as update_block or move_block, so it is clear but lacks explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Partially update a note/frame/edgeless-text block by id', and the merge behavior hints at when to use it. However, there is no explicit when-to-use guidance versus update_block, move_block, or update_surface_element, and no stated exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | Yes | Emoji shorthand ("🧪"), a full object ({type:"emoji",unicode:"🧪"} or {type:"affine-icon",name:"FlagPanel",color:"var(--affine-v2-block-callout-icon-red)"}), or null to remove the icon. `name` must be an @blocksuite/icons export without the `Icon` suffix (e.g. "FlagPanel", "DirectionSignPanel"); unknown names render as no icon. | |
| folderId | Yes | The organize folder whose icon to update. | |
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| icon | No | |
| kind | No | |
| error | No | |
| cleared | No | |
| details | No | |
| folderId | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower. The description adds two things annotations cannot: the tool is experimental, and passing null is a valid clearing operation rather than an error. It doesn't cover permissions or error behavior on unknown icon names (the schema does that).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and the accepted payload shapes, ending with a one-word experimental caveat. Nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, a rich icon schema, and an output schema present, the description covers what the agent needs to call it correctly. The only gaps are the undocumented workspaceId and the absence of any failure-mode note for invalid icon names, which the schema partially covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the icon parameter is already documented in exceptional detail in the schema (emoji shorthand, object forms, null, @blocksuite/icons naming rules). The description only restates those accepted shapes, and workspaceId remains unexplained in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (set/clear) and resource (sidebar icon on an organize folder), which distinguishes it from the read-only get_folder_icon and from update_doc_icon by resource scope. It never names those siblings explicitly, so the differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent what payload shapes are accepted and that null removes the icon, which is invocation guidance. It gives no when-to-use / when-not guidance relative to get_folder_icon or update_doc_icon, and 'Experimental' is a caution flag rather than a usage rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | Document ID | |
| blockId | Yes | Frame block id (flavour affine:frame). | |
| padding | No | Padding (px) used when resizeToFit is true (default 40). Ignored when resizeToFit=false. | |
| resizeToFit | No | If true (default), recompute xywh from the union of resolvable child bounds + padding + title band. Set to false to preserve the frame's current box (useful when you want ownership-only edits or manual positioning). | |
| workspaceId | No | Workspace ID (optional if default set) | |
| childElementIds | Yes | Full list of ids the frame should own/contain. Replaces any existing ownership. | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| xywh | No | |
| error | No | |
| blockId | No | |
| details | No | |
| flavour | No | |
| missing | No | |
| resized | No | |
| updated | No | |
| ownedIds | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses what the write actually does: wholesale replacement of the ownership map, default resize-to-fit including padding and title band, resize being skipped on clear, and unresolved ids surfacing under 'missing'. That is exactly the kind of mutation behavior an agent needs and the annotations alone don't provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six tight sentences, front-loaded with the core mutation and then the important edge cases (missing ids, resize default, clear behavior). No filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 7 params, an output schema, and annotations, this covers everything an agent needs: replacement semantics, resize defaults, clearing behavior, and missing-id handling. It correctly leaves return-value structure to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds value by explaining which id types are accepted (surface elements and edgeless blocks) and that childElementIds is a full replacement list, plus the interaction between `[]`, resizeToFit, and padding. It doesn't add syntax detail beyond that, which is fine given the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource ('Replace a frame block's contents wholesale') and immediately clarifies scope: it owns the frame's childElementIds map, not the child elements themselves. That distinguishes it from sibling mutation tools like update_edgeless_block or update_surface_element without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear conditions: use resizeToFit=false for ownership-only edits or manual positioning, and pass `[]` to clear ownership. What's missing is an explicit pointer to an alternative tool when the caller wants to add/remove a single child rather than wholesale replacement, so it stops short of naming alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_mindmap_nodeUpdate Native Mindmap NodeB
Replace a native node's text and/or set collapsed. Keeps node IDs and hierarchy. Recalculates geometry; the editor may refine text dimensions when opened.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| docId | Yes | ||
| nodeId | Yes | ||
| collapsed | No | ||
| mindmapId | Yes | ||
| workspaceId | No | ||
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| docId | No | |
| error | No | |
| nodes | No | |
| style | No | |
| layout | No | |
| locked | No | |
| nodeId | No | |
| rootId | No | |
| details | No | |
| causeCode | No | |
| mindmapId | No | |
| nodeCount | No | |
| retryable | No | |
| layoutType | No | |
| workspaceId | No | |
| lockedBySelf | No | |
| surfaceBlockId | No | |
| lockedByAncestor | No | |
| recoveryGuidance | No | |
| supportedLayouts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-destructive, non-read-only, open-world mutation, so the safety profile is covered. The description adds genuinely useful behavior beyond that: hierarchy and IDs are preserved and geometry is recalculated, with the editor potentially re-refining text dimensions. It says nothing about stale-write protection or revision conflicts, which is the real risk for a write tool and which the annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the mutation and its scope. The closing remark about the editor refining text dimensions is slightly cryptic but still conveys a real caveat about geometry fidelity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the core mutation semantics are present. With 7 parameters at 14% schema coverage and no guidance on revision conflicts or the workspace/mindmap scoping, it falls short of fully arming an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 14% (just expectedRevision), so the description must compensate and largely does not. It clarifies the intent of 'text' (replace) and 'collapsed' (set), but leaves docId, mindmapId, nodeId, and workspaceId — the identity/routing parameters — entirely unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replace a native node's text and/or set collapsed') and scopes it to native nodes only. It implicitly distinguishes itself from add_mindmap_node and reparent_mindmap_node by noting IDs and hierarchy are preserved, but never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the reader infers you use this for content/collapse edits rather than structural changes (reparent_mindmap_node) or styling (set_mindmap_style). There is no explicit when-to-use, when-not, or named alternative despite several adjacent mindmap siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_profileUpdate ProfileA
Update current user's profile information. Requires at least one of name or avatarUrl.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name | |
| avatarUrl | No | Avatar URL |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| name | No | |
| error | No | |
| details | No | |
| avatarUrl | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description usefully adds the at-least-one-field requirement, but says nothing about what happens to unspecified fields (partial vs full replace) or why the operation is non-idempotent per the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no filler, with the resource stated first and the calling constraint immediately after. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the mutation risk is covered by annotations. The only remaining gap is whether unmentioned fields are preserved or cleared on update, which an agent would want to know for a partial-update tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage the baseline is 3, and the description goes beyond the schema by imposing a cross-parameter constraint (at least one of name or avatarUrl) that the schema does not express — required is empty and there is no anyOf. This meaningfully changes how an agent must call the tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: updating 'current user's profile information', which is distinguishable from siblings like update_settings or update_workspace. It does not explicitly name an alternative, but 'current user's profile' is a narrowing scope that makes the target unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Requires at least one of name or avatarUrl' clause is a precondition, not a when-to-use rule, and no sibling (e.g. current_user, update_settings) is referenced as an alternative. Usage context is only implied by the word 'current user'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_settingsUpdate SettingsC
Update user settings and preferences.
| Name | Required | Description | Default |
|---|---|---|---|
| settings | Yes | User notification settings |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| details | No | |
| success | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=false, destructive=false, and openWorld=true, so the description needs to add context about what a non-idempotent, open-world update actually does. It adds nothing — no statement of partial-vs-full replacement, no mention that unspecified settings are left untouched (or reset), no permission or return info. All it contributes is the word "Update."
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no padding, which is good for front-loading, but it is under-specified rather than concise — the brevity comes at the cost of saying anything useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, but for a mutation tool flagged non-idempotent and open-world the description is incomplete: it should clarify partial-update behavior and scope (user-level notification prefs, not workspace/profile). Nothing an agent needs to invoke it safely is stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the nested settings object documents all three boolean fields, so the schema carries the parameter meaning. The description adds no syntax, format, or merge semantics beyond what the schema already provides; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a generic verb+resource ("Update user settings and preferences") but never says what kind of settings — the schema reveals they are notification email toggles, which the description omits. No differentiation from the nearby sibling update_profile, so an agent cannot tell the two apart from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus alternatives such as update_profile, nor any stated prerequisite. The agent must infer usage entirely from the name and its one parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X position on canvas (shape/text; default 0). | |
| y | No | Y position on canvas (shape/text; default 0). | |
| mode | No | Connector mode: 0=straight, 1=orthogonal (elbow), 2=curve (default 2). Connector only. | |
| text | No | Text content (shape/text) or connector label. Replaces existing Y.Text on update. | |
| color | No | Text color. Shape default `#000000` — keep unless the fill is dark, then pass a contrasting hex. Canvas text default `--affine-text-primary-color` (theme-adaptive). Shape/text. | |
| docId | Yes | Document ID | |
| index | No | BlockSuite fractional-index string controlling z-order. On add, defaults to a key above every existing element's index (new elements render on top). On update, replaces the stored value — pass a key less than some existing index to send-to-back, or greater to bring-to-front. Use the value returned by list_surface_elements to pick a specific position. | |
| label | No | Connector label (stored as text on the connector). Connector only. | |
| title | No | Group title. Group only. | |
| width | No | Width (shape default 100, text default 200). | |
| filled | No | Whether shape is filled (default true). Shape only. | |
| height | No | Height (shape default 100, text default 30). | |
| radius | No | Corner radius for rect (0.1 = rounded). Shape only. | |
| stroke | No | Connector stroke color (default '--affine-text-primary-color' — theme-adaptive, near-black in light / near-white in dark). Accepts any CSS color or AFFiNE palette token. Connector only. | |
| children | No | Child element ids. Group only. | |
| fontSize | No | Font size (shape default 20, text default 16). Shape/text. | |
| sourceId | No | Connector source element id. Connector only. | |
| targetId | No | Connector target element id. Connector only. | |
| elementId | Yes | Element ID to update | |
| fillColor | No | Fill color. Prefer the `--affine-palette-shape-<color>` family (yellow/orange/red/magenta/purple/navy/blue/green/teal/grey/white/black). These are fixed colors — AFFiNE shape colors are not theme-adaptive by design. Shape only. | |
| shapeType | No | Shape type (default rect). Shape only. | |
| fontWeight | No | Font weight (shape default 600, text default 400). Shape/text. | |
| strokeColor | No | Stroke color. Prefer the `--affine-palette-line-<color>` family (same color names as fillColor). Fixed colors, not theme-adaptive. Shape only. | |
| strokeStyle | No | Stroke style. Shape/connector. | |
| strokeWidth | No | Stroke width (default 2). Shape/connector. | |
| workspaceId | No | Workspace ID (optional if default set) | |
| sourcePosition | No | Source [x,y]: relative [0-1] if sourceId set, absolute otherwise. Connector only. | |
| targetPosition | No | Target [x,y]: relative [0-1] if targetId set, absolute otherwise. Connector only. When both source/target are bound by id and neither position is provided, endpoints snap to the BlockSuite side-midpoint facing the other endpoint so connectors flow in a clear direction. Pass [0.5,0] top, [0.5,1] bottom, [0,0.5] left, [1,0.5] right to force a specific side. | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. | |
| rearEndpointStyle | No | Rear endpoint style (default Arrow). Connector only. | |
| frontEndpointStyle | No | Front endpoint style (default None). Connector only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| type | No | |
| error | No | |
| changed | No | |
| details | No | |
| ignored | No | |
| updated | No | |
| causeCode | No | |
| elementId | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing two non-obvious behaviors: geometry fields merge with existing xywh while text/label/title clobber the underlying Y.Text wholesale, and mismatched fields are silently reported instead of rejected. That is genuine mutation-context information an agent cannot get from readOnlyHint=false or destructiveHint=false. Missing are error/conflict behavior and any hint about why idempotentHint is false for these merge semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: identity and operation first, then the merge rule, then the replace rule, then the failure-ish case. Zero redundancy and nothing buried at the end that should be up front.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 31-parameter mutation tool with full schema coverage, full annotations, and an output schema, the description supplies exactly the missing layer — the semantics of combining fields — and even references the 'ignored' response field. Nothing essential to invoking it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% across 31 parameters, so the per-field documentation is already carried by the schema; the description earns extra credit by explaining the interaction between x/y/width/height and the current geometry, which no individual parameter description states. It does not, however, group or prioritize the type-scoped families (shape vs connector vs group) beyond one sentence.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Partially update a surface element by id") and pins down the partial-update contract immediately, which cleanly separates it from add_surface_element, delete_surface_element and list_surface_elements. An agent knows exactly what class of operation this is without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains when to use this over a full write by describing the merge-vs-replace rule ("move without resizing, or vice versa") and warns that type-inapplicable fields land in the 'ignored' list rather than erroring. It does not explicitly name a sibling alternative or state prerequisites such as needing an existing elementId, so it falls short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_table_cellUpdate Table CellA
Replace one cell in an AFFiNE table by zero-based row and column while preserving rich-text attributes and the table's header bold formatting.
| Name | Required | Description | Default |
|---|---|---|---|
| row | Yes | Zero-based table row. | |
| text | Yes | Replacement cell text as plain text or a delta array. For LinkedPage references, set insert to one ASCII space and pass the pageId in reference attributes; visible labels are resolved by AFFiNE. | |
| docId | Yes | AFFiNE document id. | |
| column | Yes | Zero-based table column. | |
| blockId | Yes | Table block id (flavour affine:table). | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| row | No | |
| cell | No | |
| code | No | |
| error | No | |
| rowId | No | |
| column | No | |
| blockId | No | |
| details | No | |
| updated | No | |
| columnId | No | |
| previous | No | |
| causeCode | No | |
| retryable | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds real behavioral context beyond annotations: it replaces the entire cell contents rather than editing in place, and it preserves rich-text attributes and header bold formatting. It doesn't mention any failure modes such as out-of-range row/column indices, and the expectedRevision staleness check is left entirely to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and target, and every clause (zero-based addressing, rich-text preservation, header bold preservation) carries distinct information. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with an output schema and full schema coverage, the description covers the operation and its preservation guarantees. Remaining gaps are minor: out-of-bounds behavior and the concurrency/staleness contract are only in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents row, column, text (including the LinkedPage delta pattern), workspaceId, and expectedRevision. The description only restates the zero-based addressing and rich-text preservation, adding no new parameter-level detail. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb ("Replace") with a precise resource (one cell in an AFFiNE table) and names the addressing scheme (zero-based row and column). It is clearly distinguishable from siblings like update_block, update_database_row, and update_table_column_widths.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the precise operation scope, but there is no explicit guidance on when to choose this over update_block or update_database_row, nor any prerequisite or when-not-to-use statement. An agent must infer the selection from the name and scope alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_table_column_widthsUpdate Table Column WidthsA
Set every column width in an AFFiNE table while preserving rows and cell content. Pass null for a column to restore AFFiNE's automatic width.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| widths | Yes | Widths in pixels, in current column order. Provide exactly one entry per column; null restores automatic width. | |
| blockId | Yes | Table block id (flavour affine:table). | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. | |
| expectedRevision | No | Optional read_doc revision of this primary document. Reject stale content before writing. Covers document content, not workspace metadata; requires all writers to share one MCP server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| code | No | |
| error | No | |
| table | No | |
| blockId | No | |
| details | No | |
| updated | No | |
| previous | No | |
| rowCount | No | |
| causeCode | No | |
| columnIds | No | |
| retryable | No | |
| columnCount | No | |
| changedColumns | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false), and the description adds real value by disclosing that the operation replaces all widths while preserving rows and cell content. That tells an agent what is and isn't affected by the write, which annotations alone do not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core effect front-loaded and the null special case second. Nothing is repeated or wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full annotation coverage and 100% schema descriptions, the description covers what an agent needs to invoke it correctly. It stops short of mentioning the optimistic-concurrency path (expectedRevision), but that is already fully specified in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so docId, blockId, widths, workspaceId and expectedRevision are all documented inline, including the null-restores-automatic behavior. The description only reinforces the null semantics and the whole-array nature, adding little beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Set) and resource (every column width in an AFFiNE table), which clearly separates it from update_table_cell and update_block. It never names a sibling explicitly, so the differentiation is inferential rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Pass null to restore AFFiNE's automatic width' sentence implies when to use null values, but there is no guidance on when to pick this tool over update_table_cell or update_block, and no preconditions or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_workspaceUpdate WorkspaceB
Update workspace settings. Requires at least one of public or enableAi.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workspace ID | |
| public | No | Make workspace public | |
| enableAi | No | Enable AI features |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| code | No | |
| kind | No | |
| error | No | |
| details | No | |
| causeCode | No | |
| retryable | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, non-destructive, idempotent=false, openWorld=true. The description adds one genuine behavioral rule not derivable from the schema: at least one mutable field must be supplied. It omits permissions, what happens to unspecified fields, and whether public=false reverts to private.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler, and the core action is front-loaded. The second sentence is terse to the point of ambiguity about whether it is a hard requirement or a suggestion.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the 3 flat boolean/string params are simple. Still, a mutation tool should say what happens to unmentioned settings and whether any privilege is required; those gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter carries its own description, so the schema does the heavy lifting. The description adds the meaningful constraint about supplying public or enableAi, but nothing beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update workspace settings"), which is clear enough to act on. However, it doesn't distinguish this from close siblings like update_settings or update_profile, leaving the agent to infer scope from the schema fields alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The precondition "Requires at least one of public or enableAi" gives a valid-call rule, which is useful. But there is no guidance on when to choose this over update_settings/update_profile, and no exclusions or context about who may call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Blob content encoded according to the encoding field. | |
| encoding | No | Content encoding. Defaults to utf8; use base64 explicitly for binary data. | utf8 |
| filename | No | Optional filename stored with the upload. Defaults to a generated .bin name. | |
| contentType | No | Optional MIME type. Defaults to application/octet-stream. | |
| workspaceId | Yes | AFFiNE workspace id that owns the blob. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| ok | No | |
| key | No | |
| code | No | |
| size | No | |
| error | No | |
| details | No | |
| encoding | No | |
| filename | No | |
| causeCode | No | |
| retryable | No | |
| uploadedAt | No | |
| contentType | No | |
| workspaceId | No | |
| recoveryGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the 'creates stored content' sentence largely restates that. The genuinely additive detail is the non-attachment side effect, which warns agents about orphan blobs. No mention of size limits, quota, or duplicate handling despite idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and ending on the constraint that matters most. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety and an output schema covering the returned blob key, the description is close to sufficient for a one-shot upload. A pointer to blob cleanup/attachment follow-ups would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with per-field descriptions including the encoding enum and defaults, so the schema carries all parameter meaning. The description adds nothing about workspaceId, content, encoding, or filename.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('upload a file or blob into AFFiNE workspace storage') plus the return value ('blob key'). The clause 'does not attach it to a document by itself' implicitly separates it from document/block tools like append_block, though no sibling is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The note that the upload is not attached to a document implies a two-step workflow (upload, then attach), which is real routing guidance. However, it never states when to prefer this over alternatives nor mentions the follow-up tools (delete_blob, cleanup_blobs) that manage orphans.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
107 tool updates
v3.10.2- First observed
add_database_column - First observed
add_database_row - First observed
add_doc_to_collection - First observed
add_mindmap_node - First observed
add_organize_link - First observed
add_surface_element - First observed
add_tag_to_doc - First observed
analyze_doc_fidelity - First observed
append_block - First observed
append_markdown - First observed
append_semantic_section - First observed
cleanup_blobs - First observed
clear_doc_property - First observed
compose_database_from_intent - First observed
create_collection - First observed
create_comment - First observed
create_custom_property - First observed
create_doc - First observed
create_doc_from_markdown - First observed
create_folder - First observed
create_mindmap - First observed
create_semantic_page - First observed
create_tag - First observed
create_workspace - First observed
create_workspace_blueprint - First observed
current_user - First observed
delete_blob - First observed
delete_block - First observed
delete_collection - First observed
delete_comment - First observed
delete_custom_property - First observed
delete_database_row - First observed
delete_doc - First observed
delete_folder - First observed
delete_organize_link - First observed
delete_surface_element - First observed
delete_tag - First observed
delete_workspace - First observed
export_doc_markdown - First observed
export_with_fidelity_report - First observed
find_doc_by_title - First observed
get_capabilities - First observed
get_collection - First observed
get_doc - First observed
get_doc_icon - First observed
get_edgeless_canvas - First observed
get_folder_icon - First observed
get_mindmap - First observed
get_orphan_docs - First observed
get_workspace - First observed
inspect_template_structure - First observed
instantiate_template_native - First observed
list_children - First observed
list_collections - First observed
list_comments - First observed
list_doc_properties - First observed
list_docs - First observed
list_docs_by_tag - First observed
list_histories - First observed
list_notifications - First observed
list_organize_nodes - First observed
list_surface_elements - First observed
list_tags - First observed
list_workspace_tree - First observed
list_workspaces - First observed
move_block - First observed
move_doc - First observed
move_organize_node - First observed
publish_doc - First observed
read_all_notifications - First observed
read_database_cells - First observed
read_database_columns - First observed
read_doc - First observed
remove_doc_from_collection - First observed
remove_tag_from_doc - First observed
rename_folder - First observed
reparent_mindmap_node - First observed
replace_doc_with_markdown - First observed
resolve_comment - First observed
restore_doc - First observed
revoke_doc - First observed
search_docs - First observed
set_doc_journal - First observed
set_doc_property - First observed
set_mindmap_layout - First observed
set_mindmap_lock - First observed
set_mindmap_style - First observed
sign_in - First observed
trash_doc - First observed
update_block - First observed
update_collection - First observed
update_collection_rules - First observed
update_comment - First observed
update_database_row - First observed
update_doc_icon - First observed
update_doc_title - First observed
update_edgeless_block - First observed
update_folder_icon - First observed
update_frame_children - First observed
update_mindmap_node - First observed
update_profile - First observed
update_settings - First observed
update_surface_element - First observed
update_table_cell - First observed
update_table_column_widths - First observed
update_workspace - First observed
upload_blob
TDQS
Scored across 107 tools
The tool set covers many adjacent operations, and several groups overlap heavily: list_docs/search_docs/find_doc_by_title, get_doc/read_doc, create_doc/create_doc_from_markdown/create_semantic_page, and append_block/append_markdown/append_semantic_section. The descriptions usually explain the boundaries, so misselection is avoidable, but the sheer number of similar choices makes the set confusing in practice.
Almost all tools use snake_case with a verb_noun pattern, such as list_workspaces, create_doc, update_surface_element, and delete_comment. The main deviation is current_user, and there are minor verb variations like get/read/list, but the overall convention is predictable.
107 tools are far beyond an appropriate MCP surface and create severe navigation and selection overhead. Even though AFFiNE is a broad product, this set would benefit from consolidation and grouping rather than exposing nearly every operation individually.
Coverage is very broad across workspaces, docs, blocks, canvas, databases, mindmaps, tags, collections, folders, comments, properties, and blobs. There are still notable lifecycle gaps, such as database column update/delete, mindmap node deletion, blob listing/retrieval, and explicit comment replies.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Automate 1,000+ services from any MCP-compatible AI agent: build Applets, run actions and queries.
Build, validate, deploy — HTTP APIs, cron jobs, webhooks and MCP tools — from your AI client.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables clients such as Claude, Cursor, VS Code, and Windsurf to manage workspaces, projects, tasks, and AI agents through a hosted OAuth endpoint or a local stdio package, and to generate MCP tools from OpenAPI specs.2,914 npmMIT
- AlicenseNot gradedqualityAmaintenanceGives AI agents headless, token-authenticated read/write access to a Notion workspace through MCP, using three context-efficient tools that cover 47 operations across pages, databases, blocks, templates, comments, users, and files. Supports creating and editing pages, querying and filtering databases, batch mutations with rollback and idempotency, markdown round-trips, and image/file uploads, runnable over stdio or HTTP in CI and self-hosted deployments.1,532 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI clients such as Claude, Cursor, VS Code, and Windsurf to list and manage workspaces, projects, tasks, AI agents, and automations through a hosted OAuth-secured endpoint or a local stdio package. Also generates MCP tools from any OpenAPI spec.2,914 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables web-based AI clients such as Claude, ChatGPT, Grok, and Postman to securely operate a local machine through a single OAuth-gated MCP endpoint exposing 38 governed tools. Covers file read/write/edit, whitelisted shell commands, search, Git, SQLite, browser automation, DevTools, background tasks, localhost fetching, clipboard, notifications, port management, and Postman control.MIT