Fast.io
Server Details
Fastio gives your team and AI agents a workspace for each project, bringing source files, comments and new work together. Connect a compatible MCP client to find files, answer questions from project material, and save results where the team can review and use them.
Sign in through Fastio and choose the workspaces the connection can reach. Read Only connections expose read tools; Read & Write connections also allow changes.
• Files and folders: browse, read, upload, and organize files, with version history and trash.
• Search: find files by keyword; search file content and meaning when Deep Indexing is enabled and files have been processed.
• Metadata: read, set, and search metadata fields, including extracted fields where available.
• Shares: create and manage shares for sending or collecting files.
• Comments and members: read and add comments, and manage workspace membership within your permissions.
• Activity: search workspace events to see what changed.
Hosted by Fastio, with no server installation required.
• Claude and most MCP clients: https://mcp.fast.io/mcp/tools
• ChatGPT: https://mcp.fast.io/mcp/operations
• ChatGPT and Codex: Fastio plugin
• Claude Code, Cursor and similar coding agents: https://mcp.fast.io/mcp/code
• Setup and client-specific capabilities: https://mcp.fast.io/docs
Paid plans. Monthly plans include a trial of up to 30 days. A card is required, and billing begins when the trial ends or trial credits run out, whichever comes first. No free plan.
- Status
- Healthy
- Uptime
- 99.9% over 67 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 37 tools
Tools are organized as explicit read/write pairs (e.g., storage/storage_manage) with detailed descriptions that cross-reference each other. Overlapping search tools (find, storage search, metadata search) are clearly differentiated, leaving no ambiguity about which tool to use for a given action.
Most tools follow a consistent noun/noun_manage pattern for read/write pairs, which is predictable. However, a few tools (download, find, how-to) deviate from this pattern, and 'how-to' uses a hyphen instead of an underscore, introducing minor inconsistency.
With 37 tools, the server far exceeds the recommended 3-15 range and is likely to overwhelm an agent's tool selection. While the domain is broad, the count is excessive and could be consolidated.
The surface covers the full lifecycle of workspaces, files, shares, members, invitations, e-signatures, AI, metadata, and more, with create/read/update/delete operations for all major resources. No obvious dead ends or missing critical operations.
Available Tools
37 toolsaiAI ChatARead-onlyInspect
Fastio AI chat (read): chats and their details, messages, a message's answer with citations, AI credit transactions. Workspace or share context. Writes are on ai_manage. action='describe' gives the full action/param reference.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | chat-list filter: 'user' (default — user-driven chats), 'agent' (agentic chats), or 'all'. | |
| wait | No | message-read only. Default true: bounded-wait for completion (up to ~24s on a workspace via the activity long-poll). false: a single-shot status probe (one details fetch, ~1 round-trip), within strict ~30s client timeouts. | |
| limit | No | chat-list/message-list page size. Forwarded best-effort: these endpoints document no paging and may return all rows. | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| detail | No | Verbosity for chat-list/chat-details/message-list/message-details (best-effort server-side). Defaults: terse for lists, full for details. Levels: see describe. | |
| offset | No | chat-list/message-list offset (best-effort, see limit). | |
| chat_id | No | AI chat ID. | |
| share_id | No | profile_id alias; implies profile_type=share. | |
| context_id | No | Alias for profile_id (either name works) | |
| message_id | No | AI message ID. | |
| profile_id | No | 19-digit workspace or share ID (pair with profile_type). Aliases: workspace_id / share_id (imply the type), context_id, instance_id. | |
| instance_id | No | Alias for profile_id. | |
| context_type | No | Alias for profile_type (either name works) | |
| profile_type | No | Profile type: "workspace" or "share". | |
| workspace_id | No | profile_id alias; implies profile_type=workspace. | |
| include_deleted | No | chat-list: if true, list deleted chats via the /deleted variant (workspace AND share). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered by structured data. The description reinforces the read-only nature and notes that answers carry citations, but adds little behavioral detail beyond the annotations (no rate limits, no pagination behavior). With annotations carrying the burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the read scope and resource list, then the write-boundary, then the self-reference pointer. No wasted words despite covering a 7-action, 16-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a wide read tool with 16 parameters and no output schema, the description covers the domain, the read/write boundary, and defers detailed action semantics to action='describe', which is an effective completeness strategy. It does not explain return shapes for the citation or transaction actions, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 16 parameters — including the alias relationships and the `wait` long-poll semantics — are already documented in the schema. The description adds no parameter-level meaning beyond what the schema provides, only deferring to action='describe'. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific domain ('Fastio AI chat (read)') and enumerates the resources covered: chats and their details, messages, a message's answer with citations, and AI credit transactions. It explicitly marks the read scope and names the sibling that handles writes, so an agent can separate it from `ai_manage` without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes write operations to `ai_manage` and points to action='describe' for the full action/param reference, which is real usage guidance for a tool with seven actions. It stops short of saying when to pick each action (e.g. message-read vs message-details), so it is clear context without full exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_manageAI Chat ManagementADestructiveInspect
Fastio AI chat (write): ask a question about workspace or share files and get a cited answer, a workspace status summary, create/update/publish/cancel chats, send messages, generate an AI share. Destructive: chat-delete. ask, status, chat-create and message-send consume AI credits. Reads are on ai. action='describe' gives the full action/param reference.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | chat-create (workspace only): 'user' (default) or 'agent' (agentic; immutable). | |
| name | No | New chat name. | |
| files | No | File opaque IDs (max 25, share share-generate). | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| effort | No | Reply effort for THIS message: 'normal' (default) or 'high' (deeper reasoning, no per-reply step limit; slower, more credits). Per message — resend it on each message that should use it. | |
| chat_id | No | AI chat ID. | |
| privacy | No | Chat privacy (default: private). Workspace chat-create only — share chats are always private. | |
| node_ids | No | File node IDs (max 25, workspace share-generate). | |
| share_id | No | profile_id alias; implies profile_type=share. | |
| context_id | No | Alias for profile_id (either name works) | |
| profile_id | No | 19-digit workspace or share ID (pair with profile_type). Aliases: workspace_id / share_id (imply the type), context_id, instance_id. | |
| query_text | No | Question or prompt (max 32,000 chars). | |
| instance_id | No | Alias for profile_id. | |
| context_type | No | Alias for profile_type (either name works) | |
| files_attach | No | Files for the AI to read: comma-separated nodeId:versionId (versionId optional = current). Works without Deep Indexing; an unreadable node errors. | |
| profile_type | No | Profile type: "workspace" or "share". | |
| workspace_id | No | profile_id alias; implies profile_type=workspace. | |
| subject_files | No | Files pinned as the turn's focus subjects (sent as `subjects`): comma-separated nodeId:versionId, same format and limits as files_attach. | |
| folders_attach | No | Folders for the AI to read: comma-separated folder nodeIds (no depth). Denied on restricted-view shares. | |
| subject_folders | No | Folders pinned as the turn's focus subjects (sent as `subjects`): comma-separated folder nodeIds, same format as folders_attach. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=true, so the safety profile is covered. The description adds value beyond that by identifying exactly which action is destructive (chat-delete) and by disclosing that ask, status, chat-create, and message-send consume AI credits. It stops short of stating reversibility or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the write-vs-read distinction and the action inventory, with no filler. Every clause carries operational information (destructive action, cost, fallback reference).
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 20-parameter multi-action tool with no output schema, the description covers scope, destructive surface, cost, and the read alternative, and points to action='describe' for the full reference. It only lightly gestures at return content ('a cited answer', 'a workspace status summary'), which is the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 20 parameters, so aliasing, enum meanings, and limits are already documented. The description adds only marginal parameter-level meaning, mainly tying credit consumption to specific actions; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fastio AI chat (write)') and then enumerates the concrete action surface: ask, status, chat create/update/publish/cancel, message-send, share-generate. It also explicitly distinguishes itself from the read counterpart ('Reads are on `ai`'), so an agent can separate it from the sibling `ai` tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative for reads ('Reads are on `ai`') and flags the destructive action ('Destructive: chat-delete') plus the credit-consuming actions. It does not, however, explain when to pick one action over another (e.g. chat-publish vs share-generate), instead deferring to action='describe', which is a reasonable routing move but shifts the guidance out of the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assetBrand AssetsARead-onlyInspect
Brand assets (logos, banners, profile photos) on an org, workspace, share, or user: asset types, list, read an asset's bytes. Writes are on asset_manage.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Operation. Use 'describe' for full action reference. | |
| asset_id | No | Asset ID or name. | |
| entity_id | No | Entity ID (optional for user). | |
| asset_type | No | Asset type key (e.g. 'logo', 'banner', 'photo'). | |
| entity_type | No | Entity type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds that reads return an asset's bytes and that mutations live elsewhere, but says nothing about permission requirements, rate limits, or byte-return size/format.
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: resource, scope, capabilities, then the exclusion. No padding whatsoever.
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 5-param read-only tool with full schema coverage and no output schema, the description covers scope, entities, and capabilities adequately. It omits the 'describe' action and any detail on what 'read bytes' returns, but those gaps are minor given the schema enumerates every action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with per-parameter descriptions and two enums, so the schema does the heavy lifting. The description's enumeration of operations (types, list, read) loosely maps to the action enum but adds no format or syntax detail beyond it. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource concretely (brand assets: logos, banners, profile photos), the scoping entities (org, workspace, share, user), and the read operations performed (types, list, read bytes). An agent can distinguish this from asset_manage purely from the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes writes to the sibling `asset_manage`, which is a clean when-not-to-use rule. It lacks a positive trigger statement ('use this when you need to inspect or retrieve assets'), but the read/write split with the alternative named is clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asset_manageBrand Asset ManagementADestructiveInspect
Brand assets (logos, banners, profile photos) on an org, workspace, share, or user: upload, delete. Destructive: delete. Reads are on asset.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Operation. Use 'describe' for full action reference. | |
| content | No | Plain text content (e.g. SVG). | |
| asset_id | No | Asset ID or name. | |
| metadata | No | Additional metadata as JSON array string. | |
| entity_id | No | Entity ID (optional for user). | |
| file_name | No | Original file name. | |
| asset_type | No | Asset type key (e.g. 'logo', 'banner', 'photo'). | |
| entity_type | No | Entity type. | |
| file_base64 | No | Base64-encoded binary content. | |
| content_type | No | MIME type (default application/octet-stream). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds precision annotations cannot: it pinpoints that `delete` specifically is the destructive path, leaving `upload` non-destructive-by-capability. It stops short of describing what deletion removes (asset only vs. referencing entities) or any auth/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?
Three short clauses, front-loaded with the resource and scope, followed by the destructive-action warning and the sibling pointer. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, multi-action tool with no output schema, the description covers scope, entity types, the destructive action, and the read alternative. The notable omission is the `describe` action, which the schema itself surfaces and the description never mentions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 10 parameters are already documented in the schema, and every field carries its own description. The tool description adds no parameter-level meaning beyond that, so the baseline applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource (brand assets: logos, banners, profile photos), the scope (org, workspace, share, user), and the two mutating verbs (upload, delete). It also explicitly distinguishes itself from the read-only sibling `asset`, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the conditional split clearly: writes belong here, 'Reads are on `asset`.' It also flags which action is destructive. It gives no guidance on the third action (`describe`) or on when a given entity_type should be chosen over another.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
authAuthenticationARead-onlyInspect
Fastio session and credential state (read): sign-in check, session and scope details, email availability, 2FA status, API keys, OAuth sessions. Sign-in, sign-up, 2FA changes, PKCE login and credential changes are on auth_manage.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Email address. | ||
| action | Yes | Operation. Use 'describe' for full action reference. | |
| key_id | No | API key identifier. | |
| session_id | No | OAuth session identifier. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered; the description adds the useful behavioral boundary that all credential-mutating operations live on a different tool, preventing an agent from expecting write capability here. It does not mention auth requirements, rate limits, or error behavior, but those are lower-priority for a read-only inspection tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The read scope is front-loaded and the routing constraint to `auth_manage` follows immediately, so the most decision-relevant information arrives first.
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 tool with no output schema, the description covers the resource families an agent needs to recognize relevance and correctly routes writes elsewhere. It leaves the per-action semantics to the schema's `describe` action, which is a reasonable division of labor, though it does not hint at what `describe`/`check` return.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each of the five parameters is documented in-schema, including the 11-value action enum and the `describe_action` modifier. The description adds no parameter-level syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific resource and mode ('Fastio session and credential state (read)') and then enumerates exactly what is covered: sign-in check, session/scope details, email availability, 2FA status, API keys, OAuth sessions. It explicitly distinguishes itself from the sibling `auth_manage`, so an agent can pick between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names the alternative tool and the condition that selects it: mutations ('Sign-in, sign-up, 2FA changes, PKCE login and credential changes') go to `auth_manage`, everything read stays here. That is an explicit when/when-not routing rule, not an inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auth_manageAuthentication ManagementADestructiveInspect
Fastio sign-in and credentials (write): PKCE browser sign-in, signup, signout, set an API key, email verification, password reset, 2FA enrolment, API key create/update/delete, OAuth session update/revoke. Password signin and 2fa-verify are refused. Destructive: api-key-delete, oauth-revoke, oauth-revoke-all. Reads are on auth.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Verification or authorization code. Meaning is action-specific — see action='describe' for the per-action reference (e.g. reset code for password-reset). pkce-complete ignores it. | |
| name | No | API key label. | |
| admin | No | pkce-login only. Request the admin access mode (`rwa`) as a CEILING on the consent screen. Default false. A ceiling is not a grant: the human must still tick the toggle, and the granted set is whatever `auth action=scopes` reports afterwards. | |
| No | Email address. | ||
| token | No | 2FA / verification token. Meaning is action-specific — see action='describe' for the per-action reference (e.g. 2FA-disable token, 2fa-verify-setup token, 2FA token for api-key-create/api-key-delete). | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| key_id | No | API key identifier. | |
| scopes | No | Scope strings "entity:id:mode" with mode r | rw | rwa (rwa = read-write + admin access mode; a implies rw), e.g. ["org:123:rwa", "userdetails:*:rw", "user:*:r"]. api-key-create/update: omit for full access. oauth-update: REQUIRED and must be narrower-or-equal; an empty list is refused — use oauth-revoke instead. | |
| api_key | No | Fastio API key. | |
| channel | No | 2FA channel. | |
| expires | No | Token lifetime in seconds. | |
| password | No | Account password. | |
| last_name | No | Family name. | |
| password1 | No | New password. | |
| password2 | No | New password confirmation. | |
| agent_name | No | Agent name for the approval screen and audit logs. If omitted on pkce-login this DEFAULTS to the MCP client's self-reported name (clientInfo.name from initialize), which is caller-supplied and NOT platform-verified — a human approves it on the consent screen, but it is not a vouched vendor. Pass it explicitly to control what is recorded. | |
| first_name | No | Given name. | |
| scope_type | No | PKCE scope type. Default 'user' (full access). | |
| session_id | No | OAuth session identifier. | |
| email_token | No | Email verification code. | |
| key_expires | No | ISO 8601 expiration datetime. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. | |
| exclude_current | No | Skip current session in revoke-all. | |
| account_settings | No | pkce-login only. Request the account-settings scope (`userdetails:*:rw`, gating password/email changes, 2FA enrolment and sign-out-all) as a CEILING on the consent screen. Default false. A ceiling is not a grant: the human must still tick the toggle, and the granted set is whatever `auth action=scopes` reports afterwards. | |
| current_session_id | No | Current session ID for exclusion. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description goes further by naming exactly which actions are destructive (api-key-delete, oauth-revoke, oauth-revoke-all) and which are refused. It also signals the auth/consent flow implicitly through the action vocabulary, giving the agent concrete per-action risk information that the boolean annotations cannot.
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 dense sentences that front-load the purpose before the enumeration, and every element earns its place (action groups, refusals, destructive list, read routing). Slightly list-heavy, but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 25-parameter, action-dispatch tool with no output schema, the description is appropriately complete: it scopes the tool, names the alternatives, flags the destructive subset, and points to action='describe' for the per-action reference the schema declines to inline. Nothing critical is missing given the schema's own richness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema descriptions are unusually rich (per-action meaning of `code`/`token`, `scopes` syntax, `admin`/`account_settings` ceiling semantics, `agent_name` provenance caveat), so the schema carries the parameter burden. The description lists the action set but adds no parameter syntax or format detail beyond what the schema already provides, so the baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource ('Fastio sign-in and credentials (write)') and then enumerates the concrete operations covered — PKCE sign-in, signup, signout, API key CRUD, 2FA, OAuth session update/revoke. It explicitly carves out what is NOT handled here ('Password signin and 2fa-verify are refused') and routes reads to the sibling `auth` tool, so an agent can distinguish it from `auth` without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States both when to use this tool (write-side auth operations) and when not to ('Reads are on `auth`'), plus the explicit refusal cases ('Password signin and 2fa-verify are refused'). The alternative tool is named rather than implied, which is the textbook 5 condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
commentCommentsARead-onlyInspect
Fastio comments on files (read): list a file's comments, all comments in a workspace or share, comment details, a comment's attachments. Writes are on comment_manage. action='describe' gives the full action/param reference.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Default -created (newest first). | |
| limit | No | Page size 2-200. | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| detail | No | terse|standard|full (best-effort). Defaults: terse for list/list-all, full for details. | |
| offset | No | Offset for pagination. | |
| node_id | No | File node opaque ID. | |
| share_id | No | Alias for profile_id; implies profile_type=share. | |
| comment_id | No | Comment opaque ID. | |
| context_id | No | Alias for profile_id (either name works) | |
| profile_id | No | Workspace, share or File Share ID (pair with profile_type). | |
| context_type | No | Alias for profile_type (either name works) | |
| profile_type | No | Profile type. | |
| workspace_id | No | Alias for profile_id; implies profile_type=workspace. | |
| display_limit | No | list-all only: comments to return (default 10, max 200), trimmed after fetch. | |
| include_total | No | Include total count in response. | |
| reference_type | No | Filter by anchor type. | |
| include_deleted | No | Include soft-deleted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=true, so the safety profile is covered. The description adds context beyond that: it makes the read/write division of labor with comment_manage explicit and points to action='describe' for a full action/param reference, which is genuinely useful self-documentation behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences: the read scope and its four operations are front-loaded, and routing to the write sibling plus the describe hint follow. No filler, every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter tool with no output schema, the description covers the essentials: scope, the operation set, and a pointer to action='describe' for the full reference. It doesn't explain the alias relationships (e.g., context_id/share_id/workspace_id vs profile_id), but the schema documents those, and no output schema means return values needn't be described.
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 17 documented parameters and 6 enums, so the schema already carries parameter meaning. The description only reinforces the 'action' parameter via action='describe' and adds no syntax or alias guidance beyond what the schema provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('comments on files (read)') and enumerates the four concrete operations: list a file's comments, all comments in a workspace or share, comment details, and a comment's attachments. It also explicitly differentiates itself from the write sibling comment_manage, so an agent can distinguish the two without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Writes are on comment_manage' explicitly routes mutation intent to the correct sibling, and the parenthetical '(read)' plus the enumerated action list make the read context clear. It stops short of per-action selection guidance (e.g., when to choose list vs list-all), but the main when-to-use/when-not split is legible.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
comment_manageComment ManagementADestructiveInspect
Fastio comments on files (write): add (with an optional anchor or attachments), edit, delete, bulk-delete, emoji reactions, attach/detach objects. Destructive: delete, bulk-delete. Reads are on comment. action='describe' gives the full action/param reference.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Max 8192 characters; display text (mention markup excluded) max 500, usually the binding limit. CJK and emoji count as one. | |
| emoji | No | Single emoji character. | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| node_id | No | File node opaque ID. | |
| share_id | No | Alias for profile_id; implies profile_type=share. | |
| reference | No | Anchor: image region, A/V timestamp, PDF page, or text selection. Max 2048 bytes JSON-encoded (non-ASCII costs 6 each). | |
| target_id | No | Object to attach: node, workspace, share, File Share or envelope ID. | |
| comment_id | No | Comment opaque ID. | |
| context_id | No | Alias for profile_id (either name works) | |
| profile_id | No | Workspace, share or File Share ID (pair with profile_type). | |
| properties | No | JSON object of app-defined key-values: stored on add, merged on edit (server-managed keys ignored). | |
| target_ids | No | Objects to attach (max 25 per comment). | |
| comment_ids | No | Comment IDs (max 100). | |
| context_type | No | Alias for profile_type (either name works) | |
| profile_type | No | Profile type. | |
| workspace_id | No | Alias for profile_id; implies profile_type=workspace. | |
| parent_comment_id | No | Parent comment ID (reply; one level). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the description's job is to add detail — and it does, naming exactly which actions are destructive (delete, bulk-delete) rather than leaving the agent to guess across nine actions. It stops short of describing permission requirements, reversibility, or side effects of attachment detach.
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 tightly packed sentences: the write scope first, the destructive warning second, the routing to `comment` and 'describe' last. No filler and every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter tool with nested objects and no output schema, the description covers scope, destructiveness, and the read alternative, and delegates exhaustive detail to action='describe'. What is missing is any hint about required identifiers (profile_id/node_id) or what a successful mutation returns, though the describe action mitigates that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 17 parameters in detail, including the nested anchor object and the region coordinate conventions. The description only alludes to 'optional anchor or attachments' and adds no syntax or constraint detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Fastio comments on files (write)') and then enumerates the exact operations covered: add with anchor/attachments, edit, delete, bulk-delete, reactions, attach/detach. It also distinguishes itself from the sibling read tool `comment`, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes reads to the `comment` tool and points to action='describe' for the full action/param reference. It does not give per-action when-to-use conditions (e.g. when to prefer bulk-delete over repeated delete), but the write/read split and the describe escape hatch are clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
downloadDownloadARead-onlyIdempotentInspect
Download URLs for files (file-url) and folder ZIPs (zip-url), and details of existing QuickShare links (quickshare-details, deprecated; new links are created on fileshare_manage). Consumes bandwidth credits. action='describe' gives the full action/param reference.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Operation. Use 'describe' for full action reference. | |
| node_id | No | Storage tree node opaque ID. Both files and folders are nodes — use this name regardless of which. | |
| share_id | No | Alias for profile_id when the profile is a share — implies profile_type=share (so profile_type may be omitted). | |
| context_id | No | Alias for profile_id (either name works) | |
| profile_id | No | Polymorphic context ID. Pair with profile_type=workspace|share. Typed aliases let you omit profile_type: workspace_id (⇒ workspace) / share_id (⇒ share); also context_id / instance_id. 19-digit profile ID or custom name. | |
| version_id | No | Specific file version ID. | |
| instance_id | No | Alias for profile_id (REST/how-to name; profile_id is canonical). | |
| context_type | No | Alias for profile_type (either name works) | |
| profile_type | No | Profile type. | |
| workspace_id | No | Alias for profile_id when the profile is a workspace — implies profile_type=workspace (so profile_type may be omitted). | |
| quickshare_id | No | Quickshare opaque identifier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, and the description adds genuinely new context: it consumes bandwidth credits and flags quickshare-details as deprecated. It does not describe URL expiry or output shape, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core capability, then the deprecation caveat, then the cost and the describe pointer in a compact two-sentence block. Dense but every clause carries information; slightly telegraphic phrasing costs it a 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?
For an 11-parameter tool with no output schema, the description covers the action space, the credit cost, the deprecation status, and a discovery escape hatch via describe. It omits return-value/URL-lifetime details, but annotations carry the safety profile and the schema carries parameter detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents the polymorphic profile_id aliases, node_id, and version_id in detail. The description only repeats the action-value names, adding little beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (download) plus the exact resources returned (file URLs, folder ZIPs) and maps the action enum values file-url/zip-url/quickshare-details to those outcomes. It also distinguishes itself from the sibling fileshare_manage for link creation, so an agent can tell it apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for each action and explicitly routes quickshare link creation to fileshare_manage, plus points to action='describe' for the full reference. It lacks explicit when-not-to-use guidance versus read siblings like find or storage, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eventEvents & ActivityARead-onlyInspect
Fastio event log and activity (read): search audit events, event details, list and long-poll workspace/share activity, the per-member workspace Dashboard feed (dashboard-list), and the org-wide storage change feed (changes: one cursor for every workspace and share in an org). Writes and the billed AI summary are on event_manage. action='describe' gives the full action/param reference.
| Name | Required | Description | Default |
|---|---|---|---|
| wait | No | Max seconds server holds connection (1-95, default 95). | |
| event | No | Exact event name. See describe action for catalog. | |
| limit | No | Max results (1-250; default 100, changes: 250). | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| cursor | No | changes: the opaque feed cursor from the previous response — send it back unchanged; omit to bootstrap. activity-list: last activity timestamp for incremental polling. | |
| detail | No | terse|standard|full. Defaults: terse for search/activity-list/activity-poll, standard for summarize, full for details. Only search and details honor it. | |
| offset | No | Pagination offset. | |
| org_id | No | Organization profile ID (19-digit). Filter-style scope filter; the org to read for changes. | |
| user_id | No | Filters the event's stored subject column, which the platform derives instead of taking it from the emitter, so it can name an arbitrary related user rather than the person the event concerns. The actor is calling_user_id. The search note covers both. | |
| category | No | Event category; valid values are in describe. `node` is the AI/RAG pipeline, not file operations; file activity is under both `workspace` and `share`. Cloud import is category="import" (subcategory="cloud_import" for graft traffic only); `cloudsync` is an activity field on a different taxonomy and matches nothing here. | |
| event_id | No | Alphanumeric event opaque ID. | |
| share_id | No | Filter by share profile ID. | |
| entity_id | No | activity-poll: the workspace, share, or File Share ID to long-poll (a File Share's file_share_* feed reaches WORKSPACE MEMBERS only; recipients get no feed). | |
| object_id | No | Filter by related object opaque ID (file, folder, etc.). | |
| context_id | No | Alias for profile_id (either name works) | |
| profile_id | No | activity-list: the workspace, share, or File Share ID (pair with profile_type). | |
| visibility | No | Filter by event visibility level (external_audit_log | external). Default returns both, excludes internal. | |
| created_max | No | ISO 8601 datetime — events on or before. | |
| created_min | No | ISO 8601 datetime — events on or after. | |
| subcategory | No | Event subcategory. See describe action for valid values. | |
| acknowledged | No | Filter by acknowledgment status. | |
| context_type | No | Alias for profile_type (either name works). | |
| lastactivity | No | Timestamp from prior poll's response. Omit on first call. | |
| profile_type | No | Profile type: "workspace", "share", or "fileshare". `fileshare` is valid for activity-list (long-poll a File Share's feed — workspace members only; recipients get no feed). | |
| workspace_id | No | Filter-style scope filter by workspace ID. dashboard-*: the workspace. | |
| calling_user_id | No | Filter by the user who triggered the event. | |
| parent_event_id | No | Filter by parent event ID for serial/batch events. SCOPE-EXCLUSIVE: cannot combine with any filter other than acknowledged, limit, offset. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds useful scope context — the changes feed being 'one cursor for every workspace and share in an org' and the per-member dashboard feed — but says nothing about auth requirements, rate limits, or polling cost beyond what the schema already states.
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 dense paragraph that front-loads the read-only scope and the operation inventory before the hand-off to `event_manage`. Every clause carries information, though the sentence is long and could be broken for scanability.
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 27-parameter, action-dispatch tool with no output schema and full schema coverage, the description covers scope, the read/write boundary, and defers detailed action semantics to the describe action. That is sufficient for correct invocation; the omission of return-shape or pagination expectations is minor given the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 27 parameters (including the 6 enums and cursor/long-poll semantics) are already documented in the schema. The description's mentions (cursor over an org, dashboard-list scoping) add framing but no syntax or format detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with an explicit verb+resource+mode ('Fastio event log and activity (read)') and then enumerates the concrete read surfaces: audit event search, event details, activity list/long-poll, dashboard-list, and the org-wide changes feed. It names the sibling it is not ('Writes and the billed AI summary are on event_manage'), so an agent can route between `event` and `event_manage` without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing guidance (reads here, writes/billed summarization on `event_manage`) and points to action='describe' for the full action/param reference. It does not spell out when to pick search vs details vs activity-list vs dashboard-list, leaving that to the action names and the describe reference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
event_manageEvent ManagementADestructiveInspect
Fastio events (write): AI-summarize audit events (summarize: an LLM call billed to the org's AI credits), acknowledge an event (marks it read for the caller; idempotent), and dismiss/snooze or undismiss a Dashboard card in the caller's own feed (a view change; the underlying item is unchanged). Reads are on event. action='describe' gives the full action/param reference.
| Name | Required | Description | Default |
|---|---|---|---|
| event | No | Exact event name. See describe action for catalog. | |
| limit | No | Max results (1-250; default 100, changes: 250). | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| detail | No | terse|standard|full. Defaults: terse for search/activity-list/activity-poll, standard for summarize, full for details. Only search and details honor it. | |
| offset | No | Pagination offset. | |
| org_id | No | Organization profile ID (19-digit). Filter-style scope filter; the org to read for changes. | |
| user_id | No | Filters the event's stored subject column, which the platform derives instead of taking it from the emitter, so it can name an arbitrary related user rather than the person the event concerns. The actor is calling_user_id. The search note covers both. | |
| card_key | No | Dashboard card key "<lane>:<id>" from a dashboard-list card. | |
| category | No | Event category; valid values are in describe. `node` is the AI/RAG pipeline, not file operations; file activity is under both `workspace` and `share`. Cloud import is category="import" (subcategory="cloud_import" for graft traffic only); `cloudsync` is an activity field on a different taxonomy and matches nothing here. | |
| event_id | No | Alphanumeric event opaque ID. | |
| share_id | No | Filter by share profile ID. | |
| object_id | No | Filter by related object opaque ID (file, folder, etc.). | |
| visibility | No | Filter by event visibility level (external_audit_log | external). Default returns both, excludes internal. | |
| created_max | No | ISO 8601 datetime — events on or before. | |
| created_min | No | ISO 8601 datetime — events on or after. | |
| subcategory | No | Event subcategory. See describe action for valid values. | |
| acknowledged | No | Filter by acknowledgment status. | |
| snooze_until | No | dashboard-dismiss: a future "Y-m-d H:i:s UTC" to snooze until; omit to dismiss permanently. | |
| user_context | No | Focus guidance for AI summary, e.g. "Focus on uploads". | |
| workspace_id | No | Filter-style scope filter by workspace ID. dashboard-*: the workspace. | |
| calling_user_id | No | Filter by the user who triggered the event. | |
| parent_event_id | No | Filter by parent event ID for serial/batch events. SCOPE-EXCLUSIVE: cannot combine with any filter other than acknowledged, limit, offset. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give a blanket destructiveHint=true, but the description differentiates the operations: summarize incurs a billed LLM call against org AI credits, acknowledge is idempotent and only marks read for the caller, and dashboard dismiss/snooze is a per-caller view change that leaves the underlying item unchanged. That is exactly the kind of nuance the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the write-scope and each action's effect in a single dense sentence, followed by the sibling routing and the describe pointer. Every clause is informative, though the stacked parentheticals make it slightly heavy 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?
For a 5-action, 22-parameter write tool with no output schema, it covers what each action does and where to find full parameter details. It stops short of describing what each action returns, but the describe pointer partially compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries the parameter semantics (including the nuanced user_id/subcategory/category notes), making 3 the baseline. The description adds only the pointer to action='describe' for the full reference rather than new per-parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Fastio events (write)') and enumerates the three distinct write capabilities (summarize, acknowledge, dashboard dismiss/undismiss) with their effects. It explicitly distinguishes itself from the read sibling by saying 'Reads are on `event`', so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The read/write split against the `event` sibling is stated explicitly, which is the primary routing decision. It also points to action='describe' as the authoritative reference for the action/param catalog, giving a clear fallback when details are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findUnified Search (Find)ARead-onlyInspect
Unified search across a workspace or share — ONE query, results GROUPED BY TYPE into buckets (files, metadata [workspace only], comments), each independently paginated and health-reported. action='describe' gives the full action/param reference. storage action=search is the files-only search, with a smaller default page, files_scope/metadata_filters and the depth surface; find adds metadata-only hits and comments in the same call; metadata action=search covers lexical metadata fields alone.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Alias for search (the name storage + code-mode search use). | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| detail | No | Files-bucket rows on workspaces AND shares: caps `content_snippet` (standard 600 bytes, terse 200, full untrimmed). On a WORKSPACE also the `facts` tier: standard (default) up to 8 fields WITH values, full up to 100, terse names-only so a terse row carries NO `facts`. Shares carry no facts at any tier. See action='describe'. | |
| search | No | Search query string. 1-1024 chars; empty/blank rejected (platform 1605). Searched across every applicable bucket. (Alias: query.) | |
| share_id | No | Alias for profile_id when profile_type=share. | |
| search_in | No | filename | content | both (DEFAULT). filename = name only, find-style. content = the AI's summary + semantic, NOT grep. Sending it changes the response shape (adds a search_metadata block); omitting it reproduces today's behavior byte-for-byte. filename pairs with name_match. | |
| context_id | No | Alias for profile_id. | |
| name_match | No | auto (DEFAULT) | exact | prefix | contains | glob. exact = whole name; prefix = starts with; contains = substring — those three are LITERAL (* and ? are ordinary chars). glob = wildcards over the WHOLE name: *.pdf, report-*.xlsx. No pre-escaping needed. Applies when search_in is filename or both; auto keeps today's relevance. Precise modes cap the pattern at 256 chars, reject an empty one. | |
| profile_id | No | Workspace or share opaque ID (19-digit numeric ID or custom name). Pair with profile_type. Four accepted aliases besides this one (five id params total): workspace_id, share_id, context_id, instance_id — the supplied id must match profile_type (workspace_id only with profile_type=workspace, share_id only with share). | |
| files_limit | No | files bucket page size (default 25). | |
| instance_id | No | Alias for profile_id (REST/how-to name; profile_id is canonical). | |
| context_type | No | Alias for profile_type. | |
| files_offset | No | files bucket result offset (default 0). | |
| profile_type | No | Profile to search: "workspace" or "share". (Alias: context_type.) | |
| workspace_id | No | Alias for profile_id when profile_type=workspace. | |
| case_sensitive | No | Case-sensitive matching for exact/prefix/contains/glob. Default false (like find -iname), which folds non-ASCII too. Ignored under name_match=auto. | |
| comments_limit | No | comments bucket page size (default 25). | |
| metadata_limit | No | metadata bucket page size (default 25). Workspace only — dropped from the request on a share (shares have no metadata bucket). | |
| comments_offset | No | comments bucket result offset (default 0). | |
| metadata_offset | No | metadata bucket result offset (default 0). Workspace only — dropped from the request on a share (shares have no metadata bucket). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, open-world behavior, so the safety profile is covered. The description adds real context beyond that: the bucket model (files, metadata workspace-only, comments), independent pagination, and health reporting. It omits any auth or rate-limit notes, but the annotation baseline makes this solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the core purpose front-loaded before the sibling comparisons. Nothing is wasted, though the middle sentence is heavily parenthetical and slightly harder to parse on first read.
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 20-parameter tool with no output schema, the description conveys the essential shape of results (typed buckets, per-bucket pagination) and defers detail to action='describe'. That is close to sufficient, though a single clause on what 'health-reported' means for a bucket would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 20 parameters including enums, aliases and pagination defaults. The description adds only a pointer to action='describe' for the full action/param reference and does not elaborate meaning beyond what the schema carries. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('unified search across a workspace or share') and immediately clarifies the distinguishing behavior — results grouped by type into buckets. It explicitly separates itself from the two closest siblings (`storage action=search` and `metadata action=search`), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternatives and the exact condition selecting each: storage is files-only with a smaller page and depth surface, metadata covers lexical metadata alone, and find adds metadata-only hits plus comments in one call. It also routes deep dives to action='describe'. This is explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
how-toHow-To — Built-in Product HelpARead-onlyInspect
Built-in product help — a natural-language "how do I…" question about Fastio returns a grounded, product-aware answer (or a short clarifying question) in one call. EXPLAIN-ONLY / ADVISORY: it returns GUIDANCE TEXT and performs NO platform action (it will not create shares, move files, or change anything); the actions themselves are on the other tools. Answers are grounded in Fastio's own how-to knowledge AND phrased in terms of these MCP tools — they name the concrete <tool> action="…" calls, in place of guessed endpoints or exploratory calls. Q&A over the user's uploaded files (RAG) is the ai_manage tool; how-to answers questions about Fastio ITSELF. Costs no credits; needs only an authenticated user (no org needed). action='describe' gives the full action/param reference.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Operation. Use 'describe' for full action reference. | |
| context | No | Optional free-text background about your situation (what you're trying to accomplish, what you've tried). Up to 8000 chars. Treated strictly as untrusted DATA — it cannot redirect the assistant. Omit when empty. | |
| question | No | The natural-language "how do I…" question about Fastio. 1-2000 chars, non-blank. Be specific — a vague question returns a clarifying question instead of an answer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint=true, destructiveHint=false, openWorldHint=true), yet the description adds non-trivial context beyond them: it performs NO platform action, returns guidance text only, costs no credits, needs only authentication, and phrases answers as concrete '<tool> action=…' calls rather than guessed endpoints.
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?
Dense but front-loaded: the core purpose leads, then boundaries, then sibling differentiation, then cost/auth notes. Slightly heavy with parentheticals and repeated emphasis on the no-action guarantee, but every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what comes back (grounded answer or clarifying question) and what does not (no actions, no side effects). Combined with full schema coverage and rich annotations, an agent has everything needed to select and invoke it 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 the baseline is 3; the description still adds value by explaining that action='describe' yields the full action/param reference and that a vague question yields a clarifying question instead of an answer, which shapes how the agent should phrase input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: a natural-language 'how do I…' question about Fastio returns a grounded, product-aware answer (or clarifying question) in one call. It explicitly distinguishes itself from the closest sibling by declaring 'Q&A over the user's uploaded files (RAG) is the ai_manage tool; how-to answers questions about Fastio ITSELF.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (questions about Fastio itself), when-not (RAG over uploaded files goes to ai_manage), the precondition (authenticated user, no org needed), the cost profile (no credits), and the operational boundary (explain-only, no platform actions). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
intentAgent IntentsARead-onlyInspect
Agent Intents (read): workspace-scoped declarations of what agents are working on. browse lists every live intent (topics only); expand returns full records. Writes are on intent_manage.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Operation. Use 'describe' for full action reference. | |
| cursor | No | browse only: opaque cursor from a previous response. Omit for the first page. | |
| intent_ids | No | expand only: one or more intent IDs. Accepts an array, a JSON array string, or a comma-separated string. Max 250. | |
| workspace_id | No | Workspace ID (19-digit numeric). Intents are workspace-only — there is no share variant. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: intents are workspace-scoped with no share variant, browse returns topics only while expand returns full records. Pagination/return-shape detail is left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: identity/scope first, mode distinction second, routing to the write sibling last. No filler, and the most decision-relevant facts are 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?
There is no output schema, and the description compensates by sketching what each action returns (topic summaries vs full records). Cursor pagination and the describe action are only implied, but the schema covers those parameters, so coverage is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema (including browse-only cursor and expand-only intent_ids). The description reinforces the browse/expand parameter mapping but adds no syntax or format detail beyond it, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Agent Intents (read): workspace-scoped declarations of what agents are working on') and immediately distinguishes the two read modes, browse vs expand. It also names the sibling that owns writes, so an agent can separate this tool from intent_manage without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly routes writes to `intent_manage` and explains the browse/expand split (list topics vs full records). It does not cover the third action, 'describe', or when to prefer this over other read tools, so the guidance is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
intent_manageAgent Intent ManagementADestructiveInspect
Agent Intents (write): allocate a slot (content-free; get-or-create — it can return an existing slot), fill it with a topic/message (fill is also the heartbeat), release it. Destructive: release. Reads are on intent.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | fill only: one-line label, max 256 characters. No newlines or tabs. This is what browse shows. | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| intent | No | What KIND of work this is — closed vocabulary, server-validated. Optional on allocate and fill. | |
| message | No | fill only: long-form detail, max 8192 characters. Absent from browse rows — read it with expand. | |
| node_id | No | allocate only: scope the declaration to one node. Omit for a workspace-wide intent. Part of the slot key. | |
| version | No | fill only, REQUIRED: the version you last read for this slot. Compare-and-set — a stale or omitted version is refused with 409. | |
| intent_id | No | Intent ID from allocate, or from a browse/expand row. Matched byte-for-byte as received. | |
| workspace_id | No | Workspace ID (19-digit numeric). Intents are workspace-only — there is no share variant. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give a blanket destructiveHint=true, but the description narrows it: only `release` is destructive, which is genuinely useful disambiguation. It also discloses that allocate is get-or-create (may return an existing slot) and that fill doubles as the heartbeat — behavior not visible in the schema. Auth/permission requirements and rate limits are still unstated.
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?
Tight and front-loaded: the write scope and the destructive action appear immediately, and the sibling routing is at the end. The parenthetical nesting makes it dense but every clause carries information; no filler sentences.
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 9-parameter write tool with no output schema, the description covers the action lifecycle, the destructive action, and sibling routing, while the schema covers per-parameter constraints (version CAS, 409, ID formats). Missing is any mention of permissions or what release actually destroys.
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 9 parameters; baseline would be 3. The description earns above baseline by adding action-level semantics the schema lacks — get-or-create on allocate and heartbeat behavior on fill — which help the agent choose the right action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (Agent Intents) and enumerates the three write operations — allocate, fill, release — with concrete semantics for each. It also explicitly distinguishes itself from the sibling `intent` tool, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes read operations to `intent`, and the allocate→fill→release lifecycle implies the intended ordering. It does not, however, state preconditions for each action (e.g., when allocate is preferable to reusing a slot) beyond the get-or-create hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invitationInvitationARead-onlyInspect
Fastio workspace and share invitations (read): list invitations, filter by state. Writes are on invitation_manage.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Invitation state filter. | |
| action | Yes | Operation; 'describe' lists the actions. | |
| entity_id | No | Workspace or share ID (19-digit numeric or custom name). Must match entity_type. | |
| entity_type | No | Workspace or share. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description reinforces '(read)' and adds the write-path routing, but discloses nothing about pagination, result size, or output shape. Consistent 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 short sentences with the read scope front-loaded and the delegation to invitation_manage immediately after. Zero 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?
A read-only list tool with fully documented parameters and no output schema; the description plus schema covers what an agent needs to invoke it. Minor gap on intra-action selection (describe vs list-by-state) keeps it short of a 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 description coverage is 100%, so all four parameters (action, state, entity_id, entity_type) are already documented inline, including enum values. The description only restates the state filter, adding no syntax or format detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('list invitations, filter by state') scoped to workspace and share invitations, and explicitly marks it as the read-side tool. An agent can distinguish it from invitation_manage without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes write operations to `invitation_manage`, which is a clear when-not-to-use signal. It does not explain when to choose 'describe' vs 'list' vs 'list-by-state', so the intra-tool routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invitation_manageInvitation ManagementADestructiveInspect
Fastio workspace and share invitations (write): update an invitation, revoke one. Destructive: delete. Reads are on invitation.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Operation; 'describe' lists the actions. | |
| expires | No | Updated expiration — `YYYY-MM-DD HH:MM:SS UTC`. ISO 8601 is NOT documented as accepted. | |
| entity_id | No | Workspace or share ID (19-digit numeric or custom name). Must match entity_type. | |
| new_state | No | New invitation state. | |
| entity_type | No | Workspace or share. | |
| permissions | No | Updated permission level. | |
| invitation_id | No | Invitation opaque ID or invitee email. | |
| notifications | No | Notification preference (workspace). | |
| notify_options | No | Notification preference (share). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, so the safety profile is covered; the description adds value by pinpointing that 'delete' specifically is the destructive action rather than the update path. It does not disclose side effects of update (e.g., notification behavior) or permission requirements, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the write scope, the destructive action, and the read alternative all front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with no output schema, the description covers routing and the destructive path, and the fully described schema carries the parameter burden. It omits the `describe` action and any indication of required combinations per action, leaving a small completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and three parameters carry enums, so the schema fully documents action, entity_type, new_state, expires, and the rest. The description adds no parameter-level meaning beyond the action names, making the baseline 3 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?
Names a specific resource (workspace and share invitations) with concrete write verbs (update, revoke) and explicitly marks delete as the destructive path. It also draws a clean boundary against the `invitation` sibling, which handles reads, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes read operations to `invitation`, which is exactly the alternative-selection guidance an agent needs for this family. It stops short of stating preconditions (required IDs, entity_type/entity_id matching, permissions needed), so it is clear context rather than full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memberMemberARead-onlyInspect
Fastio workspace and share members (read): list (active and pending), details. Writes are on member_manage.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of items to return (1-500, default 100) | |
| action | Yes | Operation; 'describe' lists the actions. | |
| offset | No | Number of items to skip (default 0) | |
| user_id | No | User profile ID (share). | |
| entity_id | No | Workspace or share ID (19-digit numeric or custom name). Must match entity_type. | |
| member_id | No | Member ID (workspace). | |
| entity_type | No | Workspace or share. | |
| display_limit | No | How many members the list action returns (default 10, max 500), trimmed after the fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safety profile is already structured. The description adds value by clarifying that it lists both active and pending members, which the annotations don't say. It could add more (pagination behavior, permissions), but it's solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, and the sibling routing is 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?
Complete for a read tool with full schema coverage and annotations covering safety. It clearly routes to the write counterpart. The only minor gap is not detailing return structure, but with no output schema and a list operation, that's acceptable and could be inferred.
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 does the heavy lifting. The description maps the two list modes ('active and pending', 'details') to the `action` enum values, which is useful but minimal. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('read') on a specific resource ('workspace and share members') and explicitly distinguishes the read tool from its write sibling ('member_manage'). It also clarifies the sub-operations (list active and pending, details).
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 explicitly states when to use this tool versus the alternative: 'read' operations belong here, 'Writes are on member_manage'. This is the exact sibling routing pattern.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
member_manageMember ManagementADestructiveInspect
Fastio workspace and share members (write): add, remove, update, transfer ownership, join, leave, answer an invitation. Destructive: remove, transfer-ownership, leave. Reads are on member.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Share permission level. | |
| action | Yes | Operation; 'describe' lists the actions. | |
| expires | No | Membership expiration, `YYYY-MM-DD HH:MM:SS UTC` for workspace and share. ISO 8601 is rejected (406). | |
| message | No | Invitation email message (10-255 chars). | |
| user_id | No | User profile ID (share). | |
| entity_id | No | Workspace or share ID (19-digit numeric or custom name). Must match entity_type. | |
| member_id | No | Member ID (workspace). | |
| expiration | No | Alias for expires (share only). | |
| entity_type | No | Workspace or share. | |
| permissions | No | Workspace permission level. | |
| notifications | No | Alias for notify_options. | |
| invitation_key | No | Invitation key string. | |
| notify_options | No | Member notification preference: 'Do not notify me', 'Notify me in app', 'Notify me in app and via email' or 'Notify me via app, email and text message'. | |
| email_or_user_id | No | Email (to invite) or user ID (to add directly). | |
| invitation_action | No | Accept or decline. | |
| force_notification | No | true: email the membership notification to an added existing user (sent as notification=force). | |
| invitation_expires | No | Email invitation expiration, `YYYY-MM-DD HH:MM:SS UTC`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description goes further by naming exactly which actions are destructive: remove, transfer-ownership, leave. That specificity is genuine added value, though it does not cover auth requirements, reversibility, or side effects like notification emails triggered on add.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the action inventory leads and the destructive warning plus sibling pointer are front-loaded. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter multi-action tool, the description covers the action set, the destructive subset, and the read/write boundary with its sibling, while the schema carries the parameter detail and there is no output schema to explain. The remaining gap is per-action parameter pairing, which is only partially implied by schema hints like '(share)' and '(workspace)'.
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% across all 17 parameters, with enums and format constraints (e.g., the UTC date format and the 406 rejection note) already documented in the schema. The description adds no parameter syntax or pairing information beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Fastio workspace and share members (write)') and enumerates all eight operations, so the agent knows exactly what surface it covers. It also explicitly distinguishes itself from the sibling read tool by ending with 'Reads are on `member`.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear routing context: this tool is the write path, and reads belong to `member`. However, with eight distinct actions in one tool, it gives no per-action selection guidance (e.g., when to use 'join' vs 'join-invitation', or 'remove' vs 'leave'), so the agent must fall back on the enum descriptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metadataMetadataARead-onlyInspect
Fastio workspace metadata (read): the field VOCABULARY (fields-list), lexical value search (search), metadata+content matching (compound-search), extraction eligibility (eligible), merge proposals (fields-merge-candidates), saved filters (filters-list, filter-details, filter-nodes). Templates and saved views were removed; extraction is on storage_manage. Writes are on metadata_manage. action='describe' gives the full reference.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | search keyword(s). 1-1024 chars. Multi-token = ALL tokens (AND); case-insensitive; substring for <=64 chars, else whole-word. | |
| limit | No | search: page size (1-100, default 100). | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| cursor | No | eligible/fields-list: opaque cursor from the prior page's response, echoed back verbatim. Omit for the first page. | |
| offset | No | search: results to skip (offset+limit <= 10000). fields-merge-candidates: the prior next_offset. | |
| sort_dir | No | filter-nodes: sort direction. Default desc for updated, asc otherwise. | |
| filter_id | No | Saved filter ID (from filters-list). | |
| page_size | No | eligible/fields-list: cursor page size (1-250, default 100). Server caps at 250. | |
| sort_field | No | filter-nodes: order by a file column. Not with sort_metadata_field. | |
| template_id | No | RETIRED (metadata templates were removed): supplying it fails the request on every action. Narrow by field name (fields-list). | |
| workspace_id | No | Workspace opaque ID (19-digit numeric ID or custom name). Required for every action. | |
| content_query | No | compound-search: free-text query run against INDEXED FILE CONTENT (1-1024 chars). AND-ed with metadata_filters — a file matches only if it satisfies BOTH. A file with no indexed content can never match, however well its metadata fits. | |
| display_limit | No | search: how many items to return post-fetch. Default 10, max 100 (page past 100 with offset). | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. | |
| metadata_filters | No | compound-search: JSON predicate array `[{"field","operator","value"}]` (sent to the platform as `filters`). Required for compound-search. | |
| sort_metadata_field | No | filter-nodes: order by this metadata field's value. Not with sort_field. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful non-obvious context: retired features, that template_id now fails on every action, and that a describe action exists to fetch the full reference. It does not discuss rate limits or response shape beyond pointing at describe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the tool scope and the read/write split, with the long action parenthetical placed mid-sentence. The sentence listing eight actions is dense but every clause maps to a real enum value, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter, 9-action router with no output schema, the description is compact yet covers scope, sibling boundaries, deprecations, and a pointer to action='describe' for the full reference. That pointer compensates for the lack of per-action detail in the description itself.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 16 parameters is already documented in structured form, including the cursor, offset, and required-for-compound-search details. The description adds only the action glosses (fields-list, search, compound-search, etc.), which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fastio workspace metadata (read)') and enumerates the nine operations it exposes, so an agent knows exactly what capability set this covers. It also explicitly separates itself from metadata_manage (writes) and storage_manage (extraction), making sibling disambiguation immediate.
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?
Names the alternatives by tool ('Writes are on metadata_manage', 'extraction is on storage_manage') and flags the removed capabilities (templates, saved views). It also gives the escape hatch for deeper detail via action='describe', which is an explicit when-to-use instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metadata_manageMetadata ManagementADestructiveInspect
Fastio workspace metadata (write): fold one field name into another, workspace-wide; create, replace or delete saved filters. Destructive: fields-merge (irreversible; unconfirmed it is a preview), filter-delete. Reads are on metadata. action='describe' gives the full reference.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Saved filter name, 1-100 characters, unique per workspace. | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| confirm | No | fields-merge: 'true' performs the IRREVERSIBLE workspace-wide merge; omitted, the call is a preview that changes nothing. | |
| filter_id | No | Saved filter ID (from filters-list). | |
| predicate | No | Saved filter predicate: JSON array of up to 5 AND-ed {field,operator,value} clauses; [] matches all. | |
| projection | No | Saved filter projection (JSON object or array, stored as sent); only {"sort":{field,dir}} is applied. | |
| description | No | Saved filter description, max 255 characters. | |
| template_id | No | RETIRED (metadata templates were removed): supplying it fails the request on every action. Narrow by field name (fields-list). | |
| source_field | No | The field NAME that is FOLDED AWAY and stops existing. Names, not ids. | |
| target_field | No | The field NAME that SURVIVES and absorbs the source's values. | |
| workspace_id | No | Workspace opaque ID (19-digit numeric ID or custom name). Required for every action. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds which specific actions are destructive (fields-merge, filter-delete) and that fields-merge is workspace-wide and irreversible unless confirm is set. The 'unconfirmed it is a preview' phrasing is slightly murky about what remains unverified, which keeps this short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight clauses with zero filler, front-loading the write scope, then the destructive-action list, then the read alternative and the describe escape hatch. 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 12-parameter, no-output-schema tool with a retired `template_id`, the description covers the safety-critical surface (which actions destroy data, preview behavior) and the alternatives. It relies on the schema for field-level detail, which is reasonable, but does not mention result shape or how filter_id is obtained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents every parameter, including the preview semantics of `confirm`. The description's only parameter-level contribution is pointing at action='describe', so the baseline 3 for schema-carried semantics is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fastio workspace metadata (write)') and enumerates the concrete operations: field folding, saved-filter create/replace/delete. It explicitly distinguishes itself from the read sibling ('Reads are on `metadata`'), so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear routing context: use this for writes, use `metadata` for reads, and use action='describe' to get the full action reference. It does not, however, say when to pick fields-merge versus filter-* operations or state prerequisites beyond workspace scoping.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
orgOrganizationARead-onlyInspect
Fastio organizations (read): list, details, limits, workspaces, shares, billing, members, invitations, discovery, assets. Writes are on org_manage.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size. | |
| meter | No | Meter type, e.g. storage_bytes, transfer_bytes, ai_tokens. | |
| state | No | Invitation state, e.g. pending, accepted. | |
| action | Yes | Operation; 'describe' lists the actions. | |
| detail | No | Per-entity verbosity. Default terse for list/discover-*/members/list-workspaces, full for details; describe lists the fields per level. | |
| offset | No | Pagination offset (0-based). | |
| org_id | No | Organization 19-digit ID or domain string. | |
| user_id | No | User ID. | |
| end_time | No | End datetime (default now). | |
| share_id | No | Filter by share ID. | |
| start_time | No | Start datetime (default 30 days ago). | |
| domain_name | No | Domain to check for availability. | |
| workspace_id | No | billing-meters: filter by workspace ID. | |
| display_limit | No | Number of orgs to return to the agent (default 10, max 100). | |
| starting_after | No | billing-invoices cursor: a prior invoice's `id`. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description's read/write split reinforces that and points to org_manage, but adds nothing about pagination, default time windows, or permission requirements for the org-scoped reads.
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, with the read scope and the org_manage handoff front-loaded. The middle clause is a dense keyword list rather than prose, which is efficient but slightly reads as a dump of action names.
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 16-parameter, 22-action multiplexed tool with no output schema, the description gives the agent a category map but no per-action requirements (which actions need org_id, meter, or workspace_id) and no return-shape hints. The `describe` action in the schema partially compensates, so this is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter (detail defaults, meter, starting_after, describe_action, workspace_id scoping) is already documented inline. The description only repeats the action category names, adding no format, default, or interaction semantics beyond the schema. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (Fastio organizations) and the read-only scope, then enumerates the operation families (list, details, limits, workspaces, shares, billing, members, invitations, discovery, assets) that map onto the 22-value action enum. That is enough to tell it apart from org_manage, though it never names a single verb+resource pair per 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?
Explicitly routes write operations to the sibling `org_manage`, which is a genuine when-not rule. It does not, however, say when to pick a specific action over another (e.g. details vs public-details, discover-all vs discover-available), leaving that to the schema's 'describe' action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
org_manageOrganization ManagementADestructiveInspect
Fastio organizations (write): create, update, workspaces, billing, members, invitations, assets. Destructive: close (org and all data), billing-cancel, remove-member, leave, transfer-ownership, invitation-delete, asset-delete. Reads are on org.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name (3-100 chars). | |
| role | No | Org role: `member` or `admin`. `owner` is not assignable; `guest`/`view` are workspace/share roles, rejected (1605). | |
| No | Invitee email. | ||
| state | No | Invitation state, e.g. pending, accepted. | |
| action | Yes | Operation; 'describe' lists the actions. | |
| domain | No | Subdomain: lowercase alphanumeric and hyphens, globally unique, not reserved. | |
| org_id | No | Organization 19-digit ID or domain string. | |
| confirm | No | Org domain or ID, confirming close. | |
| content | No | Plain-text asset body, e.g. SVG. | |
| expires | No | Updated expiration datetime. | |
| message | No | Invitation message (10-255 chars). | |
| user_id | No | User ID. | |
| industry | No | Industry key (see industry-list). | |
| metadata | No | Asset metadata as a JSON array string. | |
| file_name | No | File name, e.g. logo.png. | |
| member_id | No | Member user ID or email. | |
| perm_join | No | Permission level required to join workspace. | |
| asset_name | No | Asset name, e.g. "logo", "banner". | |
| description | No | Description (10-1000 chars). | |
| file_base64 | No | Base64 binary asset content. | |
| folder_name | No | Workspace folder name (4-80 chars). | |
| join_action | No | Accept or decline the invitation (default accept). | |
| permissions | No | Updated permission level. | |
| twitter_url | No | Twitter/X URL. | |
| youtube_url | No | YouTube URL. | |
| accent_color | No | Brand accent color as JSON. | |
| billing_plan | No | Plan ID, e.g. solo_monthly; billing-plans lists current IDs. The free plan is closed to new subscriptions. | |
| content_type | No | MIME type (default application/octet-stream). | |
| facebook_url | No | Facebook URL. | |
| homepage_url | No | Website URL. | |
| billing_email | No | Billing contact email. | |
| deep_indexing | No | Deep Indexing (RAG indexing), 10 credits per page. Default "false". Responses report it as `intelligence`. | |
| instagram_url | No | Instagram URL. | |
| invitation_id | No | Invitation ID or invitee email. | |
| owner_defined | No | Owner-defined properties as JSON. | |
| invitation_key | No | Invitation key from invite link. | |
| use_background | No | Show the background: "true" or "false". | |
| background_mode | No | Background mode, e.g. 'stretched', 'fixed'. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. | |
| background_color | No | Background color as JSON. | |
| background_color1 | No | Primary background color as JSON. | |
| background_color2 | No | Secondary background color as JSON. | |
| perm_member_manage | No | Who can manage members, e.g. 'Owner only'. | |
| metadata_extraction | No | Automatic metadata extraction for new uploads (default "true"); effective only while Deep Indexing is on. | |
| perm_authorized_domains | No | Authorized email domain for auto-join. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, readOnlyHint=false, but the description adds real value by naming which actions are destructive and spelling out the worst consequence (close destroys the org and all data). It does not cover auth/permission requirements or rate limits. Note the tool does expose a `describe` read action even though the text says reads live on `org` — a minor inconsistency, not an annotation 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?
Three tight clauses with zero filler: scope first, capability families second, destructive actions third, sibling routing last. Every phrase earns its place in a tool whose schema carries the bulk of the detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-action, 45-parameter tool with no output schema, the description covers the high-risk information (which actions destroy data) and the read/write split. It omits mention of the `describe` mechanism and the `confirm` requirement for close, though both are fully documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 45 parameters with constraints, enums, and cross-references (billing-plans, industry-list). The description adds no parameter-level detail beyond grouping the actions, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (Fastio organizations) and the scope (write) and enumerates the operation families it covers: create, update, workspaces, billing, members, invitations, assets. It explicitly distinguishes itself from the read sibling by naming `org` as the read path, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear routing rule — writes here, reads on `org` — and flags the destructive subset, which tells the agent when caution is required. It stops short of stating when a write should be avoided entirely or what prerequisites (e.g. confirm for close) gate each action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signE-SignatureARead-onlyInspect
Fastio e-signature reads: sign envelopes and sign templates in a workspace, plus document and audit-certificate download URLs. Writes are on sign_manage.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Pagination limit (max 500). | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| offset | No | Pagination offset (default 0). | |
| document_id | No | sign-document-*: document OpaqueId. | |
| envelope_id | No | sign-*: numeric envelope ID. | |
| template_id | No | sign-template-get: template id (30-char base32, `sa` family). | |
| workspace_id | No | Workspace ID (19-digit NUMERIC; the document/audit download stream route rejects custom workspace names). Envelopes are workspace-parented. | |
| display_limit | No | Max list rows rendered inline (default 10; the full page is still fetched). | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. | |
| envelope_status | No | sign-list: status filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safe-read profile is covered and the description's 'reads' is partly redundant. It does add useful context beyond the annotations – that some actions yield document and audit-certificate download URLs and that writes are delegated elsewhere – but discloses nothing about auth needs, rate limits, or return format specifics.
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 tightly written sentences: the first front-loads the read scope and the second names the write alternative. No filler, and the important routing information is placed early – only slightly terse for a tool with ten parameters and ten actions.
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, ten-parameter tool with full schema coverage and no output schema, the description covers the read/write split and the return categories but does not help an agent choose among the ten actions or explain the 'describe' workflow. Adequate, but a good part of the selection burden rests on the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all ten parameters (including the numeric workspace_id constraint and the action enum) and the baseline is 3. The description adds no parameter-level detail 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 names the domain (Fastio e-signature) and enumerates the read resource categories – sign envelopes, sign templates, and document/audit-certificate download URLs – within a workspace, and explicitly routes writes to the sibling sign_manage. It is clear and sibling-differentiating, though 'reads' is a broad category label rather than a single precise verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a clear condition for use: read operations live here, while 'Writes are on sign_manage', naming the alternative explicitly. It gives no guidance on which of the ten read actions to pick or on ordering (e.g. describe first), leaving that to the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sign_manageE-Signature ManagementADestructiveInspect
Fastio e-signature writes: draft envelopes, send (reserves signing credits), void, retry, the caller's signing link, and sign templates. Destructive: sign-send, sign-void, sign-template-delete (confirm='true'). Reads are on sign.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Envelope or template name (required on sign-template-create). sign-template-instantiate defaults it to the template name. | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| fields | No | sign-create/-update: JSON array of field placements (coords 0..1; see note). | |
| reason | No | sign-void: void reason. | |
| confirm | No | 'true' is required for sign-send, sign-void and sign-template-delete. | |
| snapshot | No | sign-template-create/-update: JSON {recipient_slots, document_slots, fields, policy}; a full replacement on update. | |
| documents | No | JSON array. sign-create/-update: 1-20 documents (see note). sign-template-instantiate: slot overrides [{document_slot_index, source_node_id, source_version_id?}]. | |
| expires_at | No | sign-create/-update: expiry 'Y-m-d H:i:s UTC' (not a day count; omit = policy default). | |
| recipients | No | sign-create/-update: JSON recipients array (see note). | |
| description | No | sign-template-create/-update: template description. | |
| envelope_id | No | sign-*: numeric envelope ID. | |
| policy_json | No | sign-create/-update: optional JSON policy {auth_method,...}. | |
| template_id | No | sign-template-get/-update/-delete/-instantiate: template id (30-char base32, `sa` family). | |
| workspace_id | No | Workspace ID (19-digit NUMERIC; the document/audit download stream route rejects custom workspace names). Envelopes are workspace-parented. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. | |
| expected_version | No | sign-template-update: the `version` from sign-template-get (optimistic CAS; 409 on a concurrent write). | |
| recipient_bindings | No | sign-template-instantiate: JSON object slot_key -> {email, display_name?, auth_method?} (not an array). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say destructiveHint=true generically; the description narrows it to the exact three actions (sign-send, sign-void, sign-template-delete) and states the confirm='true' gate, plus the billing side effect that send 'reserves signing credits'. It omits reversibility and rate-limit behavior, but the per-action destructive mapping is real added 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?
Three dense sentences with zero filler: capability list first, destructive/confirm caveat second, sibling routing last. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter, 11-action tool with no output schema, the description supplies scope, sibling routing, the destructive subset, and the describe escape hatch — enough to call it correctly given 100% schema coverage. It stops short of mapping actions to intents, which is the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter carries a per-action note, so the schema does the heavy lifting; baseline 3 applies. The description only repeats the confirm='true' requirement and adds the credit-reservation note for send, adding little parameter 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?
Opens with a specific verb+resource ('Fastio e-signature writes') and enumerates the concrete operations (draft, send, void, retry, signing link, templates), so the agent knows exactly what surface this tool covers. It also explicitly delimits itself from the sibling read tool ('Reads are on `sign`').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the write-vs-read split and routes reads to `sign`, and it points to action='describe' for the full action reference. What it does not do is help choose among the eleven write actions for a given intent — the agent must go to the schema enum or call describe.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storageStorageARead-onlyInspect
Fastio files and folders in workspaces and shares (read): list, recent, search, details, trash, versions, locks, previews, content reads, and per-node metadata. FILES OFTEN ALREADY CARRY AI-EXTRACTED METADATA, AND IT IS SEARCHABLE: it frequently answers the question without opening anything, and finds files by value without listing folders. Writes are on storage_manage. action='describe' gives the full reference.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | list/search: alias for `query`. content: the relevance query (1-512 chars) — BM25 over THAT ONE FILE's chunks, never across the workspace, so it cannot find another file; returns every one of the top `limit` hits (default 3, max 20) with FULL text, is not byte-budgeted, and cannot be combined with `cursor`, `max_bytes`, or a page/chunk window. | |
| page | No | content: read one page (1-based). A window selector. | |
| size | No | Size preset: "IconSmall", "IconMedium", "Preview", or custom. | |
| type | No | Filter by node type. | |
| limit | No | Max results — 1-500, default 100 on list/search. content NARROWS it to 1-20, default 5 (3 with q); a value outside 1-20 is refused before any platform call. | |
| query | No | Search query — keyword, or keyword + semantic when Deep Indexing is on. | |
| width | No | Target width in pixels. | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| cursor | No | Opaque cursor from a previous response. | |
| detail | No | Per-node verbosity for list/recent/search/trash-list/details. Defaults: terse for list/recent/trash-list, STANDARD for search (terse drops fact values), full for details. Bump to full when you need ai.attach (files_attach preflight), virus, hashes, file_attributes, lock_info, or long-form summaries. See action='describe' for per-level field lists. Not to be confused with `details` (search-only). | |
| height | No | Target height in pixels. | |
| offset | No | Results to skip (default 0). | |
| output | No | content-only response tier (default full). terse OMITS each chunk's `text` — every other field still comes back, so it is the cheap way to map a file's chunks before reading any. Not `detail`, the per-node tier on list/recent/search/details. EXACTLY ONE tier: markdown composition is NOT supported here, so `full,markdown` is rejected before the request is built. | |
| details | No | Search-only: attach the hydrated node to each hit (default limit drops to 10). Distinct from `detail` (see describe). | |
| node_id | No | Storage node opaque ID (files and folders are both nodes), or 'root'. On `list`, the target folder may also be given as parent_node_id or parent_id (aliases), and defaults to 'root' (the storage top level) when all three are omitted. | |
| sort_by | No | Sort column (default: name). | |
| chunk_to | No | content: last chunk `position` of a chunk range (0-based, >= chunk_from, and under 10000). Requires chunk_from. | |
| max_size | No | Max read-content bytes (default 512000, max 1048576). | |
| node_ids | No | Storage node opaque IDs (details: 1-25 max). | |
| share_id | No | Alias for profile_id implying profile_type=share (dual-type actions). | |
| sort_dir | No | Sort direction (default: asc). | |
| max_bytes | No | content, ORDERED reads only: UTF-8 byte budget for the returned passages (1024-262144, default 32768). Text is never cut inside a chunk — the page stops BEFORE the chunk that would exceed the budget. Refused alongside q: a relevance read is unbudgeted. | |
| parent_id | No | Alias for node_id on `list` (the folder whose contents to list), or 'root'. `list` defaults to 'root' when omitted. | |
| search_in | No | filename | content | both (DEFAULT). filename = name only, find-style. content = the AI's summary + semantic, NOT grep. Sending it changes the response shape (adds a search_metadata block); omitting it reproduces today's behavior byte-for-byte. filename pairs with name_match. | |
| chunk_from | No | content: start of an inclusive chunk `position` range (0-based, a chunk's ordinal in read order, under 10000). LEGAL ALONE — it reads on from that position; chunk_from=N chunk_to=N reads one chunk in full. | |
| context_id | No | Alias for profile_id (either name works) | |
| name_match | No | auto (DEFAULT) | exact | prefix | contains | glob. exact = whole name; prefix = starts with; contains = substring — those three are LITERAL (* and ? are ordinary chars). glob = wildcards over the WHOLE name: *.pdf, report-*.xlsx. No pre-escaping needed. Applies when search_in is filename or both; auto keeps today's relevance. Precise modes cap the pattern at 256 chars, reject an empty one. | |
| profile_id | No | Workspace or share ID (19-digit, or custom name); pair with profile_type. Typed aliases imply the type: workspace_id (workspace), share_id (share, dual-type actions); also context_id / instance_id. | |
| as_markdown | No | Opt-in (list/recent/search/details/trash-list): the platform renders the response as GitHub-flavored Markdown (?output=<detail>,markdown) instead of JSON. Omit for JSON with web_url enrichment + _next hints. | |
| files_scope | No | Scope semantic search to file versions. See describe for full constraints. | |
| instance_id | No | Alias for profile_id (REST/how-to name; profile_id is canonical). | |
| context_type | No | Alias for profile_type (either name works) | |
| preview_type | No | Preview kind; each applies only to compatible file categories (see describe). | |
| profile_type | No | Profile type: "workspace" or "share". | |
| workspace_id | No | Alias for profile_id that implies profile_type=workspace. Valid on every action. | |
| display_limit | No | How many items to return (default 10, max 500) on list, recent and search. list/recent page via `cursor`; search pages via `offset` (increase it by the page size). | |
| folders_scope | No | Scope semantic search to folders via BFS. See describe for full constraints. | |
| output_format | No | Output format: "png", "jpg", "webp". | |
| case_sensitive | No | Case-sensitive matching for exact/prefix/contains/glob. Default false (like find -iname), which folds non-ASCII too. Ignored under name_match=auto. | |
| parent_node_id | No | Parent folder opaque ID, or 'root'. On `list`, an alias for node_id. | |
| transform_name | No | Transform name, e.g. "image" for resize/crop/format. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. | |
| metadata_filters | No | search: JSON array of metadata predicates, e.g. '[{"field":"category","operator":"=","value":"Legal"}]'. Narrows to files whose metadata satisfies EVERY predicate BEFORE the query ranks — see describe. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so safety is covered. The description still adds useful behavior: the read-only action inventory, the pointer to storage_manage for mutations, and the important note that metadata is AI-extracted and searchable, which steers agents away from expensive content reads. It does not describe rate limits or pagination semantics in prose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the read scope and the write boundary before the metadata hint. The ALL-CAPS emphasis is slightly noisy but the content is dense and 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 43-parameter, 15-action tool with no output schema, the description cannot enumerate everything, and it correctly provides a discovery path via `action='describe'` plus the scope/mutation boundary. Return-value shape is left to the schema's per-action descriptions, which is acceptable given the deferral mechanism.
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% across all 43 parameters, and the schema descriptions are unusually rich (aliases, defaults, cross-param conflicts such as q vs max_bytes). The description adds only the pointer to `action='describe'` for the full action reference, 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?
States a specific verb family (read operations) plus resource (files and folders) and enumerates the sub-operations: list, recent, search, details, trash, versions, locks, previews, content reads, and per-node metadata. It also explicitly contrasts itself with the sibling `storage_manage`, so an agent can tell the read tool from the write tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative for writes ('Writes are on `storage_manage`') and gives a real usage heuristic: files often carry AI-extracted metadata that is searchable and 'frequently answers the question without opening anything.' It does not say when to pick one of the 15 actions over another, deferring that to `action='describe'`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_manageStorage ManagementADestructiveInspect
Fastio files and folders (write): create folders, copy, move, rename, restore, add files/links, transfer, versions, locks, node metadata set/extract. Destructive: delete (to trash), purge (permanent), metadata-delete. Reads are on storage. action='describe' gives the full reference.
| Name | Required | Description | Default |
|---|---|---|---|
| keys | No | metadata-delete: JSON array of metadata keys to delete (omit to clear all). | |
| name | No | Name for new folder or file. | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| node_id | No | Storage node opaque ID (files and folders are both nodes), or 'root'. | |
| duration | No | lock-acquire: lock length in seconds (60-3600). The platform default is short (300s measured). | |
| new_name | No | New name for file or folder. | |
| node_ids | No | Storage node opaque IDs (details: 1-25 max). | |
| share_id | No | add-link: the share to link. Dual-type actions: alias for profile_id implying profile_type=share. | |
| node_type | No | rename: optional type hint; skips the type-probe round-trip. Omit to probe. | |
| upload_id | No | Opaque ID of completed upload session. | |
| context_id | No | Alias for profile_id (either name works) | |
| key_values | No | metadata-set: JSON object of field-name -> value (max 100) from the workspace field vocabulary. Writes only the named fields; cannot clear one (metadata-delete clears). | |
| lock_token | No | lock-release: the token lock-acquire returned (required). | |
| profile_id | No | Workspace or share ID (19-digit, or custom name); pair with profile_type. Typed aliases imply the type: workspace_id (workspace), share_id (share, dual-type actions); also context_id / instance_id. | |
| version_id | No | Version ID to restore. | |
| instance_id | No | Alias for profile_id (REST/how-to name; profile_id is canonical). | |
| template_id | No | RETIRED (metadata templates were removed): supplying it fails the request. Write with key_values; scope extraction with extract_fields. | |
| context_type | No | Alias for profile_type (either name works) | |
| profile_type | No | Profile type: "workspace" or "share". | |
| workspace_id | No | Alias for profile_id that implies profile_type=workspace. Valid on every action. | |
| if_version_id | No | rename: compare-and-swap base, the node's `version` from your last read. A stale base is rejected with a 409 naming the current version; nothing changes. | |
| transfer_mode | No | 'copy' (default) or 'move'. 'move' invalid for node_id 'root'. | |
| dest_parent_id | No | transfer: destination parent folder in the OTHER instance, or 'root'. copy/move: alias for target_parent_id. | |
| extract_fields | No | metadata-extract(-all): JSON array of field names (e.g. `["vendor","amount"]`); omit for a full extract. Not a strict filter on single-node extraction (see describe). | |
| parent_node_id | No | Parent folder opaque ID, or 'root'. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. | |
| dest_instance_id | No | Destination workspace or share profile ID. | |
| target_parent_id | No | Destination folder opaque ID, or 'root'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true and openWorldHint=true, so the safety profile is partly covered. The description adds real value beyond that by grading destruction: delete goes 'to trash' while purge is 'permanent', and metadata-delete is destructive. It does not cover auth/permission requirements or return behavior, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the write scope and followed by the destructive list and the escape hatch. Efficient, though the action list is compressed to near-telegraphic style with minimal connective text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 18 actions, 28 params, and no output schema, the description summarizes scope correctly and delegates full detail to action='describe', which is an adequate completeness strategy. It could say more about the dual-instance transfer/auth model, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself documents every parameter (including aliases, lock durations, extract_fields). The description adds no parameter-level syntax beyond pointing the agent to action='describe', so the schema does the heavy lifting and baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb class (write operations) on a specific resource (Fastio files and folders), then enumerates the mutation categories. It explicitly distinguishes itself from the 'storage' sibling by declaring 'Reads are on `storage`', so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly routes read vs write via the 'storage' pointer and directs discovery through action='describe'. It gives clear context for when to use this tool versus the read sibling, but does not disambiguate among the many actions beyond grouping them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uploadUploadARead-onlyInspect
Fastio uploads (read): upload session status (wait long-polls), active sessions, chunk status, web-import jobs, upload limits, allowed extensions, and the POST /blob sidecar details (blob-info). Writes are on upload_manage. action='describe' gives the full action/param reference.
| Name | Required | Description | Default |
|---|---|---|---|
| org | No | Org ID for limit resolution. | |
| plan | No | Override billing plan to check (e.g. free, pro). | |
| wait | No | Long-poll wait in SECONDS, 1-590 (NOT milliseconds; 0/omitted returns immediately). The server holds the connection until the upload reaches a terminal status. Sending a millisecond value here would hold for minutes and blow past the tool-call timeout. | |
| limit | No | Max results (1-100, default 50). | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| offset | No | Pagination offset. | |
| status | No | Filter by status. | |
| file_id | No | File ID for update context. | |
| chunk_id | No | Specific chunk number (omit for all). | |
| password | No | File Share link password (profile_type=fileshare only). Sent only as the x-ve-password header on each call, never in a URL/log; needed when the target share is password-protected. | |
| upload_id | No | Upload session ID or web upload job ID. | |
| instance_id | No | Target workspace/share ID — also the profile_id alias for upload flows; profile_id is canonical. | |
| action_context | No | Context: create or update. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description still adds value by disclosing that `wait` long-polls and that blob-info is a POST /blob sidecar, which are behavioral traits an agent needs. It does not mention auth requirements, rate limits, or what the read payloads contain.
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 dense sentences, front-loaded with the read scope and the sibling boundary, then the action reference escape hatch. Every clause maps to a capability or routing decision; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, multi-action read tool with no output schema, the description covers scope, sibling boundary, and points to `describe` for per-action detail, which is a sound completeness strategy. It leaves return shapes and per-action prerequisites unstated, though the describe mechanism mitigates that.
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, and the description earns a step above by tying key parameters to behavior: `wait` long-polling, `blob-info` for sidecar details, and action='describe' for the action/param index. It adds framing rather than raw syntax, which the schema already supplies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (Fastio uploads) and scopes it precisely as the read half: session status, sessions, chunk status, web-import jobs, limits, extensions, blob-info. It explicitly contrasts itself with `upload_manage`, so an agent can distinguish it from its write sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit boundary ("Writes are on `upload_manage`") and routes the agent to action='describe' for the full reference, which is a real usage rule. It does not say when to prefer one action (e.g. status vs chunk-status) over another, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_manageUpload ManagementADestructiveInspect
Fastio uploads (write): stream-upload (one call, auto-finalizes, no filesize), chunked sessions (create-session, chunk, finalize), web URL import, batch (many small files), cancellation. For files and binary the default byte source is the POST /blob sidecar: raw bytes over plain HTTP outside MCP (up to 100 MB, no base64), returning a blob_id for stream-upload/chunk/batch. The chunked path is for files over 100 MB. content is UTF-8 text composed in the call; content_base64 inflates ~33% and fails above a few MB. Uploads create files and consume storage credits; a same-name upload overwrites in place as a new version. Destructive: cancel, cancel-all, chunk-delete, web-cancel. Reads are on upload. action='describe' gives the full action/param reference.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Source URL to import from. | |
| hash | No | Hash of the bytes this call sends (a chunk, or the whole stream body). Pair with hash_algo. If both are omitted, the CRC-32C of the bytes is sent. | |
| wait | No | Long-poll wait in SECONDS, 1-590 (NOT milliseconds; 0/omitted returns immediately). The server holds the connection until the upload reaches a terminal status. Sending a millisecond value here would hold for minutes and blow past the tool-call timeout. | |
| files | No | Batch manifest (1..200 entries). Each: filename + one of blob_id/content/content_base64. | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| stream | No | Stream mode — size optional, single POST, auto-finalizes. | |
| blob_id | No | Blob ID from POST /blob — the **default source** for all file & binary uploads (no base64, no MCP size limit, up to 100 MB). Single-use. | |
| content | No | **Text only** — stored verbatim UTF-8. This is for writing content you are composing **on the fly** directly through the MCP (a note, a generated report, a snippet you just produced) — NOT a fallback for uploading an existing file. Base64 goes in content_base64. One of content/content_base64/blob_id. | |
| creator | No | Client identifier echoed back (alphanumeric + hyphens). | |
| blob_ref | No | Alias for blob_id (deprecated). Accepted on chunk/stream/stream-upload only. | |
| filename | No | File name. Optional when target_node_id is set (auto-resolved); pass to rename-on-replace. | |
| filesize | No | Total file size in bytes. | |
| max_size | No | Stream-body byte ceiling — aborts mid-transfer if exceeded. An overestimate is safe; omitted, the organization's file-size limit applies. Stream sessions only. | |
| password | No | File Share link password (profile_type=fileshare only). Sent only as the x-ve-password header on each call, never in a URL/log; needed when the target share is password-protected. | |
| share_id | No | Alias for profile_id when the profile is a share — implies profile_type=share (so profile_type may be omitted). | |
| folder_id | No | Target folder OpaqueId or "root". Omit for instance root. | |
| hash_algo | No | md5, sha1, sha256, sha384 or crc32c (8 lowercase hex). Pair with hash. | |
| upload_id | No | Upload session ID or web upload job ID. | |
| chunk_size | No | Chunk size in bytes (server picks default). | |
| context_id | No | Alias for profile_id (either name works) | |
| profile_id | No | Polymorphic context ID (pair with profile_type=workspace|share|fileshare). Typed aliases let you omit profile_type: workspace_id (⇒ workspace) / share_id (⇒ share); also context_id / instance_id. Target workspace/share ID, or the File Share id for a fileshare write-back. fileshare has NO typed alias — pass profile_type=fileshare explicitly. | |
| file_crc32c | No | chunk only: CRC-32C of the WHOLE file (8 lowercase hex), checked once all bytes arrive; combine each chunk's returned `crc32c` in order. Send on the first send of the chunk whose CRC completes last (sequential: the last chunk) and its retries; never move it. A different value: 10779; after every byte arrived: 10507. | |
| instance_id | No | Target workspace/share ID — also the profile_id alias for upload flows; profile_id is canonical. | |
| chunk_number | No | 1-indexed chunk number. | |
| context_type | No | Alias for profile_type (either name works). | |
| include_hash | No | Compute a CRC-32C client-side for entries without a hash (default true when omitted). | |
| profile_type | No | Target type: workspace | share | fileshare (alias: context_type). Use `fileshare` ONLY for content write-back to a File Share's bound file (requires target_node_id = the bound node id, fileshare.file.id in the File Share's details; create-style new-file flows are rejected for fileshare). | |
| workspace_id | No | Alias for profile_id when the profile is a workspace — implies profile_type=workspace (so profile_type may be omitted). | |
| if_version_id | No | Compare-and-swap base for an overwrite. Enforced on EVERY update target — workspace, share and File Share. Pass the version id your edit was based on; record it on create-session/stream-upload (finalize does NOT read it). On a stale base the session ends assembly_failed with CONFLICT_VERSION_MISMATCH:<id> — rebase and retry. Omitting it is last-write-wins. See action=describe. | |
| content_base64 | No | Base64-encoded **binary**, server-decoded. ⚠️ **LAST RESORT — expect FAILURE above a few MB** (~33% inflation + MCP transport cap). An unreachable POST /blob is almost always a CLIENT-SIDE FIREWALL/PROXY restriction, not a server limit; allowing /blob there lifts it. `blob_id` carries real files. | |
| parent_node_id | No | Parent folder OpaqueId or "root". On create-session, stream-upload, and web-import, folder_id is accepted as an alias (either name works). | |
| target_node_id | No | Overwrite this specific node (preserves node_id; new version). When set, parent_node_id is ignored and filename is optional (auto-resolved). Must be a file node. REQUIRED for profile_type=fileshare write-back — set it to the File Share's bound node id (fileshare.file.id in the File Share's details). | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the tool is destructive, and the description goes further by naming exactly which actions are destructive (cancel, cancel-all, chunk-delete, web-cancel), disclosing storage-credit consumption, and explaining that same-name uploads overwrite in place as a new version. These are side-effect details the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action inventory before byte-source and side-effect details, which is the right ordering for a 12-action tool. It is dense and some clauses (base64 inflation, storage credits) duplicate schema text, but for a 33-parameter mega-tool the length is earned.
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 12 actions, 33 parameters, and no output schema, the description covers the decision-critical surface: which action, which byte source, size limits, and destructive semantics. It defers the exhaustive action/param matrix to action='describe', which is a reasonable pointer, though per-action return behavior remains unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description still adds cross-parameter routing value beyond the schema by synthesizing which byte source (blob_id vs content vs content_base64) to use and why, rather than restating field definitions individually.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource framing ('Fastio uploads (write)') and enumerates the full set of write actions (stream-upload, chunked sessions, web import, batch, cancellation). It explicitly distinguishes itself from the read-side sibling by noting 'Reads are on `upload`', so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete selection rules: the POST /blob sidecar is the default byte source for files and binaries, chunked is for files over 100 MB, `content` is for text composed in-call, and `content_base64` is a rare fallback. It also names the alternative tool for reads and points to action='describe' for the full action/param reference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
userUserARead-onlyInspect
Fastio user account (read): profile, contacts, limits, shares, invitations, assets. Writes are on user_manage.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of items to return (1-500, default 100) | |
| query | No | Contact search substring. | |
| action | Yes | Operation; 'describe' lists the actions. | |
| offset | No | Number of items to skip (default 0) | |
| user_id | No | 19-digit user ID or email. | |
| archived | No | true: archived shares; false: active. | |
| display_limit | No | list-shares row cap (default 10, max 500), applied after the fetch. | |
| invitation_id | No | Invitation opaque ID or key. | |
| invitation_key | No | Invitation key. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered structurally. The description adds the read/write boundary and the redirect to user_manage, which is useful context, but says nothing about pagination behavior, rate limits, or auth requirements for a 12-action tool.
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 clauses, zero filler, and the resource scope is front-loaded before the sibling redirect. 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 10-parameter read-only tool with no output schema, the description plus 100% schema coverage and a built-in 'describe' action give an agent enough to invoke it correctly. The remaining gap is routing among the other read-oriented siblings, which the description does not address.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, including the 12-value action enum and the 'describe' self-documentation action. The description adds no parameter-level meaning beyond the schema, which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (Fastio user account) and a clear scope (read: profile, contacts, limits, shares, invitations, assets). The parenthetical '(read)' plus the enumerated resource list lets an agent distinguish it from user_manage and from other read siblings at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes write operations to `user_manage`, which is a concrete when-not-to-use signal. It stops short of distinguishing this tool from other read siblings such as member, invitation, or share, so it is not a full alternative map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
user_manageUser ManagementADestructiveInspect
Fastio user account (write): profile, invitations, assets, report-bug. Destructive: close, asset-delete, invitation-decline. Reads are on user.
| Name | Required | Description | Default |
|---|---|---|---|
| blob | No | Plain-text excerpt (error body, short log), max 32 KB. No secrets or file content. | |
| title | No | Bug report title, 1-200 chars. | |
| action | Yes | Operation; 'describe' lists the actions. | |
| content | No | Plain-text asset content. | |
| user_id | No | 19-digit user ID or email. | |
| category | No | Bug report area. | |
| endpoint | No | Failing call as 'METHOD /path', no host or query. | |
| filename | No | Original filename. | |
| last_name | No | Family name. | |
| asset_name | No | Asset type name (e.g. profile_pic). | |
| error_code | No | Error code of the failed call. | |
| first_name | No | Given name. | |
| request_id | No | From the failed tool result. | |
| description | No | Bug report body: steps, expected vs actual. Max 8 KB. No secrets. | |
| http_status | No | HTTP status of the failed call. | |
| occurred_at | No | Failure time, 'YYYY-MM-DD HH:MM:SS UTC', last 30 days. | |
| confirmation | No | Account email or user ID. | |
| content_type | No | MIME type. | |
| invitation_id | No | Invitation opaque ID or key. | |
| content_base64 | No | Base64 binary content. | |
| invitation_key | No | Invitation key. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. | |
| idempotency_key | No | 16-64 chars [A-Za-z0-9_-]; generated when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds the specific destructive action set, which is useful beyond the generic annotation. It does not explain permissions, reversibility, or confirmation 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?
Three compact fragments, front-loaded with scope, then destructive actions, then the read alternative. Every clause carries routing or safety value and there is no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 23-parameter multi-action tool, the description supplies essential write-vs-read routing and destructive-action categorization. The fully described schema and safety annotations cover most remaining gaps, though the description omits confirmation/idempotency nuances and per-action return expectations.
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 23 parameters are documented in the input schema. The description adds grouping for the `action` enum and identifies destructive action values, but does not clarify conditional requirements such as when `confirmation` is needed or how the other parameters interact per action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (Fastio user account) and operation type (write), enumerates action groups (profile, invitations, assets, report-bug) and destructive actions. Explicitly distinguishes this tool from the read-only `user` sibling.
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?
Directs all read operations to the `user` sibling, which clearly scopes this tool to writes. It also flags destructive actions (close, asset-delete, invitation-decline) so the agent can route and call them cautiously.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspaceWorkspaceARead-onlyInspect
Fastio workspaces (read): list and details, members, shares in a workspace, available workspaces, name availability, notes, QuickShare links, async job status. Writes are on workspace_manage. action='describe' gives the full action/param reference. Metadata is not here: the workspace field vocabulary is on metadata, node-level metadata on storage. Verbosity (detail param): list/available/members/list-shares default to terse; details defaults to full.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of items to return (1-500, default 100) | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| detail | No | Per-entity verbosity for list/available/members/list-shares/details. Defaults: terse for list/available/members/list-shares, full for details. See action='describe' for per-level field lists. | |
| offset | No | Number of items to skip (default 0) | |
| org_id | No | Filter workspaces to this org. | |
| node_id | No | Storage tree node opaque ID. Both files and folders are nodes — use this name regardless of which. | |
| archived | No | Filter by archive status (default "false"). | |
| share_id | No | Share ID or custom name: the share to import, or (read-note) the share holding the note. | |
| check_org_id | No | Org ID for check-name (required — you must be a member). Suggests an org-prefixed alternative if the name is taken. | |
| workspace_id | No | Workspace opaque ID. Use this when only workspaces are valid (not shares or other contexts). For polymorphic contexts use profile_id. 19-digit numeric ID or custom name. | |
| display_limit | No | How many items to return. Default 10, max 500. The MCP trims post-fetch; backend page_size stays MCP-internal so the platform cache stays warm. Applies to list, list-shares, members. | |
| name_to_check | No | Folder name to check availability. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real context on top: the `describe` self-reference mechanism, an async job-status action, and the terse/full verbosity behavior per action. It omits auth requirements and pagination nuance, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool reads, then handles boundaries, then verbosity defaults in roughly three dense clauses. No wasted sentences, though the parenthetical action list and the trailing verbosity sentence are somewhat cramped for a single run-on block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-action multiplexed tool with 13 params and no output schema, the description covers scope, sibling boundaries, and the `describe` escape hatch for the full action/param reference. What remains unstated (pagination semantics, auth) is minor and partly covered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 13 parameters are already documented. The description restates the `detail` verbosity defaults, which the schema already documents verbatim, and points to `describe` for per-action field lists, adding only marginal 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?
States a specific resource and scope ('Fastio workspaces (read)') and enumerates the operations covered: list/details, members, shares, available, name availability, notes, QuickShare links, job status. It also names the sibling that handles the write side (`workspace_manage`), so an agent can separate the two without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: writes go to `workspace_manage`, metadata vocabulary to `metadata`, node-level metadata to `storage`, and `action='describe'` for the full reference. This tells the agent both when to use this tool and which alternatives to reach for otherwise.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_manageWorkspace ManagementADestructiveInspect
Fastio workspaces (write): update settings, archive/unarchive, delete, import a share, create/update notes, delete QuickShare links, enable/disable cloud import. Destructive: delete (the workspace and all its files), quickshare-delete. Reads are on workspace. action='describe' gives the full action/param reference. Enabling Deep Indexing costs credits (10 per page); the toggle is rate-limited.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name (2-100 chars on update). Cannot be cleared. | |
| action | Yes | Operation. Use 'describe' for full action reference. | |
| blob_id | No | Blob ID from POST /blob. Preferred for large note content (UTF-8 decoded). Single-use. | |
| confirm | No | Must match folder_name or numeric ID. | |
| content | No | Plain text/markdown. Notes: max 102400 bytes (100 KiB) — use blob_id for larger. | |
| node_id | No | Storage tree node opaque ID. Both files and folders are nodes — use this name regardless of which. | |
| blob_ref | No | Alias for blob_id (deprecated). | |
| share_id | No | Share ID or custom name: the share to import, or (read-note) the share holding the note. | |
| note_name | No | Note filename (must end with .md). | |
| parent_id | No | Parent folder opaque ID or 'root'. | |
| perm_join | No | Who can join the workspace. | |
| description | No | Description. Newlines allowed. Send "null"/"" to clear on update. | |
| folder_name | No | URL-safe workspace folder name (4-80 chars). | |
| accent_color | No | Brand accent color JSON. "null" to clear. | |
| workspace_id | No | Workspace opaque ID. Use this when only workspaces are valid (not shares or other contexts). For polymorphic contexts use profile_id. 19-digit numeric ID or custom name. | |
| deep_indexing | No | Toggle Deep Indexing (AI indexing of file content). Enabling costs credits (10/page) to index existing files. Disable flushes embeddings; re-enable re-indexes. Rate-limited. Responses report it as `intelligence`. | |
| display_limit | No | How many items to return. Default 10, max 500. The MCP trims post-fetch; backend page_size stays MCP-internal so the platform cache stays warm. Applies to list, list-shares, members. | |
| if_version_id | No | Compare-and-swap base for update-note: the note's `version` from the read your edit was based on (read-note returns it as note.version). If the note has changed since, the update is rejected with a 409 version conflict naming the current version id, and nothing is changed. Omit for last-write-wins. | |
| owner_defined | No | Custom properties JSON. "null"/"" to clear. | |
| sharing_shares | No | Whether new shares can be created here. Off blocks new ones only; the organization's setting is a ceiling. | |
| cloud_sync_mode | No | Cloud sync direction ceiling: read (inbound only) or read_write. Not an on/off switch. | |
| describe_action | No | With action='describe': return one action's params and notes instead of the action index. | |
| external_invites | No | This workspace's external-invite switch; only tightens the organization's policy and cannot be reset to inherit. | |
| background_color1 | No | Background color 1 JSON. "null" to clear. | |
| background_color2 | No | Background color 2 JSON. "null" to clear. | |
| perm_member_manage | No | Who can manage members. | |
| sharing_file_links | No | As sharing_shares, for single-file share links. | |
| metadata_extraction | No | Automatic metadata extraction for new uploads; effective only while Deep Indexing is on. Off deletes nothing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds useful specifics: delete removes the workspace and all its files, quickshare-delete is destructive, and enabling Deep Indexing costs 10 credits/page and is rate-limited. It does not cover auth requirements or confirmation behavior, but the added behavioral context is solid.
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 front-loaded and dense with useful information: it lists the write operations, flags destructive actions, names the read alternative, points to action='describe', and notes credit/rate-limit behavior. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 28-parameter action-based tool with no output schema, the description covers the main operation categories, destructive scope, read alternative, self-describe mechanism, and cost/rate-limit behavior. It is nearly complete, though it leaves permission and confirmation details to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 28 parameters thoroughly. The description mentions action='describe' and the Deep Indexing credit/rate-limit behavior, but it does not add parameter-level syntax or 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 names the resource ('Fastio workspaces') and clearly frames the tool as the write/mutation surface, listing specific operations such as update, archive/unarchive, delete, import-share, and note management. It explicitly distinguishes itself from the sibling read tool by stating 'Reads are on `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?
It states the primary usage context ('write') and names the read alternative (`workspace`). It also points to action='describe' for full action/param reference, but it does not explain when to choose each action or list prerequisites for actions like delete or quickshare-delete.
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.
2 tool updates
- Changed
ai_manage1 field changed- added
Input schema / properties / effortAdded value: +{ + "description": "Reply effort for THIS message: 'normal' (default) or 'high' (deeper reasoning, no per-reply step limit; slower, more credits). Per message — resend it on each message that should use it.", + "enum": [ + "normal", + "high" + ], + "type": "string" +}
- Changed
user_manage1 field changed- removed
Input schema / properties / email_addressRemoved value: -{ - "description": "Email address.", - "type": "string" -}
14 tool updates
- Changed
ai_manage2 fields changed- added
Input schema / properties / subject_filesAdded value: +{ + "description": "Files pinned as the turn's focus subjects (sent as `subjects`): comma-separated nodeId:versionId, same format and limits as files_attach.", + "type": "string" +} - added
Input schema / properties / subject_foldersAdded value: +{ + "description": "Folders pinned as the turn's focus subjects (sent as `subjects`): comma-separated folder nodeIds, same format as folders_attach.", + "type": "string" +}
- Changed
comment3 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "list", - "list-all", - "details" -]New value: +[ + "describe", + "list", + "list-all", + "details", + "attachment-list" +] - changed
Input schema / properties / profile_id / descriptionPrevious value: -"Workspace or share ID (pair with profile_type)."New value: +"Workspace, share or File Share ID (pair with profile_type)." - changed
Input schema / properties / profile_type / enumPrevious value: -[ - "workspace", - "share" -]New value: +[ + "workspace", + "share", + "fileshare" +]
- Changed
comment_manage6 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "add", - "edit", - "delete", - "bulk-delete", - "reaction-add", - "reaction-remove" -]New value: +[ + "describe", + "add", + "edit", + "delete", + "bulk-delete", + "reaction-add", + "reaction-remove", + "attachment-add", + "attachment-detach" +] - changed
Input schema / properties / profile_id / descriptionPrevious value: -"Workspace or share ID (pair with profile_type)."New value: +"Workspace, share or File Share ID (pair with profile_type)." - changed
Input schema / properties / profile_type / enumPrevious value: -[ - "workspace", - "share" -]New value: +[ + "workspace", + "share", + "fileshare" +] - changed
Input schema / properties / properties / descriptionPrevious value: -"edit only: JSON object merged into the comment's properties (server-managed keys ignored)."New value: +"JSON object of app-defined key-values: stored on add, merged on edit (server-managed keys ignored)." - added
Input schema / properties / target_idAdded value: +{ + "description": "Object to attach: node, workspace, share, File Share or envelope ID.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / target_idsAdded value: +{ + "description": "Objects to attach (max 25 per comment).", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" +}
- Changed
fileshare_manage1 field changed- added
Input schema / properties / comments_enabledAdded value: +{ + "description": "create/update: allow comments on the File Share (create default: off). Always off on anyone_with_link shares.", + "type": "boolean" +}
- Changed
member_manage4 fields changed- changed
Input schema / properties / force_notification / descriptionPrevious value: -"Force notify existing user (workspace-only)."New value: +"true: email the membership notification to an added existing user (sent as notification=force)." - changed
Input schema / properties / invitation_expires / descriptionPrevious value: -"Invitation expiration ISO 8601 (workspace-only)."New value: +"Email invitation expiration, `YYYY-MM-DD HH:MM:SS UTC`." - changed
Input schema / properties / notifications / descriptionPrevious value: -"Notification preference (workspace)."New value: +"Alias for notify_options." - changed
Input schema / properties / notify_options / descriptionPrevious value: -"Notification preference (share)."New value: +"Member notification preference: 'Do not notify me', 'Notify me in app', 'Notify me in app and via email' or 'Notify me via app, email and text message'."
- Changed
metadata6 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "eligible", - "fields-list", - "search", - "compound-search" -]New value: +[ + "describe", + "eligible", + "fields-list", + "search", + "compound-search", + "fields-merge-candidates", + "filters-list", + "filter-details", + "filter-nodes" +] - added
Input schema / properties / filter_idAdded value: +{ + "description": "Saved filter ID (from filters-list).", + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / offset / descriptionPrevious value: -"search: results to skip (default 0). offset+limit must stay <= 10000."New value: +"search: results to skip (offset+limit <= 10000). fields-merge-candidates: the prior next_offset." - added
Input schema / properties / sort_dirAdded value: +{ + "description": "filter-nodes: sort direction. Default desc for updated, asc otherwise.", + "enum": [ + "asc", + "desc" + ], + "type": "string" +} - added
Input schema / properties / sort_fieldAdded value: +{ + "description": "filter-nodes: order by a file column. Not with sort_metadata_field.", + "enum": [ + "name", + "size", + "updated" + ], + "type": "string" +} - added
Input schema / properties / sort_metadata_fieldAdded value: +{ + "description": "filter-nodes: order by this metadata field's value. Not with sort_field.", + "minLength": 1, + "type": "string" +}
- Changed
metadata_manage6 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "fields-merge" -]New value: +[ + "describe", + "fields-merge", + "filter-create", + "filter-update", + "filter-delete" +] - added
Input schema / properties / descriptionAdded value: +{ + "description": "Saved filter description, max 255 characters.", + "type": "string" +} - added
Input schema / properties / filter_idAdded value: +{ + "description": "Saved filter ID (from filters-list).", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / nameAdded value: +{ + "description": "Saved filter name, 1-100 characters, unique per workspace.", + "type": "string" +} - added
Input schema / properties / predicateAdded value: +{ + "description": "Saved filter predicate: JSON array of up to 5 AND-ed {field,operator,value} clauses; [] matches all.", + "type": "string" +} - added
Input schema / properties / projectionAdded value: +{ + "description": "Saved filter projection (JSON object or array, stored as sent); only {\"sort\":{field,dir}} is applied.", + "type": "string" +}
- Changed
org_manage1 field changed- added
Input schema / properties / metadata_extractionAdded value: +{ + "description": "Automatic metadata extraction for new uploads (default \"true\"); effective only while Deep Indexing is on.", + "enum": [ + "true", + "false" + ], + "type": "string" +}
- Changed
share_manage4 fields changed- changed
Input schema / properties / custom_name / descriptionPrevious value: -"Custom share URL name (4-80 chars; Unicode letters, digits, hyphens, underscores). Omit to have one auto-generated."New value: +"Custom share URL name (4-80 chars; Unicode letters, digits, hyphens, underscores). On create, omit it to have one auto-generated." - added
Input schema / properties / custom_urlAdded value: +{ + "description": "Custom URL name for the share link (10-100 chars), distinct from custom_name. update: \"null\" clears it.", + "maxLength": 100, + "type": "string" +} - changed
Input schema / properties / deep_indexing / descriptionPrevious value: -"Enable Deep Indexing (RAG indexing); costs credits (10/page). Default false; forced false on workspace_folder shares. Responses report it as `intelligence`."New value: +"Deep Indexing (RAG indexing); costs credits (10/page). create: default false; always false on workspace_folder shares. Responses report it as `intelligence`." - added
Input schema / properties / external_invitesAdded value: +{ + "description": "update: this share's external-invite switch; only tightens the organization's policy and cannot be reset to inherit.", + "enum": [ + "allowed", + "denied" + ], + "type": "string" +}
- Changed
storage_manage1 field changed- added
Input schema / properties / if_version_idAdded value: +{ + "description": "rename: compare-and-swap base, the node's `version` from your last read. A stale base is rejected with a 409 naming the current version; nothing changes.", + "minLength": 1, + "type": "string" +}
- Changed
upload_manage1 field changed- changed
Input schema / properties / max_size / descriptionPrevious value: -"Stream-body byte ceiling — aborts mid-transfer if exceeded. An overestimate is safe; omitted, the plan limit applies. Stream sessions only."New value: +"Stream-body byte ceiling — aborts mid-transfer if exceeded. An overestimate is safe; omitted, the organization's file-size limit applies. Stream sessions only."
- Changed
user_manage2 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "update", - "close", - "accept-all-invitations", - "asset-upload", - "asset-delete", - "report-bug" -]New value: +[ + "describe", + "update", + "close", + "accept-all-invitations", + "invitation-accept", + "invitation-decline", + "asset-upload", + "asset-delete", + "report-bug" +] - added
Input schema / properties / invitation_idAdded value: +{ + "description": "Invitation opaque ID or key.", + "type": "string" +}
- Changed
workspace1 field changed- added
Input schema / properties / share_idAdded value: +{ + "description": "Share ID or custom name: the share to import, or (read-note) the share holding the note.", + "type": "string" +}
- Changed
workspace_manage8 fields changed- added
Input schema / properties / cloud_sync_modeAdded value: +{ + "description": "Cloud sync direction ceiling: read (inbound only) or read_write. Not an on/off switch.", + "enum": [ + "read", + "read_write" + ], + "type": "string" +} - added
Input schema / properties / external_invitesAdded value: +{ + "description": "This workspace's external-invite switch; only tightens the organization's policy and cannot be reset to inherit.", + "enum": [ + "allowed", + "denied" + ], + "type": "string" +} - added
Input schema / properties / if_version_idAdded value: +{ + "description": "Compare-and-swap base for update-note: the note's `version` from the read your edit was based on (read-note returns it as note.version). If the note has changed since, the update is rejected with a 409 version conflict naming the current version id, and nothing is changed. Omit for last-write-wins.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / metadata_extractionAdded value: +{ + "description": "Automatic metadata extraction for new uploads; effective only while Deep Indexing is on. Off deletes nothing.", + "enum": [ + "true", + "false" + ], + "type": "string" +} - changed
Input schema / properties / name / descriptionPrevious value: -"Name. Send \"null\" to clear on update."New value: +"Display name (2-100 chars on update). Cannot be cleared." - changed
Input schema / properties / share_id / descriptionPrevious value: -"19-digit numeric ID or custom name of share to import."New value: +"Share ID or custom name: the share to import, or (read-note) the share holding the note." - added
Input schema / properties / sharing_file_linksAdded value: +{ + "description": "As sharing_shares, for single-file share links.", + "enum": [ + "true", + "false" + ], + "type": "string" +} - added
Input schema / properties / sharing_sharesAdded value: +{ + "description": "Whether new shares can be created here. Off blocks new ones only; the organization's setting is a ceiling.", + "enum": [ + "true", + "false" + ], + "type": "string" +}
1 tool update
- Changed
upload_manage5 fields changed- added
Input schema / properties / file_crc32cAdded value: +{ + "description": "chunk only: CRC-32C of the WHOLE file (8 lowercase hex), checked once all bytes arrive; combine each chunk's returned `crc32c` in order. Send on the first send of the chunk whose CRC completes last (sequential: the last chunk) and its retries; never move it. A different value: 10779; after every byte arrived: 10507.", + "type": "string" +} - changed
Input schema / properties / files / items / properties / hash_algo / enumPrevious value: -[ - "md5", - "sha1", - "sha256", - "sha384" -]New value: +[ + "md5", + "sha1", + "sha256", + "sha384", + "crc32c" +] - changed
Input schema / properties / hash / descriptionPrevious value: -"File hash for verification."New value: +"Hash of the bytes this call sends (a chunk, or the whole stream body). Pair with hash_algo. If both are omitted, the CRC-32C of the bytes is sent." - changed
Input schema / properties / hash_algo / descriptionPrevious value: -"Hash algorithm (e.g. 'sha256')."New value: +"md5, sha1, sha256, sha384 or crc32c (8 lowercase hex). Pair with hash." - changed
Input schema / properties / include_hash / descriptionPrevious value: -"Compute SHA-256 client-side for entries without a hash (default true when omitted)."New value: +"Compute a CRC-32C client-side for entries without a hash (default true when omitted)."
5 tool updates
- Changed
ai_manage1 field changed- changed
Input schema / properties / files_attach / descriptionPrevious value: -"Files for the AI to read: comma-separated nodeId:versionId (versionId optional = current). Works without intelligence; an unreadable node errors."New value: +"Files for the AI to read: comma-separated nodeId:versionId (versionId optional = current). Works without Deep Indexing; an unreadable node errors."
- Changed
org_manage2 fields changed- added
Input schema / properties / deep_indexingAdded value: +{ + "description": "Deep Indexing (RAG indexing), 10 credits per page. Default \"false\". Responses report it as `intelligence`.", + "type": "string" +} - removed
Input schema / properties / intelligenceRemoved value: -{ - "description": "RAG indexing, 10 credits per page. Default \"false\".", - "type": "string" -}
- Changed
share_manage2 fields changed- added
Input schema / properties / deep_indexingAdded value: +{ + "description": "Enable Deep Indexing (RAG indexing); costs credits (10/page). Default false; forced false on workspace_folder shares. Responses report it as `intelligence`.", + "type": "boolean" +} - removed
Input schema / properties / intelligenceRemoved value: -{ - "description": "Enable RAG indexing; costs credits (10/page). Default false; forced false on workspace_folder shares.", - "type": "boolean" -}
- Changed
storage1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Search query — keyword, or keyword + semantic when intelligence is on."New value: +"Search query — keyword, or keyword + semantic when Deep Indexing is on."
- Changed
workspace_manage2 fields changed- added
Input schema / properties / deep_indexingAdded value: +{ + "description": "Toggle Deep Indexing (AI indexing of file content). Enabling costs credits (10/page) to index existing files. Disable flushes embeddings; re-enable re-indexes. Rate-limited. Responses report it as `intelligence`.", + "enum": [ + "true", + "false" + ], + "type": "string" +} - removed
Input schema / properties / intelligenceRemoved value: -{ - "description": "Toggle AI features. Enabling costs credits (10/page) to index existing files. Disable flushes embeddings; re-enable re-indexes. Rate-limited.", - "enum": [ - "true", - "false" - ], - "type": "string" -}
35 tool updates
- Changed
ai17 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "ask", - "status", - "chat-create", - "chat-list", - "chat-details", - "chat-update", - "chat-delete", - "chat-publish", - "chat-cancel", - "message-send", - "message-list", - "message-details", - "message-read", - "share-generate", - "transactions" -]New value: +[ + "describe", + "chat-list", + "chat-details", + "message-list", + "message-details", + "message-read", + "transactions" +] - changed
Input schema / properties / detail / descriptionPrevious value: -"Per-entity verbosity for chat-list/chat-details/message-list/message-details (best-effort: chat/message/activity endpoints may not yet honor detail server-side). Defaults: terse for list-style (chat-list, message-list), full for details (chat-details, message-details). See action='describe' for per-level field lists."New value: +"Verbosity for chat-list/chat-details/message-list/message-details (best-effort server-side). Defaults: terse for lists, full for details. Levels: see describe." - removed
Input schema / properties / filesRemoved value: -{ - "description": "File opaque IDs (max 25, share share-generate).", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / files_attachRemoved value: -{ - "description": "Attach workspace FILES for the AI to read directly (comma-separated nodeId:versionId pairs; versionId optional → backend resolves current). Works regardless of workspace intelligence. A missing/inaccessible/ineligible node ERRORS (not a silent drop). See describe.", - "type": "string" -} - removed
Input schema / properties / folders_attachRemoved value: -{ - "description": "Attach workspace FOLDERS for the AI to read (comma-separated folder nodeIds; no depth). Denied on restricted-view shares. See describe.", - "type": "string" -} - changed
Input schema / properties / instance_id / descriptionPrevious value: -"Alias for profile_id (REST/how-to name; profile_id is canonical)."New value: +"Alias for profile_id." - changed
Input schema / properties / kind / descriptionPrevious value: -"chat-create (workspace only): 'user' (default) or 'agent' — flags the chat as agentic; set at creation, immutable; not accepted on share chats. chat-list: filter by 'user'|'agent'|'all'."New value: +"chat-list filter: 'user' (default — user-driven chats), 'agent' (agentic chats), or 'all'." - changed
Input schema / properties / limit / descriptionPrevious value: -"chat-list/message-list page size. Best-effort: the AI API spec documents NO pagination on the chat-list or message-list endpoints (both return all rows under {count, items}), so this is forwarded but may be a silent no-op until the platform adds paging."New value: +"chat-list/message-list page size. Forwarded best-effort: these endpoints document no paging and may return all rows." - removed
Input schema / properties / nameRemoved value: -{ - "description": "New chat name.", - "type": "string" -} - removed
Input schema / properties / node_idsRemoved value: -{ - "description": "File node IDs (max 25, workspace share-generate).", - "items": { - "type": "string" - }, - "type": "array" -} - changed
Input schema / properties / offset / descriptionPrevious value: -"chat-list/message-list pagination offset — see the limit caveat (no documented paging on these endpoints; forwarded best-effort)."New value: +"chat-list/message-list offset (best-effort, see limit)." - removed
Input schema / properties / privacyRemoved value: -{ - "description": "Chat privacy (default: private). Workspace chat-create only — share chats are always private.", - "enum": [ - "private", - "public" - ], - "type": "string" -} - changed
Input schema / properties / profile_id / descriptionPrevious value: -"Polymorphic context ID (pair with profile_type=workspace|share). Typed aliases let you omit profile_type: workspace_id (⇒ workspace) / share_id (⇒ share); also context_id / instance_id. 19-digit workspace or share ID."New value: +"19-digit workspace or share ID (pair with profile_type). Aliases: workspace_id / share_id (imply the type), context_id, instance_id." - removed
Input schema / properties / query_textRemoved value: -{ - "description": "Question or prompt (max 32,000 chars).", - "maxLength": 32000, - "type": "string" -} - changed
Input schema / properties / share_id / descriptionPrevious value: -"Alias for profile_id when the profile is a share — implies profile_type=share (so profile_type may be omitted)."New value: +"profile_id alias; implies profile_type=share." - changed
Input schema / properties / wait / descriptionPrevious value: -"message-read only. Default true: bounded-wait for completion (up to ~24s on a workspace via the activity long-poll). Set false for a single-shot status probe (one details fetch, ~1 round-trip) — useful against strict ~30s client timeouts."New value: +"message-read only. Default true: bounded-wait for completion (up to ~24s on a workspace via the activity long-poll). false: a single-shot status probe (one details fetch, ~1 round-trip), within strict ~30s client timeouts." - changed
Input schema / properties / workspace_id / descriptionPrevious value: -"Alias for profile_id when the profile is a workspace — implies profile_type=workspace (so profile_type may be omitted)."New value: +"profile_id alias; implies profile_type=workspace."
- Added
ai_manage - Changed
asset7 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "upload", - "delete", - "types", - "list", - "read" -]New value: +[ + "describe", + "types", + "list", + "read" +] - removed
Input schema / properties / contentRemoved value: -{ - "description": "Plain text content (e.g. SVG).", - "type": "string" -} - removed
Input schema / properties / content_typeRemoved value: -{ - "description": "MIME type (default application/octet-stream).", - "type": "string" -} - changed
Input schema / properties / entity_id / descriptionPrevious value: -"Opaque ID of a specific object (file, comment, etc.). Pair with entity_type to disambiguate. Entity ID (optional for user)."New value: +"Entity ID (optional for user)." - removed
Input schema / properties / file_base64Removed value: -{ - "description": "Base64-encoded binary content.", - "type": "string" -} - removed
Input schema / properties / file_nameRemoved value: -{ - "description": "Original file name.", - "type": "string" -} - removed
Input schema / properties / metadataRemoved value: -{ - "description": "Additional metadata as JSON array string.", - "type": "string" -}
- Added
asset_manage - Changed
auth22 fields changed- removed
Input schema / properties / account_settingsRemoved value: -{ - "description": "pkce-login only. Request the account-settings scope (`userdetails:*:rw`, gating password/email changes, 2FA enrolment and sign-out-all) as a CEILING on the consent screen. Default false. A ceiling is not a grant: the human must still tick the toggle, and the granted set is whatever `auth action=scopes` reports afterwards.", - "type": "boolean" -} - changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "signin", - "signout", - "signup", - "check", - "session", - "status", - "scopes", - "set-api-key", - "email-check", - "email-verify", - "password-reset-request", - "password-reset", - "2fa-verify", - "2fa-status", - "2fa-enable", - "2fa-disable", - "2fa-send", - "2fa-verify-setup", - "pkce-login", - "pkce-complete", - "api-key-create", - "api-key-list", - "api-key-get", - "api-key-update", - "api-key-delete", - "oauth-list", - "oauth-details", - "oauth-update", - "oauth-revoke", - "oauth-revoke-all" -]New value: +[ + "describe", + "check", + "session", + "status", + "scopes", + "email-check", + "2fa-status", + "api-key-list", + "api-key-get", + "oauth-list", + "oauth-details" +] - removed
Input schema / properties / adminRemoved value: -{ - "description": "pkce-login only. Request the admin access mode (`rwa`) as a CEILING on the consent screen. Default false. A ceiling is not a grant: the human must still tick the toggle, and the granted set is whatever `auth action=scopes` reports afterwards.", - "type": "boolean" -} - removed
Input schema / properties / agent_nameRemoved value: -{ - "description": "Agent name for the approval screen and audit logs. If omitted on pkce-login this DEFAULTS to the MCP client's self-reported name (clientInfo.name from initialize), which is caller-supplied and NOT platform-verified — a human approves it on the consent screen, but it is not a vouched vendor. Pass it explicitly to control what is recorded.", - "type": "string" -} - removed
Input schema / properties / api_keyRemoved value: -{ - "description": "Fastio API key.", - "type": "string" -} - removed
Input schema / properties / channelRemoved value: -{ - "description": "2FA channel.", - "enum": [ - "sms", - "totp", - "whatsapp", - "call" - ], - "type": "string" -} - removed
Input schema / properties / codeRemoved value: -{ - "description": "Verification or authorization code. Meaning is action-specific — see action='describe' for the per-action reference (e.g. 2FA code for 2fa-verify, reset code for password-reset, OAuth code for pkce-complete).", - "type": "string" -} - removed
Input schema / properties / current_session_idRemoved value: -{ - "description": "Current session ID for exclusion.", - "type": "string" -} - changed
Input schema / properties / describe_action / descriptionPrevious value: -"When action='describe', narrow the output to ONE action's full params/notes (e.g. 'status'). Omit to get the compact action index."New value: +"With action='describe': return one action's params and notes instead of the action index." - removed
Input schema / properties / email_tokenRemoved value: -{ - "description": "Email verification code.", - "type": "string" -} - removed
Input schema / properties / exclude_currentRemoved value: -{ - "description": "Skip current session in revoke-all.", - "type": "boolean" -} - removed
Input schema / properties / expiresRemoved value: -{ - "description": "Token lifetime in seconds.", - "maximum": 9007199254740991, - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / first_nameRemoved value: -{ - "description": "Given name.", - "type": "string" -} - removed
Input schema / properties / key_expiresRemoved value: -{ - "description": "ISO 8601 expiration datetime.", - "type": "string" -} - removed
Input schema / properties / last_nameRemoved value: -{ - "description": "Family name.", - "type": "string" -} - removed
Input schema / properties / nameRemoved value: -{ - "description": "API key label.", - "type": "string" -} - removed
Input schema / properties / passwordRemoved value: -{ - "description": "Account password.", - "type": "string" -} - removed
Input schema / properties / password1Removed value: -{ - "description": "New password.", - "type": "string" -} - removed
Input schema / properties / password2Removed value: -{ - "description": "New password confirmation.", - "type": "string" -} - removed
Input schema / properties / scope_typeRemoved value: -{ - "description": "PKCE scope type. Default 'user' (full access).", - "enum": [ - "user", - "org", - "workspace", - "all_orgs", - "all_workspaces", - "all_shares" - ], - "type": "string" -} - removed
Input schema / properties / scopesRemoved value: -{ - "description": "Scope strings \"entity:id:mode\" with mode r | rw | rwa (rwa = read-write + admin access mode; a implies rw), e.g. [\"org:123:rwa\", \"userdetails:*:rw\", \"user:*:r\"]. api-key-create/update: omit for full access. oauth-update: REQUIRED and must be narrower-or-equal; an empty list is refused — use oauth-revoke instead.", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / tokenRemoved value: -{ - "description": "2FA / verification token. Meaning is action-specific — see action='describe' for the per-action reference (e.g. 2FA-disable token, 2fa-verify-setup token, 2FA token for api-key-create/api-key-delete).", - "type": "string" -}
- Added
auth_manage - Changed
comment14 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "list", - "list-all", - "add", - "edit", - "delete", - "bulk-delete", - "details", - "reaction-add", - "reaction-remove" -]New value: +[ + "describe", + "list", + "list-all", + "details" +] - removed
Input schema / properties / comment_idsRemoved value: -{ - "description": "Array of comment opaque IDs.", - "items": { - "type": "string" - }, - "type": "array" -} - changed
Input schema / properties / detail / descriptionPrevious value: -"Per-comment verbosity for list/list-all/details. Defaults: terse for list/list-all (compact rows), full for details (drill-down). See action='describe' for per-level field lists."New value: +"terse|standard|full (best-effort). Defaults: terse for list/list-all, full for details." - changed
Input schema / properties / display_limit / descriptionPrevious value: -"list-all only — ignored on the markdown list action. Number of comments to return to the agent (default 10, max 200). Backend page_size unchanged for cache warmth (JSON only). Trims post-fetch only."New value: +"list-all only: comments to return (default 10, max 200), trimmed after fetch." - removed
Input schema / properties / emojiRemoved value: -{ - "description": "Single emoji character.", - "type": "string" -} - changed
Input schema / properties / node_id / descriptionPrevious value: -"Storage tree node opaque ID. Both files and folders are nodes — use this name regardless of which."New value: +"File node opaque ID." - removed
Input schema / properties / parent_comment_idRemoved value: -{ - "description": "Parent comment ID for reply (single-level threading).", - "type": "string" -} - changed
Input schema / properties / profile_id / descriptionPrevious value: -"Polymorphic context ID (pair with profile_type=workspace|share). Typed aliases let you omit profile_type: workspace_id (⇒ workspace) / share_id (⇒ share); also context_id. 19-digit profile ID."New value: +"Workspace or share ID (pair with profile_type)." - removed
Input schema / properties / propertiesRemoved value: -{ - "description": "Arbitrary key-value JSON object metadata (edit action only). Accepts a native object or a JSON string. Merged into the comment's stored properties; server-managed keys (reactions, version, version_hash, edited_at, content_filtered, mentions) supplied here are ignored.", - "type": "string" -} - removed
Input schema / properties / referenceRemoved value: -{ - "description": "Anchor: image region, A/V timestamp, PDF page, or text selection.", - "properties": { - "end_offset": { - "description": "Selection end char offset.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "exact": { - "description": "Verbatim selected text (max 500 characters).", - "maxLength": 1000, - "type": "string" - }, - "page": { - "description": "PDF page (1-based).", - "maximum": 9007199254740991, - "minimum": 1, - "type": "integer" - }, - "prefix": { - "description": "~30-50 chars before selection (max 100 characters).", - "maxLength": 200, - "type": "string" - }, - "region": { - "description": "Spatial region for image/video/PDF — CORNERS on a 0-100 PERCENT scale: {x1,y1,x2,y2}, not {x,y,width,height} and not 0-1 normalized.", - "properties": { - "x1": { - "description": "Left edge, 0-100 PERCENT.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "x2": { - "description": "Right edge, 0-100 PERCENT (must be > x1).", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "y1": { - "description": "Top edge, 0-100 PERCENT.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "y2": { - "description": "Bottom edge, 0-100 PERCENT (must be > y1).", - "maximum": 100, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x1", - "y1", - "x2", - "y2" - ], - "type": "object" - }, - "start_offset": { - "description": "Selection start char offset.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "suffix": { - "description": "~30-50 chars after selection (max 100 characters).", - "maxLength": 200, - "type": "string" - }, - "text_snippet": { - "description": "Selected PDF text snippet.", - "type": "string" - }, - "timestamp": { - "description": "Seconds (video/audio).", - "minimum": 0, - "type": "number" - }, - "type": { - "description": "Anchor content type. 'document' covers PDF and text; 'text' aliases 'document'.", - "enum": [ - "image", - "video", - "audio", - "pdf", - "document", - "text", - "general" - ], - "type": "string" - } - }, - "type": "object" -} - changed
Input schema / properties / share_id / descriptionPrevious value: -"Alias for profile_id when the profile is a share — implies profile_type=share (so profile_type may be omitted)."New value: +"Alias for profile_id; implies profile_type=share." - changed
Input schema / properties / sort / descriptionPrevious value: -"Sort: 'created' or '-created' (default newest first)."New value: +"Default -created (newest first)." - removed
Input schema / properties / textRemoved value: -{ - "description": "Max 8192 body / 500 DISPLAY text (mention markup discounted) — the 500 usually BINDS. Both count CHARACTERS — CJK and emoji cost one each, same as ASCII. Mentions count toward 8192 only. A separate 2048-BYTE budget applies to the JSON-encoded `reference` anchor, where each non-ASCII character costs SIX bytes.", - "type": "string" -} - changed
Input schema / properties / workspace_id / descriptionPrevious value: -"Alias for profile_id when the profile is a workspace — implies profile_type=workspace (so profile_type may be omitted)."New value: +"Alias for profile_id; implies profile_type=workspace."
- Added
comment_manage - Changed
event11 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "search", - "summarize", - "details", - "acknowledge", - "activity-list", - "activity-poll", - "dashboard-list", - "dashboard-dismiss", - "dashboard-undismiss", - "changes" -]New value: +[ + "describe", + "search", + "details", + "activity-list", + "activity-poll", + "dashboard-list", + "changes" +] - removed
Input schema / properties / card_keyRemoved value: -{ - "description": "Dashboard card identity \"<lane>:<id>\" (e.g. \"mention:123\"). From a dashboard-list card. Required for dashboard-dismiss/dashboard-undismiss; URL-encoded into the path by the server.", - "minLength": 1, - "type": "string" -} - changed
Input schema / properties / category / descriptionPrevious value: -"Event category. See describe action for valid values. `node` IS THE AI/RAG PIPELINE, NOT FILE OPERATIONS — file activity lives under `workspace` AND `share`, so query both. CLOUD IMPORT IS NOT `cloudsync` HERE — that is an ACTIVITY field on a different taxonomy and returns nothing rather than erroring. Use category=\"import\", narrowed with subcategory=\"cloud_import\" for graft traffic only."New value: +"Event category; valid values are in describe. `node` is the AI/RAG pipeline, not file operations; file activity is under both `workspace` and `share`. Cloud import is category=\"import\" (subcategory=\"cloud_import\" for graft traffic only); `cloudsync` is an activity field on a different taxonomy and matches nothing here." - changed
Input schema / properties / detail / descriptionPrevious value: -"Per-record verbosity for search/summarize/details/activity-list/activity-poll. Defaults: terse for search/activity-list/activity-poll (compact rows), standard for summarize, full for details (drill-down). See action='describe' for per-level field lists."New value: +"terse|standard|full. Defaults: terse for search/activity-list/activity-poll, standard for summarize, full for details. Only search and details honor it." - changed
Input schema / properties / entity_id / descriptionPrevious value: -"Opaque ID of a specific object (file, comment, etc.). Pair with entity_type to disambiguate. 19-digit workspace, share, or File Share ID to monitor (activity-poll long-polls GET /activity/poll/{id}/ — for a File Share id this surfaces its file_share_* feed to WORKSPACE MEMBERS only; recipients get no feed)."New value: +"activity-poll: the workspace, share, or File Share ID to long-poll (a File Share's file_share_* feed reaches WORKSPACE MEMBERS only; recipients get no feed)." - changed
Input schema / properties / org_id / descriptionPrevious value: -"Organization profile ID (19-digit). Filter for search/summarize; the org to read for changes."New value: +"Organization profile ID (19-digit). Filter-style scope filter; the org to read for changes." - changed
Input schema / properties / profile_id / descriptionPrevious value: -"Polymorphic context ID. Pair with profile_type=workspace|share|org|fileshare. Use workspace_id instead when only workspaces are valid. 19-digit profile ID (workspace, share, or File Share)."New value: +"activity-list: the workspace, share, or File Share ID (pair with profile_type)." - removed
Input schema / properties / snooze_untilRemoved value: -{ - "description": "Optional for dashboard-dismiss: a future \"Y-m-d H:i:s UTC\" timestamp to snooze the card until (it reappears after). Omit for a permanent dismiss.", - "type": "string" -} - removed
Input schema / properties / user_contextRemoved value: -{ - "description": "Focus guidance for AI summary, e.g. \"Focus on uploads\".", - "maxLength": 64, - "type": "string" -} - changed
Input schema / properties / user_id / descriptionPrevious value: -"Filter by the event's stored subject column. DO NOT read it as \"the person this event is about\": the platform DERIVES that column instead of taking it from the emitter, so it can name an arbitrary related user rather than the subject. For \"what did this person do\", use calling_user_id (the actor) and read its note. See the search note before relying on either."New value: +"Filters the event's stored subject column, which the platform derives instead of taking it from the emitter, so it can name an arbitrary related user rather than the person the event concerns. The actor is calling_user_id. The search note covers both." - changed
Input schema / properties / workspace_id / descriptionPrevious value: -"Workspace opaque ID. Use this when only workspaces are valid (not shares or other contexts). For polymorphic contexts use profile_id. Filter by workspace profile ID."New value: +"Filter-style scope filter by workspace ID. dashboard-*: the workspace."
- Added
event_manage - Changed
fileshare14 fields changed- removed
Input schema / properties / access_optionRemoved value: -{ - "description": "Access tier: anyone_with_link | any_registered | named_people. create / update. `edit` capability is NEVER conferred by a tier — it always needs an explicit edit grant.", - "enum": [ - "anyone_with_link", - "any_registered", - "named_people" - ], - "type": "string" -} - changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "create", - "list", - "details", - "update", - "delete", - "grant-list", - "grant-add", - "grant-revoke", - "download-url", - "preview-url", - "versions-list", - "version-download-url" -]New value: +[ + "describe", + "list", + "details", + "grant-list", + "download-url", + "preview-url", + "versions-list", + "version-download-url" +] - removed
Input schema / properties / capabilityRemoved value: -{ - "description": "grant-add: the capability to grant — view | download | edit (ordered). `edit` allows content write-back. Required for grant-add.", - "enum": [ - "view", - "download", - "edit" - ], - "type": "string" -} - removed
Input schema / properties / emailRemoved value: -{ - "description": "grant-add / grant-revoke: the grantee's email. EXACTLY ONE of user / email. An unregistered email becomes a PENDING invite (auto-activates on signup; capped to the share's expiry).", - "type": "string" -} - removed
Input schema / properties / expiresRemoved value: -{ - "description": "create/update: relative expiry in SECONDS from now (1..3155760000). Mutually exclusive with expires_at.", - "maximum": 3155760000, - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / expires_atRemoved value: -{ - "description": "create/update: absolute expiry as 'YYYY-MM-DD HH:MM:SS UTC' (no timezone = UTC). Mutually exclusive with expires. update: send '' (empty string) to CLEAR the expiry and make the share durable again.", - "type": "string" -} - changed
Input schema / properties / fileshare_id / descriptionPrevious value: -"File Share ID (19-digit numeric). Required for every action except create / list."New value: +"File Share ID." - removed
Input schema / properties / nodeRemoved value: -{ - "description": "create: the workspace FILE node opaque ID to bind the share to (required). The binding is immutable — share a different file by creating a new File Share.", - "type": "string" -} - changed
Input schema / properties / password / descriptionPrevious value: -"create/update: SET the share password. On consumer actions (details / download-url / preview-url / versions-list / version-download-url): supply the recipient password — forwarded ONLY as the x-ve-password header, never in a URL/log. update: send '' (empty string) to CLEAR an existing password."New value: +"Recipient password for a gated share, sent only as the x-ve-password header (never in a URL or log)." - changed
Input schema / properties / preview_type / descriptionPrevious value: -"preview-url: the preview variant (e.g. 'image', 'pdf', 'video'). Multi-file previews 307-redirect to a token-bearing sub-file URL."New value: +"preview-url: the preview variant (e.g. 'image', 'pdf', 'video')." - removed
Input schema / properties / titleRemoved value: -{ - "description": "Human-readable share title. create / update.", - "type": "string" -} - removed
Input schema / properties / userRemoved value: -{ - "description": "grant-add / grant-revoke: the grantee's numeric user ID (19-digit). EXACTLY ONE of user / email.", - "type": "string" -} - changed
Input schema / properties / version_id / descriptionPrevious value: -"version-download-url: the specific version OpaqueId to download (from versions-list / details)."New value: +"version-download-url: the version ID (from versions-list)." - changed
Input schema / properties / workspace_id / descriptionPrevious value: -"Parent workspace ID (19-digit or custom name). create / list — the management authz anchor."New value: +"Parent workspace ID."
- Added
fileshare_manage - Changed
find2 fields changed- changed
Input schema / properties / name_match / descriptionPrevious value: -"auto (DEFAULT) | exact | prefix | contains | glob. exact = whole name; prefix = starts with; contains = substring — those three are LITERAL (* and ? are ordinary chars). glob = wildcards over the WHOLE name: *.pdf, report-*.xlsx. Do NOT pre-escape. Applies when search_in is filename or both; auto keeps today's relevance. Precise modes cap the pattern at 256 chars, reject an empty one."New value: +"auto (DEFAULT) | exact | prefix | contains | glob. exact = whole name; prefix = starts with; contains = substring — those three are LITERAL (* and ? are ordinary chars). glob = wildcards over the WHOLE name: *.pdf, report-*.xlsx. No pre-escaping needed. Applies when search_in is filename or both; auto keeps today's relevance. Precise modes cap the pattern at 256 chars, reject an empty one." - changed
Input schema / properties / search_in / descriptionPrevious value: -"filename | content | both (DEFAULT). filename = name only, find-style. content = the AI's summary + semantic, NOT grep. OMIT unless you mean it — sending it changes the response shape (adds a search_metadata block); omitting reproduces today's behavior byte-for-byte. Pair filename with name_match."New value: +"filename | content | both (DEFAULT). filename = name only, find-style. content = the AI's summary + semantic, NOT grep. Sending it changes the response shape (adds a search_metadata block); omitting it reproduces today's behavior byte-for-byte. filename pairs with name_match."
- Changed
intent9 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "allocate", - "browse", - "fill", - "expand", - "release" -]New value: +[ + "describe", + "browse", + "expand" +] - added
Input schema / properties / describe_actionAdded value: +{ + "description": "With action='describe': return one action's params and notes instead of the action index.", + "type": "string" +} - removed
Input schema / properties / intentRemoved value: -{ - "description": "What KIND of work this is — closed vocabulary, server-validated. Optional on allocate and fill.", - "enum": [ - "edit", - "read", - "upload", - "move", - "delete", - "analyze", - "organize" - ], - "type": "string" -} - removed
Input schema / properties / intent_idRemoved value: -{ - "description": "Intent ID from allocate, or from a browse/expand row. Pass it back EXACTLY as received — do not reformat it.", - "minLength": 1, - "type": "string" -} - removed
Input schema / properties / messageRemoved value: -{ - "description": "fill only: long-form detail, max 8192 characters. Absent from browse rows — read it with expand.", - "type": "string" -} - removed
Input schema / properties / node_idRemoved value: -{ - "description": "allocate only: scope the declaration to one node. Omit for a workspace-wide intent. Part of the slot key.", - "minLength": 1, - "type": "string" -} - removed
Input schema / properties / topicRemoved value: -{ - "description": "fill only: one-line label, max 256 characters. No newlines or tabs. This is what browse shows.", - "type": "string" -} - removed
Input schema / properties / versionRemoved value: -{ - "description": "fill only, REQUIRED: the version you last read for this slot. Compare-and-set — a stale or omitted version is refused with 409.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" -} - changed
Input schema / properties / workspace_id / descriptionPrevious value: -"Workspace ID (19-digit numeric). Required for every action except describe. Intents are workspace-only — there is no share variant."New value: +"Workspace ID (19-digit numeric). Intents are workspace-only — there is no share variant."
- Added
intent_manage - Changed
invitation8 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Operation. Use 'describe' for full action reference."New value: +"Operation; 'describe' lists the actions." - changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "list", - "list-by-state", - "update", - "delete" -]New value: +[ + "describe", + "list", + "list-by-state" +] - removed
Input schema / properties / expiresRemoved value: -{ - "description": "Updated expiration — `YYYY-MM-DD HH:MM:SS UTC`. ISO 8601 is NOT documented as accepted.", - "type": "string" -} - removed
Input schema / properties / invitation_idRemoved value: -{ - "description": "Invitation opaque ID or invitee email.", - "type": "string" -} - removed
Input schema / properties / new_stateRemoved value: -{ - "description": "New invitation state.", - "enum": [ - "pending", - "accepted", - "declined", - "expired", - "revoked" - ], - "type": "string" -} - removed
Input schema / properties / notificationsRemoved value: -{ - "description": "Notification preference (workspace).", - "type": "string" -} - removed
Input schema / properties / notify_optionsRemoved value: -{ - "description": "Notification preference (share).", - "type": "string" -} - removed
Input schema / properties / permissionsRemoved value: -{ - "description": "Updated permission level.", - "type": "string" -}
- Added
invitation_manage - Changed
member15 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Operation. Use 'describe' for full action reference."New value: +"Operation; 'describe' lists the actions." - changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "list", - "add", - "remove", - "details", - "update", - "transfer-ownership", - "leave", - "join", - "join-invitation" -]New value: +[ + "describe", + "list", + "details" +] - changed
Input schema / properties / display_limit / descriptionPrevious value: -"How many members to return for the list action. Default 10, max 500. The MCP trims post-fetch; backend paging stays MCP-internal so the platform cache stays warm."New value: +"How many members the list action returns (default 10, max 500), trimmed after the fetch." - removed
Input schema / properties / email_or_user_idRemoved value: -{ - "description": "Email (to invite) or user ID (to add directly).", - "type": "string" -} - removed
Input schema / properties / expirationRemoved value: -{ - "description": "Alias for expires (share only).", - "type": "string" -} - removed
Input schema / properties / expiresRemoved value: -{ - "description": "Membership expiration — `YYYY-MM-DD HH:MM:SS UTC` for BOTH workspace and share. ISO 8601 is NOT accepted (406).", - "type": "string" -} - removed
Input schema / properties / force_notificationRemoved value: -{ - "description": "Force notify existing user (workspace-only).", - "type": "boolean" -} - removed
Input schema / properties / invitation_actionRemoved value: -{ - "description": "Accept or decline.", - "enum": [ - "accept", - "decline" - ], - "type": "string" -} - removed
Input schema / properties / invitation_expiresRemoved value: -{ - "description": "Invitation expiration ISO 8601 (workspace-only).", - "type": "string" -} - removed
Input schema / properties / invitation_keyRemoved value: -{ - "description": "Invitation key string.", - "type": "string" -} - removed
Input schema / properties / messageRemoved value: -{ - "description": "Invitation email message (10-255 chars).", - "maxLength": 255, - "minLength": 10, - "type": "string" -} - removed
Input schema / properties / notificationsRemoved value: -{ - "description": "Notification preference (workspace string).", - "type": "string" -} - removed
Input schema / properties / notify_optionsRemoved value: -{ - "description": "Notification preference (share).", - "type": "string" -} - removed
Input schema / properties / permissionsRemoved value: -{ - "description": "Workspace permission level.", - "enum": [ - "admin", - "member", - "guest" - ], - "type": "string" -} - removed
Input schema / properties / roleRemoved value: -{ - "description": "Share permission level.", - "enum": [ - "admin", - "member", - "guest", - "view" - ], - "type": "string" -}
- Added
member_manage - Changed
metadata9 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "eligible", - "fields-list", - "search", - "compound-search", - "fields-merge" -]New value: +[ + "describe", + "eligible", + "fields-list", + "search", + "compound-search" +] - removed
Input schema / properties / confirmRemoved value: -{ - "description": "fields-merge: must be 'true' to proceed. The merge is IRREVERSIBLE and workspace-wide; the gate exists because the platform's guards check DATA safety, not whether the two fields mean the same thing.", - "enum": [ - "true", - "false" - ], - "type": "string" -} - changed
Input schema / properties / content_query / descriptionPrevious value: -"compound-search: free-text query run against INDEXED FILE CONTENT (1-1024 chars). Required for compound-search and AND-ed with metadata_filters — a file matches only if it satisfies BOTH. A file with no indexed content can never match, however well its metadata fits."New value: +"compound-search: free-text query run against INDEXED FILE CONTENT (1-1024 chars). AND-ed with metadata_filters — a file matches only if it satisfies BOTH. A file with no indexed content can never match, however well its metadata fits." - changed
Input schema / properties / cursor / descriptionPrevious value: -"eligible/fields-list: opaque pagination cursor from a prior page's response — echo it back verbatim rather than constructing one. Omit for the first page."New value: +"eligible/fields-list: opaque cursor from the prior page's response, echoed back verbatim. Omit for the first page." - changed
Input schema / properties / describe_action / descriptionPrevious value: -"When action='describe', narrow the output to ONE action's full params/notes (e.g. 'fields-list'). Omit to get the compact action index."New value: +"With action='describe': return one action's params and notes instead of the action index." - changed
Input schema / properties / display_limit / descriptionPrevious value: -"search: how many items to return post-fetch. Default 10, max 100 (the backend fetches at most 100 per page — a higher value has no effect; use offset to page past 100)."New value: +"search: how many items to return post-fetch. Default 10, max 100 (page past 100 with offset)." - removed
Input schema / properties / source_fieldRemoved value: -{ - "description": "fields-merge: the field NAME that is FOLDED AWAY and stops existing. Names, not ids.", - "minLength": 1, - "type": "string" -} - removed
Input schema / properties / target_fieldRemoved value: -{ - "description": "fields-merge: the field NAME that SURVIVES and absorbs the source's values.", - "minLength": 1, - "type": "string" -} - changed
Input schema / properties / template_id / descriptionPrevious value: -"RETIRED — metadata templates were removed, so there is no template to scope to. This tool REFUSES it on EVERY action: supplying it FAILS the request rather than narrowing it (the platform hard-refuses it too, and OPTIONS deliberately does not advertise it). Narrow by FIELD NAME instead — list valid names with `metadata action=fields-list`."New value: +"RETIRED (metadata templates were removed): supplying it fails the request on every action. Narrow by field name (fields-list)."
- Added
metadata_manage - Changed
org46 fields changed- removed
Input schema / properties / accent_colorRemoved value: -{ - "description": "Brand accent color as JSON.", - "type": "string" -} - changed
Input schema / properties / action / descriptionPrevious value: -"Operation. Use 'describe' for full action reference."New value: +"Operation; 'describe' lists the actions." - changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "list", - "details", - "create", - "update", - "close", - "public-details", - "limits", - "industry-list", - "list-workspaces", - "list-shares", - "create-workspace", - "billing-plans", - "billing-create", - "billing-cancel", - "billing-reactivate", - "billing-details", - "billing-invoices", - "billing-members", - "billing-meters", - "members", - "invite-member", - "remove-member", - "update-member-role", - "member-details", - "leave", - "transfer-ownership", - "join", - "invitations-list", - "invitation-update", - "invitation-delete", - "discover-all", - "discover-available", - "discover-check-domain", - "discover-external", - "asset-upload", - "asset-delete", - "asset-types", - "asset-list" -]New value: +[ + "describe", + "list", + "details", + "public-details", + "limits", + "industry-list", + "list-workspaces", + "list-shares", + "billing-plans", + "billing-details", + "billing-invoices", + "billing-members", + "billing-meters", + "members", + "member-details", + "invitations-list", + "discover-all", + "discover-available", + "discover-check-domain", + "discover-external", + "asset-types", + "asset-list" +] - removed
Input schema / properties / asset_nameRemoved value: -{ - "description": "Asset name, e.g. \"logo\", \"banner\".", - "type": "string" -} - removed
Input schema / properties / background_colorRemoved value: -{ - "description": "Background color as JSON.", - "type": "string" -} - removed
Input schema / properties / background_color1Removed value: -{ - "description": "Primary background color as JSON.", - "type": "string" -} - removed
Input schema / properties / background_color2Removed value: -{ - "description": "Secondary background color as JSON.", - "type": "string" -} - removed
Input schema / properties / background_modeRemoved value: -{ - "description": "Background display mode, e.g. 'stretched', 'fixed'.", - "type": "string" -} - removed
Input schema / properties / billing_emailRemoved value: -{ - "description": "Billing contact email.", - "type": "string" -} - removed
Input schema / properties / billing_planRemoved value: -{ - "description": "Paid plan ID for billing-create, e.g. 'solo_monthly', 'business_v2_monthly', 'growth_monthly' (each has an annual variant). New orgs require a paid plan — the free plan is legacy and closed to new subscriptions; legacy 'pro_monthly'/'business_monthly' are also closed. Call billing-plans for the currently-offered plan IDs.", - "type": "string" -} - removed
Input schema / properties / confirmRemoved value: -{ - "description": "Confirmation string, must match org domain or ID.", - "type": "string" -} - removed
Input schema / properties / contentRemoved value: -{ - "description": "Plain text content. asset-upload: e.g. SVG body.", - "type": "string" -} - removed
Input schema / properties / content_typeRemoved value: -{ - "description": "MIME type, e.g. image/png. Defaults to application/octet-stream.", - "type": "string" -} - changed
Input schema / properties / describe_action / descriptionPrevious value: -"When action='describe', narrow the output to ONE action's full params/notes (e.g. 'list'). Omit to get the compact action index."New value: +"With action='describe': return one action's params and notes instead of the action index." - removed
Input schema / properties / descriptionRemoved value: -{ - "description": "Description (10-1000 chars).", - "maxLength": 1000, - "minLength": 10, - "type": "string" -} - changed
Input schema / properties / detail / descriptionPrevious value: -"Per-entity verbosity for list/discover-*/members/list-workspaces/details. Defaults: terse for list/discover-*/members/list-workspaces, full for details. See action='describe' for per-level field lists."New value: +"Per-entity verbosity. Default terse for list/discover-*/members/list-workspaces, full for details; describe lists the fields per level." - changed
Input schema / properties / display_limit / descriptionPrevious value: -"Number of orgs to return to the agent (default 10, max 100). Backend page_size unchanged for cache warmth — applies to list. Trims post-fetch only."New value: +"Number of orgs to return to the agent (default 10, max 100)." - removed
Input schema / properties / domainRemoved value: -{ - "description": "URL-safe subdomain (2-80 chars, lowercase alphanumeric + hyphens, globally unique, not reserved).", - "maxLength": 80, - "minLength": 2, - "type": "string" -} - removed
Input schema / properties / emailRemoved value: -{ - "description": "Email address of user to invite.", - "type": "string" -} - removed
Input schema / properties / expiresRemoved value: -{ - "description": "Updated expiration datetime.", - "type": "string" -} - removed
Input schema / properties / facebook_urlRemoved value: -{ - "description": "Facebook page URL.", - "type": "string" -} - removed
Input schema / properties / file_base64Removed value: -{ - "description": "Base64 file content for binary assets.", - "type": "string" -} - removed
Input schema / properties / file_nameRemoved value: -{ - "description": "Original file name, e.g. logo.png.", - "type": "string" -} - removed
Input schema / properties / folder_nameRemoved value: -{ - "description": "URL-safe workspace folder name (4-80 chars).", - "maxLength": 80, - "minLength": 4, - "type": "string" -} - removed
Input schema / properties / homepage_urlRemoved value: -{ - "description": "Organization website URL.", - "type": "string" -} - removed
Input schema / properties / industryRemoved value: -{ - "description": "Industry type, e.g. technology, healthcare, financial.", - "type": "string" -} - removed
Input schema / properties / instagram_urlRemoved value: -{ - "description": "Instagram profile URL.", - "type": "string" -} - removed
Input schema / properties / intelligenceRemoved value: -{ - "description": "Enable RAG indexing. COSTS 10 credits/page. Defaults \"false\". See describe.", - "type": "string" -} - removed
Input schema / properties / invitation_idRemoved value: -{ - "description": "Invitation ID or invitee email.", - "type": "string" -} - removed
Input schema / properties / invitation_keyRemoved value: -{ - "description": "Invitation key from invite link.", - "type": "string" -} - removed
Input schema / properties / join_actionRemoved value: -{ - "description": "Invitation action: accept or decline (default accept). Appended to the join URL path — restricted to these two values to prevent path injection.", - "enum": [ - "accept", - "decline" - ], - "type": "string" -} - removed
Input schema / properties / member_idRemoved value: -{ - "description": "User ID or email of member.", - "type": "string" -} - removed
Input schema / properties / messageRemoved value: -{ - "description": "Custom invitation email message (10-255 chars).", - "type": "string" -} - removed
Input schema / properties / metadataRemoved value: -{ - "description": "Additional metadata as JSON array string.", - "type": "string" -} - removed
Input schema / properties / nameRemoved value: -{ - "description": "Display name (3-100 chars).", - "maxLength": 100, - "minLength": 3, - "type": "string" -} - removed
Input schema / properties / owner_definedRemoved value: -{ - "description": "Custom owner-defined properties as JSON.", - "type": "string" -} - removed
Input schema / properties / perm_authorized_domainsRemoved value: -{ - "description": "Authorized email domain for auto-join.", - "type": "string" -} - removed
Input schema / properties / perm_joinRemoved value: -{ - "description": "Permission level required to join workspace.", - "type": "string" -} - removed
Input schema / properties / perm_member_manageRemoved value: -{ - "description": "Who can manage members, e.g. 'Owner only'.", - "type": "string" -} - removed
Input schema / properties / permissionsRemoved value: -{ - "description": "Updated permission level.", - "type": "string" -} - removed
Input schema / properties / roleRemoved value: -{ - "description": "Org permission level — `member` or `admin` ONLY. `owner` is not assignable (it is returned when READING members, alongside admin/member). `guest` and `view` are WORKSPACE/SHARE roles and are rejected here (1605).", - "type": "string" -} - changed
Input schema / properties / starting_after / descriptionPrevious value: -"billing-invoices cursor: pass a prior invoice's `id` to fetch the next page (cursor pagination, not offset)."New value: +"billing-invoices cursor: a prior invoice's `id`." - removed
Input schema / properties / twitter_urlRemoved value: -{ - "description": "Twitter/X profile URL.", - "type": "string" -} - removed
Input schema / properties / use_backgroundRemoved value: -{ - "description": "Enable/disable background, \"true\"/\"false\".", - "type": "string" -} - changed
Input schema / properties / workspace_id / descriptionPrevious value: -"Workspace opaque ID. Use this when only workspaces are valid (not shares or other contexts). For polymorphic contexts use profile_id. Filter by workspace ID."New value: +"billing-meters: filter by workspace ID." - removed
Input schema / properties / youtube_urlRemoved value: -{ - "description": "YouTube channel URL.", - "type": "string" -}
- Added
org_manage - Changed
share38 fields changed- removed
Input schema / properties / accent_colorRemoved value: -{ - "description": "Accent color as JSON string.", - "type": "string" -} - removed
Input schema / properties / access_optionsRemoved value: -{ - "description": "Access level. 'Anyone with the link' not allowed for receive/exchange.", - "enum": [ - "Only members of the Share or Workspace", - "Members of the Share, Workspace or Org", - "Anyone with a registered account", - "Anyone with the link" - ], - "type": "string" -} - changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "list", - "details", - "create", - "update", - "delete", - "public-details", - "archive", - "unarchive", - "password-auth", - "members", - "available", - "check-name", - "quickshare-create", - "autotitle" -]New value: +[ + "describe", + "list", + "details", + "public-details", + "password-auth", + "members", + "available", + "check-name" +] - removed
Input schema / properties / anonymous_uploads_enabledRemoved value: -{ - "description": "Allow guests to upload anonymously on public Receive/Exchange shares.", - "type": "boolean" -} - removed
Input schema / properties / background_color1Removed value: -{ - "description": "Primary background color as JSON string.", - "type": "string" -} - removed
Input schema / properties / background_color2Removed value: -{ - "description": "Secondary background color as JSON string.", - "type": "string" -} - removed
Input schema / properties / background_imageRemoved value: -{ - "description": "Background image index (0-128, default 0).", - "maximum": 128, - "minimum": 0, - "type": "integer" -} - removed
Input schema / properties / comments_enabledRemoved value: -{ - "description": "Enable comments (default: true).", - "type": "boolean" -} - removed
Input schema / properties / confirmRemoved value: -{ - "description": "delete: must match the share's custom_name or id (validated client-side before the call).", - "type": "string" -} - removed
Input schema / properties / create_folderRemoved value: -{ - "description": "Create a new workspace folder (workspace_folder mode).", - "type": "boolean" -} - removed
Input schema / properties / custom_nameRemoved value: -{ - "description": "Custom share URL name (4-80 chars; Unicode letters, digits, hyphens, underscores). Omit to have one auto-generated.", - "maxLength": 80, - "minLength": 4, - "type": "string" -} - changed
Input schema / properties / describe_action / descriptionPrevious value: -"When action='describe', narrow the output to ONE action's full params/notes (e.g. 'create'). Omit to get the compact action index."New value: +"With action='describe': return one action's params and notes instead of the action index." - removed
Input schema / properties / descriptionRemoved value: -{ - "description": "Share description (10-500 chars).", - "maxLength": 500, - "minLength": 10, - "type": "string" -} - changed
Input schema / properties / detail / descriptionPrevious value: -"Per-entity verbosity for list/available/members/public-details/details. Defaults: terse for list/available/members, standard for public-details, full for details. See action='describe' for per-level field lists."New value: +"terse|standard|full. Defaults: terse for list/available/members, standard for public-details, full for details." - changed
Input schema / properties / display_limit / descriptionPrevious value: -"How many items to return. Default 10, max 500. The MCP trims post-fetch; backend page_size stays MCP-internal so the platform cache stays warm. Applies to list."New value: +"list: rows to return (default 10, max 500), trimmed after fetch." - removed
Input schema / properties / display_typeRemoved value: -{ - "description": "Display mode (default: grid).", - "enum": [ - "list", - "grid" - ], - "type": "string" -} - removed
Input schema / properties / download_securityRemoved value: -{ - "description": "Download security: off (default), medium (no guest download), high (block all guest downloads).", - "enum": [ - "off", - "medium", - "high" - ], - "type": "string" -} - removed
Input schema / properties / expandRemoved value: -{ - "description": "quickshare-create only. Set to 'node' to include the full backend payload as a nested `node` field. Default response is slim: `{id, web_url, expires_at}`.", - "enum": [ - "node" - ], - "type": "string" -} - removed
Input schema / properties / expiresRemoved value: -{ - "description": "Expiration: 'YYYY-MM-DD HH:MM:SS' for create/update; seconds (default 10800, max 604800) for quickshare-create.", - "type": "string" -} - removed
Input schema / properties / expires_atRemoved value: -{ - "description": "ISO 8601 datetime for quickshare expiration.", - "type": "string" -} - removed
Input schema / properties / folder_nameRemoved value: -{ - "description": "Name for new folder (default: 'Shared Folder').", - "type": "string" -} - removed
Input schema / properties / folder_node_idRemoved value: -{ - "description": "Workspace folder node ID (workspace_folder mode).", - "type": "string" -} - removed
Input schema / properties / guest_chat_enabledRemoved value: -{ - "description": "Enable guest chat (default: false).", - "type": "boolean" -} - removed
Input schema / properties / intelligenceRemoved value: -{ - "description": "Enable RAG indexing. ⚠️ COSTS CREDITS (10/page) — default false unless user requests it. Forced false on workspace_folder shares.", - "type": "boolean" -} - removed
Input schema / properties / inviteRemoved value: -{ - "description": "Who can invite others (default: owners).", - "enum": [ - "owners", - "guests" - ], - "type": "string" -} - changed
Input schema / properties / limit / descriptionPrevious value: -"Internal backend page_size — stays MCP-internal so the platform cache stays warm. Use display_limit to control how many rows are actually returned. Forwarded by list/members."New value: +"Backend page size (list/members); display_limit sets how many rows are returned." - changed
Input schema / properties / name / descriptionPrevious value: -"Share title (2-80 chars; maps to API 'title')."New value: +"check-name: the custom share URL name to check." - removed
Input schema / properties / node_idRemoved value: -{ - "description": "Storage tree node opaque ID. Both files and folders are nodes — use this name regardless of which. File node opaque ID. Quickshares: single file, max 1 GB, default 3h, max 7 days.", - "type": "string" -} - removed
Input schema / properties / notifyRemoved value: -{ - "description": "Notification setting (default: never).", - "enum": [ - "never", - "notify_on_file_received", - "notify_on_file_sent_or_received" - ], - "type": "string" -} - removed
Input schema / properties / owner_definedRemoved value: -{ - "description": "Custom metadata as JSON string.", - "type": "string" -} - changed
Input schema / properties / password / descriptionPrevious value: -"Password (only with 'Anyone with the link')."New value: +"password-auth: the share password." - removed
Input schema / properties / room_goalRemoved value: -{ - "description": "REMOVED — Coordination Rooms were deleted from the platform on 2026-08-25 and this parameter no longer does anything. Supplying it is REFUSED rather than ignored, so a stale tool list cannot silently drop your value. Do not use it.", - "maxLength": 1000, - "minLength": 1, - "type": "string" -} - removed
Input schema / properties / share_typeRemoved value: -{ - "description": "New share type.", - "enum": [ - "send", - "receive", - "exchange" - ], - "type": "string" -} - removed
Input schema / properties / storage_modeRemoved value: -{ - "description": "Storage mode (default: independent).", - "enum": [ - "independent", - "workspace_folder" - ], - "type": "string" -} - removed
Input schema / properties / titleRemoved value: -{ - "description": "Share title (2-80 chars). Alias of name.", - "maxLength": 80, - "minLength": 2, - "type": "string" -} - removed
Input schema / properties / user_contextRemoved value: -{ - "description": "autotitle only: optional user-provided context to guide the AI-generated title/description.", - "type": "string" -} - removed
Input schema / properties / workspace_idRemoved value: -{ - "description": "Workspace opaque ID. Use this when only workspaces are valid (not shares or other contexts). For polymorphic contexts use profile_id. Parent workspace ID.", - "type": "string" -} - removed
Input schema / properties / workspace_styleRemoved value: -{ - "description": "Use workspace styling (default: true).", - "type": "boolean" -}
- Added
share_manage - Changed
sign16 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "sign-list", - "sign-create", - "sign-get", - "sign-update", - "sign-send", - "sign-void", - "sign-document-source-download", - "sign-document-source-preview", - "sign-document-signed-download", - "sign-audit-download", - "sign-audit-pdf-download", - "sign-retry", - "dashboard-sign-link", - "sign-template-create", - "sign-template-list", - "sign-template-get", - "sign-template-update", - "sign-template-delete", - "sign-template-instantiate" -]New value: +[ + "describe", + "sign-list", + "sign-get", + "sign-document-source-download", + "sign-document-source-preview", + "sign-document-signed-download", + "sign-audit-download", + "sign-audit-pdf-download", + "sign-template-list", + "sign-template-get" +] - removed
Input schema / properties / confirmRemoved value: -{ - "description": "Confirmation gate ('true'). REQUIRED for sign-send/sign-void; refused without it.", - "enum": [ - "true", - "false" - ], - "type": "string" -} - changed
Input schema / properties / describe_action / descriptionPrevious value: -"When action='describe', narrow the output to ONE action's full params/notes (e.g. 'sign-create'). Omit to get the compact action index."New value: +"With action='describe': return one action's params and notes instead of the action index." - removed
Input schema / properties / descriptionRemoved value: -{ - "description": "sign-template-create/-update: template description (max 1024).", - "maxLength": 1024, - "type": "string" -} - removed
Input schema / properties / documentsRemoved value: -{ - "description": "sign-create/-update: JSON documents array 1-20 (see note). sign-template-instantiate: JSON array of slot overrides [{document_slot_index, source_node_id, source_version_id?}].", - "type": "string" -} - removed
Input schema / properties / expected_versionRemoved value: -{ - "description": "sign-template-update: the `version` you read from sign-template-get (optimistic CAS). A concurrent write returns 409 — re-read and retry.", - "maximum": 9007199254740991, - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / expires_atRemoved value: -{ - "description": "sign-create/-update: envelope expiry as a UTC timestamp 'Y-m-d H:i:s UTC' (NOT a day count; omit/null = policy default).", - "type": "string" -} - removed
Input schema / properties / fieldsRemoved value: -{ - "description": "sign-create/-update: JSON array of field placements (coords 0..1; see note).", - "type": "string" -} - removed
Input schema / properties / nameRemoved value: -{ - "description": "sign-create/-update: envelope name (max 255). sign-template-create/-update: template name (REQUIRED on create). sign-template-instantiate: name for the draft envelope (defaults to the template name).", - "maxLength": 255, - "minLength": 1, - "type": "string" -} - removed
Input schema / properties / policy_jsonRemoved value: -{ - "description": "sign-create/-update: optional JSON policy {auth_method,...}.", - "type": "string" -} - removed
Input schema / properties / reasonRemoved value: -{ - "description": "sign-void: void reason (max 1024).", - "maxLength": 1024, - "type": "string" -} - removed
Input schema / properties / recipient_bindingsRemoved value: -{ - "description": "sign-template-instantiate: JSON OBJECT keyed by slot_key -> {email, display_name?, auth_method?}. An ARRAY is rejected by the platform.", - "type": "string" -} - removed
Input schema / properties / recipientsRemoved value: -{ - "description": "sign-create/-update: JSON recipients array (see note).", - "type": "string" -} - removed
Input schema / properties / snapshotRemoved value: -{ - "description": "sign-template-create/-update: JSON snapshot object {recipient_slots, document_slots, fields, policy}. On update it is a FULL replacement (see note).", - "type": "string" -} - changed
Input schema / properties / template_id / descriptionPrevious value: -"sign-template-get/-update/-delete/-instantiate: template id (30-char base32, `sa` family)."New value: +"sign-template-get: template id (30-char base32, `sa` family)." - changed
Input schema / properties / workspace_id / descriptionPrevious value: -"Workspace ID. Envelopes are workspace-parented; use the 19-digit NUMERIC workspace ID (the document/audit download stream route rejects custom workspace names)."New value: +"Workspace ID (19-digit NUMERIC; the document/audit download stream route rejects custom workspace names). Envelopes are workspace-parented."
- Added
sign_manage - Changed
storage28 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "list", - "recent", - "details", - "search", - "trash-list", - "create-folder", - "copy", - "move", - "delete", - "rename", - "purge", - "restore", - "add-file", - "add-link", - "transfer", - "version-list", - "version-restore", - "lock-acquire", - "lock-status", - "lock-release", - "preview-url", - "preview-transform", - "read-content", - "content", - "metadata-facts", - "metadata-get", - "metadata-set", - "metadata-delete", - "metadata-extract", - "metadata-extract-all", - "metadata-versions" -]New value: +[ + "describe", + "list", + "recent", + "details", + "search", + "trash-list", + "version-list", + "lock-status", + "preview-url", + "preview-transform", + "read-content", + "content", + "metadata-facts", + "metadata-get", + "metadata-versions" +] - changed
Input schema / properties / as_markdown / descriptionPrevious value: -"Opt-in (list/recent/search/details/trash-list): when true, the platform renders the response as GitHub-flavored Markdown (?output=<detail>,markdown) for compact, human/agent-readable output instead of JSON. Omit (default) for the unchanged JSON shape with web_url enrichment + _next hints. Markdown is a passthrough — no client-side reshaping."New value: +"Opt-in (list/recent/search/details/trash-list): the platform renders the response as GitHub-flavored Markdown (?output=<detail>,markdown) instead of JSON. Omit for JSON with web_url enrichment + _next hints." - changed
Input schema / properties / describe_action / descriptionPrevious value: -"When action='describe', narrow the output to ONE action's full params/notes (e.g. 'list'). Omit to get the compact action index."New value: +"With action='describe': return one action's params and notes instead of the action index." - removed
Input schema / properties / dest_instance_idRemoved value: -{ - "description": "Destination workspace or share profile ID.", - "type": "string" -} - removed
Input schema / properties / dest_parent_idRemoved value: -{ - "description": "Destination parent folder opaque ID, or 'root'. Primary param for transfer (the parent in the OTHER instance). For copy/move within the same instance use target_parent_id — dest_parent_id is also accepted there as an alias.", - "type": "string" -} - changed
Input schema / properties / details / descriptionPrevious value: -"Search-only. Return fully-hydrated node objects per result (default limit drops to 10). Distinct from `detail` — call action='describe' for the contrast."New value: +"Search-only: attach the hydrated node to each hit (default limit drops to 10). Distinct from `detail` (see describe)." - changed
Input schema / properties / display_limit / descriptionPrevious value: -"How many items to return. Default 10, max 500. The MCP trims post-fetch; backend cache stays warm. Used by: list, recent, search. list/recent paginate via the `cursor` param; search paginates via `offset` (increase offset by the page size) for additional pages."New value: +"How many items to return (default 10, max 500) on list, recent and search. list/recent page via `cursor`; search pages via `offset` (increase it by the page size)." - removed
Input schema / properties / durationRemoved value: -{ - "description": "lock-acquire only — how long the lock should hold, in seconds (60-3600). Omit for the platform default, which is SHORT: measured at 300s (5 minutes) on dev1.", - "maximum": 3600, - "minimum": 60, - "type": "integer" -} - removed
Input schema / properties / extract_fieldsRemoved value: -{ - "description": "metadata-extract: JSON array of field names (e.g. `[\"vendor\",\"amount\"]`); omit for a full-row extract. WITH a template bound it narrows extraction to those fields. WITHOUT one it is NOT a filter: the request may be REFUSED, and where accepted the names act only as a re-run key — the file is still read in full, other fields are still written, and named fields are not guaranteed to return.", - "type": "string" -} - removed
Input schema / properties / key_valuesRemoved value: -{ - "description": "metadata-set: JSON object of field-name -> value, max 100 entries, matching the workspace field VOCABULARY (list names with `metadata action=fields-list`) — NOT template fields; templates were removed. ADDITIVE: send ONLY the fields you are changing, and note it CANNOT clear a field (use metadata-delete with an explicit `keys` list).", - "type": "string" -} - removed
Input schema / properties / keysRemoved value: -{ - "description": "metadata-delete: JSON array of metadata keys to delete (omit to clear all).", - "type": "string" -} - removed
Input schema / properties / lock_tokenRemoved value: -{ - "description": "lock-release only — the token returned by lock-acquire. REQUIRED to release a lock.", - "type": "string" -} - removed
Input schema / properties / nameRemoved value: -{ - "description": "Name for new folder or file.", - "type": "string" -} - changed
Input schema / properties / name_match / descriptionPrevious value: -"auto (DEFAULT) | exact | prefix | contains | glob. exact = whole name; prefix = starts with; contains = substring — those three are LITERAL (* and ? are ordinary chars). glob = wildcards over the WHOLE name: *.pdf, report-*.xlsx. Do NOT pre-escape. Applies when search_in is filename or both; auto keeps today's relevance. Precise modes cap the pattern at 256 chars, reject an empty one."New value: +"auto (DEFAULT) | exact | prefix | contains | glob. exact = whole name; prefix = starts with; contains = substring — those three are LITERAL (* and ? are ordinary chars). glob = wildcards over the WHOLE name: *.pdf, report-*.xlsx. No pre-escaping needed. Applies when search_in is filename or both; auto keeps today's relevance. Precise modes cap the pattern at 256 chars, reject an empty one." - removed
Input schema / properties / new_nameRemoved value: -{ - "description": "New name for file or folder.", - "type": "string" -} - changed
Input schema / properties / node_id / descriptionPrevious value: -"Storage tree node opaque ID. Both files and folders are nodes — use this name regardless of which. Storage node opaque ID, or 'root'. On `list`, the target folder may also be given as parent_node_id or parent_id (aliases), and defaults to 'root' (the storage top level) when all three are omitted."New value: +"Storage node opaque ID (files and folders are both nodes), or 'root'. On `list`, the target folder may also be given as parent_node_id or parent_id (aliases), and defaults to 'root' (the storage top level) when all three are omitted." - removed
Input schema / properties / node_typeRemoved value: -{ - "description": "rename-only OPTIONAL hint: the node's type, when the caller already knows it. Notes route to a dedicated endpoint, so supplying node_type lets rename skip the /details/ type-probe round-trip. Omit to have rename probe automatically. Distinct from the list/recent `type` filter.", - "enum": [ - "file", - "folder", - "link", - "note" - ], - "type": "string" -} - changed
Input schema / properties / parent_node_id / descriptionPrevious value: -"Parent folder opaque ID, or 'root'. (On `list`, also accepted as an alias for node_id — the folder to list; `list` defaults to 'root' when omitted.)"New value: +"Parent folder opaque ID, or 'root'. On `list`, an alias for node_id." - changed
Input schema / properties / preview_type / descriptionPrevious value: -"Type of preview to generate. See describe for which preview_types apply to which file categories."New value: +"Preview kind; each applies only to compatible file categories (see describe)." - changed
Input schema / properties / profile_id / descriptionPrevious value: -"Polymorphic context ID (pair with profile_type=workspace|share). Typed aliases let you omit profile_type: workspace_id (⇒ workspace) / share_id (⇒ share, on dual-type actions); also context_id / instance_id. 19-digit workspace or share ID, or custom name."New value: +"Workspace or share ID (19-digit, or custom name); pair with profile_type. Typed aliases imply the type: workspace_id (workspace), share_id (share, dual-type actions); also context_id / instance_id." - changed
Input schema / properties / search_in / descriptionPrevious value: -"filename | content | both (DEFAULT). filename = name only, find-style. content = the AI's summary + semantic, NOT grep. OMIT unless you mean it — sending it changes the response shape (adds a search_metadata block); omitting reproduces today's behavior byte-for-byte. Pair filename with name_match."New value: +"filename | content | both (DEFAULT). filename = name only, find-style. content = the AI's summary + semantic, NOT grep. Sending it changes the response shape (adds a search_metadata block); omitting it reproduces today's behavior byte-for-byte. filename pairs with name_match." - changed
Input schema / properties / share_id / descriptionPrevious value: -"For add-link: the target share to link (workspace-only). For the dual-type actions (list/details/copy/move/etc.): a profile alias implying profile_type=share — the share you are operating in (so profile_type may be omitted)."New value: +"Alias for profile_id implying profile_type=share (dual-type actions)." - removed
Input schema / properties / target_parent_idRemoved value: -{ - "description": "Destination folder opaque ID, or 'root'.", - "type": "string" -} - removed
Input schema / properties / template_idRemoved value: -{ - "description": "RETIRED — metadata templates were removed, so there is no template to scope to. Supplying it FAILS the request: the platform hard-refuses it on metadata-extract, metadata-set and the search routes alike, and OPTIONS does not advertise it. Node metadata is written as facts against the workspace field vocabulary — use key_values to write, and extract_fields to scope an extraction.", - "type": "string" -} - removed
Input schema / properties / transfer_modeRemoved value: -{ - "description": "'copy' (default) or 'move'. 'move' invalid for node_id 'root'.", - "enum": [ - "copy", - "move" - ], - "type": "string" -} - removed
Input schema / properties / upload_idRemoved value: -{ - "description": "Opaque ID of completed upload session.", - "type": "string" -} - removed
Input schema / properties / version_idRemoved value: -{ - "description": "Version ID to restore.", - "type": "string" -} - changed
Input schema / properties / workspace_id / descriptionPrevious value: -"Alias for profile_id when the profile is a workspace — implies profile_type=workspace (so profile_type may be omitted). Valid on every storage action."New value: +"Alias for profile_id that implies profile_type=workspace. Valid on every action."
- Added
storage_manage - Changed
upload29 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "create-session", - "stream-upload", - "batch", - "chunk", - "stream", - "finalize", - "status", - "cancel", - "list-sessions", - "cancel-all", - "chunk-status", - "chunk-delete", - "web-import", - "web-list", - "web-cancel", - "web-status", - "limits", - "extensions", - "blob-info" -]New value: +[ + "describe", + "status", + "list-sessions", + "chunk-status", + "web-list", + "web-status", + "limits", + "extensions", + "blob-info" +] - removed
Input schema / properties / blob_idRemoved value: -{ - "description": "Blob ID from POST /blob — the **default source** for all file & binary uploads (no base64, no MCP size limit, up to 100 MB). Single-use.", - "type": "string" -} - removed
Input schema / properties / blob_refRemoved value: -{ - "description": "Alias for blob_id (deprecated). Accepted on chunk/stream/stream-upload only.", - "type": "string" -} - removed
Input schema / properties / chunk_numberRemoved value: -{ - "description": "1-indexed chunk number.", - "maximum": 9007199254740991, - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / chunk_sizeRemoved value: -{ - "description": "Chunk size in bytes (server picks default).", - "maximum": 9007199254740991, - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / contentRemoved value: -{ - "description": "**Text only** — stored verbatim UTF-8. This is for writing content you are composing **on the fly** directly through the MCP (a note, a generated report, a snippet you just produced) — NOT a fallback for uploading an existing file. Do NOT pass base64 here (use content_base64). One of content/content_base64/blob_id.", - "type": "string" -} - removed
Input schema / properties / content_base64Removed value: -{ - "description": "Base64-encoded **binary**, server-decoded. ⚠️ **LAST RESORT — expect FAILURE above a few MB** (~33% inflation + MCP transport cap). If POST /blob is unreachable that is almost always a CLIENT-SIDE FIREWALL/PROXY restriction, not a server limit — have the user allow /blob instead of falling back here. Use `blob_id` for any real file.", - "type": "string" -} - removed
Input schema / properties / context_idRemoved value: -{ - "description": "Alias for profile_id (either name works)", - "minLength": 1, - "type": "string" -} - removed
Input schema / properties / context_typeRemoved value: -{ - "description": "Alias for profile_type (either name works).", - "enum": [ - "workspace", - "share", - "fileshare" - ], - "type": "string" -} - removed
Input schema / properties / creatorRemoved value: -{ - "description": "Client identifier echoed back (alphanumeric + hyphens).", - "maxLength": 150, - "minLength": 1, - "type": "string" -} - changed
Input schema / properties / describe_action / descriptionPrevious value: -"When action='describe', narrow the output to ONE action's full params/notes (e.g. 'chunk'). Omit to get the compact action index."New value: +"With action='describe': return one action's params and notes instead of the action index." - removed
Input schema / properties / filenameRemoved value: -{ - "description": "File name. Optional when target_node_id is set (auto-resolved); pass to rename-on-replace.", - "type": "string" -} - removed
Input schema / properties / filesRemoved value: -{ - "description": "Batch manifest (1..200 entries). Each: filename + one of blob_id/content/content_base64.", - "items": { - "properties": { - "blob_id": { - "description": "Blob ID from POST /blob. One of blob_id/content/content_base64.", - "minLength": 1, - "type": "string" - }, - "content": { - "description": "Inline **text** content (verbatim UTF-8; ≤4 MB). Do NOT pass base64 here.", - "minLength": 1, - "type": "string" - }, - "content_base64": { - "description": "Inline **binary** as base64 (server-decoded; ≤4 MB).", - "minLength": 1, - "type": "string" - }, - "filename": { - "description": "File name (1-255 characters). An over-length name is a hard ERROR — the platform no longer truncates.", - "minLength": 1, - "type": "string" - }, - "hash": { - "description": "Hex hash digest. Both hash and hash_algo must be supplied together.", - "minLength": 1, - "type": "string" - }, - "hash_algo": { - "description": "Hash algorithm. Pair with hash.", - "enum": [ - "md5", - "sha1", - "sha256", - "sha384" - ], - "type": "string" - }, - "relative_path": { - "description": "Sub-folder path under folder_id (trailing slash auto-added; no leading slash, no '.' or '..').", - "minLength": 1, - "type": "string" - } - }, - "required": [ - "filename" - ], - "type": "object" - }, - "maxItems": 200, - "minItems": 1, - "type": "array" -} - removed
Input schema / properties / filesizeRemoved value: -{ - "description": "Total file size in bytes.", - "maximum": 9007199254740991, - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / folder_idRemoved value: -{ - "description": "Target folder OpaqueId or \"root\". Omit for instance root.", - "type": "string" -} - removed
Input schema / properties / hashRemoved value: -{ - "description": "File hash for verification.", - "type": "string" -} - removed
Input schema / properties / hash_algoRemoved value: -{ - "description": "Hash algorithm (e.g. 'sha256').", - "type": "string" -} - removed
Input schema / properties / if_version_idRemoved value: -{ - "description": "Compare-and-swap base for an overwrite. Enforced on EVERY update target — workspace, share and File Share. Pass the version id your edit was based on; record it on create-session/stream-upload (finalize does NOT read it). On a stale base the session ends assembly_failed with CONFLICT_VERSION_MISMATCH:<id> — rebase and retry. Omitting it is last-write-wins. See action=describe.", - "minLength": 1, - "type": "string" -} - removed
Input schema / properties / include_hashRemoved value: -{ - "description": "Compute SHA-256 client-side for entries without a hash (default true when omitted).", - "type": "boolean" -} - removed
Input schema / properties / max_sizeRemoved value: -{ - "description": "Stream-body byte ceiling — aborts mid-transfer if exceeded. Always overestimate; omit to use plan limit. Stream sessions only.", - "maximum": 9007199254740991, - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / parent_node_idRemoved value: -{ - "description": "Parent folder OpaqueId or \"root\". On create-session, stream-upload, and web-import, folder_id is accepted as an alias (either name works).", - "type": "string" -} - changed
Input schema / properties / password / descriptionPrevious value: -"File Share link password (profile_type=fileshare only). Forwarded ONLY as the x-ve-password header on every upload phase — never in a URL/log. Supply when the target share is password-protected."New value: +"File Share link password (profile_type=fileshare only). Sent only as the x-ve-password header on each call, never in a URL/log; needed when the target share is password-protected." - removed
Input schema / properties / profile_idRemoved value: -{ - "description": "Polymorphic context ID (pair with profile_type=workspace|share|fileshare). Typed aliases let you omit profile_type: workspace_id (⇒ workspace) / share_id (⇒ share); also context_id / instance_id. Target workspace/share ID, or the File Share id for a fileshare write-back. fileshare has NO typed alias — pass profile_type=fileshare explicitly.", - "type": "string" -} - removed
Input schema / properties / profile_typeRemoved value: -{ - "description": "Target type: workspace | share | fileshare (alias: context_type). Use `fileshare` ONLY for content write-back to a File Share's bound file (requires target_node_id = the bound node id from `fileshare details`; create-style new-file flows are rejected for fileshare).", - "enum": [ - "workspace", - "share", - "fileshare" - ], - "type": "string" -} - removed
Input schema / properties / share_idRemoved value: -{ - "description": "Alias for profile_id when the profile is a share — implies profile_type=share (so profile_type may be omitted).", - "type": "string" -} - removed
Input schema / properties / streamRemoved value: -{ - "description": "Stream mode — size optional, single POST, auto-finalizes.", - "type": "boolean" -} - removed
Input schema / properties / target_node_idRemoved value: -{ - "description": "Overwrite this specific node (preserves node_id; new version). When set, parent_node_id is ignored and filename is optional (auto-resolved). Must be a file node. REQUIRED for profile_type=fileshare write-back — set it to the File Share's bound node id (from `fileshare details` → fileshare.file.id).", - "minLength": 1, - "type": "string" -} - removed
Input schema / properties / urlRemoved value: -{ - "description": "Source URL to import from.", - "type": "string" -} - removed
Input schema / properties / workspace_idRemoved value: -{ - "description": "Alias for profile_id when the profile is a workspace — implies profile_type=workspace (so profile_type may be omitted).", - "type": "string" -}
- Added
upload_manage - Changed
user24 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Operation. Use 'describe' for full action reference."New value: +"Operation; 'describe' lists the actions." - changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "me", - "update", - "search-contacts", - "close", - "details-by-id", - "profiles", - "allowed", - "org-limits", - "list-shares", - "invitation-list", - "invitation-details", - "accept-all-invitations", - "asset-upload", - "asset-delete", - "asset-types", - "asset-list", - "report-bug" -]New value: +[ + "describe", + "me", + "search-contacts", + "details-by-id", + "profiles", + "allowed", + "org-limits", + "list-shares", + "invitation-list", + "invitation-details", + "asset-types", + "asset-list" +] - changed
Input schema / properties / archived / descriptionPrevious value: -"True for archived shares, false for active."New value: +"true: archived shares; false: active." - removed
Input schema / properties / asset_nameRemoved value: -{ - "description": "Asset type name (e.g. profile_pic).", - "type": "string" -} - removed
Input schema / properties / blobRemoved value: -{ - "description": "report-bug: plain-text excerpt (error body, short log), max 32 KB. No secrets or file content.", - "type": "string" -} - removed
Input schema / properties / categoryRemoved value: -{ - "description": "report-bug: area of the suspected platform defect.", - "enum": [ - "api", - "mcp", - "docs", - "auth", - "storage", - "ai", - "billing", - "other" - ], - "type": "string" -} - removed
Input schema / properties / confirmationRemoved value: -{ - "description": "Email or user ID confirmation for account close.", - "type": "string" -} - removed
Input schema / properties / contentRemoved value: -{ - "description": "Plain text content for asset upload.", - "type": "string" -} - removed
Input schema / properties / content_base64Removed value: -{ - "description": "Base64-encoded binary content.", - "type": "string" -} - removed
Input schema / properties / content_typeRemoved value: -{ - "description": "MIME type.", - "type": "string" -} - changed
Input schema / properties / describe_action / descriptionPrevious value: -"When action='describe', narrow the output to ONE action's full params/notes (e.g. 'me'). Omit to get the compact action index."New value: +"With action='describe': return one action's params and notes instead of the action index." - removed
Input schema / properties / descriptionRemoved value: -{ - "description": "report-bug: what you did, steps, expected vs actual. Max 8 KB. No secrets.", - "type": "string" -} - changed
Input schema / properties / display_limit / descriptionPrevious value: -"How many items to return. Default 10, max 500. The MCP trims post-fetch; backend page_size stays MCP-internal so the platform cache stays warm. Applies to list-shares."New value: +"list-shares row cap (default 10, max 500), applied after the fetch." - removed
Input schema / properties / email_addressRemoved value: -{ - "description": "Email address.", - "type": "string" -} - removed
Input schema / properties / endpointRemoved value: -{ - "description": "report-bug: failing call as 'METHOD /path' — no host, no query string.", - "type": "string" -} - removed
Input schema / properties / error_codeRemoved value: -{ - "description": "report-bug: numeric error code of the failing call.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" -} - removed
Input schema / properties / filenameRemoved value: -{ - "description": "Original filename.", - "type": "string" -} - removed
Input schema / properties / first_nameRemoved value: -{ - "description": "Given name.", - "type": "string" -} - removed
Input schema / properties / http_statusRemoved value: -{ - "description": "report-bug: HTTP status of the failing call.", - "maximum": 599, - "minimum": 100, - "type": "integer" -} - removed
Input schema / properties / idempotency_keyRemoved value: -{ - "description": "report-bug: 16-64 chars [A-Za-z0-9_-]. Generated when omitted and returned — reuse it on a manual retry.", - "type": "string" -} - removed
Input schema / properties / last_nameRemoved value: -{ - "description": "Family name.", - "type": "string" -} - removed
Input schema / properties / occurred_atRemoved value: -{ - "description": "report-bug: when it happened, 'YYYY-MM-DD HH:MM:SS UTC' (last 30 days).", - "type": "string" -} - removed
Input schema / properties / request_idRemoved value: -{ - "description": "report-bug: request_id from the failed tool result (the call's x-ve-reqid).", - "type": "string" -} - removed
Input schema / properties / titleRemoved value: -{ - "description": "report-bug: one-line summary, 1-200 chars.", - "type": "string" -}
- Added
user_manage - Changed
workspace20 fields changed- removed
Input schema / properties / accent_colorRemoved value: -{ - "description": "Brand accent color JSON. \"null\" to clear.", - "type": "string" -} - changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "list", - "details", - "update", - "delete", - "archive", - "unarchive", - "members", - "list-shares", - "import-share", - "available", - "check-name", - "create-note", - "update-note", - "read-note", - "quickshare-get", - "quickshare-delete", - "quickshares-list", - "jobs-status", - "enable-import", - "disable-import" -]New value: +[ + "describe", + "list", + "details", + "members", + "list-shares", + "available", + "check-name", + "read-note", + "quickshare-get", + "quickshares-list", + "jobs-status" +] - removed
Input schema / properties / background_color1Removed value: -{ - "description": "Background color 1 JSON. \"null\" to clear.", - "type": "string" -} - removed
Input schema / properties / background_color2Removed value: -{ - "description": "Background color 2 JSON. \"null\" to clear.", - "type": "string" -} - removed
Input schema / properties / blob_idRemoved value: -{ - "description": "Blob ID from POST /blob. Preferred for large note content (UTF-8 decoded). Single-use.", - "type": "string" -} - removed
Input schema / properties / blob_refRemoved value: -{ - "description": "Alias for blob_id (deprecated).", - "type": "string" -} - changed
Input schema / properties / check_org_id / descriptionPrevious value: -"Org ID for check-name — suggests org-prefixed alternative if name taken."New value: +"Org ID for check-name (required — you must be a member). Suggests an org-prefixed alternative if the name is taken." - removed
Input schema / properties / confirmRemoved value: -{ - "description": "Must match folder_name or numeric ID.", - "type": "string" -} - removed
Input schema / properties / contentRemoved value: -{ - "description": "Plain text/markdown. Notes: max 102400 bytes (100 KiB) — use blob_id for larger.", - "type": "string" -} - changed
Input schema / properties / describe_action / descriptionPrevious value: -"When action='describe', narrow the output to ONE action's full params/notes (e.g. 'list'). Omit to get the compact action index."New value: +"With action='describe': return one action's params and notes instead of the action index." - removed
Input schema / properties / descriptionRemoved value: -{ - "description": "Description. Newlines allowed. Send \"null\"/\"\" to clear on update.", - "maxLength": 2000, - "type": "string" -} - removed
Input schema / properties / folder_nameRemoved value: -{ - "description": "URL-safe workspace folder name (4-80 chars).", - "maxLength": 80, - "minLength": 4, - "type": "string" -} - removed
Input schema / properties / intelligenceRemoved value: -{ - "description": "Toggle AI features. ⚠️ COSTS CREDITS (10/page) — only enable on explicit user request. Disable flushes embeddings; re-enable re-indexes. Rate-limited.", - "enum": [ - "true", - "false" - ], - "type": "string" -} - removed
Input schema / properties / nameRemoved value: -{ - "description": "Name. Send \"null\" to clear on update.", - "maxLength": 255, - "minLength": 1, - "type": "string" -} - removed
Input schema / properties / note_nameRemoved value: -{ - "description": "Note filename (must end with .md).", - "type": "string" -} - removed
Input schema / properties / owner_definedRemoved value: -{ - "description": "Custom properties JSON. \"null\"/\"\" to clear.", - "type": "string" -} - removed
Input schema / properties / parent_idRemoved value: -{ - "description": "Parent folder opaque ID or 'root'.", - "type": "string" -} - removed
Input schema / properties / perm_joinRemoved value: -{ - "description": "Who can join the workspace.", - "enum": [ - "Only Org Owners", - "Admin or above", - "Member or above" - ], - "type": "string" -} - removed
Input schema / properties / perm_member_manageRemoved value: -{ - "description": "Who can manage members.", - "enum": [ - "Admin or above", - "Member or above" - ], - "type": "string" -} - removed
Input schema / properties / share_idRemoved value: -{ - "description": "19-digit numeric ID or custom name of share to import.", - "type": "string" -}
- Added
workspace_manage
1 tool update
- Changed
user11 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "me", - "update", - "search-contacts", - "close", - "details-by-id", - "profiles", - "allowed", - "org-limits", - "list-shares", - "invitation-list", - "invitation-details", - "accept-all-invitations", - "asset-upload", - "asset-delete", - "asset-types", - "asset-list" -]New value: +[ + "describe", + "me", + "update", + "search-contacts", + "close", + "details-by-id", + "profiles", + "allowed", + "org-limits", + "list-shares", + "invitation-list", + "invitation-details", + "accept-all-invitations", + "asset-upload", + "asset-delete", + "asset-types", + "asset-list", + "report-bug" +] - added
Input schema / properties / blobAdded value: +{ + "description": "report-bug: plain-text excerpt (error body, short log), max 32 KB. No secrets or file content.", + "type": "string" +} - added
Input schema / properties / categoryAdded value: +{ + "description": "report-bug: area of the suspected platform defect.", + "enum": [ + "api", + "mcp", + "docs", + "auth", + "storage", + "ai", + "billing", + "other" + ], + "type": "string" +} - added
Input schema / properties / descriptionAdded value: +{ + "description": "report-bug: what you did, steps, expected vs actual. Max 8 KB. No secrets.", + "type": "string" +} - added
Input schema / properties / endpointAdded value: +{ + "description": "report-bug: failing call as 'METHOD /path' — no host, no query string.", + "type": "string" +} - added
Input schema / properties / error_codeAdded value: +{ + "description": "report-bug: numeric error code of the failing call.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Input schema / properties / http_statusAdded value: +{ + "description": "report-bug: HTTP status of the failing call.", + "maximum": 599, + "minimum": 100, + "type": "integer" +} - added
Input schema / properties / idempotency_keyAdded value: +{ + "description": "report-bug: 16-64 chars [A-Za-z0-9_-]. Generated when omitted and returned — reuse it on a manual retry.", + "type": "string" +} - added
Input schema / properties / occurred_atAdded value: +{ + "description": "report-bug: when it happened, 'YYYY-MM-DD HH:MM:SS UTC' (last 30 days).", + "type": "string" +} - added
Input schema / properties / request_idAdded value: +{ + "description": "report-bug: request_id from the failed tool result (the call's x-ve-reqid).", + "type": "string" +} - added
Input schema / properties / titleAdded value: +{ + "description": "report-bug: one-line summary, 1-200 chars.", + "type": "string" +}
1 tool update
- Changed
event4 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "describe", - "search", - "summarize", - "details", - "acknowledge", - "activity-list", - "activity-poll", - "dashboard-list", - "dashboard-dismiss", - "dashboard-undismiss" -]New value: +[ + "describe", + "search", + "summarize", + "details", + "acknowledge", + "activity-list", + "activity-poll", + "dashboard-list", + "dashboard-dismiss", + "dashboard-undismiss", + "changes" +] - changed
Input schema / properties / cursor / descriptionPrevious value: -"Last activity timestamp for incremental polling."New value: +"changes: the opaque feed cursor from the previous response — send it back unchanged; omit to bootstrap. activity-list: last activity timestamp for incremental polling." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-250, default 100)."New value: +"Max results (1-250; default 100, changes: 250)." - changed
Input schema / properties / org_id / descriptionPrevious value: -"Filter by organization profile ID."New value: +"Organization profile ID (19-digit). Filter for search/summarize; the org to read for changes."
1 tool update
- Added
sign
Related MCP Connectors
Persistent file storage for AI agents via MCP and curl. Upload, download, and version files.
Securely search and manage workspace context files for AI agents and teams.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
An agent-first office suite Claude & ChatGPT read and write over one MCP URL.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants like Claude, Cursor, VS Code, and Windsurf to manage workspaces, projects, tasks, and AI agents through natural language, with a hosted OAuth server or a local stdio package. Also supports generating MCP tools from any OpenAPI spec.1,264 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants and teams to collaborate in a shared workspace by building and querying tables, writing documents, uploading files, and publishing live dashboards through any MCP-compatible client.2MIT
- AlicenseNot gradedqualityAmaintenanceConnects a workspace and project management platform to Claude, Cursor, VS Code, Windsurf, and other MCP clients, letting users list workspaces, create and manage projects and tasks, and build, train, and prompt AI agents. Also generates MCP tools from any OpenAPI spec.1,264 npmMIT
- AlicenseNot gradedqualityBmaintenanceConnects MCP-compatible AI clients and agents to one durable Project Brain plus controlled access to authorized project folders on your own machine. Enables file editing, terminal and Git operations, project intelligence, browser automation, and local MCP server federation, all scoped to explicit workspace grants.28 npmApache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.