AFFiNE MCP Server
The AFFiNE MCP Server enables AI assistants to comprehensively manage AFFiNE workspaces and documents through the Model Context Protocol (MCP) via a stdio interface.
Workspace Management: Create, list, retrieve, update settings (public access, AI features), and delete workspaces, including creating workspaces with initial documents
Document Operations: List, get metadata, search, publish/revoke public access, and retrieve recently updated documents. WebSocket-based tools (v1.2.0+) support creating documents, appending paragraphs, and deletion with real-time editing capabilities
Comment System: Full CRUD operations on comments including listing, creating, updating, deleting, resolving, and unresolving
Version Control: List document version histories by timestamp and recover documents to previous states
User Management: Get current user info, sign in with email/password, update profiles and settings, manage email verification, password changes/resets, and account deletion
Token Management: Generate, list, and revoke personal access tokens with session cookie establishment
Blob Storage: Upload, delete, and permanently cleanup files/blobs in workspace storage
Notifications: List notifications and mark them as read (individually or all at once)
Advanced Operations: Apply CRDT updates to documents for advanced document manipulation
Provides comprehensive tools for managing AFFiNE workspaces, documents, search, comments, and version history through GraphQL API integration, enabling full workspace collaboration and document management capabilities.
Click on "Install 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 Serversearch for documents about project planning"
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
A Model Context Protocol (MCP) server for AFFiNE. It exposes AFFiNE workspaces and documents to AI assistants over stdio (default) or HTTP (/mcp) and supports both AFFiNE Cloud and self-hosted deployments.
Table of Contents
Related MCP server: Yuque 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
Supports stdio and HTTP transports
Supports session-cookie and email/password authentication, plus compatible bearer tokens for older deployments
Exposes 105 canonical MCP tools backed by AFFiNE GraphQL and WebSocket APIs
Includes semantic page composition, native template instantiation, database intent composition, capability and fidelity reporting, and workspace blueprint helpers
Includes Docker images, health probes, and end-to-end test coverage
Scope boundaries:
This server can access only server-backed AFFiNE workspaces
Browser-local workspaces stored only in local storage are not available through AFFiNE server APIs
AFFiNE 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
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 | |
Run the server remotely over HTTP or behind OAuth | |
Lock down tool exposure for least-privilege deployments | docs/configuration-and-deployment.md#least-privilege-tool-exposure |
Learn common AFFiNE workflows and tool sequences | |
Browse the tool catalog by domain |
Quick Start
1. Install the CLI
npm i -g affine-mcp-server
affine-mcp --versionYou can also run the package ad hoc:
npx -y -p affine-mcp-server affine-mcp -- --version2. Or run the server in Docker
docker run -d \
-p 3000:3000 \
-e MCP_TRANSPORT=http \
-e AFFINE_BASE_URL=https://your-affine-instance.com \
-e AFFINE_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:latestThen point your client at:
{
"mcpServers": {
"affine": {
"type": "http",
"url": "http://localhost:3000/mcp",
"headers": {
"Authorization": "Bearer your-strong-secret"
}
}
}
}For Docker, health checks, and remote deployment details, see docs/configuration-and-deployment.md#docker.
3. Save credentials with interactive login
affine-mcp loginThis stores credentials in $XDG_CONFIG_HOME/affine-mcp/config when XDG_CONFIG_HOME is set, otherwise in ~/.config/affine-mcp/config, with mode 600.
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
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.
4. Register the server with your client
Claude Code project config:
{
"mcpServers": {
"affine": {
"command": "affine-mcp"
}
}
}Codex CLI:
codex mcp add affine -- affine-mcpMore client-specific setup is in docs/client-setup.md.
5. Verify the connection
affine-mcp status
affine-mcp doctorIf you want to expose the server remotely over HTTP instead of stdio, start with docs/configuration-and-deployment.md.
Compatibility Matrix
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.
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
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 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
status, doctor, and the server runtime use the same environment > saved config > defaults resolution. 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.
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 expiresRestrict 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/dawncr0w/affine-mcp-server.git
cd affine-mcp-server
npm install
npm run build
node dist/index.jsRelease Notes
License
MIT License - see LICENSE.
Support
Open an issue on GitHub
Review AFFiNE product documentation at docs.affine.pro
Acknowledgments
Built for the AFFiNE knowledge base platform
Uses the Model Context Protocol specification
Powered by @modelcontextprotocol/sdk
Available Tools
95 toolsadd_database_columnAdd Database ColumnA
Add a column to an existing AFFiNE database block. Supports rich-text, select, multi-select, number, checkbox, link, date types.
| 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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-readonly, open-world, non-idempotent, non-destructive behavior. The description adds no additional behavioral context (e.g., idempotency of adding same column, authentication needs, or side effects). It aligns with annotations but doesn't expand beyond the basic action.
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 concise sentences with no redundant information. The first sentence clearly states the action and target, while the second lists supported types. Every word 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?
While the description covers the core action and type support, it lacks details on return values, error scenarios (e.g., adding a duplicate column), or prerequisites like the existence of the database block. Given no output schema and 7 parameters, more context would improve 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% with descriptions for all parameters. The description adds value by clarifying that 'options' are for select/multi-select types and listing supported types, enhancing understanding of the 'type' and 'options' parameters 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 clearly states the action ('Add a column') and the resource ('existing AFFiNE database block'), and lists the supported column types, distinguishing it from sibling tools like 'add_database_row' or 'read_database_columns'.
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 does not explicitly state when to use this tool versus alternatives (e.g., 'add_database_row', 'read_database_columns'). Usage is implied by the focus on adding columns, but no guidance on when not to use or substitutes is provided.
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. 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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful context beyond annotations: select columns auto-create options by label, and title column text is stored on the row paragraph block. Annotations indicate readOnlyHint=false, openWorldHint=true, etc., and the description does not contradict them. No mention of error handling or row duplication behavior, but overall good.
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 focused sentences with no wasted words. Front-loaded purpose in first sentence. Efficient and to the point.
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 tool's moderate complexity, annotations, and no output schema, the description covers main behaviors and parameter use. Could mention non-idempotent behavior (creating a new row each call) but is otherwise 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%, so baseline is 3. The description clarifies the 'cells' map usage and behavior for select columns, adding value beyond the schema. However, it does not elaborate on other parameters like linkedDocId or workspaceId 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 description clearly states the action ('Add a row') and the resource ('AFFiNE database block'). It provides specific details about cell value mapping by column name or ID, and behavior for title and select columns, which helps distinguish from update/delete database row 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?
No explicit guidance on when to use this tool versus alternatives (e.g., update_database_row for modifications). No prerequisites like having the docId or databaseBlockId mentioned. The description implies usage for adding rows but does not set boundaries or exclusions.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutation (readOnlyHint false) and non-idempotent, but description does not elaborate on edge cases like duplicate addition or missing collection. Adequate but not enhanced beyond 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, no fluff, front-loaded with main action. Every sentence adds value.
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?
Simple operation with no output schema; description provides complete context for selecting and invoking the tool given 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?
All parameters have descriptions in schema (100% coverage). Description adds no additional meaning beyond schema, meeting 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?
Description clearly states the action (add), the resource (existing document id to AFFiNE collection allow-list), and distinguishes from sibling tool 'update_collection_rules'.
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 alternative tool 'update_collection_rules' for rule-driven membership, providing clear when-to-use guidance.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare mutability (readOnlyHint=false) and non-destructiveness (destructiveHint=false). Description adds context with 'Experimental' label and warns against duplicates, hinting at non-idempotency. No further behavioral details (e.g., side effects, return value) are provided, but annotations cover the safety profile adequately.
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: first states purpose and experimental status, second directs to alternative. No unnecessary words, highly efficient.
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 no output schema and 5 parameters, the description covers purpose and usage guidelines well but omits return value or error handling. It is adequate but not fully comprehensive for a mutable tool without 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% with parameter descriptions that clearly define each field (e.g., 'type' enum, 'index' default behavior). The description does not add additional meaning beyond what schema already provides, so 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?
Description clearly states the verb 'add', resource 'doc/tag/collection link', and location 'under an AFFiNE organize folder'. It explicitly distinguishes from sibling 'move_organize_node' for existing links, providing excellent clarity.
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?
Description directly advises using 'move_organize_node' instead when an existing link node should be moved, preventing duplicate creation. It does not specify when to use this tool over other 'add' siblings, but the alternative guidance is clear and helpful.
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. | |
| rearEndpointStyle | No | Rear endpoint style (default Arrow). Connector only. | |
| frontEndpointStyle | No | Front endpoint style (default None). Connector only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutability and non-destructiveness. Description adds that inapplicable fields are reported in the 'ignored' list and explains element-type-specific behaviors (shapes vs connectors). No contradictions.
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: purpose, detailed feature description, and usage guidance. No wasted words.
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 30 parameters and no output schema, the description provides a high-level map of element types and key behavior. It covers the essential behavioral nuance (ignored list) but could elaborately tie all parameters together, though the schema descriptions are rich.
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 has 100% coverage. Description adds context beyond schema by explaining shape capabilities, connector drawing modes, and the ignored field behavior. Adds value despite 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 clearly states the verb 'Add' and the resource 'shape, connector, text, or group to the AFFiNE edgeless canvas surface'. It distinguishes from sibling tools like 'update_surface_element' and 'delete_surface_element' by focusing on creation.
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 recommends usage 'for building diagrams programmatically' and references 'update_surface_element' for ignored list behavior. Could more directly state when not to use, but context is clear.
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. This updates workspace metadata and attempts to sync the document's own 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (not read-only, not idempotent, not destructive), the description adds that the tool updates workspace metadata and attempts to sync document metadata. It also mentions creating the tag option if needed, which is additional behavioral 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?
The description is two sentences, front-loaded with the main verb, and contains no unnecessary words. Every sentence adds value.
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 simplicity of the tool (3 params, no output schema), the description covers the purpose and key side effects. It could optionally explain what happens if the tag already exists, but it is largely 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?
With 100% schema coverage, the baseline is 3. The description does not add extra meaning to individual parameters; it only explains the overall effect.
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 clearly states the action (attach a workspace tag) and the resource (document), and distinguishes from sibling tools like create_tag and remove_tag_from_doc by mentioning creation if needed.
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 the tool is for attaching tags but does not explicitly state when to use or provide alternatives. It could mention that create_tag is for creating tags without attaching, or that remove_tag_from_doc is for removal.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, so the safety profile is clear. Description adds context about unsupported flavours and risky paths, but doesn't disclose additional behavioral traits like rate limits or return format beyond 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?
Single, well-structured sentence that conveys purpose and specific aspects without redundancy. Every word 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?
Given the tool's simplicity and rich annotations, the description is mostly complete. However, it lacks any mention of the output format or return value, which would be helpful for an inspection tool. No output schema is provided, so the description should clarify what the agent can expect.
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?
Input schema descriptions are clear and cover 100% of parameters. Description does not add any additional meaning beyond the schema, so 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?
Description states specific verb 'Inspect' and resource 'document for markdown export fidelity risk'. It mentions key aspects like 'unsupported AFFiNE block flavours' and 'risky content paths'. While it doesn't explicitly differentiate from siblings like 'export_with_fidelity_report', the focus on risk inspection is distinct enough.
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 description implies use before export, but no alternatives or exclusions are mentioned. Adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_blockAppend BlockA
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 | |
| 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 text | |
| 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 source id 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 | |
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutation (readOnlyHint=false) but description does not elaborate on side effects, idempotency, or destructive potential. The mention of 'strict validation' adds minor behavioral context, but overall the description adds little beyond what annotations already 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?
Single sentence, front-loaded with key information, no wasted words. Perfectly concise for the high-level purpose.
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 complexity (37 params, nested objects, no output schema), the description is too brief. It does not explain the variety of block types or placement options, relying heavily on the schema. Could be more complete to aid agent understanding.
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 detailed parameter descriptions. The tool description adds no new parameter meaning beyond referencing 'placement' and 'strict', which are already documented in 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?
The description clearly states the action (append), the resource (document blocks), and key features (canonical types, legacy aliases, placement, strict validation). It differentiates from sibling tools like append_markdown or delete_block.
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 tool versus alternatives (e.g., append_markdown, update_edgeless_block). Does not mention prerequisites, exclusions, or comparison to siblings.
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.
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate the tool is not read-only, not idempotent, and not destructive. The description adds no further behavioral context (e.g., effect on document structure, performance implications) beyond 'append'.
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 clear sentence with no redundancy. It could benefit from a structured format, but conciseness is appropriate for a straightforward 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?
The description omits context like document existence requirement, default placement behavior, and success feedback. With no output schema, more detail would be helpful.
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 80%, with most parameters having descriptions. The tool description does not add extra meaning beyond the schema, meeting the baseline for this coverage level.
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 clearly states the action (append markdown) and target (existing AFFiNE document), but does not distinguish from sibling tools like append_block or replace_doc_with_markdown.
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 information is provided about when to use this tool versus alternatives, such as when to append vs replace, or prerequisites like document existence.
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. | |
| afterSectionTitle | No | Optional existing section heading to append after. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only and non-destructive behavior. The description adds that the tool appends a semantic section to an existing document, but does not elaborate on side effects, permission requirements, or behavior when the specified section title already exists. It provides moderate transparency beyond 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 a single sentence that clearly states the action and key concepts. It is concise without being overly terse, though it could benefit from slightly more detail. No wasted words.
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 tool has 7 parameters and no output schema, the description should explain what the tool returns, prerequisites (e.g., document existence), and error conditions. It lacks this information, making it incomplete for an agent to fully understand the tool's 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?
The input schema has 100% description coverage, so the schema already documents each parameter. The description does not add new meaning beyond 'by heading title and native block composition', which is a high-level summary. 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 specifies the verb 'append', the resource 'semantic section', and the mechanism 'by heading title and native block composition', making the tool's purpose clear. However, it does not explicitly distinguish itself from sibling tools like 'append_block' or 'create_semantic_page', which slightly reduces 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?
The description provides no guidance on when to use this tool versus alternatives such as 'append_block' or 'append_markdown'. There are no explicit conditions, prerequisites, or exclusions mentioned, leaving the agent to infer usage context.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive=true and readOnly=false. The description reinforces this with 'destructive', adds condition 'already marked deleted', and warns about confirmation. No contradictions.
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 action and key constraints. No unnecessary words.
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 tool's simplicity (one parameter, no output schema), the description fully covers purpose, usage guidance, and behavioral implications.
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 reference to 'workspaceId' adds no meaning beyond the schema's description. Baseline score 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 clearly states it permanently releases blobs already marked deleted, distinguishing it from the sibling 'delete_blob' which likely just marks for deletion.
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 says to use only after confirming deleted blobs are no longer needed, providing clear context. Lacks explicit 'when not to use' or alternative tool references.
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 PropertyC
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint false and destructiveHint false, but the description does not clarify potential side effects, error conditions, or required permissions. The mutation behavior is implied but not detailed.
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 sentence with no extraneous words. However, it could be more informative without sacrificing brevity.
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 lacks an output schema, and the description does not explain return values or behavior in edge cases (e.g., missing property). Given the complexity of a mutation tool with three parameters, the description is insufficient.
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% (only 'property' has a description). The description adds no additional meaning beyond what the schema already provides for 'property', and it offers no context for 'docId' or 'workspaceId'.
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 explicitly states the action (remove), the resource (custom property value from a document), and the identification method (by id or name). This clearly distinguishes it from siblings like 'set_doc_property' and '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?
No guidance is provided on when to use this tool versus alternatives. It does not mention prerequisites (e.g., property must exist) or scenarios where other tools like 'delete_custom_property' would be more appropriate.
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 IntentA
Create a useful AFFiNE database/data-view from declarative intent. Supports task_board and issue_tracker presets with starter schema, kanban view, and optional starter rows.
| 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) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a write operation (readOnlyHint=false). Description adds that presets include starter schema and kanban view, but does not clarify behavior if doc already has content or effects on existing blocks. No contradiction with 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, front-loaded with essential information, no redundant words.
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 6 parameters, nested objects, and no output schema, the description covers core functionality. Could explain what the tool returns or prerequisites (e.g., doc existence), but acceptable for a creation 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 covers all 6 parameters (100% coverage). Description adds nuance for seedRows (preset vs custom). Minimal added value beyond 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?
Description clearly states it creates a database from intent, naming presets and components. Differentiates from sibling tools that are more atomic (e.g., add_database_column, add_database_row).
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?
Implies use for high-level database creation from intent, but no explicit when-to-use or when-not-use, and no mention of alternative tools for manual construction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_collectionCreate CollectionA
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=false) are complemented by description stating it writes sidebar metadata but does not create documents. This adds meaningful behavioral context beyond annotations, though it omits details like idempotency or side effects.
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 redundant words. First sentence states purpose, second provides key behavioral constraint. Efficient and 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?
Description is adequate but omits return value (no output schema). It covers basic functionality but could be more complete by explaining the rules structure or what the response looks like.
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 descriptions for all parameters. The description adds minimal extra meaning beyond schema but provides context that the collection is sidebar metadata. 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?
Description clearly specifies the action ('Create'), resource ('AFFiNE sidebar collection'), and scope ('with optional rules', 'does not create documents'). It distinguishes from siblings like add_doc_to_collection by clarifying it only writes metadata.
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?
Description implies when to use (when creating a new collection) but does not explicitly state when not to use or mention alternatives. It contrasts with document creation but lacks explicit guidance against other use cases.
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 | Comment content accepted by AFFiNE. Plain strings are normalized to { text }, and rich AFFiNE payload objects are passed through. | |
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description says 'This writes collaboration state,' confirming it's a mutation, which aligns with annotations (readOnlyHint=false). No contradictions. Could add auth or response details, but with annotations present, this is sufficient.
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 only. First sentence states purpose, second gives usage alternative. No wasted words.
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?
No output schema, but description covers key aspects: creation, usage alternative, parameter nuance. Could mention success response, but not essential for selection.
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. Description adds nuance for 'content' parameter: explains normalization of plain strings and pass-through of rich payloads. This provides value beyond 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?
Clearly states it creates a new comment on an existing document. Distinguishes from sibling 'update_comment' by saying 'use update_comment when editing an existing comment instead.'
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 says when to use this tool (create new comment) and when not to (use update_comment for editing). Also mentions it writes collaboration state, indicating it's a write operation.
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 PropertyA
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only and non-destructive. Description adds return value info but lacks behavioral details such as idempotency, error handling, or side effects. Adequate but minimal extra value.
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 concise sentences with no fluff. Front-loads the core action and return value.
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?
No output schema, but description mentions returned propertyId. Covers purpose, type constraints, and return. Missing explanation of workspaceId parameter, but it is optional. Sufficient for a straightforward creation 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 describes 3 of 4 parameters (75% coverage). Description does not add meaning beyond the schema. WorkspaceId parameter is not explained. Baseline score applies as schema covers most 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?
Description clearly states it creates a workspace-wide custom property definition, lists the valid types, and mentions the return value. Distinguishes from sibling tools like delete_custom_property and set_doc_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?
Implies workspace-level use but does not explicitly state when to use this tool vs. alternatives like set_doc_property for document-level properties. No 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.
create_docCreate DocumentA
Create a new AFFiNE document with optional content. If parentDocId is provided, the new doc is linked into the sidebar tree immediately. If folderId is provided, the doc is placed inside that folder in the sidebar.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Optional initial document title. | |
| content | No | Optional initial plain text or markdown-like content. | |
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond annotations: explains that parentDocId links the doc to the sidebar tree and folderId places it in a folder. Annotations already indicate non-destructive write, so description enriches with specific side effects.
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 main purpose, then specific conditions. No extraneous 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?
Covers main behavior and key parameter effects. No output schema, so return value not needed. Missing error cases or prerequisites, but adequate for a create tool with simple inputs.
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. Description adds value by explaining the real-world effect of parentDocId and folderId parameters (sidebar linking and folder placement), which is not in schema descriptions.
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?
Clearly states 'create a new AFFiNE document' with optional content, and specifies behavioral details about parentDocId and folderId. Differentiates from sibling tools like create_folder and create_doc_from_markdown.
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?
Implies usage through parameter descriptions, but does not explicitly state when to use this tool versus alternatives like create_doc_from_markdown or append_markdown. No when-not or alternatives provided.
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 content. Use parentDocId to automatically embed the new doc into a parent, making it visible in the sidebar instead of being an orphan.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| strict | No | ||
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show it's a write operation with no idempotency or destructiveness. The description adds value by explaining the embedding behavior (parentDocId) and that the doc would be 'visible in the sidebar instead of being an orphan'. No contradictions with 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 concise sentences front-loaded with the core purpose. Every word adds value, zero fluff.
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 5 parameters and no output schema, the description covers the main function and key parameter (parentDocId). It explains embedding but omits details on error states or title handling. Adequate for a create 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 60% (descriptions for markdown, parentDocId, workspaceId, but not title or strict). The description adds meaning for parentDocId (embedding) but not for title or strict. Baseline 3 is appropriate as the description 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?
The description clearly states the tool creates a new AFFiNE document from markdown content. It distinguishes from siblings like create_doc (empty doc) and append_markdown (append to existing docs) by specifying importing markdown and optional embedding via parentDocId.
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 guidance on when to use this tool (creating docs with markdown) and mentions a key parameter (parentDocId) for embedding. However, it doesn't explicitly state when to use alternatives like create_doc or append_markdown, leaving some inference to the agent.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-readonly and non-destructive behavior. The description adds context that it only changes sidebar organization without modifying document content. However, it does not disclose potential side effects or permissions 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?
Two concise sentences: first states the purpose, second clarifies the scope. No unnecessary words or 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?
Given the presence of annotations and full schema coverage, the description adequately covers the tool's main behavior and non-destructive nature. It could mention the output (created node id) but is not required without an 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 documentation coverage is 100%, so parameters are fully described in the schema. The description adds no additional semantic value beyond listing the folder name and optional 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 clearly states the action 'create an AFFiNE organize folder node' and specifies the location 'in the sidebar tree'. It distinguishes itself from other creation tools by clarifying that it only affects sidebar organization, not document content.
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 guidance on when to use this tool versus alternatives like create_collection or create_tag. The only hint is 'Experimental' which indicates instability but not usage context.
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 PageA
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false. The description adds minimal behavioral context beyond creating a page. It doesn't specify side effects like sidebar linking or template application details, but annotations cover the safety profile adequately.
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?
Single sentence, front-loaded with the key action ('Create an AFFiNE-native page'). No redundant phrases. Very concise.
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 full schema coverage and standard annotations, the description is minimally complete. However, it lacks explanation of what a 'Semantic Page' is or guidance on choosing pageType templates. With many sibling creation tools, more context would help.
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 has 100% description coverage for all 5 parameters. The description does not add extra meaning beyond what the schema provides. Baseline of 3 is appropriate as no compensation is 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 clearly states it creates an AFFiNE-native page with intentional section structure and native block composition. It distinguishes from siblings like create_doc or create_doc_from_markdown by emphasizing 'semantic' structure, but does not explicitly differentiate.
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 use for creating structured pages with sections, but provides no explicit when-to-use or when-not-to-use guidance. No alternatives are mentioned, leaving the agent to infer context from the name and schema.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate it's a non-read, non-destructive mutation. Description adds workspace-level scope and clarifies it doesn't attach to doc. No contradictions. Could mention any side effects or permissions, but is sufficient given annotation presence.
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 concise sentences, no wasted words. Front-loaded with purpose and quickly provides exclusion 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?
For a simple creation tool with 2 parameters, good annotations, and no output schema, the description fully covers what the tool does and when to use it. No gaps.
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 have clear descriptions. Description adds no additional meaning beyond the schema, so 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?
Description clearly states the action (create), resource (tag), and scope (workspace-level). It explicitly distinguishes from the sibling tool 'add_tag_to_doc', leaving no 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?
Explicitly states when to use (creating a tag for future reuse) and when not (to attach to a document), and names the alternative tool 'add_tag_to_doc'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_workspaceCreate WorkspaceA
Create a new workspace with initial document (accessible in UI)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Workspace name | |
| avatar | No | Avatar emoji or URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutation (readOnlyHint=false) and non-destructiveness. Description adds the side effect of creating an initial document, which goes beyond annotations. However, no discussion of authorization, error cases, or idempotency.
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?
Single sentence, no filler. Action is front-loaded. Concise and efficient.
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 creation tool with 2 parameters and annotations present, the description is fairly complete. However, lacks guidance on uniqueness constraints or error conditions.
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 provides full coverage for both parameters (name, avatar). Description does not add parameter-specific guidance, 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?
Description clearly states verb (create) and resource (workspace), and adds specificity about initial document being accessible in UI. This distinguishes from update and deletion 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?
No explicit when/not or alternatives provided. Implied that this is for creation, but no comparison to siblings like create_workspace_blueprint.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=false and destructiveHint=false. The description adds that it is a wrapper and creates a blueprint, but does not detail side effects like behavior on existing folders or error conditions. It is adequate given the annotations, but not rich.
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, no wasted words, and directly states the tool's purpose and relationship to create_folder. It is optimally concise.
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 tool's simplicity, the schema and annotations cover most essentials. The description lacks return value information, but as a convenience wrapper, the agent can infer it likely returns similar results to create_folder. Otherwise, it is complete enough for 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?
Schema coverage is 100%, so the baseline is 3. The description adds no additional meaning beyond the schema, simply restating that it creates a root with optional child folders.
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 clearly states it creates a 'simple AFFiNE organize folder blueprint with one root folder and optional child folders' and explicitly positions itself as a convenience wrapper around create_folder. This distinguishes it from the sibling create_folder and other 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 indicates it is a convenience wrapper around create_folder, which implies it should be used when you want to create a folder structure in one call rather than multiple calls. However, it does not explicitly mention when not to use it or provide alternative tools.
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 | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds the context of credential verification, which is useful and consistent with 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, no wasted words. Purpose and usage are stated upfront.
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?
Simple tool with adequate description. Covers what it returns, when to use it, and its read-only nature. No output schema needed.
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?
No parameters. Baseline score of 4 for 0-parameter tools. No additional parameter information 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?
Clearly states it returns the current authenticated user profile. Verb 'return' and resource 'user profile' are specific and distinguish from all sibling 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?
Explicitly tells to use before workspace or document operations to verify credentials, providing clear usage context. No mention of when not to use, but that's less critical for a simple read tool.
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. | |
| permanently | No | If true, permanently delete the blob instead of marking it deleted. | |
| workspaceId | Yes | AFFiNE workspace id that owns the blob. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint: true. The description adds the nuance of recoverable vs permanent deletion via the 'permanently' parameter, but does not explain default behavior (soft delete?) or side effects.
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 consists of two clear sentences with no redundant information. It is front-loaded and efficiently communicates the tool's purpose and a key usage nuance.
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 3-parameter tool with no output schema, the description covers the core behavior and the parameter nuance. It does not address error cases or return values, but these are adequately handled by the 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 coverage is 100%, so baseline is 3. The description adds value by explaining the 'permanently' parameter's purpose, but does not provide additional detail beyond the schema for other 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 clearly states the action ('Delete a blob'), the resource ('blob'), and the scope ('from AFFiNE workspace storage'). This distinguishes it from siblings like 'upload_blob' and 'cleanup_blobs'.
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 provides guidance on when to set the 'permanently' parameter ('only when the blob should bypass recoverable deletion'). However, it lacks explicit alternatives or when-not-to-use context, though the sibling list includes many different resource types.
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. 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses default behavior (removes descendants), and describes effects of deleteChildren and pruneConnectors. No contradiction with 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, no fluff, front-loaded with the core action.
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?
Covers key behaviors, options, and exclusions adequately for a destructive block tool with no 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 covers all parameters with descriptions, but description adds practical context for deleteChildren and pruneConnectors 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?
Description clearly states it deletes a block by ID, and explicitly distinguishes from delete_doc for whole pages ('Refuses affine:page — use delete_doc for whole 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 tells when not to use (for pages, use delete_doc) and describes options for controlling child deletion and connector pruning.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that only metadata is removed and documents are preserved, adding valuable context beyond the destructiveHint annotation. It clarifies the non-destructive effect on documents.
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-load the core action and key behavioral nuance. No superfluous words; every sentence adds essential 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?
For a straightforward deletion tool with full schema coverage and annotations, the description is nearly complete. It could mention permission requirements or irreversibility, but the core behavior is well covered.
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 schema covers 100% of parameters with descriptions, so the description adds no additional parameter meaning. 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 clearly states the tool deletes an AFFiNE sidebar collection, with the critical clarification that it does not delete referenced documents. This distinguishes it from related tools like delete_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 the tool is for deleting collection metadata only, but does not explicitly state when to use it versus alternatives (e.g., delete_doc, delete_tag). No direct guidance on 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.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'This is destructive for that comment', which aligns with the 'destructiveHint: true' annotation and adds context that the destruction is limited to the specific comment. It adds value beyond the annotation by specifying the scope of destruction.
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 extremely concise with just two sentences, yet it covers the essential purpose, usage guidance, and behavioral note. No unnecessary words.
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 deletion tool with one parameter, no output schema, and clear annotations, the description covers the core purpose, alternative usage, and behavioral impact. It is fully adequate for an agent to understand and use 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?
The input schema already has a well-described 'id' parameter with 100% coverage. The tool description does not add any additional meaning or context about the parameter beyond what the schema provides, so a 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 clearly states 'Delete an existing comment by id', which is a specific verb and resource. It also distinguishes itself from the sibling tool 'resolve_comment' by explaining the difference in intent.
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 tells when to use this tool (delete a comment) and when not to ('use resolve_comment when you only want to mark a thread resolved'). This provides clear guidance on alternatives.
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond annotations by specifying 'soft-delete' and 'existing values are hidden,' which clarifies the non-destructive nature despite the destructiveHint annotation. It does not fully explain reversibility or permissions, but the addition is meaningful.
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 sentence of 12 words, front-loading the action and resource with no extraneous information. Every word 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?
Given the tool has two parameters and no output schema, the description adequately conveys the core action but lacks details on error handling, permissions, or impact on associated data. For a destructive tool, more context would be beneficial.
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% (only 'property' is described in the description, while 'workspaceId' is not). The description adds meaning for the 'property' parameter (id or name) but leaves 'workspaceId' unexplained, providing partial compensation.
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 clearly states the verb (soft-delete), the resource (workspace custom property definition), and the identification method (by propertyId or name), distinguishing it from siblings like create_custom_property or clear_doc_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?
The description implies usage through the resource type but does not explicitly state when to use this tool versus alternatives, nor does it mention prerequisites or exclusions. The agent must infer context from sibling tool names.
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, but the description adds no additional behavioral details (e.g., cascading deletes, reversibility, 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?
The description is a single concise sentence that communicates the tool's purpose without any unnecessary words, demonstrating efficient structure.
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 description is adequate for a straightforward delete operation, but lacks critical context like return value behavior (no output schema) or post-deletion effects. Some additional detail would improve 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 description coverage is 100%, so the schema fully documents all four parameters. The description does not add extra meaning beyond what is in schema, earning a baseline score of 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?
The description clearly states the tool deletes a row from an AFFiNE database block, specifying the verb 'Delete' and the resource 'row' with context. It distinguishes from sibling tools like add_database_row and update_database_row.
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 tool compared to alternatives (e.g., when to delete vs update). The description lacks any usage context or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_docDelete DocumentADestructive
Delete a document by removing its workspace metadata entry and sending the AFFiNE WebSocket delete request for its content. This is destructive; use revoke_doc when you only need to remove public access.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | AFFiNE document id. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint: true, but description adds specifics about what gets deleted (metadata and content via WebSocket), enhancing transparency.
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 concise sentences, front-loaded with action, no wasted words.
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 destructive tool without output schema, the description explains effect and provides alternative, making it sufficiently 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%, so parameters are well-documented there. Description adds no extra parameter details, meeting the 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?
Description clearly states it deletes a document by removing metadata and sending a delete request, and distinguishes from revoke_doc by specifying its destructive nature.
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 tells when to use this tool (for full deletion) and when to use revoke_doc (only for removing public access), providing clear guidance.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true. The description adds that the operation is 'Experimental' and specifies it is destructive only for sidebar organization, not for target documents/tags/collections. This is valuable context beyond 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 with no wasted words. The first sentence states the action and scope; the second clarifies non-destructive aspects. Highly efficient.
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 destructive delete tool with no output schema, the description covers key behavioral aspects: what gets destroyed and what remains. It also notes experimental status. Minimal gaps exist, such as not mentioning response behavior or error cases.
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 both parameters described. The description does not add additional meaning beyond the schema, such as constraints or examples, so it meets but does not exceed the 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 uses a specific verb 'delete' and clearly identifies the resource: an AFFiNE organize folder and all nested folders or link nodes. It further distinguishes itself by stating what it does NOT delete (target documents, tags, or collections), differentiating it from sibling tools like delete_doc, delete_collection, etc.
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 mentions 'Experimental' as a warning but does not explicitly state when to use this tool versus alternatives. It implies use for removing folder structure without affecting underlying items, but lacks clear when-not or alternative tool references.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint: true), the description adds that the tool is experimental and that it only removes a sidebar link, not the resource. This provides behavioral context that would not be inferred from the schema or annotations alone. However, it does not address potential side effects or error conditions, such as what happens if the nodeId does not exist.
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 extremely concise: two sentences that first state the action and then clarify its scope. Every word earns its place, with no redundancy or filler. It is front-loaded with the essential verb and resource.
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 tool with one required parameter and full schema coverage, the description is largely complete. It explains what the tool does and what it does not do. The only gap is the lack of usage guidelines, but given the low complexity, the description provides sufficient context for the agent to understand the tool's effect.
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 schema covers both parameters with clear descriptions. The tool description adds no additional parameter-level information beyond what the schema provides. Since schema coverage is 100%, a baseline score of 3 is appropriate; the description does not enhance parameter understanding.
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 clearly states the verb 'delete' and the resource 'organize doc, tag, or collection link node', and crucially distinguishes itself from other delete tools by specifying it removes only the sidebar link, not the target resource. This precision makes its purpose 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 description lacks explicit when-to-use or when-not-to-use guidance. While it clarifies that the target resource is preserved, it does not contrast with sibling tools like delete_doc, delete_tag, or delete_collection that delete the actual resource. The 'Experimental' label hints at caution but is not actionable. Implicit guidance is present but not sufficient for an agent to reliably choose this over alternatives.
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) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already show destructiveHint=true. The description adds valuable detail about the 'pruneConnectors' option, which cascades deletion to related connectors, providing behavioral context beyond 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 concise sentences that front-load the main action and elaborate on an option. No unnecessary words or 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?
For a delete tool, the description covers the core action and cascading behavior. However, it does not mention error handling (e.g., what happens if element not found) or idempotency, which annotations indicate false. Slightly incomplete but acceptable.
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 input schema has 100% coverage, so baseline is 3. The description repeats the pruneConnectors behavior but does not add significant new meaning 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 clearly states the action ('Delete a surface element by id'), specifying the resource and method. It distinguishes itself from sibling tools like 'update_surface_element' and 'add_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?
The description implies usage for deleting surface elements but does not explicitly state when to use this tool versus alternatives (e.g., removing via other means). No guidance on prerequisites or 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.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true. The description adds critical behavior: it removes the tag from all documents referencing it, and explains how ambiguous names are handled. This goes beyond annotations but could still note if the operation is reversible or if confirmation is 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?
Two sentences with no redundancy. The key action and consequences are front-loaded. Every sentence adds valuable information without 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?
Given the tool has two parameters, no output schema, and annotations, the description covers the deletion behavior, side effects, and parameter ambiguity. It is sufficient for an agent to use correctly, though mentioning the return type (e.g., success/failure) would be ideal.
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%. The description adds meaning by explaining that the 'tag' parameter can be an id or name, and that ambiguous names cause rejection with candidate ids. This clarifies the parameter's flexibility and error handling.
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 explicitly states the action (delete), the resource (workspace-level tag), and the scope (remove from every document referencing it). This clearly distinguishes it from sibling tools like remove_tag_from_doc or create_tag.
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 does not provide explicit guidance on when to use this tool vs alternatives. It implies usage for permanent deletion of a tag, but lacks a direct comparison with siblings like remove_tag_from_doc. The mention of ambiguous name rejection is helpful but not a usage guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_workspaceDelete WorkspaceADestructive
Delete a workspace permanently
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workspace ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true. The description adds 'permanently' confirming irreversibility but does not disclose additional behavioral traits like impact on contained data, required permissions, or undo capability.
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 that is front-loaded and contains no superfluous words. Every word is meaningful.
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 delete operation with one parameter, the description is largely adequate given the annotations cover destructiveness. However, no return value specification is provided (no output schema), but this is typical for delete 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 coverage is 100% for the single parameter 'id' with description 'Workspace ID'. The tool description does not add any further meaning, so baseline score 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?
The description 'Delete a workspace permanently' clearly specifies the action (delete), the resource (workspace), and the scope (permanently), distinguishing it from sibling tools like update_workspace or create_workspace.
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 guidance on when to use this tool versus alternatives (e.g., update_workspace for non-destructive changes) or prerequisites. For a destructive operation, warnings or preconditions (e.g., workspace emptiness) are absent.
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 MarkdownBRead-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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that the output is markdown, but does not disclose error behavior, response format, or any side effects beyond what annotations 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?
The description is a single short sentence that conveys the core purpose without waste. It is front-loaded and efficient, though it could restructure to include brief usage hints without losing conciseness.
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 moderate complexity (3 params, no output schema), the description is somewhat incomplete. It does not explain the output format details, error conditions, or the effect of 'includeFrontmatter'. Annotations fill some gaps, but the description lacks full contextual 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 67%, with docId and workspaceId described in the schema. However, the tool description adds no meaning for any parameter, especially 'includeFrontmatter', which remains undocumented. The description should clarify the role of this critical parameter.
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 clearly states the tool's function: exporting AFFiNE document content to markdown. It uses a specific verb and resource, but does not differentiate from siblings like 'export_with_fidelity_report' or 'replace_doc_with_markdown' that also involve markdown 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?
No guidance is provided on when to use this tool versus alternatives such as 'read_doc' for JSON output. There are no mentions of preconditions, typical use cases, or exclusions.
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 ReportBRead-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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false. The description adds context about the fidelity report content (highlights markdown loss risk and unsupported content), but does not specify output format, side effects, or whether the export is a file download or inline response.
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, well-structured sentence of 21 words. It front-loads the core purpose and contains no extraneous 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?
Given the tool has 3 parameters and no output schema, the description omits important context: the structure of the fidelity report, how the output is delivered, and the effect of the 'includeFrontmatter' parameter. This leaves the agent with insufficient information to use 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 67% (docId and workspaceId have descriptions, includeFrontmatter does not). The tool description does not mention any parameters or add meaning beyond the schema. Notably, 'includeFrontmatter' is left entirely unexplained, which the description should compensate for.
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 clearly states the tool exports document markdown together with a structured fidelity report highlighting markdown loss risk and unsupported AFFiNE-native content. This distinguishes it from sibling tools like 'export_doc_markdown' (plain markdown export) and 'analyze_doc_fidelity' (fidelity analysis only).
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 guidance on when to use this tool versus alternatives such as 'export_doc_markdown' or 'analyze_doc_fidelity'. It does not mention use cases, prerequisites, or exclusions.
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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that it reads workspace metadata without per-doc fetch, and describes return structure including truncated flag. Annotations (readOnlyHint, idempotentHint) are consistent, and no contradictions.
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, but slightly verbose. Every sentence adds value, but could be tightened without losing clarity.
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 no output schema, the description provides a detailed return structure, behavior (fast, no per-doc fetch), and explains the difference from sibling. Highly complete for a 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 100%, and the description adds some context (e.g., default limit of 50, max 200) but does not significantly enhance understanding beyond what the parameter descriptions provide.
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 clearly states it resolves docs by exact title, providing a specific verb and resource. It distinguishes itself from the sibling 'search_docs' by noting case-sensitivity and higher limit.
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 advises preferring this tool over 'search_docs' when exact title is known and all matches are desired. Also notes case-sensitivity default and optional switch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_access_tokenGenerate Access TokenA
Generate a new personal access token and return its one-time secret. This creates a credential; store the returned token securely because it may not be shown again.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable token name shown in AFFiNE token settings. | |
| expiresAt | No | Optional expiration timestamp accepted by AFFiNE, typically an ISO 8601 string. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description adds critical behavior: the secret is one-time and may not be shown again. No contradiction with 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, efficient, front-loaded with key action and warning. No unnecessary verbiage.
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 generation tool with no output schema, the description adequately covers the return value behavior and token handling.
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 description adds minimal value for parameters. Baseline of 3 applies; no extra parameter details provided.
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 clearly states the tool creates a personal access token and returns a one-time secret, distinguishing it from sibling tools like list_access_tokens and revoke_access_token.
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 usage for generating tokens but doesn't explicitly state when not to use or mention alternatives like revoking or listing tokens. Sibling names provide context.
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 block, database, collaboration, and export support.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, covering safety and idempotency. The description adds value by specifying the categories of flags (block, database, collaboration, export), which provides useful behavioral context beyond 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 a single sentence, front-loaded with the action and resource, and contains no unnecessary words or 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?
For a tool with no parameters and no output schema, the description provides a reasonable summary of what the tool returns. It could be improved by hinting at the structure of the flags (e.g., JSON object with boolean fields), but it is generally 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?
There are no parameters, and schema coverage is 100%. The description does not need to add parameter details. Baseline for 0 parameters is 4, and the description appropriately avoids extraneous information.
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 clearly states the tool returns machine-readable capability flags for the MCP server, specifying the types of support included. The verb 'Return' and resource 'capability flags' are specific and distinguish this tool from sibling tools that perform actions or read specific data.
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 guidance on when to use this tool versus alternatives. While it's implied to check server capabilities before other operations, the description lacks context about prerequisites or conditions.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. Description adds context that it returns rules and allow-list, no side effects.
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 verb and resource, no fluff.
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?
No output schema but description explains returned content (rules, allow-list). Sufficient for a simple 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 100% with descriptions. Description adds minimal extra info (source of collectionId). 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?
Description clearly states it reads a collection by id, including rules and allow-list. Distinguishes from sibling list_collections (which lists all) and update_collection (write).
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 instructs to use list_collections first when id is unknown, providing clear when-to-use guidance.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, destructiveHint false. Description adds value by specifying the metadata fields retrieved, but no additional behavioral traits like auth or edge cases.
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 purpose and examples, zero wasted words. Efficient and structured.
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 tool with comprehensive annotations, description covers purpose and alternative. Lacks mention of error responses or behavior if docId not found, but adequate given low 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 100% with both parameters described. Description does not add parameter-specific details beyond schema, so 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?
Description clearly states it reads GraphQL metadata for one document, listing specific fields like title, summary, public state, roles, timestamps. It differentiates from sibling read_doc by noting that read_doc is for block content.
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 instructs to use read_doc when block content is needed, providing a clear alternative. The description implies use for metadata retrieval, making when-to-use unambiguous.
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds the return-null behavior but little else beyond 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 extra words, purpose and behavior front-loaded. Efficient and clear.
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 tool with rich annotations and no output schema, the description provides sufficient information: what it does and the null case. Context is 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 50%—only docId has a description. workspaceId is undocumented. The tool description does not add any parameter explanation, failing to compensate for missing schema descriptions.
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 clearly states the verb 'Read' and the resource 'current sidebar icon of a document,' with return behavior specified. It distinguishes from sibling tools like 'update_doc_icon' and 'get_folder_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?
Usage is implied as a read operation for icons, but no explicit when-to-use or when-not-to-use guidance is provided. No alternatives are mentioned.
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) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds specific behavioral details: it returns aggregate bounding box and per-type element counts, which go beyond the annotations without contradicting them.
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, approximately 50 words, front-loaded purpose and usage guidance. No filler, every sentence provides value.
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?
No output schema, but the description completely describes the return value: all blocks with xywh, all surface elements, aggregate bounding box, per-type counts. For a read-only tool with safe annotations, this is fully 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?
The input schema has 100% description coverage for both parameters (docId, workspaceId). The description does not add any extra meaning about the parameters beyond what the schema provides, so 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 clearly states the verb 'Read', the resource 'full edgeless canvas', and specifies exactly what it returns (edgeless-positioned blocks with xywh, surface elements, aggregate bounding box, per-type counts). This distinguishes it from sibling tools like 'list_surface_elements' or '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?
Explicitly says 'Use this when you need to understand canvas layout end-to-end before placing new elements', providing a clear when-to-use scenario. However, it does not mention when not to use it or name specific alternatives.
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 IconARead-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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, etc. The description adds that it returns null when no icon is set and marks the tool as 'Experimental,' providing useful behavioral context 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?
The description is extremely concise with two sentences, no filler, and front-loaded with the core purpose. Every sentence adds value: the first states the action, the second gives return behavior and experimental status.
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 tool with no output schema, the description covers the basic functionality (reading icon, null return) and the experimental tag. However, it could specify the format or type of the returned icon (e.g., URL or path) to be fully 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 50%: only 'folderId' has a description. The description does not add meaning for 'workspaceId' (undocumented). The description mentions 'sidebar icon of an organize folder' which implies the folder is identified, but does not clarify the role of workspaceId.
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 clearly states the tool reads the sidebar icon of an organize folder and specifies the return behavior when none is set. The verb 'Read' and resource 'sidebar icon of an organize folder' are specific and distinct from sibling tools like 'update_folder_icon' or 'get_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?
No guidance on when to use this tool versus alternatives is provided. It does not mention prerequisites, context, or when not to use it (e.g., if the icon is not set, it returns null but doesn't advise checking null). No sibling differentiation is discussed.
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly, idempotent, openWorld, not destructive. The description adds 'scans all docs — O(n)' and 'Each doc includes an inTrash flag', providing algorithmic complexity and a result field detail beyond 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, each earning its place: definition, use case, behavioral note. No wasted words, front-loaded with core purpose.
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 one optional parameter and no output schema, the description explains orphan concept, performance, and a result field. However, it fails to describe the workspaceId parameter, which is essential to control scope.
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 description does not mention the workspaceId parameter at all. The agent receives no guidance on what the parameter does or its optionality, leaving a significant 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 clearly states the verb 'Find' and the resource 'all documents that have no parent', with specific criteria excluding linked docs. It distinguishes this tool from siblings like list_docs, search_docs, and list_docs_by_tag by focusing on orphan detection.
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 says 'Useful for workspace hygiene', implying a cleanup context. It notes O(n) performance, suggesting careful use. However, it doesn't explicitly contrast with alternatives 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.
get_workspaceGet WorkspaceARead-onlyIdempotent
Get details of a specific workspace
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workspace ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds no additional behavioral context, but 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 a single, front-loaded sentence with no redundant information, achieving maximum conciseness.
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 simplicity of the operation and the presence of rich annotations, the description is adequate. However, it could mention that an ID is required or hint at the return value, though not strictly necessary.
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 parameter 'id' is described as 'Workspace ID'. The description does not add further 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?
The description clearly specifies the verb 'Get' and the resource 'workspace', distinguishing it from sibling tools like 'list_workspaces', 'update_workspace', and 'delete_workspace'.
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 usage when a user needs details of a specific workspace by ID, but it does not provide explicit guidance on when to use this tool versus alternatives like listing workspaces first.
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. |
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 agent knows it's safe and idempotent. The description adds value by specifying the exact scope of inspection (structure, tags, fallback risk), though 'fallback risk' could be more defined. No contradictions with 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?
A single sentence that is front-loaded with the purpose. Every word earns its place. No redundancy or fluff. Ideal length for quick comprehension.
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 description covers the tool's purpose and scope given its simplicity (2 params, rich annotations). However, without an output schema, a brief note on the return format (e.g., 'returns JSON with structure and risk flags') would improve completeness. Still, it is adequate for a read-only inspection 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 100%, so the baseline is 3. The description does not add any parameter-specific information beyond what the schema's descriptions already provide (e.g., workspaceId condition, templateDocId purpose). No additional semantic value is contributed.
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 clearly states the verb 'Inspect' and the resources: 'template doc's native structure, tags, and fallback risk'. It distinguishes this tool from siblings like instantiate_template_native and analyze_doc_fidelity by focusing on pre-instantiation inspection of templates. The purpose is specific and 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 description includes 'before instantiation', which provides useful context for when to use this tool relative to instantiate_template_native. However, it does not explicitly mention when not to use it or compare it to alternative tools like analyze_doc_fidelity. The guidance 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.
instantiate_template_nativeInstantiate Template NativelyA
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate it's not read-only and not destructive. The description adds value by explaining the fallback mechanism and reliance on native cloning support, which provides behavioral context beyond 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?
Single, front-loaded sentence that efficiently conveys the core action and fallback behavior. No unnecessary words.
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 description covers the main action but lacks details on return values (no output schema) and does not elaborate on the variable substitution or fallback conditions. Schema compensates somewhat, but for a tool with 7 parameters, more contextual completeness would help.
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 baseline is 3. The description does not add extra meaning to parameters 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?
Description clearly states the tool instantiates templates using native block cloning with fallback. It distinguishes from siblings like 'create_doc_from_markdown' or 'inspect_template_structure' by specifying the unique method and fallback behavior.
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 guidance on when to use this tool versus alternatives. The description implies usage context (native cloning support) but does not compare with other instantiation or creation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_access_tokensList Access TokensARead-onlyIdempotent
List metadata for the current user's personal access tokens. Token secrets are not returned; use generate_access_token only when a new secret is needed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, etc. The description adds that token secrets are not returned, which is a behavioral detail beyond what annotations provide. No contradiction.
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 words. The purpose is front-loaded, and every sentence adds value.
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?
Despite no output schema, the description clarifies what is returned (metadata) and what is not (secrets). For a parameterless tool, this is fully 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?
Tool has 0 parameters, so schema coverage is 100%. Description adds no parameter info, which is appropriate for an empty schema. Baseline 4.
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 'List metadata for the current user's personal access tokens' with a specific verb and resource. It distinguishes from siblings like generate_access_token and revoke_access_token by clarifying that secrets are not returned.
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 says 'use generate_access_token only when a new secret is needed,' providing a clear when-not-to-use and an alternative. The description implies using list for metadata retrieval.
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint, so the safety profile is covered. The description adds value by specifying the return fields (docId, title, URL, inTrash), which are not in annotations or output schema. No contradictions.
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 redundancy. The first sentence defines purpose and scope, the second details return fields. Every word 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?
For a simple list tool with no output schema, the description adequately covers return fields. It is missing details on error handling, ordering, or pagination, but these are reasonable gaps for a straightforward read tool. The behavioral annotations fill some 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 description coverage is 50%, with only docId having a description. The description adds no new parameter info: it mentions the parent doc but does not explain workspaceId or add constraints. For docId, the schema already covers it. The description fails to compensate for the missing workspaceId 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 clearly states the verb (list), the resource (direct children of a document), and specifies the types of children: embed_linked_doc, embed_synced_doc blocks, and inline LinkedPage references. It differentiates from siblings like list_docs and list_docs_by_tag by focusing on a specific parent doc and direct children only.
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 usage when you need the children of a document, but it does not explicitly state when to use this tool versus alternatives like list_workspace_tree for a full hierarchy or list_docs for all documents. No exclusions or alternatives are mentioned.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and idempotent. Description adds that it lists collections and their rules, which is beyond annotation info. No contradiction.
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 purpose, second provides usage guidance. No wasted words.
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 list tool with good annotations and schema, description is nearly complete. Could mention return format but not essential.
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 with full schema description. Description does not add additional parameter semantics beyond what schema provides. Baseline 3 per rules.
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?
Description clearly states it lists AFFiNE sidebar collections and their rules, using specific verb and resource. Distinguishes from siblings like get_collection or update_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 says to use this read-only tool before updating, deleting, or adding documents to a collection, providing clear when-to-use context.
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. | |
| offset | No | Zero-based offset used by AFFiNE pagination. Do not combine with after unless the AFFiNE API requires it. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, idempotentHint=true, etc. Description adds context that results are paginated and include nested replies and resolution state. No contradictions, and the added context is valuable 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, front-loaded with key information. No redundant words. Efficient and clear.
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 5 parameters and no output schema, description covers essential behavioral aspects (pagination, content of responses) and usage guidance. Could mention output structure briefly, but overall sufficient for an agent to use 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 100%, so parameters are already documented. Description mentions 'paginated' but does not add new meaning to input parameters. Baseline 3 is appropriate as description does not need to compensate.
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?
Description clearly states verb 'List', resource 'comments for a document', and includes scope 'including nested replies and resolution state'. It effectively distinguishes from sibling tools like create_comment, update_comment, etc.
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 'Use this before update_comment, delete_comment, or resolve_comment when you need the existing comment ids.' Provides clear contextual guidance on when to use this tool.
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 the workspace custom-property definitions and a document's current values for them.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | ||
| workspaceId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds context beyond annotations by specifying the tool lists both property definitions and document values. It does not contradict any annotation.
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. Every part of the sentence is necessary and informative.
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 no output schema, so the description should explain the return value structure. It mentions listing definitions and values but does not describe the format or fields. For a simple read operation with two parameters, this is adequate but incomplete.
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%, meaning the description adds no information about the parameters (docId, workspaceId). The description does not explain what docId or workspaceId represent or how they are used. With low coverage, the description should compensate, but it 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 clearly states the tool lists workspace custom-property definitions and a document's current values. The verb 'list' and the specific resource 'workspace custom-property definitions and document values' precisely define the tool's action, distinguishing it from sibling tools like set_doc_property or clear_doc_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?
The description implies usage for reading property definitions and values, but does not explicitly state when to use this tool versus alternatives like set_doc_property or clear_doc_property. No when-to-use or when-not-to-use guidance is provided.
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). Each doc includes an inTrash flag.
| 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. | |
| offset | No | Zero-based offset used by AFFiNE pagination. Do not combine with after unless the AFFiNE API requires it. | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint, idempotentHint, destructiveHint) already cover the read-only and non-destructive nature. The description adds the detail about the 'inTrash flag' but provides no further behavioral context beyond 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?
Single sentence that is clear, front-loaded, and contains no extraneous information. Every word adds value.
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 complexity of pagination (after, first, offset, workspaceId) and no output schema, the description omits details about how pagination works or the return structure. It is adequate but not comprehensive.
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?
Input schema coverage is 100% with all four parameters described. The description does not augment the schema's parameter descriptions, so 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 clearly states the verb 'List' and the resource 'documents in a workspace', adding a specific detail about the output ('Each doc includes an inTrash flag'). It distinguishes from sibling tools like search_docs or 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?
No explicit guidance on when to use this tool versus alternatives such as list_docs_by_tag or search_docs. The mention of GraphQL is present but does not clarify context for usage.
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 TagARead-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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint. Description adds context about result content (title metadata and inTrash flag), which adds value beyond 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 lean sentences: one for purpose, one for behavioral traits and output. No wasted words.
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?
No output schema, but description clarifies that results include title metadata and inTrash flag. Lacks pagination or full structure, but given safety annotations, it is fairly complete for a filtered list 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 100%, so baseline is 3. Description does not add extra meaning beyond what the schema provides for parameters; it only mentions output structure.
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?
Description clearly states 'List documents that contain the requested tag' with a specific verb and resource. Distinguishes from siblings like list_docs and search_docs by focusing on tag-based filtering.
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?
States 'read-only' implying safe usage, but does not explicitly mention when to use this tool vs alternatives like list_docs or search_docs. No exclusion criteria provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_historiesList HistoriesBRead-onlyIdempotent
List doc histories (timestamps) for a doc.
| Name | Required | Description | Default |
|---|---|---|---|
| guid | Yes | ||
| take | No | ||
| before | No | ||
| workspaceId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare safe read operations (readOnlyHint=true, destructiveHint=false). The description adds that the output includes timestamps, which aligns with annotations. No contradiction, but no additional behavioral insights beyond what annotations 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?
The description is a single short sentence, front-loaded, and free of fluff. However, it omits important details that could be added concisely, like parameter hints.
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 list tool with safety annotations, the description is minimally adequate but lacks parameter explanations and usage context. Given no output schema, some explanation of return format would improve 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?
The input schema has 4 parameters with 0% description coverage, and the tool description does not explain any parameter (guid, take, before, workspaceId). The mention of 'for a doc' hints at guid but leaves others completely undocumented.
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 clearly states the verb (List), resource (doc histories/timestamps), and scope (for a doc). It effectively distinguishes this tool from sibling list tools like list_docs, list_tags, etc.
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 is provided on when to use this tool versus alternatives like list_docs or list_comments. The description does not mention context, prerequisites, or exclusions.
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 the current user's AFFiNE notifications with optional unread filtering. This is read-only and returns notification ids, read state, level, and timestamps.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Cursor for pagination | |
| first | No | Number of notifications to fetch | |
| offset | No | Offset for pagination | |
| unreadOnly | No | Show only unread notifications |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds beyond annotations by stating it is read-only and returns specific fields (ids, read state, level, timestamps). Annotations already mark readOnlyHint, idempotentHint, and destructiveHint false, and the description aligns and supplements.
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 concise sentences that front-load the key purpose and behavior. Every sentence adds value without redundancy.
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 4 optional parameters, no output schema, and complex sibling tools, the description is fairly complete. It specifies return fields and highlights the optional filter, though pagination details are left to 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 schema already documents all parameters. The description mentions 'optional unread filtering' which maps to the unreadOnly parameter, but adds no additional meaning or usage details beyond the schema descriptions.
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 clearly states the tool lists notifications for the current user, with optional unread filtering. It specifies the verb 'list', resource 'notifications', scope 'current user', and distinguishes from siblings like 'list_comments'.
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 usage for viewing notifications, but does not provide explicit guidance on when to use this tool versus alternatives (e.g., search or other list tools). No when-not-to-use or context for exclusion is given.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint true/false. Description adds experimental status and data source, but no extra behavioral detail beyond what annotations 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?
Two sentences: first states purpose, second gives usage hint. No extraneous words, well-structured.
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 rich annotations, the description provides experimental context, data source, and usage guidance. Return format is not described, but not critical given the tool's simplicity.
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% for the single optional parameter workspaceId, and the description does not add any additional meaning beyond the schema 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 clearly states the tool lists AFFiNE sidebar organize folder and link nodes from the folders workspace DB, distinguishing it from sibling tools like add_organize_link and delete_organize_link.
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 advises using this tool before moving or deleting organize nodes, providing a clear usage context. Could mention when not to use, but the hint is sufficient.
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) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds value by specifying return format (raw xywh strings, parsed bounds, serialized Y.Text), but does not cover potential edge cases or constraints.
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, no unnecessary words.
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?
Despite lacking an output schema, the description adequately explains the return format (xywh, bounds, serialized Y.Text) and optional filters, providing sufficient context for a read-only listing 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?
The input schema already provides complete parameter descriptions (100% coverage). The description only mentions 'element type or id' filters, adding no significant semantic information 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 clearly states it lists elements (shape/connector/text/group) on the AFFiNE edgeless canvas surface, differentiating it from sibling tools like add_surface_element or delete_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?
The description indicates optional filters by type or id, providing clear context for when to use. However, it does not explicitly state when not to use it or mention alternatives.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive behavior. Description adds minor output context but doesn't reveal additional behavioral traits.
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, purpose first, usage second. No wasted words.
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 list tool with one parameter, complete context given schema, annotations, and output description.
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 has full coverage of the only parameter; description adds no extra meaning 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?
Clearly states it lists workspace-level tags with document counts, distinguishing it from tag mutation 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?
Explicitly advises using it before tag mutation when tag name/id is unknown, providing clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesList WorkspacesARead-onlyIdempotent
List all available AFFiNE workspaces
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, openWorld, idempotent, and non-destructive behavior. The description adds context ('AFFiNE workspaces') and does not contradict annotations, but does not provide additional behavioral details beyond what annotations already 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?
A single, front-loaded sentence that is extremely concise and contains precisely the needed information with no wasted words.
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 list-all tool with no parameters and rich annotations, the description is adequate. It does not specify sorting or filtering, but given the tool's name and annotations, it is sufficiently 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?
The tool has zero parameters, so schema coverage is complete. The description's phrase 'all available' adds clarity beyond the empty schema, justifying a baseline score of 4.
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 clearly states the verb 'List' and the resource 'all available AFFiNE workspaces', which distinguishes it from sibling tools like 'get_workspace' (singular) and 'create_workspace'.
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 purpose is clear but there is no explicit guidance on when to use this tool versus alternatives like 'get_workspace' or other list tools. Usage is implied by the name and description, but no exclusions or context are provided.
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). | |
| workspaceId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint as false, covering safety and idempotency. The description adds a performance warning ('may be slow on large workspaces') and notes the inTrash flag on each node, which are valuable behavioral details beyond the annotations. No contradictions.
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: the first states the core purpose, the second provides parameter context and a performance note. Every word earns its place; no fluff or repetition. It is appropriately sized and 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 no output schema, the description must explain the return format. It describes the tree structure (roots → children → grandchildren) and mentions the inTrash flag but does not specify other fields or how the tree is represented (e.g., list of root nodes with nested children). Annotations cover idempotency and openness, but the description could be more complete about the response structure.
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 50% (only depth has a description). The description adds meaning for depth by specifying the default value (3) and its role in limiting nesting. However, workspaceId is not addressed, leaving its purpose unclear. The description adds moderate value over the schema but does not fully compensate for the parameter lacking schema documentation.
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 clearly states the tool returns the full document hierarchy as a tree (roots → children → grandchildren), which is specific and distinct from siblings like list_children (direct children only) or list_docs (flat list). The verb 'Returns' combined with the resource 'document hierarchy as a tree' makes the purpose 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 description mentions using the depth parameter to limit nesting and warns that loading all docs may be slow on large workspaces, which implies caution. However, it does not explicitly state when to use this tool over alternatives like list_children or get_orphan_docs, leaving the agent to infer the appropriate context. The guidance is adequate but not comprehensive.
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 by embedding it under a new parent. Optionally removes it from the old parent (fromParentDocId). If fromParentDocId is omitted, the doc is added to the new parent but not removed from the old one.
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a non-read-only, non-idempotent mutation. The description adds behavioral context: if fromParentDocId is omitted, the doc is only added to the new parent, not removed from the old one. This goes beyond the annotations without contradicting them.
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 concise sentences front-load the core action ('Move a doc in the AFFiNE sidebar by embedding it under a new parent') and then explain the optional parameter behavior. No superfluous 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 the moderate complexity (4 parameters, no nested objects) and annotations covering the safety profile, the description provides enough context for correct use. No output schema is needed for a move operation, and the behavior is fully 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?
With 75% schema description coverage, the description adds meaning to fromParentDocId by explaining its effect when omitted. workspaceId lacks description but is self-explanatory as a workspace identifier. The added context justifies a score above the baseline of 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?
The description clearly states that the tool moves a doc in the AFFiNE sidebar by embedding it under a new parent. It uses specific verbs and resources, distinguishing it from siblings like delete_doc or create_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 explains the optional behavior of removing from the old parent via the fromParentDocId parameter. However, it does not explicitly state when to use this tool versus alternatives like move_organize_node, so it lacks exclusion guidance.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate write operation (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds that it is experimental and that only sidebar placement changes, which provides helpful behavioral context beyond annotations. No contradictions.
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 first sentence gives the purpose and experimental nature; the second clarifies the effect. Every word 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?
Given the tool's simple function (move node) and good schema/annotations, the description adequately explains the core behavior. Missing details like error handling or prerequisites, but for a straightforward move operation it's near-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%, so parameters are well-documented. The description adds minimal extra meaning beyond the schema—it implies the destination choices (folder or root) but doesn't detail parameter syntax or behaviors like indexing. 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 clearly states the verb ('move'), resource ('AFFiNE organize folder or link node'), and destination ('another folder or root'). It distinguishes from siblings like add_organize_link (creates new) and delete_organize_link (removes), making the tool's purpose 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 description implies usage context: reorganizing sidebar without affecting content ('preserves the target... changes only sidebar placement'). It doesn't explicitly state when not to use or list alternatives, but the effect is clear enough for an agent to decide.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutation (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds context that it changes sharing state, which is consistent. No contradictions, but it doesn't detail side effects like permissions or idempotency.
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 concise sentences: first states the purpose, second provides usage guidance. No redundant 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?
For a simple mutation tool with full schema coverage and annotations, the description adequately covers the main action and points to the reverse tool, making 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 coverage is 100%, so the description adds no extra meaning 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?
The description uses a specific verb ('make publicly accessible') and identifies the resource ('document through AFFiNE public sharing'). It also distinguishes from the sibling tool revoke_doc by noting the opposite 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?
The description explicitly states when to use this tool ('make a document publicly accessible') and directs to the alternative revoke_doc for disabling public access, providing clear guidance.
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 ReadA
Mark every current-user notification as read. This mutates notification state; use list_notifications first when you need to inspect unread items.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description notes that the tool mutates notification state, which aligns with annotations (readOnlyHint=false). While annotations already indicate a write operation, the description adds explicit behavioral context without contradiction.
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 action, and contains no unnecessary words. Every sentence 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?
For a simple mutation tool with no output schema and no parameters, the description is complete. It explains the action, mutational nature, and provides usage guidance, leaving no obvious gaps.
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 zero parameters, the schema coverage is 100%, so the description adds no parameter meaning. Baseline is 4 for no parameters, and the description does not need to elaborate.
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 clearly states the tool marks all current-user notifications as read, a specific action on a specific resource. It distinguishes itself from sibling tools like list_notifications by indicating mutation vs. inspection.
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 advises using list_notifications first when inspection is needed, providing clear guidance on when to use this tool vs. an alternative.
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.
| 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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, etc. The description adds that it reads 'row titles and database cell values', which clarifies the exact type of data retrieved. No contradictions.
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 that communicates the core function without extraneous words. Every word 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?
For a read tool with 5 parameters and no output schema, the description adequately states what is returned (row titles and cell values). It could benefit from noting the return format or structure, but it is sufficient for selection.
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 does not add additional meaning beyond what is already in the schema for each parameter.
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 clearly states the verb 'Read' and the resource 'row titles and database cell values' from an AFFiNE database block. This specific resource distinguishes it from sibling tools like read_database_columns or add_database_row.
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 guidance on when to use this tool versus alternatives. While the read-only and safe nature is implied by annotations, the description does not provide context for selection.
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, fully describing the safe, non-mutating behavior. The description adds minor behavioral context (reads schema metadata, useful for empty databases) but does not go beyond what annotations imply. It does not contradict annotations, so score is appropriate baseline.
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: the first delivers the core purpose, the second adds a specific use-case context. Every sentence is informative and non-redundant, with no wasted words. It is front-loaded and easy to parse.
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 simple read-only nature, rich annotations, and full schema coverage, the description adequately conveys the tool's function and when it is useful. It mentions the returned data (columns, select options, mappings), compensating for the lack of an output schema. It is sufficiently complete for an agent to select and invoke 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 each parameter (docId, workspaceId, databaseBlockId) already has a clear description in the schema. The tool description does not provide additional parameter-level information, such as format or constraints. Per rubric, baseline is 3 when coverage exceeds 80%.
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 clearly states the verb 'Read' and the resource 'schema metadata for an AFFiNE database block', specifying included elements (columns, select options, view column mappings). This distinguishes it from sibling tools like 'read_database_cells' (reads cell values) and 'add_database_column' (adds a column), making purpose 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 description provides clear context by stating 'Useful for empty databases before any rows exist,' indicating a specific scenario. However, it does not explicitly exclude alternatives or mention when not to use this tool, such as when column metadata is not needed or when rows exist. The guidance is helpful but lacks explicit comparisons to siblings.
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 via WebSocket snapshot (blocks + plain text). Set includeMarkdown: true to also get the rendered markdown — useful when you need to read content without a separate export_doc_markdown call.
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint. The description adds that the tool reads via WebSocket snapshot and returns blocks+plain text, which complements the annotations without contradiction.
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 concise sentences. The first states the core function, the second adds optional usage guidance. No wasted words.
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 no output schema, the description mentions return content (blocks + plain text) but does not detail the structure. Annotations cover safety. It is fairly complete for a read tool but could benefit from slightly more detail on the response format.
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%; all parameters have descriptions. The description adds value by explaining the purpose of includeMarkdown ('to also get the rendered markdown') and its relationship to export_doc_markdown, which goes beyond the schema's 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 uses a specific verb ('Read') and resource ('document block content via WebSocket snapshot'), and distinguishes from the sibling 'export_doc_markdown' by noting that includeMarkdown can avoid a separate call.
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 mentions that includeMarkdown can be used to avoid a separate export_doc_markdown call, providing clear context for that parameter. However, it does not compare to other read tools like 'get_doc' or specify when not to use this tool.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-destructive mutation. The description adds clarity by specifying that the document is removed from the allow-list and not deleted, but it does not address potential side effects or return behavior, especially given the openWorldHint flag.
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: first states the core action, second clarifies exclusions. Every sentence adds value without redundancy. Front-loaded and concise.
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 description covers the essential behavior but lacks information about return values, success indicators, or post-conditions. For a simple mutation tool with no output schema, more context on what to expect after execution would improve 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 the schema already describes all three parameters. The description adds no additional meaning beyond what the schema properties provide, so 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 specific verb 'remove' and identifies the resource as 'document id from an AFFiNE collection allow-list'. It clearly distinguishes from siblings like 'delete_doc' by stating it does not delete the document or change collection rules.
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 usage context by stating what it does not do, but it does not explicitly state when to use this tool over alternatives or provide exclusions. No guidance on prerequisites or context.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate it's not read-only or destructive. The description adds that it doesn't delete the workspace-level tag, but does not disclose error conditions or auth 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, no extraneous information. The core action is stated first, then a comparison with a sibling. Highly efficient.
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 detach operation, the description covers the essential distinction and action. It lacks details on return values or error handling, but annotations provide some 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% with good descriptions for all three parameters. The tool description does not add extra parameter meaning beyond the schema, so baseline score 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 clearly states the tool detaches a tag from a single document without deleting the workspace-level tag, and explicitly distinguishes it from delete_tag.
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 explicit guidance: 'Use delete_tag only when the tag should be removed from every document,' directly contrasting with the sibling tool.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations by explicitly stating that the tool only changes sidebar metadata and does not rename documents inside the folder. This clarifies non-obvious side effects. Annotations already indicate non-idempotent mutation, so the description provides useful supplementary info.
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 concise sentences: the first states the action, the second clarifies limitations. No wasted words, front-loaded with key 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?
For a simple rename tool, the description covers what it does and its limitations. It mentions 'Experimental' and the scope of changes. No output schema exists, but the description is adequate. Could add success/error hints, but not necessary given simplicity.
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 parameters are well-documented. The description does not add new meaning beyond the schema; it implies 'name' is the new folder name and 'folderId' identifies the node, but this is already clear from parameter descriptions.
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 clearly states the action 'rename an AFFiNE organize folder node' and distinguishes it from sibling tools like create_folder or delete_folder by specifying the scope: it only changes sidebar metadata and does not rename documents inside the 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 description implies usage for renaming folder metadata but does not explicitly state when to use this tool versus alternatives, nor does it provide conditions for when not to use it. The 'Experimental' label warns of instability but doesn't guide selection.
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 MarkdownA
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 | |
| workspaceId | No | AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate the tool is not read-only, not idempotent, and not destructive, which aligns with the 'replace' action. The description adds no details beyond that, such as whether other document attributes are preserved or the fate of old 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?
The description is a single, concise sentence that is front-loaded with the action and resource. No unnecessary words or 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?
The tool has four parameters and no output schema. The description explains the basic function but does not address error conditions, prerequisites (e.g., existing document), or confirm the absence of return values beyond what a replacement implies.
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%, covering three of four parameters. The description does not add any parameter-specific information beyond what is in the schema, and the 'strict' parameter lacks documentation in both.
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 clearly states the tool replaces the main note content of a document with markdown, using a specific verb and resource. It differentiates from siblings like append_markdown and create_doc_from_markdown by specifying replacement rather than addition or creation.
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 that the tool is used when one wants to overwrite a document's content entirely, but it does not provide explicit guidance on when to use this over alternatives, nor does it mention any prerequisites or exclusions.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-readonly and non-destructive; description adds that content is unchanged, aligning with annotations. No contradiction.
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 purpose, no waste. Efficient and informative.
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 no output schema, the description suffices for a simple state mutation tool. Complements schema and annotations perfectly.
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 clear descriptions for both parameters. Description does not add beyond schema, so 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?
Clearly states the action is setting resolved state without content change, and distinguishes from sibling tool delete_comment. Verb 'resolve_comment' is precise.
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 says when to use (toggle resolved) and when not (use delete_comment for removal). Provides clear decision boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_access_tokenRevoke Access TokenADestructive
Revoke an existing personal access token by id. This is destructive for API clients using that token; list tokens first if the id is unknown.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Access token id returned by list_access_tokens or generate_access_token. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reinforces the destructive nature already indicated by the destructiveHint annotation and adds context that it affects 'API clients using that token'. This additional context goes beyond the annotation.
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 concise sentences, front-loading the core action and adding essential guidance without unnecessary details.
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 revocation tool with one required parameter and no output schema, the description covers purpose, warning, and a helpful precursor action. It is sufficient for the agent to use 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?
The schema has 100% coverage, but the description adds value by explaining that the 'id' parameter is 'the access token id returned by list_access_tokens or generate_access_token', providing source context not in the schema 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 clearly states the action: 'Revoke an existing personal access token by id.' It uses a specific verb and resource, distinguishing it from sibling tools like 'generate_access_token' and 'list_access_tokens'.
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 explicit guidance: it warns that revocation is destructive for API clients using the token and advises to list tokens first if the id is unknown. This helps the agent decide when to use this tool versus listing tokens.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false. The description adds value by clarifying that the destruction is limited to disabling sharing and does not delete the document. It does not mention permissions or reversibility, which could further improve transparency.
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-loading the main action and immediately providing alternative guidance. Every sentence serves a purpose with no wasted words.
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 tool's simplicity (no output schema, two parameters), the description covers purpose, usage, and behavioral transparency adequately. It could mention the return value (e.g., success confirmation) but is otherwise 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 clear parameter descriptions for docId and workspaceId. The tool description does not add additional semantic information beyond what the schema provides, meeting the 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 clearly states the verb 'disable public sharing' and the resource 'document', and distinguishes it from the sibling tool 'delete_doc' by explicitly noting the tool does not delete the document.
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 explicit usage guidance: 'Use delete_doc only when the document itself should be removed.' This tells the agent when to use this tool versus the alternative, which is excellent differentiation.
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.
| 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). | |
| query | Yes | Search query — matched case-insensitively against doc titles. | |
| 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive. Description adds context about speed and return fields, but no additional behavioral details beyond 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, front-loaded with core purpose, no wasted words.
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 no output schema, description lists return fields (docId, title, URL, inTrash). 7 parameters are documented in schema. Sufficient for a read-only search 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%, so parameters are well-documented. Description does not add meaning beyond what 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?
Description clearly states the tool searches documents by title using workspace metadata, and lists the returned fields. It distinguishes from 'exporting each doc' but not from sibling search tools like 'find_doc_by_title'.
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?
Description implies usage for fast title search instead of exporting, but lacks explicit when-to-use or when-not-to-use guidance relative to sibling tools.
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 PropertyA
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate the tool is a write operation (readOnlyHint=false) and not destructive. The description adds that the value is validated against the property type, which is helpful. However, it omits details like whether the property must already exist or if it can be created on-the-fly (given openWorldHint=true, unclear). No contradiction with 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 a single sentence that front-loads the purpose. It is concise with no unnecessary information, but it could potentially be split for readability.
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 no output schema, so the description should explain return behavior or side effects. It does not mention what the tool returns (e.g., success confirmation) or failure conditions (e.g., property not found). For a write operation with 4 parameters, this is insufficient.
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 50% (2 of 4 parameters have descriptions). The main description adds validation context for the 'value' parameter. However, it does not provide additional meaning for 'docId' and 'workspaceId' beyond the schema's type constraints. The description partially compensates but not fully.
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 clearly states the tool sets a document's custom property value, identified by id or name. This distinguishes it from sibling tools like 'clear_doc_property' (removes property) and 'create_custom_property' (creates a property definition).
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 usage for setting a custom property value but does not explicitly state when to use or when not to, nor does it mention alternatives like using 'clear_doc_property' to remove a property. Guidance is minimal.
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. Prefer API tokens for production deployments. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate write and non-idempotent behavior. The description adds the key behavioral detail that session cookies are set for subsequent calls, which is beyond what annotations provide. Could mention session duration or error states, but sufficient for simple auth.
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?
Single sentence, front-loaded with the action, includes essential side effect. No unnecessary words.
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 authentication tool with full schema coverage and no output schema, the description is adequate. It explains the action and its primary effect. Minor omissions like session lifetime or error cases are not critical.
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 clear parameter descriptions. The tool description does not add further meaning to the parameters beyond the schema, so baseline score 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?
The description clearly states it is for signing in to AFFiNE with email and password, and specifies the side effect of setting session cookies. This distinctively contrasts with sibling auth tools like generate_access_token.
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?
Description implies usage for initial authentication to obtain a session. The parameter description for password suggests preferring API tokens for production, which provides an alternative. However, the main description does not explicitly mention when not to use this tool (e.g., for automated tasks).
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide safety profile; description adds that it only renames without altering rules, which is useful behavioral context beyond 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?
Single, front-loaded sentence with no wasted words.
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 low complexity and annotations, description is adequate; lacks return value info but no output schema exists.
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 descriptions already detail parameters; description adds minimal new meaning beyond 'rename' implication.
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?
Description uses specific verb 'rename' and resource 'collection', and explicitly states it does not change rules or allow-list, clearly distinguishing it from sibling 'update_collection_rules'.
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?
Description clarifies scope (rename only) and what it does not do, but does not explicitly state when to use or avoid this tool compared to alternatives.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context beyond annotations by noting that the tool 'rebuilds its allow-list from current workspace documents' and 'can change which docs appear in the collection.' However, it does not detail side effects, authorization needs, or rate limits. Annotations indicate non-destructive and non-idempotent, which aligns with the description, so no contradiction.
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 wordiness. The action and effect are front-loaded. Every sentence 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?
Given the tool's moderate complexity (3 params, nested objects) and no output schema, the description sufficiently explains the transformation and its impact on documents. It covers the 'why' (changes which docs appear) and the 'how' (rebuilds from current workspace docs). Slightly more detail on return value or confirmation would push to 5.
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 parameters are already described in the schema. The description adds no additional meaning beyond the parameter names and restates the action. 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 clearly states the tool replaces collection rules and rebuilds the allow-list, which distinguishes it from sibling tools like 'update_collection' and 'create_collection'. The verb 'Replace' and specific resource 'collection rules' are precise.
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 guidance is given on when to use this tool versus alternatives or when not to use it. The description implies usage for changing collection rules after creation but lacks any context about exclusions or prerequisites.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the comment thread is preserved, adding context beyond annotations (readOnlyHint=false, destructiveHint=false). No contradiction with 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 concise, front-loaded sentences with no wasted words. Every sentence adds value.
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 description covers purpose, usage, and behavior well. Lacks return value information but is sufficient for a simple mutation with no 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% and already describes both parameters. The description adds no additional parameter meaning 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 clearly states the tool replaces the content of an existing comment (verb+resource) and distinguishes itself from create_comment for new threads.
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 says when to use (replace existing comment) and provides a direct alternative (use create_comment for new thread), offering clear guidance.
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. 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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a non-read-only, non-destructive operation. The description adds that it is a 'batch update' and mentions title behavior, but does not elaborate on other behavioral aspects such as error handling, permissions, or the createOption default.
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 concise sentences: first states the core function, second provides a specific tip. No unnecessary words or 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?
For a tool with 7 parameters, nested objects, and no output schema, the description is minimal. It covers the primary purpose but lacks details on return values, error scenarios, or batch behavior, making it only marginally 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 schema documents each parameter. The description adds value by explaining how to use the 'cells' map for the title, but no additional semantics for other 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 clearly states the tool updates multiple cells on an existing database row, mentioning the specific use of 'title' for Kanban row title. This distinguishes it from siblings like add_database_row or delete_database_row.
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 guidance on when to use this tool versus alternatives like add_database_row or other update tools. No context for when-not-to-use or prerequisites is given.
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:"icon",name:"check"}), or null to remove the icon. | |
| docId | Yes | The document whose icon to update. | |
| workspaceId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate the tool is not read-only (readOnlyHint=false), not idempotent, and not destructive. The description adds value by detailing the acceptable input types, which goes beyond the annotations. However, it does not disclose additional behavioral traits such as error handling, permissions, or default behavior (e.g., whether setting an icon replaces existing).
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 sentence that front-loads the core action ('Set or clear the sidebar icon') followed by concise input instructions. There is no fluff; every word adds value.
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 mutation tool with three parameters (two required, one optional) and no output schema, the description covers the essential behavior and input formats. A minor gap is the lack of explanation for the optional workspaceId parameter, but the tool's context (workspace environment) likely makes it inferable.
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 input schema covers the icon parameter with a detailed description, and docId has a simple description. WorkspaceId lacks description. The tool description reinforces the allowed types but adds minimal new information beyond the schema. Given 67% schema description coverage (high), the baseline is 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?
The description clearly states the tool's purpose: 'Set or clear the sidebar icon (the Notion-style emoji slot) on a document.' It specifies the action (set/clear), the resource (document icon), and the allowed inputs (emoji string, full object, null). This distinguishes it from the sibling tool get_doc_icon, which reads the 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 instructs on what to pass ('emoji string, a full icon object, or null to remove it'), implying when to use the tool—to update or remove an icon. It does not explicitly state when not to use it or mention alternatives like update_folder_icon, but the context is clear enough for an agent.
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only, non-idempotent, non-destructive. The description adds value by revealing the dual update behavior (metadata and internal title), which is not captured in 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?
Single sentence that is clear and front-loaded with the action and scope. No wasted words.
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 operation with good annotation coverage and partial schema descriptions, the description adequately explains the dual effect. No output schema or further details are necessary.
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 covers 2 of 3 parameters with descriptions (67%). The tool description does not add any further meaning 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 clearly states the tool renames a document and specifies the two affected locations (sidebar title and internal page block title), distinguishing it from sibling tools like update_doc_icon or move_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 usage for renaming but provides no explicit guidance on when to use this tool versus alternatives or any prerequisites/limitations.
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) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a mutating operation (readOnlyHint=false), and the description adds behavioral details: merging x/y/width/height with current xywh, replacing background, and returning ignored fields. This goes beyond annotations, though it does not cover all aspects like auth or rate 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?
Two efficient sentences with front-loaded purpose. Every sentence adds value, though the structure could be more organized (e.g., separating parameter behavior from ignored fields).
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 no output schema, the description explains input behavior but does not mention what the tool returns (e.g., the updated block or just success). It covers the key aspects for a partial update tool but lacks completeness on return values and error scenarios.
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 description explains the merge behavior for positional parameters and replacement for background, adding semantic value beyond the schema's property definitions. With 50% schema description coverage, the description compensates well for 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 clearly states the tool updates a note/frame/edgeless-text block by id, with specific verb 'update' and resource. It distinguishes from siblings like delete_block or update_surface_element by targeting edgeless blocks specifically.
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 (for partial updates of edgeless blocks) but does not explicitly state when not to use or provide alternatives. It mentions ignored fields for inapplicable flavours, offering some guidance but lacks explicit comparison with other update tools.
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:"icon",name:"check"}), or null to remove the icon. | |
| folderId | Yes | The organize folder whose icon to update. | |
| workspaceId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this as a write operation (readOnlyHint=false) and not destructive. The description adds 'Experimental' as a behavioral note, but does not disclose side effects, error behavior, or permission requirements beyond what annotations already 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?
The description is two sentences, front-loaded with the core action, and each sentence adds value. No wasted words.
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 3-parameter write tool with annotations and no output schema, the description is adequate but not comprehensive. It lacks mention of return values, error cases, or permission context, though the experimental tag adds minimal 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 67% (workspaceId missing description). The description clarifies icon parameter types (emoji string, object, null) somewhat, but the schema already describes the anyOf variants. It does not compensate for the undocumented workspaceId parameter, leaving a 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 clearly states the action: 'Set or clear the sidebar icon on an organize folder.' It specifies the possible inputs (emoji string, icon object, null) and distinguishes from sibling tools like get_folder_icon (read) and update_doc_icon (different resource).
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 usage for updating folder icons but does not provide explicit when-to-use or when-not-to-use guidance relative to siblings. The 'Experimental' note hints at caution but lacks alternatives or exclusions.
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show it's mutating but not destructive. The description adds rich behavioral context: missing ids returned under 'missing', ownership mapping matching editor behavior, resize logic, and skips when empty. This goes well 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?
The description is efficiently packed with essential details, front-loaded with the main action, and every sentence adds value. No redundancy or fluff.
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 tool's complexity, the description covers the core behaviors and edge cases. It lacks a full return structure specification, but does mention 'missing' ids. The parameter and behavior details are sufficient 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 coverage is 100%, but the description adds meaning to each parameter: childElementIds is a full replacement list, resizeToFit controls recomputation, padding is ignored when false, blockId is flavour-bound, and the empty array case. It also hints at return value (missing ids).
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 clearly states the verb 'Replace' and specific resource 'frame block's contents wholesale'. It distinguishes from siblings by specifying it handles both surface elements and edgeless blocks together, which is unique among the listed 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 explains the core usage (wholesale replacement), the effect of resizeToFit, and that passing `[]` clears ownership with skipped resize. It implies when to use this tool (for full replacement) versus potentially other tools (none for partial updates), but does not explicitly 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.
update_profileUpdate ProfileA
Update current user's profile information.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name | |
| avatarUrl | No | Avatar URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only says 'update,' implying mutation. Annotations confirm readOnlyHint=false (mutation allowed) and destructiveHint=false (non-destructive). However, no details are given about what happens on success, error responses, or whether partial updates are allowed. The description does not add beyond the bare minimum.
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 sentence that conveys the tool's purpose without any unnecessary words. It is front-loaded and efficient.
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 tool's simplicity (two optional parameters, no output schema, no nested objects), the description is minimally adequate. However, it lacks guidance on partial updates or validation, which would be useful for an agent.
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 clear parameter descriptions ('Display name', 'Avatar URL'). The description adds no additional meaning or examples beyond what the schema provides, so baseline 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 clearly states the verb 'update' and the resource 'current user's profile information.' It uniquely identifies the tool among siblings, which include many update tools but none targeting the user's own profile.
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 does not explicitly state when to use this tool versus alternatives. However, the name and context imply it is for updating the current user's profile, and sibling tool names like 'update_settings' suggest different scopes. No exclusion or alternative guidance is provided.
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutation (readOnlyHint=false) and non-destructive behavior, but the description adds no further behavioral details (e.g., partial vs. full replacement, return value, auth requirements). A contradiction exists: openWorldHint=true suggests acceptance of additional properties, while the schema enforces additionalProperties=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?
The description is a single sentence, concise and front-loaded, with no wasted words. However, it could be slightly more informative without losing 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?
For a tool with one nested parameter and no output schema, the description is incomplete. It does not clarify whether updates are partial or full, nor does it resolve the contradiction between openWorldHint and the schema's additionalProperties: false, limiting the agent's understanding.
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 includes the repeated phrase 'User notification settings' from the schema parameter description. It adds no new meaning beyond the schema, earning a baseline score.
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 clearly states the action (update) and resource (user settings and preferences), distinguishing it from sibling tools like 'update_profile' or 'update_workspace'. However, it does not specify that it focuses on notification settings, leaving the exact domain implicit from 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?
No explicit guidance on when to use this tool versus alternatives such as 'update_profile' for profile changes or 'update_workspace' for workspace settings. The description lacks context for selection.
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. | |
| rearEndpointStyle | No | Rear endpoint style (default Arrow). Connector only. | |
| frontEndpointStyle | No | Front endpoint style (default None). Connector only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide basic traits (readOnlyHint false, destructiveHint false). The description adds valuable detail: merge behavior for xywh, wholesale replacement for text/label/title, and an 'ignored' list for non-applicable fields. This goes beyond annotations to clarify the update 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?
The description is three sentences, front-loaded with the main purpose. It is concise and structured, though the second and third sentences could be more compact. No wasted words.
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 tool with 30 parameters and no output schema, the description provides essential behavioral context (merge/replace, ignored fields). It mentions the response includes an 'ignored' list, partially compensating for missing output schema. It does not explain all edge cases, but is reasonably 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?
The input schema has 100% coverage with detailed parameter descriptions. The description only adds high-level context about merge vs replace, not per-parameter details. Baseline 3 is appropriate as 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?
The description clearly states the tool's purpose: 'Partially update a surface element by id.' It specifies the verb (update), resource (surface element), and the nature of the update (partial with merge/replace behavior). It distinguishes from siblings like add_surface_element (create) and delete_surface_element (delete) by implying an existing element is modified.
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 does not explicitly state when to use this tool versus alternatives such as update_edgeless_block. It is implied for updating existing surface elements, but no exclusions or comparisons are provided. The context from sibling names helps, but the description itself lacks direct guidance.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workspace ID | |
| public | No | Make workspace public | |
| enableAi | No | Enable AI features |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutation but not destructive or idempotent. Description adds no behavioral detail beyond annotations, but annotations already provide safety profile. No contradiction.
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?
Extremely concise at three words. Core action is clear and front-loaded. Every word 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?
Given low complexity and full schema coverage, description is adequate but could be improved by summarizing which settings (public, enableAi) are updated. Missing return value info but no output schema expected.
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 descriptions for each parameter. Description adds no additional semantics beyond 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?
The description clearly states the tool updates workspace settings with verb+resource. However, it doesn't specify which settings or distinguish from other update tools like update_collection. Adequate but not excellent.
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 tool vs alternatives like delete_workspace or create_workspace. No context on prerequisites or exclusions.
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 | Base64-encoded file content or plain UTF-8 text to upload. | |
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=false, idempotentHint=false, destructiveHint=false. The description adds the key behavior that it returns a blob key and does not attach to a document, providing additional context beyond annotations. No contradictions.
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 concise at two sentences, front-loading the core purpose and adding a key detail about attachment. Every word adds value with no redundancy.
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 tool's simplicity, the description covers the primary functionality and return value. The annotations and schema provide additional context. Could mention size limits or encoding details, but not essential for basic 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% with descriptions for all 4 parameters. The tool description does not add meaning beyond what the schema already provides, meeting the baseline expectation for high 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 clearly states the action 'Upload' and the resource 'file or blob into AFFiNE workspace storage', and specifies the return value 'blob key'. It also distinguishes itself from attachment operations by noting it does not attach to a document, differentiating from sibling tools like delete_blob.
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 usage context (storing content without attaching), but does not explicitly state when to use versus alternatives or provide exclusions. It gives some guidance but lacks clear when-to-use and when-not-to-use directives.
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. Dates show when Glama detected each change.
51 tool updates
v2.5.0- Changed
add_doc_to_collection3 fields changed- added
Input schema / properties / collectionId / descriptionAdded value: +"AFFiNE collection id from list_collections or create_collection." - added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
add_organize_link3 fields changed- added
Input schema / properties / folderId / descriptionAdded value: +"AFFiNE organize folder node id." - added
Input schema / properties / type / descriptionAdded value: +"Type of target represented by the organize link." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
add_tag_to_doc3 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - changed
Input schema / properties / tag / descriptionPrevious value: -"Tag name"New value: +"Tag name to attach to the document." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
analyze_doc_fidelity2 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
append_block2 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
append_markdown2 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
append_semantic_section2 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
cleanup_blobs1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID"New value: +"AFFiNE workspace id whose deleted blobs should be released."
- Changed
create_collection7 fields changed- added
Input schema / properties / rules / properties / filters / descriptionAdded value: +"Collection filter rules used to build the allow-list." - added
Input schema / properties / rules / properties / filters / items / descriptionAdded value: +"Single AFFiNE collection filter rule." - added
Input schema / properties / rules / properties / filters / items / properties / field / descriptionAdded value: +"Document field evaluated by the collection rule." - added
Input schema / properties / rules / properties / filters / items / properties / operator / descriptionAdded value: +"Comparison operator for the collection rule." - added
Input schema / properties / rules / properties / filters / items / properties / value / descriptionAdded value: +"String value or list of values used by the selected operator." - added
Input schema / properties / rules / properties / match / descriptionAdded value: +"Whether all filters or any filter must match. Defaults to all." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
create_comment8 fields changed- added
Input schema / properties / content / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + } +] - added
Input schema / properties / content / descriptionAdded value: +"Comment content accepted by AFFiNE. Plain strings are normalized to { text }, and rich AFFiNE payload objects are passed through." - added
Input schema / properties / docId / descriptionAdded value: +"Document id that will receive the new comment." - added
Input schema / properties / docMode / descriptionAdded value: +"Document surface for the comment. Defaults to page." - added
Input schema / properties / docTitle / descriptionAdded value: +"Optional document title stored with the comment metadata." - added
Input schema / properties / mentions / descriptionAdded value: +"Optional AFFiNE user ids to mention in the comment." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured." - changed
Input schema / requiredPrevious value: -[ - "docId" -]New value: +[ + "docId", + "content" +]
- Changed
create_doc4 fields changed- added
Input schema / properties / content / descriptionAdded value: +"Optional initial plain text or markdown-like content." - added
Input schema / properties / title / descriptionAdded value: +"Optional initial document title." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured." - added
Input schema / properties / workspaceId / minLengthAdded value: +1
- Changed
create_doc_from_markdown1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
create_folder2 fields changed- changed
Input schema / properties / parentId / anyOfPrevious value: -[ - { - "minLength": 1, - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "AFFiNE organize folder node id.", + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
create_semantic_page1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
create_tag2 fields changed- changed
Input schema / properties / tag / descriptionPrevious value: -"Tag name"New value: +"Tag name to create in the workspace tag registry." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
create_workspace_blueprint2 fields changed- added
Input schema / properties / childFolderNames / items / descriptionAdded value: +"Non-empty sidebar folder or collection name." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
delete_blob3 fields changed- changed
Input schema / properties / key / descriptionPrevious value: -"Blob key/ID to delete"New value: +"Blob key returned by upload_blob or AFFiNE document metadata." - changed
Input schema / properties / permanently / descriptionPrevious value: -"Delete permanently"New value: +"If true, permanently delete the blob instead of marking it deleted." - changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID"New value: +"AFFiNE workspace id that owns the blob."
- Changed
delete_collection2 fields changed- added
Input schema / properties / collectionId / descriptionAdded value: +"AFFiNE collection id from list_collections or create_collection." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
delete_comment1 field changed- added
Input schema / properties / id / descriptionAdded value: +"Comment id returned by list_comments or create_comment."
- Changed
delete_doc4 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / docId / minLengthAdded value: +1 - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured." - added
Input schema / properties / workspaceId / minLengthAdded value: +1
- Changed
delete_folder2 fields changed- added
Input schema / properties / folderId / descriptionAdded value: +"AFFiNE organize folder node id." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
delete_organize_link2 fields changed- added
Input schema / properties / nodeId / descriptionAdded value: +"AFFiNE organize node id from list_organize_nodes." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
delete_tag2 fields changed- changed
Input schema / properties / tag / descriptionPrevious value: -"Tag id or name to delete"New value: +"Tag id or name to delete. Ambiguous tag names are rejected with candidate ids." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
export_doc_markdown2 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
export_with_fidelity_report2 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
generate_access_token2 fields changed- added
Input schema / properties / expiresAt / descriptionAdded value: +"Optional expiration timestamp accepted by AFFiNE, typically an ISO 8601 string." - added
Input schema / properties / name / descriptionAdded value: +"Human-readable token name shown in AFFiNE token settings."
- Changed
get_collection2 fields changed- added
Input schema / properties / collectionId / descriptionAdded value: +"AFFiNE collection id from list_collections or create_collection." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
get_doc3 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured." - added
Input schema / properties / workspaceId / minLengthAdded value: +1
- Changed
inspect_template_structure1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
instantiate_template_native1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
list_collections1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
list_comments9 fields changed- added
Input schema / properties / after / descriptionAdded value: +"Cursor from pageInfo.endCursor for fetching the next page." - added
Input schema / properties / docId / descriptionAdded value: +"Document id whose comments should be listed." - added
Input schema / properties / first / descriptionAdded value: +"Maximum number of comments to return from the AFFiNE pagination connection." - added
Input schema / properties / first / exclusiveMinimumAdded value: +0 - changed
Input schema / properties / first / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / offset / descriptionAdded value: +"Zero-based offset used by AFFiNE pagination. Do not combine with after unless the AFFiNE API requires it." - added
Input schema / properties / offset / minimumAdded value: +0 - changed
Input schema / properties / offset / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
list_docs9 fields changed- added
Input schema / properties / after / descriptionAdded value: +"Cursor from pageInfo.endCursor for fetching the next page." - added
Input schema / properties / first / descriptionAdded value: +"Maximum number of items to return from the AFFiNE pagination connection." - added
Input schema / properties / first / exclusiveMinimumAdded value: +0 - changed
Input schema / properties / first / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / offset / descriptionAdded value: +"Zero-based offset used by AFFiNE pagination. Do not combine with after unless the AFFiNE API requires it." - added
Input schema / properties / offset / minimumAdded value: +0 - changed
Input schema / properties / offset / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (optional if default set)."New value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured." - added
Input schema / properties / workspaceId / minLengthAdded value: +1
- Changed
list_docs_by_tag2 fields changed- changed
Input schema / properties / tag / descriptionPrevious value: -"Tag name"New value: +"Tag name to match against workspace tag labels." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
list_organize_nodes1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
list_tags1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
move_organize_node3 fields changed- added
Input schema / properties / nodeId / descriptionAdded value: +"AFFiNE organize node id from list_organize_nodes." - changed
Input schema / properties / parentId / anyOfPrevious value: -[ - { - "minLength": 1, - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "AFFiNE organize folder node id.", + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
publish_doc5 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / docId / minLengthAdded value: +1 - added
Input schema / properties / mode / descriptionAdded value: +"Public document mode to publish. Omit to let AFFiNE use its default." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured." - added
Input schema / properties / workspaceId / minLengthAdded value: +1
- Changed
read_doc2 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
remove_doc_from_collection3 fields changed- added
Input schema / properties / collectionId / descriptionAdded value: +"AFFiNE collection id from list_collections or create_collection." - added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
remove_tag_from_doc3 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - changed
Input schema / properties / tag / descriptionPrevious value: -"Tag name"New value: +"Tag name to detach from the document." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
rename_folder3 fields changed- added
Input schema / properties / folderId / descriptionAdded value: +"AFFiNE organize folder node id." - added
Input schema / properties / name / descriptionAdded value: +"Non-empty sidebar folder or collection name." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
replace_doc_with_markdown2 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
resolve_comment2 fields changed- added
Input schema / properties / id / descriptionAdded value: +"Comment id returned by list_comments or create_comment." - added
Input schema / properties / resolved / descriptionAdded value: +"true marks the comment resolved; false reopens it."
- Changed
revoke_access_token1 field changed- added
Input schema / properties / id / descriptionAdded value: +"Access token id returned by list_access_tokens or generate_access_token."
- Changed
revoke_doc4 fields changed- added
Input schema / properties / docId / descriptionAdded value: +"AFFiNE document id." - added
Input schema / properties / docId / minLengthAdded value: +1 - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured." - added
Input schema / properties / workspaceId / minLengthAdded value: +1
- Changed
sign_in2 fields changed- added
Input schema / properties / email / descriptionAdded value: +"AFFiNE account email address." - added
Input schema / properties / password / descriptionAdded value: +"AFFiNE account password. Prefer API tokens for production deployments."
- Changed
update_collection2 fields changed- added
Input schema / properties / collectionId / descriptionAdded value: +"AFFiNE collection id from list_collections or create_collection." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
update_collection_rules8 fields changed- added
Input schema / properties / collectionId / descriptionAdded value: +"AFFiNE collection id from list_collections or create_collection." - added
Input schema / properties / rules / properties / filters / descriptionAdded value: +"Collection filter rules used to build the allow-list." - added
Input schema / properties / rules / properties / filters / items / descriptionAdded value: +"Single AFFiNE collection filter rule." - added
Input schema / properties / rules / properties / filters / items / properties / field / descriptionAdded value: +"Document field evaluated by the collection rule." - added
Input schema / properties / rules / properties / filters / items / properties / operator / descriptionAdded value: +"Comparison operator for the collection rule." - added
Input schema / properties / rules / properties / filters / items / properties / value / descriptionAdded value: +"String value or list of values used by the selected operator." - added
Input schema / properties / rules / properties / match / descriptionAdded value: +"Whether all filters or any filter must match. Defaults to all." - added
Input schema / properties / workspaceId / descriptionAdded value: +"AFFiNE workspace id. Omit only when AFFINE_WORKSPACE_ID is configured."
- Changed
update_comment4 fields changed- added
Input schema / properties / content / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + } +] - added
Input schema / properties / content / descriptionAdded value: +"Replacement comment content accepted by AFFiNE." - added
Input schema / properties / id / descriptionAdded value: +"Comment id returned by list_comments or create_comment." - changed
Input schema / requiredPrevious value: -[ - "id" -]New value: +[ + "id", + "content" +]
- Changed
upload_blob4 fields changed- changed
Input schema / properties / content / descriptionPrevious value: -"Base64 encoded content or text"New value: +"Base64-encoded file content or plain UTF-8 text to upload." - changed
Input schema / properties / contentType / descriptionPrevious value: -"MIME type"New value: +"Optional MIME type. Defaults to application/octet-stream." - changed
Input schema / properties / filename / descriptionPrevious value: -"Filename"New value: +"Optional filename stored with the upload. Defaults to a generated .bin name." - changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID"New value: +"AFFiNE workspace id that owns the blob."
12 tool updates
v2.4.0- Added
clear_doc_property - Added
create_custom_property - Changed
create_doc1 field changed- added
Input schema / properties / folderIdAdded value: +{ + "description": "Optional folder ID to place the doc in. Use list_organize_nodes to find folder IDs.", + "type": "string" +}
- Added
delete_custom_property - Added
delete_tag - Added
find_doc_by_title - Added
get_doc_icon - Added
get_folder_icon - Added
list_doc_properties - Added
set_doc_property - Added
update_doc_icon - Added
update_folder_icon
20 tool updates
v2.0.0- Added
add_surface_element - Changed
append_block10 fields changed- changed
Input schema / properties / background / descriptionPrevious value: -"Background for frame/note"New value: +"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'}`." - removed
Input schema / properties / background / typeRemoved value: -"string" - added
Input schema / properties / childElementIdsAdded value: +{ + "description": "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.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / height / descriptionPrevious value: -"Height for frame/edgeless_text/note"New value: +"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." - added
Input schema / properties / markdownAdded value: +{ + "description": "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.", + "type": "string" +} - added
Input schema / properties / paddingAdded value: +{ + "description": "Default padding (px) for `childElementIds` auto-sizing on frames (each side, plus +30px title band) and fallback gap for `stackAfter` (default 40).", + "type": "integer" +} - added
Input schema / properties / stackAfterAdded value: +{ + "additionalProperties": false, + "description": "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.", + "properties": { + "blockId": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ], + "description": "Block(s) to stack relative to. String = a single anchor; array = pick whichever is furthest in the stack direction (bottommost for 'down', rightmost for 'right', etc.)." + }, + "direction": { + "description": "Direction (default 'down')", + "enum": [ + "down", + "up", + "right", + "left" + ], + "type": "string" + }, + "gap": { + "description": "Gap in px between the anchor and the new block. Default is direction-aware: 80 for left/right, 40 for down/up — mirrors native-flowchart spacing where the flow axis gets more breathing room than the cross axis. Explicit `padding` on the block overrides this default; explicit `gap` wins over both.", + "type": "integer" + } + }, + "required": [ + "blockId" + ], + "type": "object" +} - changed
Input schema / properties / width / descriptionPrevious value: -"Width for frame/edgeless_text/note"New value: +"Width for frame/edgeless_text/note." - added
Input schema / properties / xAdded value: +{ + "description": "X position on the edgeless canvas for frame/edgeless_text/note (default 0). Prefer ≥40px between sibling bounds; BlockSuite does not auto-arrange.", + "type": "integer" +} - added
Input schema / properties / yAdded value: +{ + "description": "Y position on the edgeless canvas for frame/edgeless_text/note (default 0).", + "type": "integer" +}
- Removed
append_paragraph - Removed
batch_create_docs - Removed
cleanup_orphan_embeds - Removed
create_doc_from_template - Added
delete_block - Added
delete_surface_element - Removed
duplicate_doc - Removed
find_and_replace - Removed
get_doc_by_title - Removed
get_docs_by_tag - Added
get_edgeless_canvas - Removed
list_backlinks - Added
list_surface_elements - Removed
list_unresolved_threads - Removed
update_database_cell - Added
update_edgeless_block - Added
update_frame_children - Added
update_surface_element
87 tool updates
v1.12.0- Added
add_database_column - Added
add_database_row - Added
add_doc_to_collection - Added
add_organize_link - Added
add_tag_to_doc - Added
analyze_doc_fidelity - Added
append_block - Added
append_markdown - Added
append_paragraph - Added
append_semantic_section - Added
batch_create_docs - Added
cleanup_blobs - Added
cleanup_orphan_embeds - Added
compose_database_from_intent - Added
create_collection - Added
create_comment - Added
create_doc - Added
create_doc_from_markdown - Added
create_doc_from_template - Added
create_folder - Added
create_semantic_page - Added
create_tag - Added
create_workspace - Added
create_workspace_blueprint - Added
current_user - Added
delete_blob - Added
delete_collection - Added
delete_comment - Added
delete_database_row - Added
delete_doc - Added
delete_folder - Added
delete_organize_link - Added
delete_workspace - Added
duplicate_doc - Added
export_doc_markdown - Added
export_with_fidelity_report - Added
find_and_replace - Added
generate_access_token - Added
get_capabilities - Added
get_collection - Added
get_doc - Added
get_doc_by_title - Added
get_docs_by_tag - Added
get_orphan_docs - Added
get_workspace - Added
inspect_template_structure - Added
instantiate_template_native - Added
list_access_tokens - Added
list_backlinks - Added
list_children - Added
list_collections - Added
list_comments - Added
list_docs - Added
list_docs_by_tag - Added
list_histories - Added
list_notifications - Added
list_organize_nodes - Added
list_tags - Added
list_unresolved_threads - Added
list_workspace_tree - Added
list_workspaces - Added
move_doc - Added
move_organize_node - Added
publish_doc - Added
read_all_notifications - Added
read_database_cells - Added
read_database_columns - Added
read_doc - Added
remove_doc_from_collection - Added
remove_tag_from_doc - Added
rename_folder - Added
replace_doc_with_markdown - Added
resolve_comment - Added
revoke_access_token - Added
revoke_doc - Added
search_docs - Added
sign_in - Added
update_collection - Added
update_collection_rules - Added
update_comment - Added
update_database_cell - Added
update_database_row - Added
update_doc_title - Added
update_profile - Added
update_settings - Added
update_workspace - Added
upload_blob
36 tool updates
v1.0.0- Removed
affine_apply_doc_updates - Removed
affine_change_password - Removed
affine_cleanup_blobs - Removed
affine_create_comment - Removed
affine_current_user - Removed
affine_delete_account - Removed
affine_delete_blob - Removed
affine_delete_comment - Removed
affine_generate_access_token - Removed
affine_list_access_tokens - Removed
affine_list_comments - Removed
affine_list_histories - Removed
affine_list_notifications - Removed
affine_read_all_notifications - Removed
affine_read_notification - Removed
affine_recover_doc - Removed
affine_resolve_comment - Removed
affine_revoke_access_token - Removed
affine_send_password_reset - Removed
affine_send_verify_email - Removed
affine_sign_in - Removed
affine_update_comment - Removed
affine_update_profile - Removed
affine_update_settings - Removed
affine_upload_blob - Removed
create_workspace - Removed
delete_workspace - Removed
get_doc - Removed
get_workspace - Removed
list_docs - Removed
list_workspaces - Removed
publish_doc - Removed
recent_docs - Removed
revoke_doc - Removed
search_docs - Removed
update_workspace
36 tool updates
- First observed
affine_apply_doc_updates - First observed
affine_change_password - First observed
affine_cleanup_blobs - First observed
affine_create_comment - First observed
affine_current_user - First observed
affine_delete_account - First observed
affine_delete_blob - First observed
affine_delete_comment - First observed
affine_generate_access_token - First observed
affine_list_access_tokens - First observed
affine_list_comments - First observed
affine_list_histories - First observed
affine_list_notifications - First observed
affine_read_all_notifications - First observed
affine_read_notification - First observed
affine_recover_doc - First observed
affine_resolve_comment - First observed
affine_revoke_access_token - First observed
affine_send_password_reset - First observed
affine_send_verify_email - First observed
affine_sign_in - First observed
affine_update_comment - First observed
affine_update_profile - First observed
affine_update_settings - First observed
affine_upload_blob - First observed
create_workspace - First observed
delete_workspace - First observed
get_doc - First observed
get_workspace - First observed
list_docs - First observed
list_workspaces - First observed
publish_doc - First observed
recent_docs - First observed
revoke_doc - First observed
search_docs - First observed
update_workspace
TDQS
Each tool targets a specific resource and action, with clear differentiation (e.g., add_database_column vs add_database_row, read_doc vs get_doc). Overlapping operations like create_comment vs update_comment vs delete_comment are distinctly named.
Tools follow a mostly consistent verb_noun pattern (e.g., create_doc, list_tags). A few outliers like current_user and sign_in break the pattern, but overall the naming is predictable and readable.
95 tools is excessive for any server, even one covering broad functionality. Many specialized tools could be consolidated (e.g., multiple creation variants). The large count likely overwhelms agents.
The tool set covers all major workflows: CRUD for docs, databases, comments, tags, collections, surface elements, workspaces, auth, and blobs. Edge cases like orphan docs, fidelity reports, and template instantiation are included. No obvious gaps.
Maintenance
Related MCP Connectors
Read spaces, collections, pages and content; search docs and manage GitBook organization spaces.
Self-hosted AI-native knowledge workspace with hybrid search, GraphRAG, and MCP.
Securely search and manage workspace context files for AI agents and teams.
- KaneraOAuthapp.kanera
Manage Kanera workspaces, boards, cards, checklists, comments, notes, automations, and reports.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Aha! product management platform through GraphQL API. Supports retrieving features, requirements, and pages by reference number, as well as searching documents across Aha! workspaces.1MIT
- AlicenseBqualityDmaintenanceEnables access to Yuque (语雀) documentation through cookie-based authentication, supporting document retrieval, search, TOC navigation, and content management from knowledge bases via URL or namespace.44444MIT
- AlicenseCqualityAmaintenanceEnables AI assistants to interact with SiYuan Note for comprehensive notebook management, document editing, and block-level content operations. It supports advanced features like full-text search and SQL queries via secure API integration.34639ISC
- FlicenseNot gradedqualityCmaintenanceEnables comprehensive management of WikiJS instances through tools for searching, creating, updating, and deleting wiki pages. It supports advanced features like knowledge graph exploration, page summaries, and content exporting for documentation workflows.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/DAWNCR0W/affine-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server