PrivacyFence
OfficialSearch and read Confluence pages and attachments; create and update pages.
Search and read Gmail messages, threads, and attachments; create drafts and replies, manage labels and filters, and archive messages. No tool sends email.
Read and write Google Apps Script project source; read the result of a run you started, without running scripts itself.
Read Google Calendar events, free/busy status, and rooms; create, update, and delete events; manage out-of-office and working location.
Search, read, download, upload, move, and write Google Drive files; edit and format Google Docs; read, write, and format Google Sheets.
Read, create, update, comment on, and transition Jira issues.
Read Salesforce records, search, and run reports in a read-only manner.
List and read Slack channels, DMs, and threads; search; send messages; start group chats.
Read and search Telegram chats; send messages.
PrivacyFence
AI access without giving AI the keys. Approve the sensitive. Automate the routine.
PrivacyFence is an open-source privacy and approval gateway between AI assistants and your business systems. It connects MCP-compatible assistants such as Claude Desktop and Claude Code to Gmail, Google Drive, Calendar, Slack, Salesforce, Jira, Confluence, Telegram, and more.
PrivacyFence enforces, independently of the AI, what an assistant may see and do. Sensitive reads and consequential actions require human approval, while routine requests can be automated by policy. Optional PII detection runs locally before personal data reaches the AI, and every decision is audited.
PrivacyFence runs on an employee’s own computer (macOS, Windows, or Linux) or as a central deployment on infrastructure the organization controls, allowing web clients such as claude.ai to connect as well. Connector credentials stay with PrivacyFence, never with the AI client, and no data passes through PrivacyFence-operated servers — there are none.
Website: privacyfence.eu · Download: privacyfence.eu/download · Docs: privacyfence.eu/docs
Why
Giving an AI assistant access to Gmail, Drive, Slack or Salesforce usually means giving it a standing permission and trusting it to use that permission well. Being allowed to read a record is not the same as wanting it sent to an AI, and a tool name in a client's prompt says little about what is about to change. PrivacyFence puts an independent control point between the assistant and your systems: the AI asks, PrivacyFence decides, and you see what is at stake before it happens.
Related MCP server: mcpgate
What it does
Human approval for sensitive reads and for writes, on cards that show the actual content or change, who is asking and why — not a raw tool name or JSON payload.
Local PII detection before a read reaches the AI: likely personal data is highlighted, and it sends the request to a card even when a rule would have let it through.
Policy-based automation: narrow always-allow rules (a sender domain, a Drive folder, a Slack channel, a Jira project) let routine requests run without a card.
An audit log of every accepted, denied and automatically approved request, chained so that an edit made without its key is detected.
Credentials stay with PrivacyFence. On a packaged install it runs under its own service account, so the AI client, which runs as you, cannot read them or approve its own request.
A defined set of connectors, each tool with a gate fixed in code. PrivacyFence is not a generic proxy for arbitrary MCP tools.
How it works
Claude Desktop connects through the PrivacyFence extension (PrivacyFence.mcpb); Claude Code and
other clients that speak Streamable HTTP connect to the local /mcp endpoint directly; in an
organization deployment, clients such as claude.ai, ChatGPT (Developer Mode) and Gemini Enterprise
sign in with OAuth through the organization's identity provider. How it works walks one read and one
write through, card by card.
Platforms
Install | Runs on |
macOS ( | macOS 13 or newer, Apple silicon |
Windows ( | Windows 10 / Windows Server 2016 or newer, x64 |
Linux ( | Ubuntu 24.04, Debian 13 or newer, amd64 |
Organization deployment | A Linux server with Python 3.11 or newer and systemd ( |
Tested with Claude Desktop and Claude Code on every install, with ChatGPT desktop on macOS, and with claude.ai, ChatGPT (Developer Mode) and Gemini Enterprise through an organization deployment; any MCP-compatible client can connect. See Platform support.
Connectors
Connector | What an AI client can do through it |
Gmail | Search and read messages, threads and attachments; create drafts and replies, labels, filters; archive. No tool sends email. |
Google Drive, Docs & Sheets | Search, read, download, upload, move and write files; edit and format Docs; read, write and format Sheets |
Google Calendar | Read events, free/busy and rooms; create, update and delete events; out-of-office and working location |
Google Contacts, Tasks | Read, create and update contacts and tasks |
Google Apps Script | Read and write project source; read the result of a run you started (PrivacyFence never runs scripts) |
Slack | List and read channels, DMs and threads; search; send messages; start group chats |
Telegram | Read and search chats; send messages |
Salesforce | Read records, search, run reports; create and update records |
Jira | Read, create, update, comment on and transition issues |
Confluence | Search and read pages and attachments; create and update pages |
Jira Assets | Browse schemas, object types and attributes; search and read objects, linked objects and connected tickets; export to CSV/JSON (read-only) |
Grist | List documents and tables; read records after review; add and update records, add tables and columns (nothing is deleted) |
Peek | List your shared HTML pages and their versions; read comments, visit counts and who has access after review; publish pages and new versions, choose who can open them, rename, comment on and delete them |
Miro | List boards and tags; read items and connector lines after review; add and change sticky notes, cards, texts, shapes, frames and connector lines with approval (nothing is deleted) |
Connectors summarizes what each one reviews and which writes need approval; the Tools reference lists every tool and its gate.
Quick start
Download the installer for your platform from privacyfence.eu/download and run it.
Sign out and back in once, so your account's new group membership takes effect.
Add a passkey when the companion app (menu bar, tray, or applications menu) asks, and keep the recovery code.
Open Settings from the companion and connect your services.
Connect Claude Desktop with
PrivacyFence.mcpb, or Claude Code with the/mcpendpoint.Ask your assistant for something, and approve it on the card.
Step by step for each platform: Getting started, then macOS, Windows or Linux. For claude.ai, ChatGPT or a whole team, see Organization deployment.
Documentation
Approvals and policy: cards, the PII check, always-allow rules, the privacy filter
How it works: the daemon, the MCP endpoint, PrivacyFence's own tools, unattended sessions
Configuration reference: every
settings.yamland organization-bundle keyOrganization deployment: running PrivacyFence centrally
Security and compliance: trust boundary, privilege separation, audit log
All published docs: privacyfence.eu/docs. Contributing: CONTRIBUTING.md. Changes per release: CHANGELOG.md.
Limitations
PrivacyFence is independent open-source software, not a certified compliance product. It has no
certification, business-continuity plan or SLA, and does not by itself make a deployment compliant
with any regulation. It does not protect against root or a local Administrator, or against local
code on an install that is not packaged (a source checkout or a pip install). A process running
as you can read the local review screen, though not approve from it, and in local mode the name an
AI client gives is never verified. The full list is
What PrivacyFence does not claim.
To report a vulnerability, see SECURITY.md.
License
Available Tools
180 toolsapps_script_get_contentARead-onlyIdempotent
Fetch the full source of a Google Apps Script project -- every file (.gs/.html) plus the appsscript.json manifest. Returns {script_id, files}, where files is a list of {name, type, source} and type is 'SERVER_JS', 'HTML' or 'JSON'. Get the script id from apps_script_list_projects, and change the source with apps_script_write_content. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| script_id | Yes | Id of the script project, from apps_script_list_projects (its id field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, and the description adds meaningful context that isn't in them: 'Requires user approval' and the concrete return structure ({script_id, files} with {name, type, source} and enum values). That is real behavioral disclosure beyond the structured fields.
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, front-loaded with the action and scope, then the return shape, then routing and approval. Every clause carries information; 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?
With no output schema, the description compensates by describing the exact return object and type values, and it covers the approval requirement and sibling routing. An agent has everything needed to call 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 description coverage is 100%, so both parameters (script_id, reason) are already documented in the schema, including script_id's provenance. The description echoes the script_id source but adds no syntax or format detail beyond what the schema provides; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Fetch the full source of a Google Apps Script project') and pins the scope explicitly (every .gs/.html file plus appsscript.json manifest). It even enumerates the return shape, so an agent can distinguish it from apps_script_list_projects and apps_script_write_content without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent on both sides: where the script_id comes from (apps_script_list_projects) and which sibling to use to modify source (apps_script_write_content). It also flags the approval prerequisite. It stops short of explicit when-not/exclusion guidance, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apps_script_get_execution_logARead-onlyIdempotent
Read the result of the most recent run(s) of a script that the user triggered themselves outside PrivacyFence (status, duration, which function ran) -- not a live console.log transcript. Returns a list of {function_name, status, start_time, duration, process_type}, where status is for example COMPLETED, FAILED, RUNNING or TIMED_OUT and duration is like '1.234s'. Reads up to max_results items across pages. Get the script id from apps_script_list_projects. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| script_id | Yes | Id of the script project, from apps_script_list_projects (its id field). | |
| max_results | No | Most runs to return. Default 10, capped at 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only safety, idempotency, and non-destructiveness. The description adds meaningful behavioral context beyond those annotations: pagination behavior via max_results, the user-approval requirement, the fact that these are user-triggered runs, and the shape/status values of the returned records.
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 with the core action and scope, then moves through return shape, pagination, prerequisite, and approval requirement. It is information-dense and mostly earns its length, though the single dense paragraph could be slightly easier to scan.
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, so the description appropriately explains the returned list shape, status examples, and duration format. Combined with the annotations and fully documented input schema, it gives the agent enough context to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents script_id, reason, and max_results thoroughly. The description reinforces that script_id comes from apps_script_list_projects and mentions max_results paging, but adds little semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: reading execution-log results for a script run outside PrivacyFence. It distinguishes the tool from a live console.log transcript and lists the exact return fields, so an agent can identify what the tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool applies: recent user-triggered runs outside PrivacyFence, not a live transcript. It also tells the agent where to obtain script_id and that user approval is required. It does not name an explicit alternative tool for live-log scenarios, but it does provide the key usage conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apps_script_list_projectsARead-onlyIdempotent
List standalone Google Apps Script projects visible to the user (id, name, last-modified time). Container-bound scripts attached to a Sheet/Doc/Form are not returned. Returns a list of {id, name, created_time, modified_time}, in Drive's order. Reads up to max_results items across pages. Pass an id as script_id to apps_script_get_content and the other Apps Script tools. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Most projects to return. Default 50, capped at 1000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real value beyond that: the container-bound exclusion rule, that results come back in Drive's order, that it paginates across pages, and the operational note that the call is auto-approved.
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?
Five tight sentences, front-loaded with scope and the exclusion rule, then return shape, pagination, and routing. Every sentence earns its place with no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields {id, name, created_time, modified_time} and the ordering. Combined with the exclusions, pagination note, and sibling routing, an agent has everything needed to call it and use the result.
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 defines both parameters. The description nonetheless adds meaning the schema lacks: that max_results is honored across pagination ('Reads up to max_results items across pages'), which clarifies the truncation behavior of the required cap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List standalone Google Apps Script projects') and immediately bounds the scope by excluding container-bound scripts attached to Sheets/Docs/Forms. This lets an agent distinguish it from sibling tools like apps_script_get_content and drive_list_files without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: it lists only standalone projects and explicitly routes the agent forward ('Pass an id as script_id to apps_script_get_content and the other Apps Script tools'). It does not name a competing list tool or state when-not-to-use, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apps_script_write_contentA
Write new source to a Google Apps Script project. Replaces the project's entire file set -- there is no single-file/partial update, so always pass every file the project should have afterward, not just the ones you changed (fetch the current set with apps_script_get_content first if you need to preserve files you aren't touching). This only writes source -- PrivacyFence never runs the script; the user runs it themselves in the Apps Script editor once this write is approved. Returns {script_id, file_count}, the number of files now in the project. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | JSON array of {"name": str, "type": "SERVER_JS"|"HTML"|"JSON", "source": str}, one entry per file (a JSON manifest file is named "appsscript" with type "JSON"). Replaces the project's whole file set: any file left out is deleted. Must be valid JSON with at least one file. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| script_id | Yes | Id of the script project to overwrite, from apps_script_list_projects (its id field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that omitted files are deleted, that nothing is executed by PrivacyFence, that the write requires user approval, and even the return shape {script_id, file_count}. Annotations only supply readOnlyHint=false, idempotentHint=false, destructiveHint=false; the description's explicit 'any file left out is deleted' is strictly more informative, though it sits in tension with destructiveHint=false and the description could have noted the tension explicitly.
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 the core action and the destructive-replacement caveat before the lower-priority details. Every sentence carries load, though the parenthetical about fetching current content and the trailing approval sentence could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter destructive write with no output schema, the description covers what an agent needs: the replacement semantics, the pre-fetch step, the approval gate, the fact that execution is out of scope, and the returned fields. Nothing material is left for the agent to infer.
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 script_id, files, and reason fully. The description reinforces the 'whole file set, not just changed files' semantics of `files`, but adds no syntax or format detail beyond what the schema provides. Baseline 3 is appropriate 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 (write new source to an Apps Script project) and immediately distinguishes itself from siblings by declaring it is a full-file-set replacement, not a partial edit. An agent can tell it apart from apps_script_get_content and drive_write_doc_content without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it and how to use it safely: pass every file the project should have, fetch the current set with apps_script_get_content first if you aren't touching other files. It also sets expectations about the downstream step (the user runs the script themselves in the editor) and the approval requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_export_objectsARead-onlyIdempotent
Write every Jira Assets object an AQL query matches, up to 10,000, to a CSV or JSON file on the user's computer, in one approval. Columns: id, key, label, type, then every attribute name; a multi-value cell joins its values with "; ". Returns {rows, columns, sha256, path, name, size_bytes, delivery}, never the objects. A query matching no object writes no file and returns rows 0. Use assets_search_objects to read a few objects in the reply. On an organization-managed install nothing is saved to destination_dir: the result carries a one-time download_url instead. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| aql | Yes | AQL query selecting the objects to export, for example: objectType = "Contract". At most 4000 characters. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_name | No | File name ending in .csv or .json, which picks the format. Empty means assets-objects.csv. | |
| destination_dir | Yes | Folder on the user's computer to write the file to, absolute or starting with ~/. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the 10,000-row cap, the exact column layout and multi-value join delimiter, that the objects themselves are never returned (only a summary payload), the no-match behavior (no file, rows 0), the org-managed download_url fallback, and the approval requirement. The read/write semantics are disclosed clearly enough to reconcile with readOnlyHint/destructiveHint=false (nothing remote is mutated or destroyed).
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 action and cap come first, then output shape, then edge cases and the alternative tool. Every sentence carries a distinct fact (cap, columns, return payload, no-match, org-managed fallback, approval) with no repetition of the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return contract itself ({rows, columns, sha256, path, name, size_bytes, delivery}), plus the failure/edge behavior and the org-managed variant. For an export tool with user-approval and environment-dependent delivery, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters including the .csv/.json format selection and the empty-file_name default. The description reinforces output-shape semantics (columns, multi-value join) but adds no parameter syntax or constraints beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: writes every Jira Assets object matching an AQL query, capped at 10,000, to a CSV/JSON file. It also explicitly distinguishes itself from the sibling assets_search_objects for reading a few objects, 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 explicit when-to-use (bulk export via AQL), when-not (use assets_search_objects to read a few objects in the reply), and prerequisites (requires user approval; on org-managed installs nothing lands in destination_dir and a one-time download_url is returned instead). Also defines the zero-match case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_get_connected_ticketsARead-onlyIdempotent
List the Jira tickets connected to one Jira Assets object. Returns {object: {id, key, label, type}, tickets: [{key, summary, status, issue_type, priority}]}. Use assets_get_object to read the object itself. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| object_id | Yes | Numeric id of the object, as assets_search_objects returns it in id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context beyond annotations: the approval requirement and the exact return payload shape. It does not mention pagination or result caps, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and resource, then the return shape, then the disambiguation and prerequisite. No filler, and each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return structure inline, plus the approval prerequisite and the sibling alternative. Nothing an agent needs to invoke this read-only lookup correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both object_id and reason are already documented in the schema, and the description adds no format or sourcing detail beyond 'one Jira Assets object'. Baseline 3 applies when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the Jira tickets connected to one Jira Assets object') with an explicit cardinality scope of one object. It also names the sibling it is not ('Use assets_get_object to read the object itself'), so an agent can distinguish 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?
It explicitly routes the agent to assets_get_object when the object itself (not its connected tickets) is wanted, and flags the 'Requires user approval' prerequisite. It lacks an explicit negative case for this tool (e.g., when tickets are not the right resource), but the selection guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_get_objectARead-onlyIdempotent
Read one Jira Assets object with every attribute value and its outbound references. Returns {id, key, label, type, type_id, schema_id, created, updated, attributes, references}. Use assets_search_objects to find the object id, and assets_get_related_objects to follow its links. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| object_id | Yes | Numeric id of the object, as assets_search_objects returns it in id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/non-destructive profile, so the bar is lower. The description adds genuinely new context: the 'Requires user approval' gate, and it enumerates the returned fields, which is valuable given no output schema exists.
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: purpose first, then the return shape, then routing and the approval note. 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?
With no output schema, the explicit return-field list is exactly what the agent needs, and the approval requirement plus sibling routing round out the picture. Nothing essential is missing for a read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents object_id (with its origin) and reason. The description adds nothing about parameter syntax or format beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read), resource (one Jira Assets object), and scope (every attribute value and its outbound references). This cleanly distinguishes it from siblings like assets_search_objects and assets_get_related_objects.
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 exact prerequisite tool (assets_search_objects to find the object id) and the follow-up alternative (assets_get_related_objects to follow links). This gives the agent explicit routing without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_list_attributesARead-onlyIdempotent
List the attribute definitions of one Jira Assets object type, including which attributes reference other object types. Returns a list of {id, name, kind, value_type, reference_type_id, reference_type_name, reference_kind, min_cardinality, max_cardinality, is_label}; system attributes are left out. Use assets_list_object_types to find the type id, and assets_search_objects to read objects of that type. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| object_type_id | Yes | Numeric id of the object type, as assets_list_object_types returns it in id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint and destructiveHint=false, so the safety profile is covered. The description still adds real behavioral context beyond that: the exact return shape, the exclusion of system attributes, and the 'Auto-approved' approval status. No pagination or rate-limit notes, which keeps 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 the core action, then return fields, then exclusions, then routing. Every clause carries information and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields, and it names the prerequisite and follow-up tools. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented in the schema, and the description's pointer to assets_list_object_types for the id largely duplicates the object_type_id schema text. The 'reason' parameter is not elaborated on at all, 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 and resource ('List the attribute definitions of one Jira Assets object type') and adds the distinguishing scope note that it includes reference attributes while excluding system attributes. An agent can distinguish this from assets_list_object_types and assets_search_objects without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the sibling to call first for the type id (assets_list_object_types) and the sibling for reading the objects themselves (assets_search_objects), giving a clear workflow position for this tool. Nothing about when to reach for it 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.
assets_list_object_typesARead-onlyIdempotent
List the object types in one Jira Assets schema. Returns a list of {id, name, parent_id, description, object_count}. Use assets_list_schemas to find the schema id, and assets_list_attributes to see the attributes of one type. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| schema_id | Yes | Numeric id of the schema, as assets_list_schemas returns it in id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuine extra context by disclosing the exact return fields and the 'Auto-approved' approval behavior, though it omits pagination or size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences: purpose first, return shape second, navigation third. Every sentence earns its place with no redundant restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description enumerates the returned fields and supplies the upstream and downstream tool context, so an agent has everything needed to call 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 description coverage is 100% with only two well-documented parameters, so the schema already carries the semantics. The description implies schema_id scoping but adds no format or syntax detail beyond the schema, making baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope ('List the object types in one Jira Assets schema'), and even enumerates the returned shape {id, name, parent_id, description, object_count}. An agent can distinguish this from assets_list_attributes and assets_search_objects immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the prerequisite tool (assets_list_schemas to find the schema id) and the follow-up alternative (assets_list_attributes), giving a full navigation path. Nothing about when to use this vs siblings 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.
assets_list_schemasARead-onlyIdempotent
List the Jira Assets object schemas on the connected Atlassian site. Returns a list of {id, name, key, description, object_count, object_type_count}, at most max_results entries. Use assets_list_object_types to see what a schema contains. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Maximum number of schemas to return, 1 to 100. Default 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely new context: the return shape (id, name, key, description, object_count, object_type_count), the max_results truncation behavior, and the 'Auto-approved' approval status.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with no filler: purpose and scope first, then return shape and limit, then the drill-down hint. Every sentence contributes 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?
There is no output schema, so the inline description of returned fields is essential and present, and the safety profile is fully covered by annotations. Nothing needed to call this read-only list tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, both parameters are already fully documented in the schema, and the description only restates the max_results cap ('at most max_results entries') without adding format or edge-case meaning. Baseline 3 is correct when the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Jira Assets object schemas) with an explicit scope (the connected Atlassian site). It also enumerates the returned fields, so an agent can distinguish it from sibling readers like assets_search_objects or assets_get_object without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear next-step context by pointing to assets_list_object_types to inspect schema contents, which routes drill-down behavior. It stops short of explicitly contrasting with assets_search_objects or stating when *not* to call this, so it is clear context rather than full 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.
assets_search_objectsARead-onlyIdempotent
Search Jira Assets objects with an AQL query and return them with their attribute values. Returns a list of {id, key, label, type, type_id, schema_id, created, updated, attributes, references}, at most max_results entries. Use assets_get_object to read one object by id, assets_export_objects to write a large result to a file, and assets_list_attributes to see which attributes a type has. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| aql | Yes | AQL query, for example: objectType = "Contract" AND Name LIKE "ACME". At most 4000 characters. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Maximum number of objects to return, 1 to 100. Default 25. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read/idempotent/non-destructive profile, but the description adds two things they do not: a 'Requires user approval' gating requirement and the concrete shape of the returned list. With no output schema, enumerating the return fields is genuinely load-bearing context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose, then return shape, then sibling routing, then the approval caveat. The one verbose element (the field list) substitutes for a missing output schema, so it 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 3-parameter query tool with no output schema, the description covers purpose, return contents, result-size cap, alternative tools, and the approval requirement. Nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so aql, reason, and max_results are already fully documented in the schema; the description only echoes the max_results cap ('at most max_results entries'). It adds no syntax or format meaning beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (Jira Assets objects) plus the mechanism (AQL query) and what is returned (objects with attribute values). This cleanly separates it from assets_get_object, assets_export_objects, and assets_list_attributes, which it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to alternatives with the condition for each: assets_get_object for a single object by id, assets_export_objects when the result is large, assets_list_attributes to discover a type's attributes. This is the when-to-use-an-alternative guidance the rubric asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_create_eventA
Create a new calendar event. Returns {id, title, start_time, end_time, html_link}, plus conference_link when a Google Meet was added. Timed events only: all-day events cannot be created. Use calendar_create_out_of_office for time off, calendar_list_rooms to find rooms to book and calendar_list_colors for color ids. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | Event color id (1-11) or name, e.g. "Tomato" -- see calendar_list_colors. Empty uses the calendar's default color. | |
| rooms | No | Comma-separated room resource email addresses to book, from calendar_list_rooms (its resource_email field). Empty books no room. | |
| title | Yes | Title of the event, as shown on the calendar. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| end_time | Yes | End as an RFC 3339 timestamp, same format as start_time; must be after it. | |
| location | No | Free-text location of the event. Empty means none. | |
| attendees | No | Comma-separated email addresses of the guests to invite, e.g. 'a@example.com,b@example.com'. Empty invites nobody. | |
| recurrence | No | RRULE line(s) to make this a recurring event, e.g. "RRULE:FREQ=WEEKLY;COUNT=10". One rule per line for more than one (RRULE plus EXDATE/RDATE/EXRULE). Omit for a non-recurring event. | |
| start_time | Yes | Start as an RFC 3339 timestamp, e.g. '2026-10-15T09:00:00+02:00'. A time without an offset is read as UTC. Date-only values are not accepted. | |
| calendar_id | Yes | Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar. | |
| description | No | Free-text description of the event. Empty means none. | |
| add_google_meet | No | Set to true to add a Google Meet video conference link |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the safety profile is covered. The description adds real context beyond them: the exact return shape including conditional conference_link, the all-day limitation, and a user-approval gate. It does not disclose side effects such as invitations being emailed to attendees, which keeps 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?
Four front-loaded sentences, each earning its place: purpose, return payload, scope constraint, sibling routing, and approval requirement. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation with no output schema, the description compensates by describing the return payload and the conditional conference_link, plus the creation constraint and approval gate. Combined with 100% schema coverage, an agent has everything needed to call 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 description coverage is 100%, including timestamp formats, RRULE syntax, default-empty semantics and cross-references to calendar_list_calendars/list_rooms/list_colors, so the baseline is 3. The description only echoes those lookup hints (rooms, colors) rather than adding new parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new calendar event') and immediately bounds the scope with 'Timed events only: all-day events cannot be created.' It differentiates itself from calendar_create_out_of_office and the room/color lookup siblings by name, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit alternatives with their selecting conditions: calendar_create_out_of_office for time off, calendar_list_rooms to find bookable rooms, calendar_list_colors for color ids. It also states a hard exclusion (no all-day events) and a precondition (requires user approval), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_create_out_of_officeA
Create an out-of-office event on the primary calendar. Always auto-declines new conflicting meeting invitations that arrive while it's in effect — existing invitations already on the calendar are left alone. Returns {id, title, start_time, end_time, html_link}. Timed events only (not all-day). Use calendar_create_event for an ordinary event. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Title shown on the calendar. Default 'Out of Office'. | Out of Office |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| end_time | Yes | End as an RFC 3339 timestamp, same format as start_time; must be after it. | |
| start_time | Yes | Start as an RFC 3339 timestamp, e.g. '2026-10-15T09:00:00+02:00'. A time without an offset is read as UTC. Date-only values are not accepted. | |
| decline_message | No | Message sent to organizers of auto-declined invitations. Empty sends no custom message. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, idempotent=false, destructive=false. The description goes well beyond that: it discloses the key side effect (auto-declines new conflicting invitations), scopes it precisely (existing invitations are left alone), states the output shape, and flags the approval requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action, then the behavioral caveat, return shape, format constraint, alternative, and approval note. No filler; each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description supplies the return fields, the timed-only constraint, the side-effect behavior, and the approval prerequisite — everything an agent needs to call it correctly and predict the outcome.
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 with format details (RFC 3339, defaults, decline_message semantics). The description adds no additional parameter-level meaning, 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 (Create), resource (out-of-office event), and scope (primary calendar). It explicitly distinguishes itself from the sibling calendar_create_event, so an agent can route correctly 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 (calendar_create_event for an ordinary event) and gives an explicit when-not constraint (timed events only, not all-day). The 'requires user approval' note also tells the agent a precondition exists before invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_delete_eventADestructive
Delete a calendar event. For a recurring event, 'scope' controls what's deleted: 'this' (default) deletes only the given event_id; 'following' ends the series just before this instance, deleting it and every later occurrence but keeping earlier ones; 'all' deletes the entire series. Returns {id, deleted: true, scope}. Use calendar_update_event instead to change an event rather than remove it. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | For a recurring event: 'this', 'following', or 'all'. Ignored (has no other meaning) for a non-recurring event. | this |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| event_id | Yes | Id of the event, from calendar_list_events (its id field). | |
| calendar_id | Yes | Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar. | |
| send_updates | No | Who gets a notification email about this cancellation: 'none', 'all', or 'externalOnly'. Omit to use Calendar's own default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=false, readOnly=false, so the safety profile is covered. The description adds real value beyond them: precise recurring-series semantics, a stated return shape ({id, deleted, scope}) despite no output schema, and the 'Requires user approval' constraint. Minor gap: send_updates notification behavior is left entirely to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then the scope semantics, then the return shape, then the alternative, then the approval gate. Every sentence carries distinct information with no restatement of the name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 5 parameters, no output schema, and no enums, the description supplies the missing return shape, the destructive-scope nuance, and the approval requirement. An agent has everything needed to call this correctly for both recurring and single events.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining what 'following' actually does ('ends the series just before this instance... keeping earlier ones'), which the schema only labels. It does not extend meaning for reason, calendar_id, or send_updates beyond their schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a calendar event') and immediately differentiates the scope modes that distinguish this tool from a generic delete. It also names the sibling calendar_update_event as the non-deletion alternative, so an agent can route correctly 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?
Explicitly routes the agent: 'Use calendar_update_event instead to change an event rather than remove it,' plus per-scope conditions describing exactly which mode to pick. It also flags the approval prerequisite, leaving no inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_get_event_detailsARead-onlyIdempotent
Fetch full details of a calendar event including attendees, description and location. Returns {id, calendar_id, title, description, start_time, end_time, day_of_week, all_day, organizer_email, attendees: [{email, display_name, response_status, organizer}], location, status, html_link}; conferencing links and attachments are not included. Use calendar_list_events instead to find events. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| event_id | Yes | Id of the event, from calendar_list_events (its id field). | |
| calendar_id | Yes | Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuine value beyond that: the exact return field set, an explicit exclusion list (conferencing links and attachments are NOT included), and the approval requirement. Missing are any auth/scope caveats or visibility restrictions.
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 purpose, then return shape, then the alternative, then the gating requirement. Efficient, though the return-field enumeration is dense and reads as prose where a compact list would be more scannable.
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 carries the burden of describing return values and does so field-by-field, including nested attendee structure and explicit omissions. For a read-only, 3-param tool this is nearly complete; only visibility/permission limits on which events are retrievable are 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% and all three parameters are documented there, including the 'primary' calendar_id convention and the source of event_id. The description adds no syntax or format meaning beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch full details of a calendar event') and immediately enumerates what 'details' means (attendees, description, location). It also names the sibling it is not, calendar_list_events, so an agent can route correctly 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 redirects discovery to calendar_list_events and notes the user-approval requirement, which is a real gating condition. It stops short of stating when-not to use this tool (e.g. permissions or visibility limits), 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.
calendar_get_event_visibilityARead-onlyIdempotent
Get a calendar event's visibility setting (default, public, private, or confidential) without fetching its full details (attendees, description, etc.) the way calendar_get_event_details does. Returns {visibility}. Use calendar_set_event_visibility to change it. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| event_id | Yes | Id of the event, from calendar_list_events (its id field). | |
| calendar_id | Yes | Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and non-destructive behavior, so the bar is lower. The description still adds meaningful context beyond them: the auto-approval status and the exact return shape ('Returns {visibility}'). It does not cover auth requirements or rate limits, but for a simple read tool this 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?
Four tight sentences with zero waste; the core purpose and scope-limiting clause are front-loaded, followed by return shape, alternative tool, and approval note. 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?
The tool is low-complexity, the schema is fully documented, and there is no output schema. The description fills the remaining gap by stating the return shape and the auto-approval behavior, so an agent has everything needed to call 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 schema already documents all three parameters (calendar_id, event_id, reason) in detail. The description adds no syntax, format, or constraint details beyond what the schema provides, making the baseline of 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?
States a specific verb and resource ('Get a calendar event's visibility setting'), lists the possible values, and explicitly distinguishes itself from the sibling calendar_get_event_details by scope. An agent can identify what this tool does without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative for fetching full details (calendar_get_event_details) and the alternative for mutation (calendar_set_event_visibility), giving clear when-to-use routing. Nothing is left to inference about which sibling to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_get_free_busyARead-onlyIdempotent
Query colleagues' schedules for a time range. For each email, tries to fetch full event details (title, time, status) when the authenticated user has calendar access; falls back to free/busy slots only when access is unavailable. Use this for meeting scheduling. Returns one entry per email: {email, source: 'events', events: [{id, title, start_time, end_time, status, all_day}]} (up to 50 events), or {email, source: 'free_busy', busy: [{start, end}]}, or {email, source: 'error', error}; the user's privacy settings may reduce 'events' to busy slots. Use calendar_list_events instead for the user's own calendar. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| emails | Yes | Comma-separated email addresses of the people (or room resource emails) to check, e.g. 'a@example.com,b@example.com'. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| time_max | Yes | End of the range, same RFC 3339 format as time_min. Required. | |
| time_min | Yes | Start of the range as an RFC 3339 timestamp with an offset, e.g. '2026-10-15T09:00:00+02:00'. Required; a bare date is not accepted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: it discloses the events-vs-free_busy fallback when access is unavailable, the privacy-settings degradation that can reduce events to busy slots, the 50-event cap, and that calls are auto-approved. This is unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and fallback logic, then the routing hint, then return shapes. Dense but each part earns its place; the return-shape enumeration is slightly heavy but justified given no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema, the description fully specifies the three possible return shapes (events, free_busy, error), the 50-event cap, and privacy degradation. Nothing needed to call or interpret it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four params (emails, time_min, time_max, reason) are already documented in the schema. The description adds no extra syntax or format guidance beyond the return-shape context, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Query colleagues' schedules for a time range') and explicitly scopes it to other people's calendars rather than the user's own. It names the sibling it is not (calendar_list_events) so an agent can distinguish them 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?
Gives explicit use context ('Use this for meeting scheduling') and a named alternative with the selection condition ('Use calendar_list_events instead for the user's own calendar'). Both when-to-use and when-to-use-something-else are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_list_calendarsARead-onlyIdempotent
List all Google Calendars for the authenticated user. Returns a list of {id, summary, primary, access_role}. Pass an id as calendar_id to calendar_list_events and the other calendar tools. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely new behavioral context: the exact return shape and the 'Auto-approved' note indicating no human approval gate. It says nothing about pagination or empty-result behavior, 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?
Three short sentences, front-loaded with the purpose, then the return shape, then the downstream usage hint. Every sentence carries distinct information with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by naming the returned fields. Combined with the trivially simple one-parameter input and the annotation safety profile, an agent has everything needed to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter with 100% schema description coverage, so the schema fully documents the required 'reason' field. The description adds no information about that parameter (its 'id as calendar_id' remark concerns output usage elsewhere), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all Google Calendars for the authenticated user') and even enumerates the returned fields {id, summary, primary, access_role}, which cleanly separates it from siblings like calendar_list_events or calendar_list_colors.
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 describes the downstream workflow: 'Pass an id as calendar_id to calendar_list_events and the other calendar tools.' This tells the agent when this tool is the prerequisite step. It lacks an explicit when-not-to-use or a named alternative for listing calendars another way, so it falls 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.
calendar_list_colorsARead-onlyIdempotent
List Calendar's fixed event color palette: each color's id, name (e.g. "Tomato", "Sage"), and hex background/foreground. Use a color's id or name as the color argument to calendar_create_event, calendar_update_event, or calendar_set_event_color instead of guessing a numeric id. Returns a list of {id, name, background, foreground}, sorted by id (1-11). Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds real context beyond that: the palette is fixed, results are sorted by id in the range 1-11, and the call is auto-approved (no approval round-trip). It stops short of detailing error or edge behavior, 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?
Three tight sentences: what it returns, why you'd call it, and the exact return shape. The useful routing information is front-loaded with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description compensates by naming the exact return shape and ordering ({id, name, background, foreground}, sorted 1-11). For a simple read-only lookup tool, nothing an agent needs to invoke or consume it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the only parameter (reason) is fully documented in the schema, so the schema carries the parameter burden. The description adds no syntax or format detail for the parameter, which matches the baseline-3 expectation when coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (List) and resource (Calendar's fixed event color palette), then enumerates exactly what each entry contains (id, name, hex background/foreground). It is easily distinguished from siblings because it explicitly names the consumers of its output (calendar_create_event, calendar_update_event, calendar_set_event_color).
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 precise condition for use: call this before passing a color argument rather than guessing a numeric id. It names the exact alternative tools that consume the returned id/name, leaving no inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_list_eventsARead-onlyIdempotent
List events from a calendar (id, title, start_time, end_time, all_day, status). No attendees, description, or links returned. Returns a list of {id, title, start_time, end_time, day_of_week, all_day, status}, recurring events expanded into single occurrences and sorted by start time. Reads up to max_results events across pages. Use calendar_get_event_details to read one event's attendees and description, or calendar_list_calendars to find calendar_id. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Free-text search matched against event fields such as title, description, location and attendees. Empty returns every event in the window. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| time_max | No | Only events starting before this time, same RFC 3339 format as time_min. Empty means no upper bound. | |
| time_min | No | Only events ending after this time, as an RFC 3339 timestamp with an offset, e.g. '2026-10-15T00:00:00Z' or '2026-10-15T09:00:00+02:00'; a bare date is not accepted. Empty means now. | |
| calendar_id | Yes | Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar. | |
| max_results | No | Maximum number of events to return. Default 20, clamped to between 1 and 250. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive; the description adds meaningful behavior beyond that: exact return shape, recurring-event expansion, start-time sorting, pagination behavior ('reads up to max_results events across pages'), and an 'Auto-approved' note. The safety profile is covered by annotations, so the marginal value is in these operational details.
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 the verb and resource, then return shape, then routing. It is somewhat dense with parenthetical field lists, which borders on redundancy, but every clause about behavior (recurring expansion, sorting, pagination) 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?
Covers the essential ambiguity for a list tool: what is returned, what is deliberately withheld, how recurring events are handled, pagination limits, and where to go for details. With no output schema, this description carries the return-value burden adequately.
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 mentions the return fields but does not add syntax details for time_min/time_max, query matching, or max_results beyond what the schema already documents, so it does not improve on the schema's parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list events from a calendar) and enumerates the returned fields. It distinguishes itself from calendar_get_event_details by defining the two tools' complementary scopes explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Use calendar_get_event_details to read one event's attendees and description, or calendar_list_calendars to find calendar_id.' It also states when data is not returned (no attendees, description, or links), which tells the agent when to switch tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_list_roomsARead-onlyIdempotent
List meeting rooms and resource calendars from the organization's room directory. This is a locally-cached list IT refreshes with scripts/sync_room_directory.py, not a live Workspace lookup — it may come back empty if IT hasn't synced one yet. Returns a list of {resource_id, resource_name, resource_email, building_id, floor_name, capacity, description}, unpaged. To check whether a room is actually free before booking, call calendar_get_free_busy with its resource_email. Use the room email with calendar_create_event or calendar_update_event to book. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional substring filter matched against room name, building, floor, or description (case-insensitive) | |
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only/idempotent profile, and the description adds substantial extra context: it is a locally-cached directory refreshed by a sync script, it is not a live Workspace lookup, it may return empty, and results are unpaged. These are exactly the operational caveats 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?
Four dense sentences, each carrying distinct payload (scope, cache caveat, return shape, next steps), with the definition front-loaded and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields and stating that results are unpaged. Combined with the safety annotations and full schema coverage, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the query filter and the reason parameter are already documented in the schema; the description adds no syntax or format detail beyond that. Baseline 3 applies 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 ('List meeting rooms and resource calendars') and names the source directory, which cleanly separates it from the sibling calendar_list_calendars. An agent knows exactly what set of entities this returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use calendar_get_free_busy with the resource_email to check availability, and use the room email with calendar_create_event/calendar_update_event to book. This is a full when-to-use and what-next chain, not just context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_set_event_colorA
Set a calendar event's color. Only the color changes — no other fields are affected. Accepts a color id (1-11) or name, e.g. "Tomato" -- see calendar_list_colors. Returns {id, title, color_id}. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| color | Yes | Event color id (1-11) or name, e.g. "Tomato" (case-insensitive), from calendar_list_colors. Required. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| event_id | Yes | Id of the event, from calendar_list_events (its id field). | |
| calendar_id | Yes | Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it is neither read-only nor destructive, and the description adds genuinely new behavioral context: the mutation is strictly limited to the color field, it returns {id, title, color_id}, and it requires user approval — none of which the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each carrying a distinct payload (scope, input format plus sibling reference, return shape plus approval), with the core action front-loaded. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape, the approval requirement, the color value domain, and the lookup sibling for valid values. For a 4-parameter mutation tool this covers everything an agent needs to 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 description coverage is 100%, so all four parameters (including the reason field) are already documented in the schema. The description's restatement of the color id range (1-11) or name adds no syntax or format detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (set a calendar event's color) and immediately scopes it: 'Only the color changes — no other fields are affected.' That scope statement cleanly distinguishes it from the broader calendar_update_event 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?
It routes the agent to calendar_list_colors for valid color values and flags that user approval is required, which is useful implicit guidance. However, it never states when to prefer this over calendar_update_event or what conditions make it inappropriate, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_set_event_visibilityA
Set a calendar event's visibility. 'default' follows the calendar's own sharing settings; 'public' makes it visible to anyone who can see the calendar; 'private' hides its details from viewers who aren't invited; 'confidential' is a legacy synonym the Calendar API still accepts for 'private'. Only visibility changes — no other fields are affected. Returns {id, title, visibility}. Use calendar_get_event_visibility to read the current value. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| event_id | Yes | Id of the event, from calendar_list_events (its id field). | |
| visibility | Yes | New visibility: 'default', 'public', 'private' or 'confidential' (case-insensitive). Any other value is rejected before approval is requested. | |
| calendar_id | Yes | Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic write profile (readOnly=false, idempotent=false, destructive=false); the description adds real context beyond them: the exact scope of mutation, that other fields are untouched, the return shape {id, title, visibility}, and that user approval is required. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and scope, then the value semantics, then the return shape and approval note. Every sentence carries information, though the four-value enumeration makes it longer than strictly needed for a single-field mutation.
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 compensates by stating the return shape, and it covers the mutation scope, approval requirement, and the read counterpart. Nothing an agent needs to call this correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by defining the semantics of each enum-like value ('default' follows calendar sharing, 'public' is visible to calendar viewers, 'private' hides details, 'confidential' is a legacy synonym), which the schema only lists without explaining.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set a calendar event's visibility') and immediately scopes it ('Only visibility changes — no other fields are affected'), which cleanly separates it from calendar_update_event and calendar_set_event_color. It also routes to calendar_get_event_visibility for reading the current value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the read alternative ('Use calendar_get_event_visibility to read the current value') and notes the approval prerequisite. It does not state when-not to use it (e.g., bulk changes or events the user cannot edit), so it stops short of full 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.
calendar_set_working_locationA
Set your working-location presence (office or home) for a single day on the primary calendar — the same picker Google Calendar's web UI exposes. Replaces the day's existing working-location entry if there is one. Returns {id, start_time, end_time, html_link}. Use calendar_create_out_of_office for time off. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | The day as YYYY-MM-DD, e.g. 2026-07-10. | |
| label | No | Office label shown on Calendar (office only). Empty shows no label. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| location | Yes | Where you work that day: exactly "office" or "home". Anything else is rejected. | |
| building_id | No | Workspace building id (office only), from calendar_list_rooms (its building_id field). Empty leaves the building unset. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety flags; the description adds materially more: the day's existing entry is replaced (overwrite semantics), a specific return shape {id, start_time, end_time, html_link} is given despite no output schema, and 'Requires user approval' discloses an approval gate the annotations do not mention.
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: action and scope first, overwrite/return behavior second, alternative routing and approval last. No filler, everything 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?
For a mutating tool with no output schema, the description supplies the overwrite behavior, the approval requirement, and the return fields, while the schema fully covers inputs. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters (date, location, label, building_id, reason) are already documented in the schema. The description adds the web-UI-picker analogy but no per-parameter syntax, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('set your working-location presence ... for a single day on the primary calendar') and scopes it to one day. It also equates the operation to 'the same picker Google Calendar's web UI exposes', making the action unambiguous and separable from the many other calendar_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes away from the closest alternative ('Use calendar_create_out_of_office for time off') and constrains scope to a single day, so the agent knows both when this tool applies and which sibling handles the neighboring case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_update_eventA
Update an existing calendar event. For a recurring event, 'scope' controls which occurrences this touches: 'this' (default) affects only the given event_id; 'following' splits the series so this instance and every later one get the changes, leaving earlier ones untouched; 'all' updates the entire series. Only the fields you pass non-empty change; guests cannot be edited here. Returns {id, title, start_time, end_time, html_link}, plus conference_link when the event has a Google Meet. Use calendar_set_event_color or calendar_set_event_visibility to change only the color or visibility. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | New event color id (1-11) or name, e.g. "Tomato" -- see calendar_list_colors. Empty leaves the color unchanged. | |
| rooms | No | Comma-separated room resource email addresses to book, from calendar_list_rooms (its resource_email field); they replace the rooms already booked. Empty leaves the rooms unchanged. | |
| scope | No | For a recurring event: 'this', 'following', or 'all'. Ignored (has no other meaning) for a non-recurring event. | this |
| title | No | New title. Empty leaves the title unchanged. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| end_time | No | New end, same format as start_time. Empty leaves the end unchanged. | |
| event_id | Yes | Id of the event, from calendar_list_events (its id field). | |
| location | No | New location, replacing the current one. Empty leaves it unchanged. | |
| start_time | No | New start as an RFC 3339 timestamp, e.g. '2026-10-15T09:00:00+02:00'; a time without an offset uses the event's own time zone (UTC if it has none). Empty leaves the start unchanged. | |
| calendar_id | Yes | Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar. | |
| description | No | New description, replacing the current one. Empty leaves it unchanged. | |
| send_updates | No | Who gets a notification email about this change: 'none', 'all', or 'externalOnly'. Omit to use Calendar's own default. | |
| add_google_meet | No | Set to true to add a Google Meet link (skipped if one already exists) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations (readOnly=false, idempotent=false, destructive=false): partial-update semantics ('Only the fields you pass non-empty change'), a hard limitation ('guests cannot be edited here'), the exact return shape including conference_link, and an explicit 'Requires user approval' gate. These are exactly the behavioral facts an agent cannot derive from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then scope semantics, then mutation/return behavior – a logical order with no filler sentences. It is a dense single paragraph, though, and the three-way scope explanation would scan faster as a short list; a small structure cost.
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 13-parameter mutation tool with no output schema, the description covers the mutation model, the one ambiguous parameter's real-world effect, an unsupported operation, the return fields, and the approval requirement. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining what 'scope' actually does to a recurring series ('following' splits the series, leaving earlier occurrences untouched) – detail not present in the schema's terser enum explanation. Other parameters are left to the schema, which is adequate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Update an existing calendar event') and explicitly distinguishes itself from the color/visibility-only siblings by naming calendar_set_event_color and calendar_set_event_visibility. An agent can route to or away from this 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?
Gives clear conditional guidance: use the dedicated color/visibility tools when only those fields change, and it explains when each 'scope' value applies. It does not state prerequisites (e.g., required permissions) or when to prefer create/delete over update, so it falls 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.
confluence_cql_searchARead-onlyIdempotent
Search Confluence using CQL (Confluence Query Language). Sends your CQL exactly as written, so it can filter by space, content type, label, creator or date, which confluence_search cannot. Returns a list of {id, title, content_type, space_key, space_name, excerpt, url} in the order your CQL gives (add 'order by lastmodified desc' for newest first), at most max_results (default 20, capped at 100); excerpts may be redacted by the user's privacy settings. Use confluence_search instead for plain keywords. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| cql | Yes | A CQL query, e.g. "space = MYSPACE AND type = page AND title ~ 'roadmap' order by lastmodified desc". | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Maximum number of results to return. Default 20, capped at 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent/destructive annotations: it discloses that CQL is passed through verbatim, that result ordering follows the CQL (with an ordering tip), the result cap, and that excerpts may be redacted by user privacy settings. These are real behavioral traits the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that front-loads the purpose and contrast before the return shape and limits. It is longer than typical, but nearly every clause carries operational information; only the duplicated max_results default/cap is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields ({id, title, content_type, space_key, space_name, excerpt, url}) and their ordering, plus the redaction caveat. Nothing needed to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds value with the ordering hint ('add order by lastmodified desc for newest first') and confirms the default/cap semantics for max_results, plus notes the exact-query pass-through behavior of cql. It does not explain the 'reason' parameter, but that is self-evident from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search Confluence using CQL') and immediately contrasts it with the sibling it is not equivalent to, naming confluence_search explicitly. An agent can distinguish this from confluence_search 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 both a when-to-use (CQL-based filtering by space, type, label, creator, date) and a when-not (plain keywords -> use confluence_search instead), naming the alternative explicitly. The 'Auto-approved' note further clarifies it needs no approval gate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confluence_create_pageA
Create a new Confluence page in the given space. Body is HTML storage format. Returns the created page, with its new id, in the same shape confluence_get_page returns. Use confluence_update_page instead to change a page that already exists. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Page body in Confluence storage format (XHTML-based HTML), e.g. '<p>Hello</p>'. Mention someone with @[Name](accountId), the id from confluence_find_users. | |
| title | Yes | Title of the new page, as shown in Confluence. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| parent_id | No | Id of the page to nest the new page under, from confluence_list_pages. Empty creates it at the top level of the space. | |
| space_key | Yes | Key of the space to create the page in, e.g. 'ENG', from confluence_list_spaces (its key field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is partly covered. The description adds genuinely new context: the return value shape ('same shape confluence_get_page returns'), that a new id is assigned, and that user approval is required. It does not restate the non-idempotent nature, but the approval requirement is a meaningful addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each carrying distinct information (purpose, body format, return shape, alternative tool, approval requirement) with the core action front-loaded. No filler or restated name/title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description compensates by describing the returned object and its new id, redirects to the correct sibling for edits, and flags the approval gate. Combined with full schema coverage and annotations, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and five parameters are all documented in the schema, so the schema is doing the heavy lifting, which sets a baseline of 3. The description only echoes the body-format fact ('Body is HTML storage format') that the schema already specifies in more detail, adding no syntax or format meaning beyond structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new Confluence page') plus the scope ('in the given space'), and explicitly distinguishes itself from the sibling confluence_update_page. An agent can differentiate create vs update 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 tool and the exact condition that selects it ('to change a page that already exists'), and notes the user-approval prerequisite. This is explicit when-to-use/when-not guidance rather than inferred context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confluence_download_attachmentARead-onlyIdempotent
Download a Confluence page attachment's content. Identify the attachment by the name returned from confluence_list_attachments. On a local install: saved to destination_dir, which is required (no default): pass ~/Downloads (or a path the user asked for) for a deliverable, or your own scratch directory to just read or process it. On an organization-managed install: destination_dir is ignored -- a small attachment's bytes come back directly in the result, a larger one as a one-time link the human opens in their own browser. Returns {path, name, size_bytes} on a local install, or the inline or link delivery result on an organization-managed one. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| page_id | Yes | Numeric id of the page the attachment is on, from confluence_list_pages or confluence_search. | |
| attachment_name | Yes | Exact file name of the attachment, as confluence_list_attachments returns it in its name field. | |
| destination_dir | Yes | Local install only: where to save the attachment -- required, no default. On an organization-managed install it is ignored and nothing is saved to it; any value will do. Use ~/Downloads (or a path the user specified) if the user should find this file afterward; use your own working/scratch directory if it's only for you to read or process. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description adds substantial behavior beyond them: divergent local vs organization-managed delivery (file path vs inline bytes vs one-time link), the differing return shapes, and the user-approval requirement. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layered with identification, the local/managed branch, return shapes and approval. Dense but every clause carries information; only slight verbosity in restating destination_dir behavior already in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a download tool with no output schema, the description fully covers return values ({path, name, size_bytes} vs inline/link), the install-dependent behavior, and approval requirements. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents each parameter in detail, including destination_dir's local-vs-managed semantics. The description largely restates this, so it adds little parameter-level meaning beyond the structured fields. 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 ('Download a Confluence page attachment's content') and immediately routes the agent to the sibling that produces the needed identifier (confluence_list_attachments). An agent can tell it apart from confluence_list_attachments 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 says how to identify the attachment (name from confluence_list_attachments), and gives conditional guidance: on a local install pass ~/Downloads for a deliverable vs a scratch dir to just read/process; on a managed install destination_dir is ignored. Clear when-to-use and what-value-to-pass guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confluence_find_usersARead-onlyIdempotent
Find Atlassian users by name or email and return their account ids. Returns a list of {account_id, display_name, active, account_type}, at most max_results entries; email addresses are never returned. Auto-approved -- mention someone in a page body by writing @Name. Use confluence_search instead to find pages, not people.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Part of a person's name or email address, e.g. 'jane' or 'jane@example.com'. Must not be empty. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Most users to return, 1 to 50. Defaults to 10. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, but the description adds real behavioral value: 'email addresses are never returned', the returned field set, the max_results cap, and that the tool is 'Auto-approved' (no gated approval). That goes beyond what structured fields declare.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, each carrying distinct information (purpose, return shape/privacy, approval status, alternative tool). Slightly dense, but front-loaded with the core capability and free of 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?
With no output schema present, the description fully carries the burden by spelling out the returned record shape and the max_results bound. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so query/reason/max_results are already documented. The description reinforces the query semantics (name or email) and the privacy constraint on email output but adds little syntax or format detail beyond the schema; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Find Atlassian users by name or email and return their account ids.' It also explicitly disambiguates against the closest sibling by saying to use confluence_search for pages, not people.
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 when-to-use context ('mention someone in a page body by writing @[Name](accountId)') and names the alternative for page lookup. It does not mention the parallel jira_find_users sibling, leaving a small inference gap for Atlassian-wide vs Confluence-scoped lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confluence_get_pageARead-onlyIdempotent
Fetch the full content of a Confluence page by page ID. Returns the page body as HTML storage format, inside one page object {id, title, space_key, space_name, version, author, created, updated, body, url}; author is an opaque Atlassian account id, author_name is the name resolved for it, and mentions maps each @mentioned account id in the body to a name. Use confluence_get_page_by_title when you know the space and title but not the id. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| page_id | Yes | Numeric id of the page, from confluence_list_pages, confluence_search or confluence_cql_search (the id field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so side effects are covered. The description adds a non-annotation behavioral fact – 'Requires user approval' – plus a detailed return shape. It stops short of noting rate limits or pagination, but adds real value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then the return shape, then the alternative. Efficient overall, though the inline enumeration of every return field is slightly heavy and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden of describing the return object and its fields (id, title, version, author, mentions) — which it does thoroughly — and covers the approval requirement and the alternative route. Complete for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both page_id and reason are already documented in the schema. The description only restates that the fetch is by page ID, adding no format or edge-case detail. Baseline 3 applies when the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) plus resource (Confluence page) and the identifier used (page ID), and disambiguates from the sibling confluence_get_page_by_title. An agent can select this 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?
Explicitly names the alternative (confluence_get_page_by_title) and the condition that selects it: you know space and title but not the id. Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confluence_get_page_by_titleARead-onlyIdempotent
Fetch a Confluence page by space key and exact title. Returns one page in the same shape confluence_get_page returns, body included; errors when no page has that title in the space. Use confluence_get_page instead when you already have the page id. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Exact title of the page, as shown in Confluence (not a partial match). | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| space_key | Yes | Key of the space the page is in, e.g. 'ENG', from confluence_list_spaces (its key field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive. The description adds meaningful context beyond that: the return shape (same as confluence_get_page, body included), error semantics on missing title, and an approval gate ('Requires user approval'). This is substantive behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the purpose, then return/error behavior, then the alternative. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description compensates by explaining the return shape and error behavior, and it flags the approval requirement. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters (space_key, title, reason) are already documented in the schema, including the exact-match constraint and the space-key origin. The description merely restates 'space key and exact title' and adds no syntax or format meaning 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 a specific verb+resource+lookup key: 'Fetch a Confluence page by space key and exact title.' It explicitly distinguishes itself from sibling confluence_get_page by id, 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 an explicit alternative and the condition that selects it: 'Use confluence_get_page instead when you already have the page id.' It also discloses the boundary condition (errors when no page has that title), which tells the agent when this lookup will fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confluence_list_attachmentsARead-onlyIdempotent
List attachment names, media types, and sizes for a Confluence page. Auto-approved -- metadata only, no attachment content is returned. Returns {page_id, attachments: a list of {name, media_type, size in bytes}}, at most 500 attachments; names may be redacted by the user's privacy settings. Use confluence_download_attachment to fetch the actual file.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| page_id | Yes | Numeric id of the page, from confluence_list_pages, confluence_search or confluence_get_page (the id field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read profile; the description goes well beyond by disclosing auto-approval status, that only metadata (not content) is returned, the 500-attachment cap, and that names may be redacted by user privacy settings. These are exactly the operational caveats an agent needs and cannot get from the structured fields.
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: purpose and content scope first, return shape and limits second, sibling routing last. No filler, nothing restated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description compensates by spelling out the return structure ({page_id, attachments:[{name, media_type, size}]}) plus cap and redaction behavior. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (page_id, reason) are fully documented in the schema, including where page_id comes from. The description adds no parameter-level detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — listing attachment names, media types, and sizes for a Confluence page — and explicitly distinguishes itself from confluence_download_attachment, which fetches the actual file. An agent can tell it apart from siblings 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?
Clearly routes the agent to confluence_download_attachment when the actual file is needed, and the 'metadata only, no attachment content' note tells the agent what this tool will not give it. It stops short of explicit when-not conditions or prerequisite context, but the alternative is named directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confluence_list_pagesARead-onlyIdempotent
List pages in a Confluence space (title, id, version). Returns a list of {id, title, space_key, space_name, version, author, created, updated, url} without page bodies, at most max_results (default 20, capped at 1000), in the API's order. author is an opaque Atlassian account id; author_name is the resolved name. Use confluence_search instead to find pages by words, and confluence_get_page to read one. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| space_key | Yes | Key of the space, e.g. 'ENG' (not its numeric id or display name), from confluence_list_spaces (its key field). | |
| max_results | No | Maximum number of pages to return. Default 20, capped at 1000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: results exclude page bodies, are returned in the API's order, and are capped by max_results (default 20, max 1000), plus the note that author is an opaque Atlassian account id while author_name is resolved. It stops short of stating auth/permission requirements, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and result, followed by behavioral notes and routing guidance. Every clause carries information, though the max_results default/cap repeats the schema and the trailing 'Auto-approved.' is peripheral.
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 takes on the burden of describing return shape and does so (field list, no bodies, ordering, author vs author_name). Combined with the sibling routing, an agent has everything needed to call 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 space_key, max_results, and reason are all documented in the schema itself, including the same default/cap wording the description repeats. The description adds no parameter meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List pages in a Confluence space'), scopes it to a space, and enumerates the returned identity fields (title, id, version). It cleanly distinguishes itself from confluence_search and confluence_get_page, so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names two alternatives and the condition selecting each: confluence_search 'to find pages by words' and confluence_get_page 'to read one'. When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confluence_list_spacesARead-onlyIdempotent
List Confluence spaces the user has access to (key, name, type, description). Returns a list of {key, name, space_type, description, url}, at most max_results (default 50, capped at 1000). Use confluence_list_pages to list the pages in one of them. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| space_type | No | Filter to 'global' or 'personal'; omit/empty to return all types | |
| max_results | No | Maximum number of spaces to return. Default 50, capped at 1000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint, so the safety profile is covered. The description adds value beyond them: the exact return shape, the max_results cap of 1000, and the 'Auto-approved' note that no approval gate applies. It does not discuss pagination or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the resource and scope, then return shape, then the alternative. Every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully spells out the returned fields, and it covers the cap and the sibling routing. Nothing essential 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%, so the schema already documents space_type and max_results (including the default 50 / cap 1000 the description repeats). The description adds no meaning beyond the schema and does not mention the required 'reason' parameter, 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 (List) and resource (Confluence spaces) with scope ('the user has access to') and enumerates the returned fields. It also routes the agent to confluence_list_pages for the natural next step, so it is distinguishable from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use context and names confluence_list_pages as the follow-up for drilling into pages, which helps the agent sequence calls. It stops short of explicit when-not conditions (e.g., use confluence_search instead when looking for a specific space by name).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confluence_refresh_user_cacheARead-onlyIdempotent
Re-fetch the names of every Atlassian account id PrivacyFence has cached. Auto-approved -- use this when a renamed or newly added person shows up wrong; cached names otherwise refresh on their own after 7 days. Returns {cached_users: n}, the number of account ids re-fetched. Use confluence_find_users instead to look up someone by name.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so safety is covered. The description adds key behavioral context: it explains the 7-day auto-refresh cycle and indicates the operation is auto-approved. It also states the return value. However, it doesn't discuss potential rate limits or the scope of the cache (e.g., does it affect all users or just those in the current workspace?).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a tight, information-dense set of sentences. It front-loads the purpose, then adds usage conditions, return value, and an alternative tool. No extraneous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with full schema coverage and annotations, the description covers purpose, usage, and return value. It doesn't explain what PrivacyFence's cache contains or how long the refresh takes, but these are minor gaps. No output schema exists, so the description appropriately notes the return format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single parameter 'reason' is fully documented in the schema. The description adds no parameter-specific information, which is appropriate since the schema handles it. 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 a specific verb and resource: 'Re-fetch the names of every Atlassian account id PrivacyFence has cached.' This is unambiguous and distinct from read-oriented siblings. It differentiates itself from confluence_find_users by describing different functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('when a renamed or newly added person shows up wrong') and provides a clear alternative ('Use confluence_find_users instead to look up someone by name'). Also notes that cached names refresh automatically after 7 days, clarifying when the manual call is unnecessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confluence_searchARead-onlyIdempotent
Full-text search across Confluence content. Returns matching pages/blog posts with excerpts, as a list of {id, title, content_type, space_key, space_name, excerpt, url}, most recently modified first, at most max_results (default 20, capped at 100); excerpts may be redacted by the user's privacy settings. It sends the query as the CQL text ~ "" (no operators); use confluence_cql_search to filter by space, type, label or date. Get the page with confluence_get_page. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Plain-text words to find in page and blog post text, e.g. 'quarterly roadmap'. Not CQL: it is wrapped in a text-contains clause. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Maximum number of results to return. Default 20, capped at 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantially more: result ordering (most recently modified first), the result cap and default, the fact that excerpts may be redacted by privacy settings, the exact CQL rendering of the query, and the 'Auto-approved' note. These are behavioral traits the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose first, then result contract, then routing guidance, then approval note. It is a single long semicolon-chained paragraph, which is slightly heavy to parse, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden, and it does so fully: result fields, order, cap, and excerpt redaction caveat. Combined with a 100%-covered input schema and read-only annotations, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents query, reason, and max_results. The description largely repeats the default/cap and plain-text nature, but does add the exact CQL wrapping ('text ~ "<query>" (no operators)'), which meaningfully explains how the input is transformed. Marginal but real added value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Full-text search across Confluence content.' It immediately distinguishes itself from the sibling confluence_cql_search by scoping this to plain-text queries, so an agent can route correctly 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 explicitly ('use confluence_cql_search to filter by space, type, label or date') and names the natural follow-up ('Get the page with confluence_get_page'). The when-to-use / when-not-to-use boundary is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confluence_update_pageA
Update the title and/or body of an existing Confluence page. Body is HTML storage format. Pass a new title, a new body, or both; an omitted one keeps its current value, so an empty body no longer clears the page. Returns the updated page, with its new version number, in the same shape confluence_get_page returns. Call confluence_get_page first to read the current content. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | New body in Confluence storage format (XHTML-based HTML), replacing the whole current body. Omit or leave empty to keep the current body. Mention someone with @[Name](accountId), the id from confluence_find_users. | |
| title | No | New title for the page. Omit or leave empty to keep the current title. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| page_id | Yes | Numeric id of the page to update, from confluence_list_pages or confluence_search (the id field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real value beyond annotations: the body format (HTML storage format), the omitted-field semantics ('an empty body no longer clears the page'), the return shape (same as confluence_get_page, incl. new version number), and the approval requirement. Annotations only signal non-readonly/non-idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose, then mutation semantics, then return shape, then the prerequisite call and approval note. No filler; 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 4-param mutation tool with no output schema, it covers format, defaults, return shape, prerequisite read, and approval. Minor gaps: no note on conflict/version handling for concurrent edits, and destructiveHint=false is not reconciled with whole-body replacement.
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 four parameters including field defaults and the @-mention syntax. The description reinforces the omitted-field behavior but adds little the schema doesn't already carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (existing Confluence page) with the exact mutable fields (title/body). Clearly distinguishes from confluence_create_page and confluence_get_page, which appear as siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call confluence_get_page first to read current content, and explains the both/neither semantics of title/body. It doesn't name a when-not-to-use case (e.g., title collisions), but context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_add_labelA
Add a label to a contact, creating the label if it doesn't already exist. Returns {resource_name, label_added}. Labels are matched by name without regard to case. Use contacts_remove_label to take a label off again. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| label_name | Yes | Name of the label (contact group) to add, for example 'Clients'. An unknown name creates a new label. | |
| resource_name | Yes | Resource name of the contact ('people/c12345'), from contacts_search or contacts_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false. The description adds real value beyond them: it discloses the return shape {resource_name, label_added}, the case-insensitive name matching, the auto-create side effect, and a user-approval requirement. It doesn't cover failure modes (e.g., nonexistent contact), keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layered with return shape, matching rule, alternative tool, and approval requirement. Every sentence carries distinct information 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?
No output schema exists, yet the description supplies the return shape, so the agent knows what comes back. Combined with the approval requirement and matching semantics, an agent has everything needed to 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% and the schema already documents all three params, including that an unknown name creates a new label. The description's only added semantic is that labels match by name case-insensitively, which is useful but marginal, 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+resource ('Add a label to a contact') and immediately clarifies the auto-create behavior. It also names the sibling contacts_remove_label, so an agent can distinguish it from related contact tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the inverse tool (contacts_remove_label) as the alternative and states the prerequisite 'Requires user approval.' However, it doesn't give explicit when-to-use vs when-not conditions beyond the inverse operation, so it falls just short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_createA
Create a new contact in the user's Google address book. Requires user approval. emails and phones are JSON strings, e.g. '[{"value": "a@b.com", "type": "work"}]'. Contact deletion is not supported. Returns the created contact, with its new resource_name, in the same shape contacts_get returns. Search with contacts_search first to avoid creating a duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Free-text notes about the contact. Empty means no notes. | |
| emails | No | JSON array of {value, type} objects, e.g. '[{"value": "a@b.com", "type": "work"}]'. Empty means no emails. | |
| phones | No | JSON array of {value, type} objects, e.g. '[{"value": "+15551234567", "type": "mobile"}]'. Empty means no phones. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| job_title | No | Job title. Empty means none. | |
| display_name | Yes | Full name of the new contact, split on spaces into given and family name. | |
| organization | No | Company name. Empty means none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and idempotentHint=false, so the write/non-idempotent profile is already covered. The description nonetheless adds real value beyond them: it discloses that user approval is required, that deletion is not supported, that duplicates are a risk mitigated only by searching first, and the exact shape of the return value ('the same shape contacts_get returns'). It stops short of failure modes or rate limits, so a 4 rather than 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?
Five short sentences, each earning its place: action, approval requirement, parameter format caveat, scope limit, return value, and the duplicate-avoidance step. The core action is front-loaded and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by describing the return ('the created contact, with its new resource_name'). For a 7-parameter mutation tool with an approval gate, this covers what an agent needs, though it says nothing about validation failures or what happens if a duplicate is created anyway.
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 7 parameters are already documented in the schema, including the JSON-string format for emails/phones. The description repeats the emails/phones JSON example verbatim, which is restating structured data rather than adding new meaning; the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new contact in the user's Google address book') and immediately differentiates itself from the sibling read tools by telling the agent to use contacts_search first to avoid duplicates. An agent can tell it apart from contacts_get/contacts_update/contacts_list without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (creating a new contact), an explicit alternative workflow ('Search with contacts_search first to avoid creating a duplicate'), and an explicit when-not ('Contact deletion is not supported'). Nothing about tool selection 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.
contacts_getARead-onlyIdempotent
Fetch a single contact by resource name (e.g. 'people/c12345'). 'source' asserts the expected kind of contact ('personal', 'directory', or 'both'/default); the call fails if the resource doesn't match. Returns one contact in the same shape contacts_list returns; notes may be redacted by the user's privacy settings. Get the resource name from contacts_search or contacts_list. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| source | No | Kind of contact you expect: 'personal', 'directory', or 'both' (default, accepts either). The call fails if the contact is not of that kind. | both |
| resource_name | Yes | Resource name of the contact ('people/c12345'), from contacts_search or contacts_list (the resource_name field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses three non-obvious behaviors: the call fails if the contact's kind does not match 'source', notes may be redacted by the user's privacy settings, and the response matches the contacts_list shape. It also states the tool is auto-approved, which matters for the approval flow.
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?
Purpose is front-loaded and every sentence carries information, but the semicolon-heavy, multi-clause sentences reduce scannability, and 'Auto-approved.' reads as an appended fragment rather than integrated guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-record fetch with a fully documented 3-parameter schema and no output schema, the description supplies everything needed: identifier format and source, failure semantics, redaction caveat, and response shape parity with contacts_list.
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 resource_name and source are already fully documented in the schema; the description largely restates them. The failure-on-mismatch detail for 'source' is the only added semantic value beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch a single contact by resource name') and gives the exact identifier format ('people/c12345'), which unambiguously separates it from contacts_list and contacts_search. An agent can immediately tell this is a single-record lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies the prerequisite and routing guidance ('Get the resource name from contacts_search or contacts_list'), making the intended call sequence clear. It stops short of naming an explicit when-not case (e.g. use contacts_search when you only have a name), so it is clear context rather than full 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.
contacts_listARead-onlyIdempotent
List contacts from the user's Google address book. Google blends personally-saved contacts together with Workspace directory profiles (colleagues) by default; use 'source' to split them apart. Returns a list of contacts as {resource_name, display_name, given_name, family_name, emails [{value, type}], phones [{value, type}], organization, job_title, notes, photo_url, source, source_types}, where source is 'personal', 'directory', 'both' (a saved contact who is also a colleague) or 'other', and notes may be redacted by the user's privacy settings. Reads up to max_results contacts across pages; 'source' is applied before counting. Use contacts_search instead to find a contact by name or email. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| source | No | Which contacts to return: 'personal' (contacts with a saved-contact source), 'directory' (contacts with a Workspace directory source; a contact can match both), or 'both' (default, no filtering). Anything else is an error. | both |
| max_results | No | Most contacts to fetch. Default 50, capped at 1000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely new behavioral facts: that personal and directory sources are blended by default, that notes may be redacted by the user's privacy settings, that reads page across pages, and that 'source' is applied before counting toward max_results. It even states the tool is auto-approved, which matters for an agent deciding whether to call it.
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 with the core action and the key gotcha (source blending) before the return-shape enumeration. It is dense and slightly long, but each sentence carries information an agent needs; 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?
With no output schema, the description compensates by enumerating the full returned field set and the possible 'source' values, plus the notes-redaction caveat. For a 3-parameter read tool with full annotation coverage, nothing material 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 coverage is 100%, so baseline is 3, but the description adds meaning the schema lacks: what 'both' actually means ('a saved contact who is also a colleague') and the ordering rule that 'source' is applied before counting max_results. The 'reason' parameter is not discussed, minor omission.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb + resource ('List contacts from the user's Google address book') and immediately clarifies the scope nuance (personal vs. Workspace directory blending). It distinguishes itself from contacts_search by name, 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?
It names the alternative explicitly ('Use contacts_search instead to find a contact by name or email') and gives the condition selecting it. It also explains how to use 'source' to split the two contact pools, which is actionable guidance for the common ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_remove_labelA
Remove a label from a contact. Returns {resource_name, label_removed}, with a note of 'label not found' if no label has that name (nothing changes then). Use contacts_add_label to put a label on a contact. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| label_name | Yes | Name of the label (contact group) to remove, matched without regard to case. The label itself is not deleted. | |
| resource_name | Yes | Resource name of the contact ('people/c12345'), from contacts_search or contacts_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, which correctly signals mutation without deletion. The description adds valuable specifics: return shape {resource_name, label_removed}, behavior on missing label ('nothing changes then'), and a 'Requires user approval' constraint. One gap: it doesn't explain why idempotentHint=false (repeated calls could error), but overall good coverage above annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences covering action, return value, edge case, sibling reference, and approval requirement. Front-loaded with the core action. Slightly dense but no wasted words; could separate the approval requirement for better scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param mutation with no output schema, the description covers return structure, edge-case behavior, sibling tooling, and approval requirement. It stops short of explaining permission requirements or error conditions beyond 'label not found', but given annotations and full schema coverage, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are fully documented in the schema (including case-insensitivity of label_name and the fact that the label itself isn't deleted). The description does not add syntax or usage details beyond what the schema already provides, 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 ('remove') and resource ('a label from a contact'), and explicitly names the inverse sibling 'contacts_add_label' to clarify direction. An agent can immediately distinguish this from add_label or gmail_remove_label.
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?
References 'contacts_add_label' as the complementary operation, giving directional context. However, it does not explicitly state when to use this tool vs. alternatives like contacts_update (which might also modify labels) or provide preconditions/exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_searchARead-onlyIdempotent
Search contacts by name or email address. The default 'both' searches saved contacts only; only 'directory' scans Workspace directory contacts. Note: 'directory' search only finds directory profiles you already have some contact history with; there is no full company-directory search under this app's permissions. Returns a list of contacts in the same shape contacts_list returns (source is 'personal', 'directory', 'both' or 'other'), at most max_results; notes may be redacted by the user's privacy settings. Use contacts_list instead to browse without a query, and get a contact's full record with contacts_get. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Text to look for in contacts' names and email addresses (case-insensitive substring match for 'directory'). | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| source | No | Which contacts to search: 'personal' (contacts with a saved-contact source), 'directory' (contacts with a Workspace directory source; a contact can match both), or 'both' (default, saved contacts only). Anything else is an error. | both |
| max_results | No | Most contacts to return. Default 20, capped at 30 for saved contacts, up to 1000 for directory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly/idempotent/non-destructive), yet the description adds substantial behavioral context: the non-obvious 'both' default resolves to saved contacts only, directory results are limited to profiles with existing contact history, notes may be redacted by privacy settings, and the call is auto-approved. That is well beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core action and its sibling routing come first, caveats second, return shape last. Every clause carries distinct information, though the return-shape sentence is long and could be tightened.
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 takes on the burden of describing returns (list of contacts shaped like contacts_list, source values 'personal'/'directory'/'both'/'other', max_results bound, possible redaction) and does so. Nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds real nuance the schema does not spell out — that the default 'both' means saved contacts only, and that directory is a scan rather than a filter. It also reinforces the differing max_results caps (30 saved vs 1000 directory). Slight redundancy with the schema keeps it off a 5.
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 ('Search contacts by name or email address') and immediately distinguishes itself from the two nearest siblings, contacts_list and contacts_get, by naming both and their conditions. An agent can select it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use routing: 'Use contacts_list instead to browse without a query, and get a contact's full record with contacts_get.' It also states a hard limitation (no full company-directory search under this app's permissions), which is exactly the kind of guidance that prevents a doomed call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_updateA
Update a contact's fields. Provide only the fields you want to change. Requires user approval. emails and phones are JSON strings, e.g. '[{"value": "a@b.com", "type": "work"}]'. An empty value leaves that field as it is, except that emails and phones passed as '[]' clear the list. Returns the updated contact in the same shape contacts_get returns. Get the resource name from contacts_search, and read the current values with contacts_get first.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | New notes, replacing the current ones. Empty leaves the notes unchanged. | |
| emails | No | JSON array of {value, type} objects, e.g. '[{"value": "a@b.com", "type": "work"}]'. Replaces all the contact's emails, so include the ones to keep. Empty leaves them unchanged; '[]' clears them. | |
| phones | No | JSON array of {value, type} objects, e.g. '[{"value": "+15551234567", "type": "mobile"}]'. Replaces all the contact's phones, so include the ones to keep. Empty leaves them unchanged; '[]' clears them. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| job_title | No | New job title. Empty leaves it unchanged. | |
| display_name | No | New full name, split on spaces into given and family name. Empty leaves the name unchanged. | |
| organization | No | New company name. Empty leaves it unchanged. | |
| resource_name | Yes | Resource name of the contact to update ('people/c12345'), from contacts_search or contacts_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only covering readOnly/idempotent/destructive, the description adds real behavioral context: the user-approval gate, the partial-update rule (empty leaves a field unchanged), the special '[]' clearing semantics for list fields, and the exact return shape referencing contacts_get. That is exactly the kind of beyond-annotation detail the score rewards.
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 core action and partial-update rule are front-loaded, followed by the format example, then return shape, then prerequisites. Every sentence carries operational value 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 an 8-parameter mutation with no output schema, the description covers approval requirement, replacement/clearing behavior, JSON string encoding, and the return shape. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents resource_name, each field, defaults, and the emails/phones JSON format and clearing rules. The description restates that same content rather than adding new semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update a contact's fields') and immediately distinguishes the operation from creation/read siblings by explaining partial-update semantics. An agent can tell it apart from contacts_create and contacts_get without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites and workflow: get resource_name from contacts_search, read current values with contacts_get first, and note that user approval is required. It does not state when NOT to use the tool, so it falls just short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_add_commentA
Add a comment to a Drive file. Returns {file_id, comment_id, content}, where comment_id is the new comment's id. The comment is posted as the user and is not anchored to any text. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| comment | Yes | Text of the comment to post on the file. | |
| file_id | Yes | Id of the Drive file, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false): it discloses the posting identity ('posted as the user'), the anchoring behavior ('not anchored to any text'), the approval requirement, and the returned fields including how comment_id is obtained. These are exactly the behavioral traits an agent needs before invoking a write 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?
Three short sentences, zero filler, and the core action is front-loaded before the return contract. Each sentence carries distinct information (action, result, behavior/prerequisite).
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 low-complexity, three-parameter write tool with no output schema, the description supplies the result shape inline and covers the non-obvious behaviors (identity, anchoring, approval). Nothing essential 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%, so file_id, comment and reason are already fully documented in the schema (including how to obtain the file id). The description adds no format, constraint or default information 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 and resource ('Add a comment to a Drive file') and immediately follows with the return shape, so the agent knows exactly what operation is performed and what comes back. There is no competing Drive comment tool among the siblings, so no further disambiguation is required.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than spelled out – nothing says when to prefer this over other communication tools (e.g. slack_send_message or jira_add_comment) or when not to comment on a file. The only contextual cue is the prerequisite 'Requires user approval', which usefully signals a gated workflow but is not framed as when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_copy_fileA
Copy a Drive file into a folder. The original stays where it is, unchanged. Returns {id, name, mime_type, web_view_link, source_file_id, parent}, where id is the new copy's id. Folders cannot be copied. Get the destination's id from drive_list_folder. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name for the copy. Empty keeps the original file's name. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_id | Yes | Id of the file to copy, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/). | |
| destination_folder_id | Yes | Id of the folder to put the copy in, from drive_list_folder or drive_list_files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (write, non-idempotent, non-destructive); the description adds materially more: the original is left unchanged, folders are rejected, user approval is required, and the full return shape is enumerated with the meaning of 'id'. That is rich behavioral context an agent can act on.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six short sentences, front-loaded with purpose, then behavior, limits, prerequisite, and approval requirement, with no filler. The return-shape sentence earns its place because no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers purpose, source preservation, limitations, prerequisite, approval, and the exact return fields. Nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters are already documented in the schema. The description echoes the destination-id source and clarifies that the returned id is the new copy's, but adds little syntax or format detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Copy a Drive file into a folder'), plus scope limitations ('Folders cannot be copied'). This clearly separates it from siblings like drive_move_file, drive_upload_file, and drive_create_blank_file without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives prerequisites explicitly: the destination id comes from drive_list_folder, and the call 'Requires user approval.' It also states the negative constraint that folders cannot be copied. It does not name an alternative sibling for the move-vs-copy decision, so it stops 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.
drive_create_blank_fileA
Create a new blank Drive file. Returns {id, name, mime_type} of the new, empty file. Fill it with drive_write_doc_content (a Google Doc), drive_write_file_content (a text file) or drive_upload_file (any file with content); use drive_sheets_create for a spreadsheet. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the new file, as shown in Drive. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| mime_type | Yes | MIME type of the file to create, e.g. 'application/vnd.google-apps.document' for a Google Doc or 'text/plain' for a text file. | |
| parent_folder_id | No | Id of the folder to create it in. Empty creates it in My Drive's root. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, so the safety profile is covered. The description adds meaningful context beyond that: the return shape {id, name, mime_type} and the 'Auto-approved' approval behavior, which annotations don't express. It doesn't state permission requirements or what happens on name collisions, so it's 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?
Three compact sentences, front-loaded with purpose and return shape before the routing guidance. Every sentence earns its place; the only nit is that the routing list slightly crowds the core statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter creation tool with full schema coverage and no output schema, the description supplies what the schema cannot: the return shape and the downstream 'fill it' workflow that prevents the agent from creating a dead-end empty file. It omits permission scope and collision behavior, keeping it short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters including MIME type examples and the empty-string default for parent_folder_id. The description adds no parameter-level syntax or format detail 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?
States a specific verb+resource ('Create a new blank Drive file') and explicitly distinguishes itself from siblings by naming which tool to use next depending on file type (drive_write_doc_content, drive_write_file_content, drive_upload_file) and calling out drive_sheets_create for spreadsheets. An agent can pick this tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use this to create the empty shell, then fill it with one of three named tools, or use drive_sheets_create for spreadsheets. The 'Auto-approved' note also tells the agent it needs no approval gate, which is a usage condition. 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.
drive_docs_edit_contentA
Replace one occurrence of existing text in a Google Doc with new Markdown, without touching the rest of the document. find_text must match exactly one location in the document's plain, unformatted text — the words as typed, with no Markdown syntax in them at all (this is not the same as drive_get_file_content's output for a Doc, which now renders formatting as Markdown; strip any '**'/'#'/etc. markers back out of find_text first) — include enough surrounding context to make it unique, the same way a unique-match text editor requires; set replace_all=true to replace every occurrence instead. replace_markdown supports the same Markdown syntax as drive_write_doc_content, including GFM pipe tables. Returns {file_id, occurrences_replaced}. Use drive_docs_format_content to change formatting without changing the text. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_id | Yes | Id of the Google Doc to edit, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/). | |
| find_text | Yes | Exact plain-text substring to locate, as typed in the document with no Markdown markers. Must match exactly one place unless replace_all is true. | |
| replace_all | No | Default false: find_text must match exactly one place or the call fails. True replaces every occurrence. | |
| replace_markdown | Yes | Markdown to insert in place of the match, in the syntax drive_write_doc_content accepts. Empty deletes the matched text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only say non-readonly, non-idempotent, non-destructive): discloses the failure mode when find_text is not unique, the return shape {file_id, occurrences_replaced}, that empty replace_markdown deletes the match, and that user approval is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation, and every sentence carries information, but the find_text sentence is a dense run of em-dashes and parentheticals that takes effort 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-parameter mutation tool with no output schema, the description covers preconditions, alternatives, side effects, and the return value, leaving nothing an agent needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic value: it warns that find_text must come from plain unformatted text, not drive_get_file_content's Markdown rendering, and explains replacement Markdown syntax including GFM pipe tables.
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 (replace), resource (existing text in a Google Doc), and scope (one occurrence, rest untouched). It is immediately distinguishable from siblings like drive_write_doc_content and drive_docs_format_content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use drive_docs_format_content to change formatting without changing text, and replace_all=true to replace every occurrence. It also states the preconditions for a successful match (exact plain-text, unique, enough surrounding context) and notes user approval is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_docs_format_contentA
Apply formatting (bold, italic, highlight, text color) to existing text in a Google Doc, located the same way as drive_docs_edit_content, without changing the text itself. Every formatting parameter is opt-in — its default means 'leave that aspect unchanged', so a call that only sets highlight_color never touches bold/italic already on the matched text. Returns {file_id, occurrences_formatted}. Use drive_docs_edit_content to change the text itself. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| bold | No | 'true' or 'false'; omit to leave unchanged | |
| italic | No | 'true' or 'false'; omit to leave unchanged | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_id | Yes | Id of the Google Doc to format, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/). | |
| find_text | Yes | Exact plain-text substring to format, as typed in the document with no Markdown markers. Must match exactly one place unless replace_all is true. | |
| text_color | No | hex color e.g. '#000000'; omit to leave unchanged | |
| replace_all | No | Default false: find_text must match exactly one place or the call fails. True formats every occurrence. | |
| highlight_color | No | hex color e.g. '#fff59d'; omit to leave unchanged |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description adds genuinely non-obvious behavior: every formatting param is opt-in with 'leave unchanged' defaults, and the return shape {file_id, occurrences_formatted}. It does not cover failure modes beyond what the schema's replace_all note provides, so it stops 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-loaded with purpose and scope, then defaults, then return value and the sibling pointer. Every sentence carries information, though the opt-in explanation is slightly verbose relative to the schema note that already says 'omit to leave unchanged'.
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 8-parameter mutation tool with no output schema, the description supplies the missing return shape, the opt-in default contract, the approval requirement, and sibling routing. An agent has everything needed to call 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, but the description adds real meaning on top of the schema by explaining the opt-in default semantics (setting only highlight_color leaves bold/italic untouched), which clarifies how the empty-string defaults interact.
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 (Apply formatting), the resource (existing text in a Google Doc), the exact formatting kinds (bold, italic, highlight, text color), and explicitly distinguishes itself from drive_docs_edit_content by noting it does not change the text 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 routing: use this for formatting, use drive_docs_edit_content to change the text itself, and states that user approval is required. The alternative and the selection condition are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_download_fileARead-onlyIdempotent
Download a Drive file. Google Workspace documents are exported as text/CSV. On a local install: saved to destination_dir, and it Returns {path, name, size_bytes, truncated} -- destination_dir is required, there is no default, so choose deliberately: pass ~/Downloads (or a path the user asked for) for a deliverable, or your own scratch directory to just read or process it. On an organization-managed install: destination_dir is ignored -- a small file's bytes come back directly in the result, a larger file as a one-time link the human opens in their own browser. Use drive_get_file_content instead to read a file's text. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_id | Yes | Id of the Drive file, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/). | |
| destination_dir | Yes | Local install only: where to save the file -- required, no default. On an organization-managed install it is ignored and nothing is saved to it; any value will do. Use ~/Downloads (or a path the user specified) if the user should find this file afterward; use your own working/scratch directory if it's only for you to read or process. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly/idempotent/non-destructive), but the description adds substantial context they cannot: the local-install vs organization-managed install split, that destination_dir is silently ignored on managed installs, that large files return a one-time link the human must open, and the exact return shape {path, name, size_bytes, truncated}.
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 purpose and the export caveat; every sentence carries real information about install types, return shape, and approval. It is dense and slightly repetitive, restating destination_dir guidance that the schema already covers, but nothing is wasted 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?
With no output schema, the description supplies the return fields itself, and it covers the environment-dependent behavior that would otherwise cause a wrong call (saving to an ignored directory on managed installs). Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the schema already documents destination_dir's semantics. The description nonetheless reinforces the deliberate-choice framing for destination_dir and ties it to the install-type behavior, adding decision guidance beyond the field docs, though the overlap with the schema text is substantial.
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 ('Download a Drive file') and immediately adds the scope-defining behavior that Workspace docs are exported as text/CSV. It names the sibling it is not (drive_get_file_content) so an agent can differentiate without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use drive_get_file_content instead to read a file's text,' and gives a concrete decision rule for destination_dir (deliverable path vs scratch directory). It also warns that user approval is required, which is a usage precondition, not just a behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_get_file_contentARead-onlyIdempotent
Fetch the content of a Drive file by id. A Google Doc comes back as Markdown (headings, bold, italic, strikethrough, underline, code, link, ==highlight==, '---' dividers, nested bullet/numbered lists with a 2-space indent per level, GFM pipe tables with alignment), the syntax drive_write_doc_content accepts, so it round-trips into it or drive_docs_edit_content. An exact highlight or text color Markdown can't carry comes back in 'highlights'/'text_colors' ({text, hex} lists). A Sheet comes back as CSV, Slides as plain text. A PDF, .docx, .pptx or .xlsx comes back as its extracted text (a scanned PDF has none), with 'truncated': true when cut to fit; a .zip as its list of entries. Other files, such as images, only get a placeholder: use drive_download_file for those. Returns {file_id, content}, plus truncated, highlights and text_colors when they apply; content may be redacted by the user's privacy settings. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_id | Yes | Id of the Drive file, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description adds substantial context beyond them: the exact returned Markdown syntax, truncated:true on cut output, highlights/text_colors side-fields, placeholder behavior for images, and that content may be redacted by privacy settings. It also notes the approval requirement, which annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by format-by-format behavior. The long parenthetical enumerating Markdown syntax is dense but arguably earns its place as round-trip guidance; slightly verbose but no wasted framing.
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 carries return-shape information thoroughly: {file_id, content} plus truncated/highlights/text_colors, per-format return types, and edge cases (scanned PDFs, redaction). Nothing essential 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 both parameters (file_id, reason) are already documented in the schema, including the id's origin from drive_list_files/drive_list_folder/URL. The description adds no parameter-level detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Fetch the content of a Drive file by id') and immediately disambiguates from siblings by describing what each file type returns. An agent can distinguish it from drive_get_file_metadata and drive_download_file without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes unsupported types to drive_download_file ('Other files, such as images, only get a placeholder: use drive_download_file for those') and notes format suitability for round-tripping into drive_write_doc_content/drive_docs_edit_content. It gives clear context but does not contrast against metadata/list siblings like drive_get_file_metadata or drive_sheets_get_values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_get_file_metadataARead-onlyIdempotent
Fetch metadata for a single Drive file by id (name, owners, times, sharing status). Returns one file in the same shape drive_list_files lists ({id, name, mime_type, size, created_time, modified_time, owners, shared, web_view_link, parent_ids, drive_id, thumbnail_link}), or only {id} if the user's privacy settings hide file metadata. Use drive_get_file_content to read the file's text. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_id | Yes | Id of the Drive file, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/non-destructive profile, yet the description adds valuable behavior: the exact return shape, the privacy-driven degradation to only {id}, and that the call is auto-approved. That is meaningful context beyond the structured fields.
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 the core action and the return shape early, with the alternative tool and privacy caveat following. The nested field list is somewhat dense but each element earns its place by documenting the payload in the absence of an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return contract fully, including the field list and the privacy fallback. Combined with annotation-covered safety and a 100%-documented schema, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both file_id and reason are fully documented in the schema. The description repeats the id source at best and adds no new parameter 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 a specific verb and resource ('Fetch metadata for a single Drive file by id') and enumerates the fields returned. It is clearly distinguishable from siblings like drive_get_file_content and drive_list_files, which are named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to drive_get_file_content for reading file content and ties the id to drive_list_files/drive_list_folder. It gives clear context but no explicit when-not-to-use beyond the content-read alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_get_revision_contentARead-onlyIdempotent
Fetch the content of one earlier saved version of a Drive file, by file id and revision id. A Google Doc or Slides version comes back as plain text (not the Markdown drive_get_file_content gives), a Sheet version as a Markdown table per tab, a PDF, .docx, .pptx or .xlsx version as its extracted text, a .zip as its list of entries, and a text file as its text; other files, such as images, only get a placeholder with their size. Returns {file_id, revision_id, modified_time, content}, plus 'truncated': true when content was cut to fit; content may be redacted by the user's privacy settings. To compare with the current version, read the newest revision from drive_list_revisions with this tool rather than mixing in drive_get_file_content's different format. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_id | Yes | Id of the Drive file, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/). | |
| revision_id | Yes | Id of the version to read, from drive_list_revisions; the newest entry there is the current version, so read it the same way to compare like with like. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only profile, but the description adds much more: per-file-type return formats (Doc/Slides as plain text, Sheet as Markdown table, PDF/Office as extracted text, zip as entry list, images as placeholder), a 'truncated' flag, and possible redaction by privacy settings. This is exactly the extra context the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, and the following sentences carry real information. The file-type enumeration is long but earns its place because there is no output schema defining the return shape; only slight run-on density keeps it from a 5.
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 fully documents the return object ({file_id, revision_id, modified_time, content} plus 'truncated'), the redaction caveat, and the approval requirement. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter (file_id, revision_id, reason) is already well documented in the schema. The description restates file_id/revision_id but adds no syntax or format detail beyond what the schema provides, 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 and resource ('Fetch the content of one earlier saved version of a Drive file, by file id and revision id') and clearly distinguishes itself from drive_get_file_content and drive_list_revisions. An agent can immediately tell what this returns and how it differs from its closest siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing guidance: to compare against the current version, read the newest revision via drive_list_revisions with this tool rather than mixing in drive_get_file_content's different format. It names the alternative and the condition that selects it, and flags the approval requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_list_filesARead-onlyIdempotent
Search Google Drive and return matching file metadata (id, name, mime_type, owners, sharing status). Returns a list of {id, name, mime_type, size, created_time, modified_time, owners, shared, web_view_link, parent_ids, drive_id, thumbnail_link}: at most max_results files (default 20, capped at 1000), read across pages, in the order the Drive API gives for the query; fields may be redacted by the user's privacy settings. Use drive_list_folder to list one folder's children, or drive_get_file_metadata when you already have a file's id. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Drive API 'q' search query syntax, not a plain-text search string, e.g. "name contains 'Foo'" or "fullText contains 'Foo'". See https://developers.google.com/drive/api/guides/search-files | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Most files to return. Default 20, capped at 1000. Reads up to max_results items across pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds real behavioral context beyond annotations: pagination behavior (reads across pages, capped at 1000, default 20), result ordering follows the Drive API query order, fields may be redacted by privacy settings, and it is 'Auto-approved'. It stops short of describing rate limits or failure modes, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the routing sentence is tight, but the mid-sentence enumeration of twelve return fields is dense and partly duplicates the informative clauses around it. Still, every sentence carries content, so it is efficient if slightly over-packed.
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, so the description carries the full burden of describing the return value — and it does so thoroughly, enumerating the field set, the page/cap behavior, ordering, and privacy redaction. An agent has everything needed to call and interpret results 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 all three parameters are already documented in the schema. The description restates the max_results default/cap and the q-syntax nature of query rather than adding new meaning. Baseline 3 is appropriate 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 ('Search Google Drive and return matching file metadata') and explicitly distinguishes itself from siblings by naming drive_list_folder and drive_get_file_metadata with the conditions that select them. An agent can tell it apart 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?
Names two alternatives and the exact condition for each: drive_list_folder for one folder's children, drive_get_file_metadata when the file id is already known. 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.
drive_list_folderARead-onlyIdempotent
List the direct children of a Drive folder by id. Returns a list of files in the same shape drive_list_files returns: at most max_results children (default 50, capped at 1000), read across pages, excluding trashed files, in the order the Drive API gives. Use drive_list_files to search by name or content instead of browsing one folder. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| folder_id | Yes | Id of the folder whose children to list, from drive_list_files, another file's parent_ids, or drive_list_shared_drives (a shared drive's id lists its top level). | |
| max_results | No | Most children to return. Default 50, capped at 1000. Reads up to max_results items across pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description goes beyond them by disclosing pagination behavior ('read across pages'), the trashed-file exclusion, default and cap values, and ordering semantics ('in the order the Drive API gives'), which are real behavioral traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, then return shape, then the sibling alternative. Efficient overall, though the max_results default/cap sentence repeats what the schema already states and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description supplies the missing return-shape information ('same shape drive_list_files returns') plus pagination, ordering, and filtering behavior. Nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so folder_id, reason, and max_results are all documented in the schema already. The description's restatement of the max_results default/cap and page-reading behavior largely duplicates the schema text, adding little new meaning. 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 ('List the direct children of a Drive folder by id') and explicitly distinguishes itself from its closest sibling by contrasting browsing one folder against searching by name/content. An agent can route between drive_list_folder and drive_list_files 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 (drive_list_files) and the condition that selects it ('to search by name or content instead of browsing one folder'), plus the 'Auto-approved' note signalling no approval prompt is needed. Both when-to-use and when-to-use-the-other are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_list_revisionsARead-onlyIdempotent
List the saved versions (revision history) of a Drive file by id: when each was saved and by whom. Returns a list of {id, modified_time, author_name, author_email, size, keep_forever, before_cutoff}, newest first: at most max_results (default 50, capped at 1000) plus the before_cutoff entry, read across pages. Google merges a Doc's, Sheet's or Slides' frequent edits into fewer versions, and does not say which cell or paragraph each one changed. If the user's privacy settings hide file metadata, each entry is only {id, before_cutoff}. Use drive_get_revision_content to read one version's text, and drive_get_file_metadata for the file's current details. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_id | Yes | Id of the Drive file, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/). | |
| max_results | No | Most versions to return, newest first, not counting the before_cutoff entry. Default 50, capped at 1000. Older versions past the cap are left out. | |
| modified_after | No | Only versions saved at or after this UTC time, as YYYY-MM-DD or an RFC 3339 time such as 2026-10-05T00:00:00Z. The newest version saved before it is added last, marked before_cutoff, as the 'before' side to compare against. Empty returns the newest versions with no cutoff. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: return shape, cross-page reads, the caveat that Google merges frequent edits and won't say which cell or paragraph changed, and that privacy settings can reduce entries to {id, before_cutoff}. These are non-obvious behavioral traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose then return shape, caveats, and alternatives, with every sentence carrying information. 'newest first' is stated twice and the trailing 'Auto-approved.' is slightly tacked on, but overall the density is appropriate for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the full burden of describing the return value and it does so completely, including the reduced-metadata edge case and pagination. Nothing needed to call or interpret the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds meaning by explaining that the before_cutoff entry is returned in addition to max_results and that the cap leaves older versions out. It doesn't add syntax detail for modified_after beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the saved versions (revision history) of a Drive file by id') and immediately clarifies the payload ('when each was saved and by whom'). It explicitly distinguishes itself from siblings drive_get_revision_content and drive_get_file_metadata, 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?
Gives explicit routing: 'Use drive_get_revision_content to read one version's text, and drive_get_file_metadata for the file's current details.' This names the alternatives and the conditions that select them, which is exactly the when/when-not guidance required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_move_fileA
Move a Drive file to a different folder. The file leaves every folder it is in now. Returns {file_id, new_parent}. Get the destination's id from drive_list_folder. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_id | Yes | Id of the file or folder to move, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/). | |
| destination_folder_id | Yes | Id of the folder to move it into, from drive_list_folder or drive_list_files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: the file is removed from all current parents (true move, not a copy), the call needs user approval, and the return shape is {file_id, new_parent}. The approval requirement is especially valuable since no annotation covers it. It does not discuss permissions or failure modes, and the removal semantics could be read as destructive-adjacent, but this is not a contradiction of destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each carrying distinct information: what it does, the move semantics, the return value, the prerequisite, and the approval gate. Nothing is redundant and the core action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation tool with no output schema, the description covers the operation's semantics, the id-sourcing prerequisite, the approval requirement, and the return fields. An agent has everything needed to invoke it correctly without additional discovery.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter including the mandatory 'reason' is already documented. The description only restates where the destination id comes from, which the schema also says, so it adds no meaning beyond the structured fields. 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 (move) and resource (Drive file) plus the scope of the operation (to a different folder). It is immediately distinguishable from siblings like drive_upload_file or drive_write_file_content, and the follow-up sentence clarifies the move semantics rather than restating the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an actionable prerequisite ('Get the destination's id from drive_list_folder') and a policy requirement ('Requires user approval'), which routes the agent correctly. It stops short of naming alternatives or an explicit when-not-to-use condition, but the context is clear enough to act on.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_sheets_add_sheetA
Add a new tab to an existing spreadsheet. Returns {sheet_id, title, index} of the new tab. Use drive_sheets_create for a new spreadsheet, and drive_sheets_get_metadata to see the tabs that exist. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| cols | No | Number of columns the new tab starts with. Default 26, at least 1. | |
| rows | No | Number of rows the new tab starts with. Default 1000, at least 1. | |
| title | Yes | Name of the new tab. Must not be empty or already used by another tab. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| spreadsheet_id | Yes | Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish it is a non-read-only, non-idempotent, non-destructive mutation. The description adds value beyond them by naming the return shape {sheet_id, title, index} and disclosing the user-approval requirement, which is not encoded in the annotations. Gaps remain around permissions and exact mutation scope.
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: purpose, return value, sibling routing. The most decision-critical information (what it does, which tool to use instead) is front-loaded with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with full schema coverage and no output schema, the description covers purpose, routing, return shape, and the approval gate. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains spreadsheet_id, title, rows, cols, and the reason field in detail. The description adds no parameter-level syntax or constraints beyond that, so it sits at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a new tab to an existing spreadsheet') and immediately distinguishes itself from drive_sheets_create and drive_sheets_get_metadata. An agent can tell what this does and what it is not without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: drive_sheets_create for a new spreadsheet, drive_sheets_get_metadata to inspect existing tabs. It also flags 'Requires user approval', giving the agent the condition that gates invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_sheets_createA
Create a new Google Sheets spreadsheet, optionally with named tabs. Returns {id, name, web_view_link}; id is the spreadsheet_id the other drive_sheets_* tools take. Use drive_sheets_add_sheet to add a tab to a spreadsheet that already exists. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Title of the new spreadsheet, as shown in Drive. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| sheet_titles | No | JSON array of tab names, e.g. ["Q1","Q2"]. Defaults to a single 'Sheet1' tab if omitted. | |
| parent_folder_id | No | Id of the folder to move the new spreadsheet into. Empty leaves it in My Drive's root. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, so the write/non-idempotent profile is partly structured. The description adds the return shape ({id, name, web_view_link}), the key id linkage to other drive_sheets_* tools, and the 'Auto-approved' behavior — non-obvious context beyond the annotations. It stops short of stating side effects or reversal, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each earning its place: the action, the return/ID linkage, the sibling routing, and the approval status. Front-loaded with the core verb+resource and 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 create tool with no output schema, the description supplies the return shape and the id's downstream use, plus the sibling alternative and approval status. It is complete enough to invoke correctly; only the absence of side-effect/reversal notes keeps it just shy 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 the baseline is 3. The description notes the named-tabs option but adds no syntax or format detail beyond what the schema already documents (including the JSON array format and default tab behavior).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Create a new Google Sheets spreadsheet'), names the optional capability (named tabs), and distinguishes itself from the sibling drive_sheets_add_sheet by routing that use case elsewhere. An agent can tell it apart from the other drive_sheets_* tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the alternative tool (drive_sheets_add_sheet) and the condition that selects it ('to add a tab to a spreadsheet that already exists'), leaving nothing to inference. This is exemplary when-to-use/when-to-use-the-other guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_sheets_delete_dimensionsADestructive
Delete rows or columns from a sheet tab, including any values, formulas, and formatting they contain. This is destructive — deleted cell content is not recoverable through PrivacyFence. Remaining rows/columns shift to close the gap. Returns {spreadsheet_id, sheet_id, dimension, deleted}. Use drive_sheets_insert_dimensions to add blank ones. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | How many rows or columns to delete, starting at start_index. Default 1. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| sheet_id | Yes | Numeric id of the tab (its sheet_id), from drive_sheets_get_metadata; not the tab's title and not the spreadsheet_id. | |
| dimension | Yes | What to delete: 'ROWS' or 'COLUMNS'. | |
| start_index | Yes | 0-based index of the first row or column to delete (row 1 or column A is 0). | |
| spreadsheet_id | Yes | Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation by stating content is not recoverable through PrivacyFence, that remaining rows/columns shift to close the gap, that user approval is required, and the return shape. These are meaningful behavioral traits not derivable from the annotations alone.
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 the action and its destructive nature, then behavior, return shape, alternative, and approval requirement. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the return object fields, the mutating/shifting behavior, the reversal path, and the approval requirement. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented in the schema. The description adds no parameter-specific syntax or format detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (rows or columns from a sheet tab) and clarifies the scope of what is removed (values, formulas, formatting). It also names the sibling drive_sheets_insert_dimensions as the inverse operation, letting an agent distinguish it 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 indicates the delete use case and routes to the alternative (drive_sheets_insert_dimensions) for the opposite operation, plus notes user approval is required. It lacks explicit when-not conditions, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_sheets_format_rangeA
Apply formatting to a range in a spreadsheet: bold/italic, colors, number format, horizontal/vertical alignment, text wrap, column width, frozen rows/columns, and merged cells. Every parameter is opt-in — its default means 'leave that aspect unchanged', so a call that only sets a background color never touches unrelated formatting already on the range. Returns {spreadsheet_id, sheet_id, requests_applied}. Use drive_sheets_write_range to change cell values. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| bold | No | 'true' or 'false'; omit to leave unchanged | |
| italic | No | 'true' or 'false'; omit to leave unchanged | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| range_a1 | Yes | Plain A1 range scoped to sheet_id, e.g. 'A1:C10' (no sheet-name prefix, must be fully bounded) | |
| sheet_id | Yes | Numeric id of the tab (its sheet_id), from drive_sheets_get_metadata; not the tab's title and not the spreadsheet_id. | |
| merge_type | No | KEEP (default) / NONE (unmerge) / MERGE_ALL / MERGE_COLUMNS / MERGE_ROWS | KEEP |
| text_color | No | hex color e.g. '#ffffff'; omit to leave unchanged | |
| freeze_cols | No | Number of columns to freeze at the left (0 unfreezes); omit (-1) to leave unchanged | |
| freeze_rows | No | Number of rows to freeze at the top (0 unfreezes); omit (-1) to leave unchanged | |
| column_width | No | Pixel width for the range's columns; omit (-1) to leave unchanged | |
| number_format | No | Sheets number-format pattern, e.g. '0.00%', '$#,##0.00', 'yyyy-mm-dd'; omit to leave unchanged | |
| wrap_strategy | No | 'OVERFLOW_CELL' (overflow into empty neighboring cells) / 'CLIP' (cut off at the cell boundary) / 'WRAP' (line break to fit the cell); omit to leave unchanged | |
| spreadsheet_id | Yes | Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name. | |
| background_color | No | hex color e.g. '#ffcc00'; omit to leave unchanged | |
| vertical_alignment | No | 'TOP' / 'MIDDLE' / 'BOTTOM'; omit to leave unchanged | |
| horizontal_alignment | No | 'LEFT' / 'CENTER' / 'RIGHT'; omit to leave unchanged |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, idempotentHint=false, destructiveHint=false; the description adds real substance beyond them — it explains the opt-in default semantics ('its default means leave that aspect unchanged') so the agent knows a partial call won't clobber unrelated formatting, discloses the return shape, and flags the user-approval requirement. The only minor tension is that opt-in, leave-unchanged semantics read as idempotent while annotations set idempotentHint=false, but the description never asserts repeat-call behavior, so this is not a 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 sentences, front-loaded with purpose, then the key default-semantics rule, then return shape plus sibling routing and the approval note. Every sentence earns its place; the only slight drag is the long enumeration of formatting facets, which is nonetheless the most informative part of the first sentence.
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 mutation tool with no output schema, the description supplies what the structured fields cannot: the opt-in default contract, an inline description of the return object, the alternative tool, and the approval requirement. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter already carries its own 'omit to leave unchanged' note plus value examples, so the schema does the heavy lifting and 3 is the baseline. The description's grouping of the 16 parameters into named categories (colors, alignment, wrap, width, frozen rows/cols, merges) aids scanning and its 'every parameter is opt-in' framing adds useful cross-parameter meaning that no single parameter description conveys.
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 ('Apply formatting to a range in a spreadsheet') and then enumerates the concrete formatting facets (bold/italic, colors, number format, alignment, wrap, width, frozen rows/cols, merges). It also names the sibling it is not — drive_sheets_write_range — so an agent can separate formatting from value mutation 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?
Explicit routing to the alternative: 'Use drive_sheets_write_range to change cell values,' which tells the agent when to pick the sibling instead. It also surfaces a gating condition ('Requires user approval'). It stops short of stating explicit when-not-to-use cases (e.g. formatting across multiple sheets), 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.
drive_sheets_get_metadataARead-onlyIdempotent
List the tabs in a spreadsheet (id, title, index, row/column count). Returns a list of {sheet_id, title, index, row_count, column_count, hidden}, one per tab. Use drive_sheets_get_values to read a tab's cells; sheet_id is the tab id other drive_sheets_* tools take. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| spreadsheet_id | Yes | Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds 'Auto-approved,' which is genuine operational context not present in the annotations, plus the exact return shape since no output schema exists.
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: what it lists, what it returns, how it relates to siblings. The purpose and return shape are front-loaded with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description supplies the return fields and the approval behavior, and identifies the key output token's downstream use. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (spreadsheet_id, reason) are fully documented in the schema. The description adds no syntax or format detail beyond it, 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 (List) and resource (tabs in a spreadsheet), then enumerates the returned fields. It clearly distinguishes itself from drive_sheets_get_values, which reads cell values rather than tab structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to drive_sheets_get_values for reading cells, and explains that sheet_id is the tab identifier other drive_sheets_* tools accept. It does not state a when-not-to-use condition, but the sibling routing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_sheets_get_valuesARead-onlyIdempotent
Read a range of cells from a spreadsheet: display values by default, or the underlying values, or formulas instead of computed results, and optionally cell formatting alongside them. Returns the cells as a list of rows (each a list of values; the Sheets API leaves out trailing empty cells), or {values, formatting} with per-cell formatting dicts when include_formatting is true; values may be redacted by the user's privacy settings. Use drive_sheets_get_metadata to list the tab names and sizes first. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| range_a1 | Yes | Range in A1 notation including the tab name, e.g. 'Sheet1!A1:C10' or 'Sheet1!A:A'. | |
| spreadsheet_id | Yes | Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name. | |
| include_formatting | No | Default false: values only. True also fetches per-cell formatting (bold/italic/text color/background color/number format/horizontal/vertical alignment/text wrap -- the same aspects drive_sheets_format_range can set). | |
| value_render_option | No | FORMATTED_VALUE (default): displayed strings, e.g. '$1.00'. UNFORMATTED_VALUE: the underlying value with no formatting, e.g. 1. FORMULA: the formula text itself, e.g. '=A1+A2', instead of its computed result -- use this to read formulas. | FORMATTED_VALUE |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial context beyond them: values may be redacted by user privacy settings, trailing empty cells are omitted by the Sheets API, and the tool requires user approval. These are non-obvious operational traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and resource, then layered with return-shape and behavioral notes. Dense but each clause carries information; only slightly longer than strictly necessary.
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 fully compensates by describing the return shape (list of rows, or {values, formatting}), the trailing-empty-cell caveat, and the redaction possibility. Nothing essential 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%, so the schema already documents all five parameters including the value_render_option enum values and formatting scope. The description restates the default display-vs-formula behavior but adds no syntax or meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (a range of cells from a spreadsheet), and clearly distinguishes itself from siblings like drive_sheets_get_metadata and drive_sheets_write_range. The optional variant behaviors (display values, underlying values, formulas, formatting) are spelled out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to drive_sheets_get_metadata to list tab names and sizes first, which is genuine when-to-use guidance. It does not, however, state when-not to use it or contrast with drive_get_file_content, which also reads file content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_sheets_insert_dimensionsA
Insert blank rows or columns into a sheet tab, shifting existing content after the insertion point. Values/formulas are untouched, only their position shifts; formulas referencing shifted cells are adjusted automatically. Returns {spreadsheet_id, sheet_id, dimension, inserted}. Use drive_sheets_delete_dimensions to remove them. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | How many rows or columns to insert. Default 1. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| sheet_id | Yes | Numeric id of the tab (its sheet_id), from drive_sheets_get_metadata; not the tab's title and not the spreadsheet_id. | |
| dimension | Yes | What to insert: 'ROWS' or 'COLUMNS'. | |
| start_index | Yes | 0-based index of the row or column to insert before (0 inserts at the very top or left). | |
| spreadsheet_id | Yes | Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name. | |
| inherit_from_before | No | Copy formatting from the row/column before the insertion point (Sheets UI default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring readOnly=false, idempotent=false, destructive=false, the description adds substantive behavior: values/formulas are untouched, only positions shift, formulas referencing shifted cells are adjusted automatically, and the return payload is spelled out. The approval requirement is disclosed too.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action, then side effects, then return value, then the sibling route and approval note. No filler and nothing repeated.
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?
Although there is no output schema, the description names the returned fields, and it covers the mutation's effect on existing data and the approval gate. An agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already described in the schema (including start_index 0-based semantics and inherit_from_before default). The description restates the insertion-point concept but adds no syntax or edge-case detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Insert blank rows or columns into a sheet tab') plus the side effect on existing content. It is immediately distinguishable from the inverse sibling drive_sheets_delete_dimensions, which it names.
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 operational context (insertion point, shifting, formulas auto-adjusted) and points to drive_sheets_delete_dimensions for removal, plus flags that user approval is required. It does not, however, state when to prefer this over other sheet-editing tools such as drive_sheets_write_range or add_sheet.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_sheets_rename_sheetA
Rename an existing tab in a spreadsheet. There is no delete-sheet tool — to mark a tab for removal, rename it (e.g. to 'TO BE DELETED - ') and the user can delete it by hand in the Sheets UI. Returns {spreadsheet_id, sheet_id, title} with the new title. Get sheet_id from drive_sheets_get_metadata. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| sheet_id | Yes | Numeric id of the tab (its sheet_id), from drive_sheets_get_metadata; not the tab's title and not the spreadsheet_id. | |
| new_title | Yes | New name for the tab. Must not be empty or already used by another tab. | |
| spreadsheet_id | Yes | Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds real behavioral context beyond annotations: it discloses that user approval is required, that there is no delete-sheet capability, and that the tool returns a specific object with the new title. Not a perfect 5 since it doesn't explain the idempotency behavior (renaming to the same title) beyond what the schema notes about empty/duplicate names, but the approval requirement and workaround context are strong additions.
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 the purpose, then the critical workaround, then the return shape and sourcing, then the approval requirement. Every sentence is necessary and 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 mutation tool with annotations and full schema coverage, this is quite complete: it covers purpose, workaround, return values, parameter sourcing, and the user approval requirement. It misses only edge cases like whether renaming to an existing title fails or idempotency, but those are covered by the schema description for new_title.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so the schema already documents all four parameters (reason, sheet_id, new_title, spreadsheet_id). The description reinforces sheet_id sourcing from drive_sheets_get_metadata and the return structure, but adds only marginal parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Rename) and resource (existing tab in a spreadsheet), which is distinct from the sibling drive_sheets_add_sheet and drive_sheets_get_metadata. The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes when to use it as a workaround ('There is no delete-sheet tool — to mark a tab for removal, rename it...'), which is a genuinely useful routing guideline. It also names drive_sheets_get_metadata as the source of sheet_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_sheets_write_rangeA
Write values and/or formulas into a range of an existing spreadsheet. A cell string starting with '=' is evaluated as a formula, exactly as if typed into the Sheets UI — there is no separate tool for formulas. Writing an empty row/column clears those cells. Returns {spreadsheet_id, updated_range, updated_cells}. Use drive_sheets_format_range to change how cells look, not their values. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| values | Yes | JSON 2D array of rows, e.g. [["Name","Total"],["Alice","=B2*2"]]. Each inner array is one row; a string starting with '=' is written as a formula. | |
| range_a1 | Yes | Range to write, in A1 notation including the tab name, e.g. 'Sheet1!A1:C10'. The values fill it from its top-left cell. | |
| spreadsheet_id | Yes | Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: explains '=' is evaluated as a live formula, that empty rows/columns clear cells, that user approval is required, and gives the return shape. These are consequential behaviors an agent could not infer from readOnlyHint=false / destructiveHint=false alone.
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?
Five tight sentences, each carrying distinct information (operation, formula rule, clearing behavior, return shape, sibling routing, approval). The core action is front-loaded 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 mutating write tool with 100% schema coverage and annotations present, this covers operation, edge cases, return value, alternative tool, and the approval gate. No output schema exists, but the description supplies the return fields explicitly, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already documented in the input schema. The description reinforces the formula convention and the range semantics but adds no syntax or format detail beyond what the schema already states, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Write values and/or formulas into a range of an existing spreadsheet') and immediately distinguishes itself from drive_sheets_format_range. An agent can decide between 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?
Explicitly routes the agent to drive_sheets_format_range for appearance rather than values, which is a clear when-not statement, and clarifies that formulas need no separate tool. It stops short of naming alternatives for reading (drive_sheets_get_values) or other write paths, but the primary confusion is resolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_upload_fileA
Upload any file (e.g. a PDF or image) to Drive as a new file — use this instead of drive_write_file_content for any binary file, since that tool only writes UTF-8 text. Provide exactly one of local_path (a path on the user's computer, absolute or starting with ~/), content_base64 (base64-encoded file bytes; 'name' is then required), or upload_id (the id privacyfence_create_upload_slot returned after you PUT the file's bytes to its upload_url — use this if local_path fails because PrivacyFence cannot read files in your home folder). On an organization-managed install, local_path is read from the server, not the user's machine: prefer content_base64 or upload_id there. Returns {id, name, mime_type, size_bytes}. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name for the new Drive file. Required with content_base64; otherwise empty uses the local file's own name. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| upload_id | No | Id returned by privacyfence_create_upload_slot after you PUT the bytes to its upload_url. Give exactly one of local_path, content_base64 and upload_id; empty otherwise. | |
| local_path | No | Path of the file to upload, absolute or starting with ~/. Give exactly one of local_path, content_base64 and upload_id; empty otherwise. | |
| content_base64 | No | The file's bytes, base64-encoded. Requires name. Give exactly one of local_path, content_base64 and upload_id; empty otherwise. | |
| parent_folder_id | No | Id of the folder to upload into. Empty uploads to My Drive's root. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, but the description adds real value beyond them: the return shape {id, name, mime_type, size_bytes} (no output schema exists) and the 'Requires user approval' gate. It stops short of stating that re-uploading creates a duplicate file (matching non-idempotent), so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the sibling exclusion are front-loaded, then the three modes in the order the schema lists them. It is dense and slightly long with nested parentheticals, but essentially every clause carries actionable 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 a mutation tool with no output schema, the description covers input-mode selection, environment caveats, the approval requirement, and the return shape. An agent has everything needed to 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 baseline is 3, but the description adds meaning the schema does not: the exactly-one-of constraint across local_path/content_base64/upload_id, the dependency that name is required with content_base64, and the privacyfence_create_upload_slot workflow that produces upload_id.
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 (upload) and resource (file to Drive) and explicitly distinguishes itself from sibling drive_write_file_content by noting that tool only writes UTF-8 text. An agent can tell it apart from drive_write_file_content 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 tool and the condition that selects this one ('for any binary file'), then gives explicit guidance for each of the three input modes, including when local_path fails and how org-managed installs change behavior. 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.
drive_write_doc_contentA
Write Markdown content to a Google Doc with rich formatting: headings (# through ######), bold, italic, bold-italic, strikethrough, underline, code, ==highlight== (these five nest freely with each other, e.g. ==bold and highlighted==), link (escape a literal '[' or ']' in the link text as '['/']'), bullet/numbered lists (indent a sub-list 2 spaces per nesting level), GFM pipe tables (a '| --- |' separator row under the header; ':---'/'---:'/':---:' for left/right/center column alignment), and '---'/'***'/'___' on their own line as a horizontal-rule divider. Clears the existing document content before writing — use drive_docs_edit_content or drive_docs_format_content instead for a change that shouldn't touch the rest of the document. Use this instead of drive_write_file_content when the target is a Google Doc and you want formatted output. Returns {file_id}. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_id | Yes | Id of the Google Doc to overwrite, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/). | |
| markdown | Yes | Markdown for the document's new content, in the syntax listed above. Replaces everything already in the Doc. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavioral context beyond the annotations: it clears the document first, requires user approval, and returns {file_id}. Note a mild tension with destructiveHint=false, since wholesale content replacement is arguably destructive, though it is an overwrite rather than a delete of the doc itself. It does not address repeated-call or failure behavior, which the idempotentHint=false annotation hints at.
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?
Purpose and the destructive warning are front-loaded, but the syntax catalog is a dense, unbroken wall of text with no line breaks or grouping, making it hard to scan. The detail is useful but the structure could be significantly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description states the return shape ({file_id}), the destructive overwrite behavior, the approval requirement, and routes to the correct alternatives — everything an agent needs to call 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, but the description carries the entire Markdown dialect definition (nesting rules, table separators, alignment markers, escaping) that the schema only references as 'the syntax listed above'. That materially improves correct use of the markdown parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Write Markdown content to a Google Doc') and explicitly differentiates itself from siblings: drive_write_file_content, drive_docs_edit_content, and drive_docs_format_content. An agent can pick this tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names concrete alternatives with the conditions that select them: use drive_docs_edit_content/drive_docs_format_content for changes that shouldn't touch the rest of the document, and drive_write_file_content for non-Doc targets. Also states that existing content is cleared, which is the key decision factor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drive_write_file_contentA
Write content to an existing Drive file. Replaces the file's whole content with content, written as UTF-8 text. Returns {file_id, modified_time}. Use drive_write_doc_content instead for a formatted Google Doc, or drive_upload_file for a binary file or a new one. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| content | Yes | The full new content of the file, as plain text. It replaces everything already in the file. | |
| file_id | Yes | Id of the Drive file, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states the tool 'Replaces the file's whole content,' which is a destructive update to the file's existing data, yet the annotations declare destructiveHint=false (and the schema reinforces 'It replaces everything already in the file'). This directly conflicts with the annotation's meaning, so per the contradiction rule it scores 1 even though the description is otherwise verbose about 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?
Front-loaded with purpose, then behavior, return shape, alternatives, and the approval requirement in four tight sentences. Every clause carries distinct information and nothing is redundant 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?
With no output schema, the description still reports the return value ({file_id, modified_time}), the write semantics, encoding, sibling alternatives, and the approval gate. An agent has everything needed to decide and call correctly, aside from the annotation conflict noted above.
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 three parameters (reason, content, file_id) are already fully documented, establishing a baseline of 3. The description adds only a marginal detail beyond the schema — the 'UTF-8 text' encoding — while the overwrite semantics are duplicated from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Write content to an existing Drive file') and immediately scopes it with 'existing' and 'replaces the file's whole content.' It explicitly names the adjacent siblings it is not (drive_write_doc_content for formatted Docs, drive_upload_file for binary/new files), so an agent can disambiguate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: use drive_write_doc_content for a formatted Google Doc, drive_upload_file for a binary file or a new one. The 'existing file' constraint plus the alternative-naming is exactly the when/when-not guidance needed, and it adds the 'Requires user approval' precondition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_add_labelA
Add a label to a Gmail message. Returns {message_id, label_added}. A label that does not exist yet is created first. Use gmail_list_labels to see the existing label names, gmail_create_label to create a label without applying it (it fails if the name exists), and gmail_remove_label to take one off. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| label_name | Yes | Name of the label to add, as gmail_list_labels returns it in its name field (nested labels look like 'Work/Projects'). A name that does not exist yet is created. | |
| message_id | Yes | Id of the Gmail message, from gmail_list_messages (its id field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, idempotent=false, destructive=false. The description adds meaningful context beyond that: the side effect that a nonexistent label is created first, the exact return shape ({message_id, label_added}), and the 'Requires user approval' gate. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then return value, side effect, alternatives, and approval requirement in tight, non-redundant sentences. 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 mutating tool with no output schema, the description covers purpose, return value, side effects, sibling routing, and the approval requirement. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters (including the nested-label format and the create-if-missing behavior). The description reinforces the create-if-missing semantics and points to gmail_list_labels as the source of valid names, adding light workflow value over the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a label to a Gmail message') and immediately distinguishes itself from the closely related gmail_remove_label, gmail_create_label and gmail_list_labels. An agent can tell exactly what this does and how it differs from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use gmail_list_labels to see existing names, gmail_create_label to create without applying (noting it fails if the name exists), and gmail_remove_label to remove. This is a textbook when-to-use-vs-alternatives section.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_archive_messageA
Archive a Gmail message by removing it from the Inbox. The message is not deleted and remains searchable. Returns {message_id, archived: true}. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| message_id | Yes | Id of the Gmail message, from gmail_list_messages (its id field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive, non-idempotent mutation, and the description adds genuinely useful context beyond that: the message is not deleted, stays searchable, requires user approval, and returns {message_id, archived: true}. It omits what happens on a repeat call (relevant given idempotentHint=false), leaving a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and scope, then the safety guarantee, then the return shape and approval requirement. No sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers effect (removed from Inbox), reversibility perception (not deleted, searchable), required approval, and the return payload. Nothing an agent needs to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (reason, message_id) are already fully documented, including the provenance of message_id. The description adds no parameter-level detail, 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 ('Archive a Gmail message') and immediately scopes the effect ('by removing it from the Inbox'), which distinguishes it from delete-style siblings like gmail_remove_label or filter operations. An agent can identify the operation without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use—archiving keeps the message searchable and non-destructive—and notes the approval prerequisite. It does not explicitly name alternative tools or state when NOT to use it (e.g., when a label removal or delete is preferable), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_create_draftA
Create a Gmail draft. Returns {draft_id, to, subject}; the draft is only saved, never sent. Use gmail_create_draft_with_attachments instead when there is something to attach, and gmail_reply_draft to answer an existing message so the draft threads with it. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Cc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none. | |
| to | Yes | Recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. | |
| bcc | No | Bcc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none. | |
| body | No | Plain-text body. May be omitted if body_markdown is given -- the plain-text alternative is then auto-derived from it. At least one of body/body_markdown is required. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| send_as | No | Send from this Gmail send-as address instead of the account's default (sets From:, and the signature used is this address's own). Must be one of the account's configured send-as addresses -- anything else is rejected. | |
| subject | Yes | Subject line of the new draft. | |
| body_markdown | No | Optional Markdown body for a rich-text draft. Supports **bold**, *italic*, ==highlight==, [links](url), bullet/numbered lists, and `# Heading 1`/`## Heading 2` (rendered as Gmail's Large/Huge font-size presets, not raw heading tags -- no tables). When given, the draft is sent as plain text + HTML together, so it renders formatted in HTML-capable clients and as readable plain text everywhere else. | |
| include_signature | No | Append the user's Gmail signature (the one Gmail stores for the sending address) to the end of the body. Omit to use the user's 'Append Gmail signature to drafts' setting. Don't also write a sign-off block of your own when this is on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description adds two genuinely useful facts beyond them: 'the draft is only saved, never sent' and the approval requirement. It does not, however, cover retry/idempotency behavior or what happens on send_as validation failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero waste, front-loaded with the core action and the never-sent guarantee before the sibling routing. 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?
With no output schema, the description helpfully names the return shape ({draft_id, to, subject}), and it covers the mutation/approval semantics and alternative tools. Nothing needed to call this 9-param tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each of the 9 parameters is already documented in detail (send_as constraints, body/body_markdown interaction, signature handling). The description adds no parameter-level meaning beyond that, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Create a Gmail draft') and immediately distinguishes itself from the two nearest siblings (gmail_create_draft_with_attachments, gmail_reply_draft). An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use-this-elsewhere routing: attachments go to gmail_create_draft_with_attachments, answering an existing message goes to gmail_reply_draft (with the reason, threading). It also states the prerequisite 'Requires user approval.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_create_draft_with_attachmentsA
Create a Gmail draft with one or more local-file attachments. Parallel to gmail_create_draft -- use this variant only when there is something to attach; use gmail_create_draft when there isn't, so a draft doesn't need this tool's extra attachments argument for nothing. Returns {draft_id, to, subject}; the draft is only saved, never sent. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Cc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none. | |
| to | Yes | Recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. | |
| bcc | No | Bcc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none. | |
| body | No | Plain-text body. May be omitted if body_markdown is given -- the plain-text alternative is then auto-derived from it. At least one of body/body_markdown is required. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| send_as | No | Send from this Gmail send-as address instead of the account's default (sets From:, and the signature used is this address's own). Must be one of the account's configured send-as addresses -- anything else is rejected. | |
| subject | Yes | Subject line of the new draft. | |
| attachments | Yes | JSON array of local file paths to attach, e.g. ["/path/to/report.pdf"] -- each either a path on the user's computer (where Claude Desktop runs: absolute, or starting with ~/. Claude's own working or outputs directory is fine) or 'upload:<upload_id>', the id privacyfence_create_upload_slot returned after you PUT the file's bytes to its upload_url -- use that form if a plain path fails with an error about PrivacyFence being unable to read files in your home folder directly (e.g. no PrivacyFence extension is installed, or this is an organization-managed install: a plain path there is read from wherever PrivacyFence's own server runs, not the user's machine -- prefer 'upload:<upload_id>'). At least one required. | |
| body_markdown | No | Optional Markdown body for a rich-text draft. Supports **bold**, *italic*, ==highlight==, [links](url), bullet/numbered lists, and `# Heading 1`/`## Heading 2` (rendered as Gmail's Large/Huge font-size presets, not raw heading tags -- no tables). When given, the draft is sent as plain text + HTML together, so it renders formatted in HTML-capable clients and as readable plain text everywhere else. | |
| include_signature | No | Append the user's Gmail signature (the one Gmail stores for the sending address) to the end of the body. Omit to use the user's 'Append Gmail signature to drafts' setting. Don't also write a sign-off block of your own when this is on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish this is a non-read-only, non-idempotent, non-destructive write. The description goes beyond them by clarifying that the draft is 'only saved, never sent' and that user approval is required, which is important for a mutating tool. It does not cover edge cases like attachment size limits or failure modes, so it falls just 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?
Four sentences, front-loaded with the core action and the sibling disambiguation. Each sentence carries distinct value: purpose, routing rule, return shape, and approval requirement. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with no output schema, the description usefully reports the return shape ('Returns {draft_id, to, subject}') and the core behavioral constraints (saved, not sent; approval required). The rich input schema handles parameter details, so only minor gaps remain, such as attachment-related failure handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 10 parameters, including the complex attachments handling with 'upload:<upload_id>'. The description adds no syntax, defaults, or format details beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a Gmail draft with one or more local-file attachments') and explicitly distinguishes itself from its closest sibling, gmail_create_draft, by naming the condition under which each applies. An agent can identify the tool's scope without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use rule: 'use this variant only when there is something to attach; use gmail_create_draft when there isn't.' It also states the prerequisite 'Requires user approval,' removing ambiguity about the approval step. No inference is needed to pick between the two draft-creation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_create_filterA
Create a Gmail filter. Provide at least one criteria field (from_address, to_address, subject, query, has_attachment) and at least one action (add_label_names, archive, mark_as_read, star, forward_to). Returns {id, criteria, action} for the new filter. Use gmail_update_filter instead to change an existing filter. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| star | No | Star matching messages on arrival. Default false. | |
| query | No | Gmail search syntax, e.g. 'from:alice has:attachment'; matches the filter's 'Has the words' field. Empty means no search criterion. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| archive | No | Skip the Inbox: matching messages are archived on arrival. Default false. | |
| subject | No | Match messages whose subject contains this text. Empty means no subject criterion. | |
| forward_to | No | Address to forward matching messages to; Gmail only accepts an address the user has verified as a forwarding address. Empty means no forwarding. | |
| to_address | No | Match messages sent to this address. Empty means no recipient criterion. | |
| from_address | No | Match messages from this sender address. Empty means no sender criterion. | |
| mark_as_read | No | Mark matching messages as read on arrival. Default false. | |
| has_attachment | No | Match only messages that have an attachment. Default false: attachments not required. | |
| add_label_names | No | Comma-separated label names to apply, e.g. 'Work,Work/Projects'; a name that does not exist yet is created. Empty means no label is applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (non-readOnly, non-destructive, non-idempotent), so the bar is lower. The description still adds meaningful context: 'Requires user approval' and the return shape '{id, criteria, action}'. It does not explain what happens if a filter with the same criteria already exists (relevant given idempotentHint=false), but the added approval note is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core action, followed by input requirements, return shape, alternative tool, and approval note. Every sentence earns its place with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 11-parameter mutation tool, the description covers purpose, input constraints, output shape, sibling routing, and approval requirement. Annotations handle the safety profile, and the schema fully documents individual parameters, so nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds semantic grouping by labeling fields as 'criteria' or 'action' and states the 'at least one of each' requirement, which is not present in the schema. This helps the agent understand the parameter structure beyond individual field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a Gmail filter') and explicitly distinguishes itself from the sibling gmail_update_filter. An agent can immediately identify what the tool does and which sibling to use for modification.
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 explicit usage conditions: must supply at least one criteria field and at least one action. Names the alternative (gmail_update_filter) for changing existing filters and notes the approval requirement. No ambiguity about when or how to invoke.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_create_labelA
Create a Gmail label. Use '/' to create nested labels (e.g. 'Work/Projects' creates 'Projects' nested under 'Work', creating 'Work' first if it doesn't already exist). Fails if the exact label name already exists. Returns {id, name, type} of the new label. Use gmail_list_labels to check which labels exist first. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| label_name | Yes | Name for the new label; use '/' to nest it, e.g. 'Work/Projects'. Must not already exist. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring readOnly=false, idempotent=false, destructive=false, the description adds substantial context: nested creation auto-creates the parent path, duplicate names fail, the return shape is {id, name, type}, and user approval is required. That is well beyond what the structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action, then nesting rule, failure condition, return value, and a routing hint. Every sentence carries unique information 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 two-parameter mutation with no output schema, the description covers the mutation semantics, the failure mode, the return payload, a safety/prerequisite step, and the approval requirement. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters; the description still adds meaning by explaining the '/' nesting side effect (parent label created first if absent) rather than merely restating the format. It exceeds the baseline 3 without fully re-documenting both params.
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?
'Create a Gmail label' is a precise verb+resource, and the description immediately elaborates on nesting semantics, which separates it from siblings like gmail_add_label (applies an existing label) and gmail_list_labels (reads them). An agent can identify the 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?
It explicitly routes the agent to 'gmail_list_labels to check which labels exist first' and warns that creation fails if the exact name exists, giving a clear prerequisite. It does not state any when-not-to-use case, but the guidance it gives is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_download_attachmentARead-onlyIdempotent
Download a Gmail attachment's content. Identify the attachment by the name returned from gmail_list_message_attachments. Local install: saved to destination_dir (required, no default): pass ~/Downloads, or a path the user asked for, if they should find the file afterward, or your own scratch directory if it is only for you to read. Organization-managed install: destination_dir is ignored; a small attachment comes back inline in the result, a larger one as a one-time link the human opens in their own signed-in browser. Returns {path, name, size_bytes} for a file saved on a local install (a save through the file bridge returns {path, delivery} instead), the file content inline, or {delivery: 'link', name, size_bytes, download_url, expires_at, note}. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| message_id | Yes | Id of the Gmail message, from gmail_list_messages (its id field). | |
| attachment_name | Yes | File name of the attachment, exactly as gmail_list_message_attachments returns it in its name field; a name that matches none fails. | |
| destination_dir | Yes | Local install only: where to save the attachment -- required, no default. On an organization-managed install it is ignored and nothing is saved to it; any value will do. Use ~/Downloads (or a path the user specified) if the user should find this file afterward; use your own working/scratch directory if it's only for you to read or process. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations by disclosing install-dependent behavior (local save vs org-managed inline/link delivery), the requirement of user approval, and two distinct return shapes including the file-bridge {path, delivery} case.
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?
Long but front-loaded: purpose, identity source, then per-install destination guidance and return shapes. Every clause carries information, though the destination_dir guidance partially duplicates the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by enumerating the possible return payloads ({path,name,size_bytes}, inline content, {delivery:'link',...}) and noting the approval requirement, so an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the destination_dir description in the schema is nearly identical to the prose here, so the description mostly restates structured data. The message_id/attachment_name semantics are also already in the schema, leaving little added meaning beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Download a Gmail attachment's content') and immediately names the sibling (gmail_list_message_attachments) that supplies the identifier, so the agent can distinguish it from confluence_download_attachment and drive_download_file 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?
Gives clear operational guidance: identify the attachment by the name from gmail_list_message_attachments, when to pass ~/Downloads vs a scratch dir, and that user approval is required. It stops short of explicit when-not-to-use or naming a preferred alternative path, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_get_messageARead-onlyIdempotent
Fetch a single Gmail message by id, including body, metadata, and attachment list. Returns {id, thread_id, subject, sender, recipients, date, body_text, attachments (name, mime_type, and size of each), labels}, plus body_html when include_html is true; body, subject, sender, recipients and date may be redacted by the user's privacy settings. Get the id from gmail_list_messages. Use gmail_get_thread instead to read the whole conversation. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| message_id | Yes | Id of the Gmail message, from gmail_list_messages (its id field). | |
| include_html | No | Also return the message's HTML part as body_html (empty for a plain-text-only message). Only when you need the markup itself, e.g. to check how a draft's formatting or signature was saved -- body_text is enough to read a message. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, it discloses that body, subject, sender, recipients and date may be redacted by the user's privacy settings, that user approval is required, and that body_html is only populated when include_html is true. These are non-obvious behavioral traits an agent needs before calling.
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 purpose and return shape, then tacks on the id source and the sibling alternative. Dense but every clause carries information; only slight redundancy between the return-field list and the parameter notes prevents a 5.
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 fully specifies the return payload and the conditional body_html field, plus the redaction and approval caveats. An agent has everything required to call 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 description coverage is 100%, so the schema already documents message_id, reason and include_html in full. The description restates the include_html effect and the return fields but adds no syntax or format detail beyond the structured data, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch a single Gmail message by id') and enumerates what is included (body, metadata, attachment list). It explicitly distinguishes itself from gmail_get_thread ('read the whole conversation') and points to gmail_list_messages for the id.
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 routing: get the id from gmail_list_messages, and use gmail_get_thread instead when the whole conversation is needed. Both the entry condition and the alternative tool are named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_get_threadARead-onlyIdempotent
Fetch a full Gmail thread by id, including all messages. Returns {id, subject, messages}, where each message is {id, subject, sender, date, body_text, attachments} in the order Gmail returns them (oldest first); recipients and labels are not included, and bodies fall under the 'thread_history' privacy category and may be redacted. Get the id from gmail_list_threads, or from the thread_id field of gmail_list_messages. Use gmail_get_message instead to read one message with its recipients and labels. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| thread_id | Yes | Id of the Gmail thread, from gmail_list_threads (its id field) or gmail_list_messages (its thread_id field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial context beyond them: return shape, ordering (oldest first), fields deliberately excluded (recipients, labels), the thread_history privacy category with possible redaction, and a "Requires user approval" gate. That is meaningful behavioral disclosure an agent cannot infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every sentence earns its place (return shape, exclusions, id sourcing, alternative, approval). The dense return-shape clause is slightly 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?
With no output schema, the description fully carries the burden: it documents the return object graph, message ordering, omitted fields, privacy/redaction behavior, and the approval requirement. Nothing needed to call or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented. The description restates the thread_id source but adds no syntax, format, or validation detail beyond the schema. Baseline 3 is appropriate 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 ("Fetch a full Gmail thread by id, including all messages") and immediately distinguishes it from gmail_get_message. An agent can tell it apart from sibling retrieval tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative explicitly ("Use gmail_get_message instead to read one message with its recipients and labels") and the condition that selects it, plus tells where to source the id (gmail_list_threads, gmail_list_messages.thread_id). Routing is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_list_filtersARead-onlyIdempotent
List all Gmail filters with their criteria and actions. Returns a list of {id, criteria, action} in Gmail's own filter format (criteria keys such as from, to, subject, query, hasAttachment; action keys such as addLabelIds, removeLabelIds, forward); label ids are not translated to names. Get a filter_id here for gmail_update_filter. Auto-approved -- filter rules only, no message content is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the bar is lower. The description still adds real context: the exact return shape, the caveat that label ids are not translated to names, and that it is auto-approved and returns no message content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose, then return format, then the downstream use and approval note. 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?
No output schema exists, so the description responsibly describes the return object keys and format, and it flags the label-id caveat an agent would otherwise misread. Complete for a simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter ('reason') and schema coverage is 100%, so the schema fully documents it and the description adds nothing about it. Baseline 3 is appropriate when structured data does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all Gmail filters') plus the scope of data returned ('criteria and actions'). Clearly separable from siblings like gmail_create_filter and gmail_update_filter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Get a filter_id here for gmail_update_filter' tells when the output feeds another tool. It does not state when NOT to use it or list other alternatives, so it falls 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.
gmail_list_labelsARead-onlyIdempotent
List all Gmail labels (system and user-created). Nested labels have a '/' in their name (e.g. 'Work/Projects'). Returns a list of {id, name, type}, where type is 'system' or 'user'. Use the name with gmail_add_label and gmail_remove_label. Auto-approved -- label metadata only.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description goes beyond them by disclosing the auto-approval behavior ('Auto-approved -- label metadata only') and confirming the read is metadata-scoped, which is meaningful approval/policy context for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, each earning its place: purpose, nested-label note, return shape, downstream usage, approval note. The core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description supplies the return shape and type values, so nothing an agent needs to interpret results is missing. For a simple read-only list tool with full annotation coverage, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'reason' parameter, so the schema fully documents it. The description adds nothing about the parameter, 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 ('List all Gmail labels') plus scope ('system and user-created'), and disambiguates from siblings such as gmail_create_label and gmail_add_label. The nested-label naming convention and return shape ({id, name, type}) further pin down what the tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent downstream: 'Use the name with gmail_add_label and gmail_remove_label.' It gives clear context for why one would call this (obtaining label names) but does not state exclusions or when a different listing tool would be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_list_message_attachmentsARead-onlyIdempotent
List attachment names, MIME types, and sizes for a Gmail message. Returns {message_id, attachments: [{name, mime_type, size}]} with size in bytes; attachments is empty when the message has none or the user's privacy settings hide them. Auto-approved — metadata only, no attachment content is returned. Use gmail_download_attachment to fetch the actual file.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| message_id | Yes | Id of the Gmail message, from gmail_list_messages (its id field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses the exact return shape, byte units, that no attachment content is returned (metadata only), that it is auto-approved, and the privacy edge case where attachments is empty. This is rich behavioral context not derivable from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose then return shape then alternative, with zero filler. 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 supplies the return structure and edge-case behavior (empty attachments, privacy hiding), and annotations cover the safety profile. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are fully documented in the schema, including that message_id comes from gmail_list_messages. The description only loosely implies the message input, adding little beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (attachment metadata for a Gmail message) and explicitly distinguishes itself from gmail_download_attachment. An agent can tell exactly what this returns versus the sibling that fetches content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to gmail_download_attachment 'to fetch the actual file', drawing the when-not boundary between metadata inspection and file retrieval. It does not state when to prefer this over gmail_get_message, so it falls just short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_list_messagesARead-onlyIdempotent
Search Gmail and return matching message summaries (id, thread_id, subject, sender, date). Returns a list of {id, thread_id, subject, sender, date}, up to max_results (default 10, capped at 100), reading up to max_results messages across pages, in the order Gmail returns them; subject, sender and date may be redacted by the user's privacy settings. Messages whose metadata cannot be fetched are omitted. Use gmail_list_threads instead to search by conversation, and gmail_get_message to read a message once you have its id. Auto-approved — no body content is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Gmail search syntax, as typed in Gmail's search box, e.g. 'from:alice is:unread'. Empty matches every message. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Maximum number of results to return. Default 10; capped at 100, and a value below 1 is treated as 1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the description adds real value beyond them: pagination behavior across pages, that unfetchable messages are omitted rather than erroring, that subject/sender/date may be redacted by privacy settings, and that it is auto-approved with no body content returned. The only minor gap is that redaction and omission effects on the caller's assumptions could be spelled out slightly more, but this is well above the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return shape, and every sentence carries information. It loses a point because the return shape is stated twice in near-identical form ('matching message summaries (id, thread_id, subject, sender, date)' then 'Returns a list of {id, thread_id, subject, sender, date}'), which is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by describing the returned fields, ordering, pagination, and the fact that no body content is returned. Combined with annotations covering the safety profile and full schema coverage on parameters, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so query syntax, the reason field and max_results clamping are already documented in the schema; the baseline of 3 applies. The description restates the default/max_results cap and adds that reading spans up to max_results messages across pages, which is marginal added value over the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (search Gmail, return message summaries) and enumerates the returned fields. It also distinguishes itself from the two nearest siblings by name (gmail_list_threads, gmail_get_message), so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names alternatives and the condition that selects each: use gmail_list_threads to search by conversation, and gmail_get_message to read a message once you have its id. That is a clear when-to-use-this vs when-to-use-that split.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_list_threadsARead-onlyIdempotent
Search Gmail and return matching thread summaries (id, snippet). Returns a list of {id, snippet}, up to max_results (default 10, capped at 100), reading up to max_results threads across pages, in the order Gmail returns them. Use gmail_list_messages instead when you need each message's subject, sender or date, and gmail_get_thread to read a whole thread once you have its id. Auto-approved — snippet is a short excerpt of the last message's body, subject to the same 'body' privacy category as gmail_get_message.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Gmail search syntax, as typed in Gmail's search box, e.g. 'from:alice is:unread'. Empty matches every message. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Maximum number of results to return. Default 10; capped at 100, and a value below 1 is treated as 1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds material context beyond them: pagination behavior ('reading up to max_results threads across pages'), Gmail's own ordering, auto-approved status, and the privacy category that governs the snippet field. That is exactly the behavioral disclosure annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Return shape and scoping are front-loaded, followed by sibling routing and then the privacy caveat. Every sentence carries information the agent needs; there is no filler despite the density.
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 specifies the returned fields ({id, snippet}), pagination limits and ordering, and the privacy classification of the snippet. Nothing needed to call and interpret this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the schema already documents query, max_results default/cap and reason. The description nonetheless adds value by explaining that max_results governs cross-page reading and result ordering, which the schema does not state. Some restatement of the default/cap is redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Search Gmail and return matching thread summaries') and immediately defines the return shape. It explicitly distinguishes itself from gmail_list_messages and gmail_get_thread, so an agent can pick the right tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names both alternatives with the exact condition that selects them: gmail_list_messages when you need subject/sender/date, gmail_get_thread once you have an id to read a whole thread. This is explicit when-to-use/when-not guidance, not inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_remove_labelA
Remove a label from a Gmail message. Returns {message_id, label_removed}, with a note of 'label not found' added (and nothing changed) when no label has that name. Use gmail_list_labels to see the label names, and gmail_add_label to put one back. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| label_name | Yes | Name of the label to remove, as gmail_list_labels returns it in its name field (nested labels look like 'Work/Projects'). | |
| message_id | Yes | Id of the Gmail message, from gmail_list_messages (its id field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: the exact return payload {message_id, label_removed}, the not-found edge case where nothing changes, and the 'Requires user approval' gate that annotations don't express. There is a mild tension with idempotentHint=false since a repeat call is described as changing nothing, but the differing response body keeps this from being a true 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 short sentences with the action, return shape/edge case, and related tools in that order; no filler and the most important clause is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly covers the return value and the failure mode, plus the approval requirement. For a simple 3-parameter mutation this is nearly complete; only secondary details (e.g., whether the label must exist, any rate limiting) are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so label_name (including 'Work/Projects' nesting) and message_id are already fully documented in the schema. The description adds no format or syntax detail beyond pointing at gmail_list_labels, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove a label from a Gmail message') and implicitly contrasts with gmail_add_label, so an agent can distinguish it from the 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?
Explicitly routes the agent to gmail_list_labels for valid label names and to gmail_add_label as the inverse operation, and states the approval prerequisite. It stops short of stating when-not to use it (e.g., use archive/filter tools instead), so it's 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.
gmail_reply_all_draftA
Create a Gmail draft replying to all participants of a message (original sender plus To/Cc recipients, excluding yourself), staying in the same thread. Returns {draft_id, thread_id, to, cc, subject}: to is the original sender, cc the other participants plus any address you passed, and the subject is the original's with 'Re: ' added if missing. Use gmail_reply_draft instead to answer only the sender, and gmail_reply_all_draft_with_attachments when there is something to attach. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Extra Cc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none. | |
| bcc | No | Bcc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none. | |
| body | No | Plain-text body. May be omitted if body_markdown is given -- the plain-text alternative is then auto-derived from it. At least one of body/body_markdown is required. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| send_as | No | Send from this Gmail send-as address instead of the account's default (sets From:, and the signature used is this address's own). Must be one of the account's configured send-as addresses -- anything else is rejected. | |
| message_id | Yes | Id of the message to reply to, from gmail_list_messages (its id field). The draft goes in that message's thread. | |
| body_markdown | No | Optional Markdown body for a rich-text draft. Supports **bold**, *italic*, ==highlight==, [links](url), bullet/numbered lists, and `# Heading 1`/`## Heading 2` (rendered as Gmail's Large/Huge font-size presets, not raw heading tags -- no tables). When given, the draft is sent as plain text + HTML together, so it renders formatted in HTML-capable clients and as readable plain text everywhere else. | |
| include_signature | No | Append the user's Gmail signature (the one Gmail stores for the sending address) to the end of the body. Omit to use the user's 'Append Gmail signature to drafts' setting. Don't also write a sign-off block of your own when this is on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations disclose safe mutation (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds valuable behavior not covered by annotations: the return shape {draft_id, thread_id, to, cc, subject}, the rule that the draft stays in the same thread, the address mapping for to/cc, and subject prefixing with 'Re: '. It also states the approval requirement. The only remaining gap is that it doesn't clarify whether the draft is ever sent automatically (it implies 'draft' only).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each front-loaded and earning its place: first states purpose and recipient scope, second details the return shape, third provides alternatives and approval requirement. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully outlines what the tool returns, how it behaves within threads, and which sibling to use. With annotations covering safety and a 100% parameter schema, nothing essential 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%, so the schema already documents all 8 parameters with rich detail (e.g., cc/bcc formatting, send_as constraints, body vs. body_markdown). The description adds high-level meaning about to/cc derivation and subject handling, but this is not parameter-level syntax and the schema does the heavy lifting. A baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Create a Gmail draft replying to all participants') and precisely defines recipient scope (original sender plus To/Cc, excluding yourself) and thread behavior. It also explicitly names the two sibling alternatives (gmail_reply_draft, gmail_reply_all_draft_with_attachments), letting an agent select correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance by naming the alternatives gmail_reply_draft (answer only sender) and gmail_reply_all_draft_with_attachments (when there is something to attach). It also states the prerequisite 'Requires user approval', giving a clear condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_reply_all_draft_with_attachmentsA
Create a Gmail draft replying to all participants of a message (original sender plus To/Cc recipients, excluding yourself), staying in the same thread, with one or more local-file attachments. Parallel to gmail_reply_all_draft -- use this variant only when there is something to attach. Returns {draft_id, thread_id, to, cc, subject}, as gmail_reply_all_draft does. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Extra Cc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none. | |
| bcc | No | Bcc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none. | |
| body | No | Plain-text body. May be omitted if body_markdown is given -- the plain-text alternative is then auto-derived from it. At least one of body/body_markdown is required. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| send_as | No | Send from this Gmail send-as address instead of the account's default (sets From:, and the signature used is this address's own). Must be one of the account's configured send-as addresses -- anything else is rejected. | |
| message_id | Yes | Id of the message to reply to, from gmail_list_messages (its id field). The draft goes in that message's thread. | |
| attachments | Yes | JSON array of local file paths to attach, e.g. ["/path/to/report.pdf"] -- each either a path on the user's computer (where Claude Desktop runs: absolute, or starting with ~/. Claude's own working or outputs directory is fine) or 'upload:<upload_id>', the id privacyfence_create_upload_slot returned after you PUT the file's bytes to its upload_url -- use that form if a plain path fails with an error about PrivacyFence being unable to read files in your home folder directly (e.g. no PrivacyFence extension is installed, or this is an organization-managed install: a plain path there is read from wherever PrivacyFence's own server runs, not the user's machine -- prefer 'upload:<upload_id>'). At least one required. | |
| body_markdown | No | Optional Markdown body for a rich-text draft. Supports **bold**, *italic*, ==highlight==, [links](url), bullet/numbered lists, and `# Heading 1`/`## Heading 2` (rendered as Gmail's Large/Huge font-size presets, not raw heading tags -- no tables). When given, the draft is sent as plain text + HTML together, so it renders formatted in HTML-capable clients and as readable plain text everywhere else. | |
| include_signature | No | Append the user's Gmail signature (the one Gmail stores for the sending address) to the end of the body. Omit to use the user's 'Append Gmail signature to drafts' setting. Don't also write a sign-off block of your own when this is on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-readonly, non-idempotent, non-destructive, but the description adds genuinely useful behavior: it stays in the original thread, returns {draft_id, thread_id, to, cc, subject}, and 'Requires user approval' — an approval-gate disclosure not present in annotations. It stops short of noting that repeated calls create duplicate drafts (relevant given idempotentHint=false).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and the routing rule, then the return shape and approval requirement. Dense but each sentence carries distinct information; slight redundancy in 'as gmail_reply_all_draft does'.
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 supplies the return shape and the approval prerequisite, and thread/recipient semantics are covered. Combined with a fully-documented schema it is essentially complete for calling the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 9 parameters in depth (including the upload:<upload_id> form and body_markdown rendering). The description only echoes the recipient-exclusion rule and the local-file nature of attachments, adding little beyond structured data — 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 (create a Gmail draft replying to all) with precise scope: original sender plus To/Cc, excluding yourself, same thread, with attachments. It directly names gmail_reply_all_draft as the no-attachment sibling, so an agent can disambiguate 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?
Explicitly says 'use this variant only when there is something to attach' and identifies the parallel tool gmail_reply_all_draft. The selection condition is stated outright rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_reply_draftA
Create a Gmail draft replying to a single message, staying in the same thread (sets threadId plus In-Reply-To/References so it actually threads, unlike gmail_create_draft). Addressed only to the original sender. Returns {draft_id, thread_id, to, cc, subject}; the subject is the original's with 'Re: ' added if missing, and cc holds only the addresses you passed. Use gmail_reply_all_draft instead to include the other participants, and gmail_reply_draft_with_attachments when there is something to attach. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Extra Cc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none. | |
| bcc | No | Bcc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none. | |
| body | No | Plain-text body. May be omitted if body_markdown is given -- the plain-text alternative is then auto-derived from it. At least one of body/body_markdown is required. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| send_as | No | Send from this Gmail send-as address instead of the account's default (sets From:, and the signature used is this address's own). Must be one of the account's configured send-as addresses -- anything else is rejected. | |
| message_id | Yes | Id of the message to reply to, from gmail_list_messages (its id field). The draft goes in that message's thread. | |
| body_markdown | No | Optional Markdown body for a rich-text draft. Supports **bold**, *italic*, ==highlight==, [links](url), bullet/numbered lists, and `# Heading 1`/`## Heading 2` (rendered as Gmail's Large/Huge font-size presets, not raw heading tags -- no tables). When given, the draft is sent as plain text + HTML together, so it renders formatted in HTML-capable clients and as readable plain text everywhere else. | |
| include_signature | No | Append the user's Gmail signature (the one Gmail stores for the sending address) to the end of the body. Omit to use the user's 'Append Gmail signature to drafts' setting. Don't also write a sign-off block of your own when this is on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, idempotent=false, destructive=false. The description goes well beyond that: it discloses the threading headers written, the single-recipient addressing rule, the subject derivation ('Re: ' added if missing), that cc holds only what was passed, the return shape, and that user approval is required. That is rich behavioral context an annotation cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a long single paragraph, but front-loaded with the action and threading behavior, and every clause (subject rule, cc rule, return shape, sibling routing, approval) carries information. Slightly dense for one block; bullets would read better, but 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?
No output schema exists, and the description compensates by naming the return fields {draft_id, thread_id, to, cc, subject}. Combined with the threading, addressing, approval, and sibling-routing details, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The description adds real parameter-level meaning on top: the subject is the original's with 'Re: ' added if missing, and cc contains only the addresses supplied rather than auto-populated participants. That clarifies the effect of the cc parameter beyond its schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a Gmail draft replying to a single message') and immediately adds the distinguishing mechanic: it threads properly by setting threadId plus In-Reply-To/References, 'unlike gmail_create_draft'. An agent can separate this from gmail_reply_all_draft and the attachment variants without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use gmail_reply_all_draft to include other participants, and gmail_reply_draft_with_attachments when something must be attached. It also notes the addressing constraint (reply goes only to the original sender), which is precisely the condition that decides between siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_reply_draft_with_attachmentsA
Create a Gmail draft replying to a single message, staying in the same thread, with one or more local-file attachments. Parallel to gmail_reply_draft -- use this variant only when there is something to attach. Addressed only to the original sender. Returns {draft_id, thread_id, to, cc, subject}, as gmail_reply_draft does. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Extra Cc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none. | |
| bcc | No | Bcc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none. | |
| body | No | Plain-text body. May be omitted if body_markdown is given -- the plain-text alternative is then auto-derived from it. At least one of body/body_markdown is required. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| send_as | No | Send from this Gmail send-as address instead of the account's default (sets From:, and the signature used is this address's own). Must be one of the account's configured send-as addresses -- anything else is rejected. | |
| message_id | Yes | Id of the message to reply to, from gmail_list_messages (its id field). The draft goes in that message's thread. | |
| attachments | Yes | JSON array of local file paths to attach, e.g. ["/path/to/report.pdf"] -- each either a path on the user's computer (where Claude Desktop runs: absolute, or starting with ~/. Claude's own working or outputs directory is fine) or 'upload:<upload_id>', the id privacyfence_create_upload_slot returned after you PUT the file's bytes to its upload_url -- use that form if a plain path fails with an error about PrivacyFence being unable to read files in your home folder directly (e.g. no PrivacyFence extension is installed, or this is an organization-managed install: a plain path there is read from wherever PrivacyFence's own server runs, not the user's machine -- prefer 'upload:<upload_id>'). At least one required. | |
| body_markdown | No | Optional Markdown body for a rich-text draft. Supports **bold**, *italic*, ==highlight==, [links](url), bullet/numbered lists, and `# Heading 1`/`## Heading 2` (rendered as Gmail's Large/Huge font-size presets, not raw heading tags -- no tables). When given, the draft is sent as plain text + HTML together, so it renders formatted in HTML-capable clients and as readable plain text everywhere else. | |
| include_signature | No | Append the user's Gmail signature (the one Gmail stores for the sending address) to the end of the body. Omit to use the user's 'Append Gmail signature to drafts' setting. Don't also write a sign-off block of your own when this is on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-readonly, non-idempotent, non-destructive, but the description adds behavioral facts not in annotations: user approval is required, the draft stays in the original thread, and recipients are limited to the original sender. It doesn't cover what happens to the thread on failure or rate limits, but it meaningfully extends the safety picture.
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 action, then the sibling routing, then the behavioral constraints and return shape. Every clause carries distinct information 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 9-parameter mutation tool with no output schema, the description supplies the return shape ({draft_id, thread_id, to, cc, subject}), the approval requirement, threading behavior, and the recipient constraint. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each of the nine parameters is already documented in the schema, including the attachments path-vs-upload_id dance. The description adds only the recipient constraint (sender-only) and the return field list; baseline 3 is appropriate when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create a draft), resource (reply to a single message), and scope (same thread, with local-file attachments, addressed only to the sender). It explicitly differentiates itself from gmail_reply_draft by naming the sibling and the condition that selects it.
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?
'Parallel to gmail_reply_draft -- use this variant only when there is something to attach' gives an explicit when-to-use and a when-not rule with the named alternative. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_update_filterA
Replace an existing Gmail filter's criteria and actions, identified by filter_id (from gmail_list_filters). Gmail's API has no native filter update, so this creates a new filter with the given fields (which gets a new id) and then deletes the old one. Returns {old_id, id, criteria, action}; the fields you leave empty are not kept from the old filter. The replacement is created before the old filter is deleted, so a failure leaves the original in place. Use gmail_create_filter instead to add a filter without replacing one. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| star | No | Star matching messages on arrival. Default false. | |
| query | No | Gmail search syntax, e.g. 'from:alice has:attachment'; matches the filter's 'Has the words' field. Empty means no search criterion. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| archive | No | Skip the Inbox: matching messages are archived on arrival. Default false. | |
| subject | No | Match messages whose subject contains this text. Empty means no subject criterion. | |
| filter_id | Yes | Id of the filter to replace, from gmail_list_filters (its id field); the replacement gets a new id. | |
| forward_to | No | Address to forward matching messages to; Gmail only accepts an address the user has verified as a forwarding address. Empty means no forwarding. | |
| to_address | No | Match messages sent to this address. Empty means no recipient criterion. | |
| from_address | No | Match messages from this sender address. Empty means no sender criterion. | |
| mark_as_read | No | Mark matching messages as read on arrival. Default false. | |
| has_attachment | No | Match only messages that have an attachment. Default false: attachments not required. | |
| add_label_names | No | Comma-separated label names to apply, e.g. 'Work,Work/Projects'; a name that does not exist yet is created. Empty means no label is applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses critical non-obvious behavior: the implementation is create-then-delete, the new filter gets a new id, the return shape, that empty fields are not kept from the old filter, and that a failure leaves the original in place. It also states 'Requires user approval,' which is essential context beyond the annotations (readOnlyHint=false alone doesn't tell the agent about the two-step destroy/create or the approval gate).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tightly written sentences, front-loaded with purpose, followed by mechanism, return value, inheritance rule, failure behavior, sibling guidance, and approval requirement. No waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no output schema, the description covers the non-obvious aspects: implementation mechanism, return shape, failure behavior, field inheritance rule, and approval requirement. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 12 parameters in detail. The description adds the important semantic that empty fields are not inherited from the old filter, which is not obvious from the schema defaults. Otherwise parameter details are in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Replace an existing Gmail filter's criteria and actions') and explicitly distinguishes itself from the sibling gmail_create_filter. An agent can identify exactly what the tool does and how it differs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative gmail_create_filter and the condition ('to add a filter without replacing one'). Also implies you need a filter_id from gmail_list_filters, which routes the agent to the correct prerequisite tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grist_add_columnsA
Add new columns to an existing table of a Grist document. Returns {doc_id, table_id, column_ids}. Use grist_create_table to create a new table and grist_list_tables to see the existing columns. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | The document's id from grist_list_documents, or the Document ID under the document's Settings (gear icon) in Grist. Not the shorter id in the document's address. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| columns | Yes | A JSON array of {"id": <column id>, "label": <optional label>, "type": <optional type>} objects. Types: Text (default), Numeric, Int, Bool, Date, Choice, ChoiceList, Any, Ref:<TableId>, RefList:<TableId>. 1 to 50 columns. | |
| table_id | Yes | The table id from grist_list_tables, such as Contacts (not the label shown in Grist). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, and the description adds two pieces of context not in the structured data: the 'Requires user approval' gate and the return shape {doc_id, table_id, column_ids}. It does not explain behavior on duplicate column ids or partial failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, zero filler, with the core action front-loaded and the conditional guidance and approval requirement following. 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?
There is no output schema, so stating the return shape is genuinely useful, and the approval requirement plus sibling routing cover the key operational facts. Remaining gaps (duplicate-column behavior, 1-50 limit context) are minor.
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 doc_id, table_id, columns, and reason in detail, including the column-object JSON shape and allowed types. The description adds no parameter-level meaning beyond that, 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 (add columns) scoped to an existing Grist table, and explicitly names sibling tools grist_create_table and grist_list_tables. An agent can distinguish this from creating a table or listing tables without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Points to grist_create_table for new tables and grist_list_tables for discovering existing columns, which routes the agent away from misuse. It stops short of an explicit 'use this when X' condition or exclusions (e.g. what happens if a column id already exists).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grist_add_recordsA
Add new records to one table of a Grist document. Returns {doc_id, table_id, added_ids}. Use grist_update_records to change existing records and grist_list_tables to find the column ids. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | The document's id from grist_list_documents, or the Document ID under the document's Settings (gear icon) in Grist. Not the shorter id in the document's address. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| records | Yes | A JSON array of objects, each mapping column ids to the new record's values, such as [{"Name": "Ada", "Score": 3}]. 1 to 100 records; values are text, numbers, true/false or null. | |
| table_id | Yes | The table id from grist_list_tables, such as Contacts (not the label shown in Grist). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-readonly, non-idempotent, non-destructive write, so the safety profile is partly carried. The description adds two things annotations cannot: the exact return payload ({doc_id, table_id, added_ids}) and the fact that user approval is required, which materially changes how an agent should sequence the call.
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: what it does and returns, where to find alternatives, and the approval prerequisite. Every sentence earns its place and the return shape is front-loaded near the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-required-parameter mutation with no output schema, the definition covers the action, the return shape, the id lookup path, and the approval gate, so an agent has enough to call it correctly. It omits failure behavior and the 1-100 record limit (left to the schema), which keeps it just below fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema. The description only adds the practical hint that column ids (not labels) are what appear in records and can be found via grist_list_tables; useful but largely redundant with the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add) and resource (records in one table of a Grist document), and immediately pins its scope to a single table. The sibling grist_update_records is named as the contrasting operation, so an agent can route between 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?
Explicitly routes to grist_update_records for existing records and grist_list_tables for column ids, which covers the two most likely confusions. It does not address other nearby options (e.g. grist_import_csv or grist_get_records for bulk/verification), so it stops just 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.
grist_create_tableA
Create a new table, with its columns, in a Grist document. Returns {doc_id, table_id, column_ids}; table_id is the id Grist assigned. Use grist_add_columns to add columns to a table that already exists and grist_list_tables to see the existing tables. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | The document's id from grist_list_documents, or the Document ID under the document's Settings (gear icon) in Grist. Not the shorter id in the document's address. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| columns | Yes | A JSON array of {"id": <column id>, "label": <optional label>, "type": <optional type>} objects. Types: Text (default), Numeric, Int, Bool, Date, Choice, ChoiceList, Any, Ref:<TableId>, RefList:<TableId>. 1 to 50 columns. | |
| table_id | Yes | The id for the new table, such as Contacts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only, non-idempotent, non-destructive operation. The description adds useful context beyond the annotations by stating that user approval is required and by describing the return shape, though it does not discuss failure modes or permission nuances.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three compact sentences, front-loads the core action, then covers return values, alternatives, and approval requirements without any wasted text. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a four-parameter required schema with 100% coverage and no output schema, the description supplies the missing return shape and approval requirement. Together with the sibling alternatives, it gives an agent everything needed to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema itself fully documents all four parameters. The description mentions columns and implies table_id assignment, but adds no syntax, format, or constraint details beyond what the schema already provides, 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?
The description uses a specific verb+resource pair: create a new table with its columns in a Grist document. It also distinguishes this tool from the closest sibling by directing the agent to grist_add_columns for existing tables and grist_list_tables for discovering tables.
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 names the two most relevant alternatives and the conditions that select them: use grist_add_columns to add columns to a table that already exists, and grist_list_tables to see existing tables. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grist_export_recordsARead-onlyIdempotent
Write every record of one table of a Grist document, optionally filtered, to a CSV or JSON file on the user's computer, in one approval. The first column is the record id (id), then the table's columns by column id; dates are written as YYYY-MM-DD and choice lists as JSON arrays. To write changes back with grist_update_csv (key_column id, up to 20000 rows), keep only id and the data columns you change: formula and list columns cannot be written. Up to 50000 records. Returns {rows, columns, sha256, path, name, size_bytes, delivery}, never the records; read the file at path, which may be a numbered name if a file of that name exists. Use grist_get_records to look at a few records. On an organization-managed install nothing is saved to destination_dir: the result carries a one-time download_url instead. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | The document's id from grist_list_documents, or the Document ID under the document's Settings (gear icon) in Grist. Not the shorter id in the document's address. | |
| filter | No | A JSON object mapping column ids to lists of allowed values, such as {"Status": ["Open", "Waiting"]}. Rows match when every listed column has one of its values. Empty means no filter. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| table_id | Yes | The table id from grist_list_tables, such as Contacts (not the label shown in Grist). | |
| file_name | No | File name ending in .csv or .json; the ending picks the format. Empty means <table_id>.csv. | |
| destination_dir | Yes | Folder on the user's computer to write the file to, absolute or starting with ~/. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description contradicts the annotations: it describes writing a file to the user's computer (a side effect on the environment), while readOnlyHint is true. It also indicates files may be numbered if a name exists, implying repeated calls produce different outputs, which conflicts with idempotentHint true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loads the main purpose and then layers useful details in a logical order. Every sentence carries relevant information, though it could be slightly more scannable; it is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema and the tool's many behaviors, the description is remarkably complete: it covers the output shape, file path handling, format details, row limits, org-managed install behavior, and the need for user approval. An agent has everything needed to call 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 description coverage is 100%, so all parameters are already well documented in the schema. The description adds only minor context (e.g., file_name ending picks format) that is already present in the schema, so it does not add significant meaning beyond structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (write), resource (every record of one table of a Grist document), destination format (CSV or JSON file on the user's computer), and scope (optionally filtered, in one approval). It clearly distinguishes itself from siblings like grist_get_records and grist_update_csv.
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 says when to use this tool versus alternatives: use grist_get_records to look at a few records, and use grist_update_csv to write changes back. It also notes the special behavior on organization-managed installs and the approval requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grist_export_sqlARead-onlyIdempotent
Run one read-only SQL query over a Grist document and write the result to a CSV or JSON file on the user's computer, in one approval. Use it to join or filter across tables; use grist_export_records for one table. Cells are written as Grist stores them: dates as seconds since 1970, true/false as 1/0. Grist runs SQL only for people who can copy the whole document. Up to 50000 rows. Returns {rows, columns, sha256, path, name, size_bytes, delivery}, never the rows. On an organization-managed install nothing is saved to destination_dir: the result carries a one-time download_url instead. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | One read-only SQLite SELECT (or WITH … SELECT) over the document's tables, by table and column id, such as SELECT c.id, c.Email, o.Stage FROM Contacts c JOIN Deals o ON o.Contact = c.id. Use ? for values and pass them in args. No comments, no semicolon except one at the end, and no Grist internal tables (names starting with _grist); up to 10000 characters. | |
| args | No | A JSON array of values for the ? placeholders in sql, such as ["CF", 2026]. Empty means none. | |
| doc_id | Yes | The document's id from grist_list_documents, or the Document ID under the document's Settings (gear icon) in Grist. Not the shorter id in the document's address. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_name | No | File name ending in .csv or .json; the ending picks the format. Empty means query.csv. | |
| destination_dir | Yes | Folder on the user's computer to write the file to, absolute or starting with ~/. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent/destructive annotations: discloses cell encoding ('dates as seconds since 1970, true/false as 1/0'), a 50000-row cap, that rows are never returned (only {rows, columns, sha256, path, name, size_bytes, delivery}), org-managed behavior where nothing lands in destination_dir and a one-time download_url is returned, and the user-approval gate.
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 action and effect, then layered with the constraints an agent needs. It is dense and long, but each sentence carries distinct operational value, so the size is largely 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?
No output schema exists, yet the description summarizes the return shape, notele the row cap, encoding, permission precondition, and org-managed delivery deviation. For a high-complexity export tool, nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters in detail; the description's format-selection detail (CSV vs JSON) only reinforces what the file_name schema already says. Baseline 3 is appropriate 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+resource+effect: 'Run one read-only SQL query over a Grist document and write the result to a CSV or JSON file', and explicitly distinguishes itself from the sibling grist_export_records. An agent can tell it apart from grist_export_records 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 explicit routing: 'Use it to join or filter across tables; use grist_export_records for one table.' It also names the permission precondition (must be able to copy the whole document) and the approval requirement, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grist_get_recordsARead-onlyIdempotent
Read records from one table of a Grist document, optionally filtered and sorted. Returns {doc_id, table_id, records: [{id, fields}], truncated, next_after_id}. truncated is true when more records match. To read a whole table, leave sort empty and call again with after_id set to next_after_id until truncated is false; each page needs its own approval. Use grist_list_tables first to find the table and column ids. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Column ids separated by commas, each optionally prefixed with - for descending, such as -Date,Name. Empty means record-id order, the only order after_id pages through. | |
| limit | No | Most records to return, 1 to 500. Default 100; the result says truncated when there were more. | |
| doc_id | Yes | The document's id from grist_list_documents, or the Document ID under the document's Settings (gear icon) in Grist. Not the shorter id in the document's address. | |
| filter | No | A JSON object mapping column ids to lists of allowed values, such as {"Status": ["Open", "Waiting"]}. Rows match when every listed column has one of its values. Empty means no filter. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| after_id | No | Return only records with an id above this one: pass the previous page's next_after_id to read the next page. 0 (the default) starts at the first record. Cannot be combined with sort. next_after_id is null on the last page and whenever sort is set. | |
| table_id | Yes | The table id from grist_list_tables, such as Contacts (not the label shown in Grist). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the read-only, idempotent, non-destructive profile. The description adds genuinely useful context beyond them: the return shape, the truncated flag semantics, the after_id/next_after_id paging contract, and the approval requirement ('each page needs its own approval') which is not derivable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then return shape, then pagination mechanics, then prerequisite and approval notes. Every sentence carries distinct information 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?
Despite having no output schema, the description spells out the return object and the truncated/next_after_id contract, plus the approval requirement. An agent has everything needed to call and paginate correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters in detail. The description restates the sort/after_id interplay that the schema itself specifies, adding little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read), resource (records), and scope (one table of a Grist document) with the filtering/sorting modifiers. It is clearly distinguishable from write siblings like grist_add_records and bulk siblings like grist_export_records/grist_export_sql.
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 concrete prerequisite guidance ('Use grist_list_tables first') and pagination procedure ('leave sort empty and call again with after_id...'). However, it never states when to prefer this over grist_export_records or grist_export_sql, so alternative selection is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grist_import_csvA
Add every row of a CSV file as a new record in one table of a Grist document, in one approval. The first row names the columns (column ids or labels from grist_list_tables); empty cells are left empty. Provide exactly one of local_path (a path on the user's computer, absolute or starting with ~/) or upload_id (the id privacyfence_create_upload_slot returned after you PUT the file's bytes to its upload_url; use this if local_path fails because PrivacyFence cannot read files in your home folder, and always on an organization-managed install). Up to 20000 rows; dates as YYYY-MM-DD. Returns {doc_id, table_id, added, first_added_id, last_added_id}. Use grist_add_records for a few records. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | The document's id from grist_list_documents, or the Document ID under the document's Settings (gear icon) in Grist. Not the shorter id in the document's address. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| table_id | Yes | The table id from grist_list_tables, such as Contacts (not the label shown in Grist). | |
| upload_id | No | Id returned by privacyfence_create_upload_slot after you PUT the bytes to its upload_url. Give exactly one of local_path and upload_id; empty otherwise. | |
| local_path | No | Path of the CSV file, absolute or starting with ~/. Give exactly one of local_path and upload_id; empty otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (not read-only, not idempotent, not destructive), and the description adds context they don't carry: it requires user approval, caps input at 20000 rows, specifies date format YYYY-MM-DD, and documents the return shape. That is meaningful value beyond the structured fields, not a restatement.
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 action, then format rules, input-mode selection, limits, return values, and sibling routing. Every sentence carries distinct information; no padding or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, the description covers purpose, input-mode selection, format constraints, row limit, approval requirement, and return fields — everything an agent needs to call it correctly. No output schema exists, so the inline return description fully closes that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds decision guidance the schema lacks: exactly one of local_path/upload_id, why local_path may fail (PrivacyFence cannot read home-folder files), and the org-managed-install rule. It also explains the CSV header convention for column ids/labels and empty-cell handling, which goes beyond the per-parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource+scope: imports every CSV row as a new record into one Grist table in a single approval. It explicitly distinguishes itself from the closest sibling ('Use grist_add_records for a few records'), 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?
Names the alternative (grist_add_records) and the condition selecting it, and gives an explicit decision rule for the two mutually exclusive input modes: prefer local_path, fall back to upload_id when local_path fails or on an organization-managed install. 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.
grist_list_documentsARead-onlyIdempotent
List the Grist documents this account can open, with their workspace and team. Returns {documents: [{id, name, workspace, team}]}. Some Grist servers do not allow apps to list documents; then ask the user for the Document ID shown under the document's Settings. Pass an id as doc_id to grist_list_tables. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real context: the exact return shape, the server-side limitation that listing may fail, and 'Auto-approved' indicating no approval gate. It stops short of describing pagination or size limits on the returned list.
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 action, then return shape, then failure mode, then handoff. Every sentence carries distinct information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return structure itself, plus the failure/fallback path and the downstream tool to call. An agent has everything needed to invoke it correctly and recover from the refusal case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'reason' parameter is fully documented in the schema as a one-sentence justification. The description adds no further parameter detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource (list Grist documents) and scopes it to 'this account can open', including the workspace/team fields returned. It is clearly distinguishable from sibling grist_list_tables, which it explicitly hands off to.
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 both the intended use (discover documents and their ids) and an explicit fallback: when a server forbids listing, instruct the agent to ask the user for the Document ID under Settings. It also routes the output onward via 'Pass an id as doc_id to grist_list_tables'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grist_list_tablesARead-onlyIdempotent
List the tables of one Grist document and each table's columns (id, label and type). Returns {doc_id, tables: [{id, columns: [{id, label, type, is_formula}]}]}. Use grist_list_documents first to find the doc_id, and grist_get_records to read a table's records. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | The document's id from grist_list_documents, or the Document ID under the document's Settings (gear icon) in Grist. Not the shorter id in the document's address. | |
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered structurally. The description adds value the annotations cannot: the exact return shape and the 'Auto-approved' note, which matters given the privacyfence approval tooling in this environment.
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 verb+resource, then return shape, then routing guidance. 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?
With no output schema present, the description supplies the return structure explicitly, and it covers prerequisites and next steps. An agent has everything needed to select and invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both doc_id and reason are fully documented in the schema itself (including the 'not the shorter id in the address' caveat). The description adds no parameter-level meaning beyond that, 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 verb (list) and resource (tables of one Grist document), plus scope (each table's columns with id, label, type). This clearly distinguishes it from grist_list_documents (documents) and grist_get_records (records).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the prerequisite sibling ('Use grist_list_documents first to find the doc_id') and the follow-on sibling ('grist_get_records to read a table's records'), with the condition that selects each. 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.
grist_update_csvA
Update records of one table of a Grist document from a CSV file, in one approval: each row is matched to the record whose key_column has the same value, and only cells that differ change. Empty cells change nothing, unless clear_empty is true. Rows that match no record are skipped, or added when create_missing is true. Provide exactly one of local_path or upload_id, as for grist_import_csv. Returns {doc_id, table_id, updated, added, unchanged, skipped}. Use grist_update_records to change a few records by id. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | The document's id from grist_list_documents, or the Document ID under the document's Settings (gear icon) in Grist. Not the shorter id in the document's address. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| table_id | Yes | The table id from grist_list_tables, such as Contacts (not the label shown in Grist). | |
| upload_id | No | Id returned by privacyfence_create_upload_slot after you PUT the bytes to its upload_url. Give exactly one of local_path and upload_id; empty otherwise. | |
| key_column | Yes | The column id whose value identifies a record, such as Email, or id to match on the Grist record id (as grist_get_records returns it; not with create_missing). It must be in the CSV header and unique in the table. | |
| local_path | No | Path of the CSV file, absolute or starting with ~/. Give exactly one of local_path and upload_id; empty otherwise. | |
| clear_empty | No | True to clear a value when its CSV cell is empty. Default false: an empty cell leaves the value unchanged. Columns not in the CSV are never touched. | |
| create_missing | No | Add rows whose key matches no record. Default false: they are skipped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give the safety profile (readOnly=false, idempotent=false, destructive=false), and the description adds substantial behavioral context beyond it: row-matching by key_column, only-diff cells changing, empty-cell semantics, skipped vs added rows, the return shape, and that user approval is required. This is rich disclosure for a mutation 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?
Front-loaded with the core purpose in the first clause, then progressively details matching, empty handling, missing rows, input convention, return shape, and sibling routing. Dense but every sentence carries information; minor length is the only cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description inlines the return object {doc_id, table_id, updated, added, unchanged, skipped}. Combined with the matching/empty/missing semantics and approval note, it is complete for an 8-parameter batch-update tool and its sibling relationships are covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds interaction semantics beyond the schema: empty cells leave values unchanged unless clear_empty is true, unmatched rows are skipped unless create_missing is true, and the local_path/upload_id exclusivity. These clarify how the flags combine.
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 (update), resource (records of one table of a Grist document), and the input source (CSV file). It distinguishes itself from both grist_update_records (few records by id) and grist_import_csv (which it references for the path/upload convention).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use grist_update_records to change a few records by id,' and states the alternative input condition 'Provide exactly one of local_path or upload_id, as for grist_import_csv.' Provides clear when/when-not and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grist_update_recordsA
Change cells of existing records in one table of a Grist document. Returns {doc_id, table_id, updated_ids}. Use grist_add_records to add new records and grist_get_records to find record ids. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | The document's id from grist_list_documents, or the Document ID under the document's Settings (gear icon) in Grist. Not the shorter id in the document's address. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| records | Yes | A JSON array of {"id": <record id>, "fields": {<column id>: <new value>}} objects, such as [{"id": 5, "fields": {"Status": "Done"}}]. 1 to 100 records; only the listed columns change. | |
| table_id | Yes | The table id from grist_list_tables, such as Contacts (not the label shown in Grist). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already disclose read-only=false, destructive=false, and idempotent=false. The description adds valuable context beyond them: the return shape and that the operation requires user approval, though it does not cover partial-failure behavior or idempotency concerns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three compact sentences, front-loads the core action, then covers return value, alternatives, and approval requirement. 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 mutation tool with no output schema, the description supplies the return shape and the approval requirement. It is complete enough to invoke correctly, though it omits error/partial-update behavior and record-count limits that would further help.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already fully documented. The description adds context about updating one table and existing records, but does not supplement parameter-level syntax or format details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Change cells of existing records in one table of a Grist document.' It also names the relevant sibling tools for add/find operations, so an agent can distinguish it immediately.
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 says to use grist_add_records for adding new records and grist_get_records to find record ids. This directly routes the agent between update, create, and lookup operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_add_commentA
Add a comment to an existing Jira issue. Returns the new comment as {id, author, body, created, updated}. Use jira_update_issue instead to change the issue's own fields. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Comment text, plain text (not Jira markup). Must not be empty. Mention someone with @[Name](accountId), the id from jira_find_users. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| issue_key | Yes | Key of the issue, e.g. PROJ-123, from jira_search_issues (its key field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the mutating, non-idempotent, non-destructive profile, so the safety bar is partly covered. The description adds genuine value beyond that: a 'Requires user approval' gate and the return shape, which is important since no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, each earning its place: purpose, return shape, alternative routing, and approval requirement, all front-loaded with the core action 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?
With no output schema, the description proactively supplies the return shape, plus the alternative route and approval requirement. For a 3-param fully-documented mutation tool, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents issue_key, body (plain text, @-mention syntax), and reason in detail. The description adds no parameter-level meaning 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 and resource ('Add a comment to an existing Jira issue') and explicitly routes the agent away from jira_update_issue for a different operation. An agent can distinguish it from its siblings 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 sibling alternative (jira_update_issue) and the condition that selects it, and flags a prerequisite (user approval). It gives clear context but no explicit 'when not to use this' beyond the single boundary drawn.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_create_issueA
Create a new Jira issue. Returns the created issue, with its new key, in the same shape jira_get_issue returns minus comments. Get project_key from jira_list_projects. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| summary | Yes | One-line title of the issue. Must not be empty. | |
| priority | No | Name of the priority, e.g. 'High', 'Medium' or 'Low'. Empty uses the project's default priority. | |
| issue_type | No | Name of the issue type, e.g. 'Task', 'Bug' or 'Story'; it must exist in the project. Default 'Task'. | Task |
| description | No | Plain-text description of the issue. Empty means no description. | |
| project_key | Yes | Key of the project to create the issue in, e.g. MYPROJ, from jira_list_projects (its key field). | |
| assignee_account_id | No | Atlassian account id to assign the issue to, from jira_find_users (its account_id field). Empty assigns nobody. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a non-read-only, non-idempotent, non-destructive write. The description adds genuinely new behavioral context: an approval gate and a precise return contract ('new key... same shape jira_get_issue returns minus comments'), which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then return shape, prerequisite, and approval constraint in order of usefulness. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by describing the return value relative to jira_get_issue, and it discloses the approval requirement and the project_key source. Minor gaps remain (e.g., no mention of duplicate handling or post-approval failure modes), but nothing essential to a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 7 parameters (including the reason, summary, type, priority, assignee fields) are already fully documented in the schema. The description's only parameter-adjacent hint, sourcing project_key from jira_list_projects, duplicates the schema's own note, so it adds no meaning beyond structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new Jira issue'), which is unambiguously distinct from siblings like jira_update_issue, jira_transition_issue, and jira_add_comment. An agent can select this 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?
Gives prerequisites — project_key comes from jira_list_projects, and user approval is required — which tells the agent how to prepare before calling. It does not explicitly contrast with alternatives (e.g., when to comment on an existing issue instead of creating one), keeping it 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.
jira_export_issuesARead-onlyIdempotent
Write every issue a JQL query matches, up to 10,000, to a CSV or JSON file on the user's computer, in one approval. Columns: key, summary, status, issue_type, priority, assignee, reporter, labels, created, updated, url, then the requested extra fields. Returns {rows, columns, sha256, path, name, size_bytes, delivery}, never the issues. A query matching no issue writes no file and returns rows 0. On an organization-managed install nothing is saved to destination_dir: the result carries a one-time download_url instead. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| jql | Yes | JQL query selecting the issues to export. | |
| fields | No | Optional JSON array of up to 20 extra fields by name, id or cf[N], such as ["Story Points", "duedate"]; each becomes a column after the standard ones. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| file_name | No | File name ending in .csv or .json, which picks the format. Empty means jira-issues.csv. | |
| destination_dir | Yes | Folder on the user's computer to write the file to, absolute or starting with ~/. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the safety annotations to disclose what gets written (the exact column set), what is returned ({rows, columns, sha256, path, name, size_bytes, delivery}, never the issues), the empty-result edge case (no file, rows 0), and the org-managed path where nothing lands in destination_dir and a one-time download_url is returned instead. It also surfaces the approval requirement, none of which the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with the core action and file/format scope, followed by return shape, edge cases, and install-specific behavior. No filler; every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex export tool with no output schema, the description supplies the return contract, column layout, limits, and both self-hosted and org-managed delivery paths. An agent has everything needed to call it correctly; the only minor unstated detail is exact behavior when more than 10,000 issues match.
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 is already documented, so the baseline is 3. The description mostly repeats the schema (extra fields becoming columns after the standard ones) and adds only the destination_dir behavior on org-managed installs, which is more behavioral than parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+output: writing Jira issues matching a JQL query to a CSV/JSON file on the user's computer. The 10,000 cap and format selection make the scope unambiguous, and it is clearly distinguishable from siblings like jira_search_issues (which returns matches inline rather than exporting a file).
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 strong context for when this tool applies (a file export of JQL matches) and states a key gating condition — 'Requires user approval' and 'in one approval'. It does not, however, explicitly name alternatives such as jira_search_issues or jira_search_issues_with_fields for cases where inline results suffice, so routing is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_find_usersARead-onlyIdempotent
Find Atlassian users by name or email and return their account ids. Returns a list of {account_id, display_name, active, account_type}, at most max_results entries; email addresses are never returned. Auto-approved -- mention someone in a comment or description by writing @Name, or assign an issue with assignee_account_id. Use jira_search_issues instead to find issues, not people.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Part of a person's name or email address, e.g. 'jane' or 'jane@example.com'. Must not be empty. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Most users to return, 1 to 50. Defaults to 10. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description still adds meaningful behavior: the exact return shape, the max_results cap, and the non-obvious guarantee that email addresses are never returned. It stops short of disclosure about pagination or empty-result behavior, 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?
Three compact sentences, front-loaded with what it does and what it returns, then usage and the anti-pattern. Dense but every clause carries information; the return-shape brace list is slightly heavy but justifiable given no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields and the max_results bound. Combined with the routing note and downstream usage hints, an agent has everything needed to 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 description coverage is 100%, so the schema already documents query, reason, and max_results including defaults and bounds. The description reinforces only max_results and the query-by-name/email intent without adding syntax or format 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 ('Find Atlassian users by name or email') and the concrete result ('return their account ids'). It explicitly distinguishes itself from the sibling jira_search_issues ('to find issues, not people'), so an agent can route correctly 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 alternative tool and the condition that selects it, plus describes downstream use cases (mention via @[Name](accountId), assign via assignee_account_id). The 'Auto-approved' note further clarifies invocation context, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_issueARead-onlyIdempotent
Fetch full details of a Jira issue by key (e.g. PROJ-123), including description and comments. Returns the issue as {key, summary, status, issue_type, priority, assignee, reporter, description, labels, created, updated, url, comments: a list of {id, author, body, created, updated}}; with fields, it also has a fields object mapping each requested field's Jira name to its value, as jira_search_issues_with_fields returns it. Use jira_search_issues instead to find issues without reading them in full. Mentions appear as @Name. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Optional JSON array of extra fields to return, as in jira_search_issues_with_fields, e.g. ["Story Points"]. Empty returns only the standard fields. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| issue_key | Yes | Key of the issue, e.g. PROJ-123, from jira_search_issues (its key field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds genuinely non-derivable behavior: the user-approval requirement and the mention rendering format '@[Name](accountId)'. It stops short of covering rate limits or comment pagination.
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 purpose, then the alternative, then caveats. The long return-shape enumeration is dense and slightly run-on, but it earns its place because no output schema exists to carry that 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 fully specifies the return shape including the conditional 'fields' object and comment structure. Combined with annotations and a 100%-covered schema, an agent has everything needed to call 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, but the description goes further by explaining what the 'fields' array actually produces in the response and cross-referencing jira_search_issues_with_fields for its syntax. The issue_key format is also echoed with its provenance (the 'key' field from jira_search_issues).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Fetch full details of a Jira issue by key') and explicitly distinguishes itself from jira_search_issues ('to find issues without reading them in full'). An agent can pick between 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?
It states the selecting condition for this tool (full detail read) and names the alternative plus the condition that picks the alternative. It also discloses the 'Requires user approval' gate, which is a real usage precondition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_transitionsARead-onlyIdempotent
List the status transitions available for a Jira issue right now (name and target status), given its current workflow state. Use before jira_transition_issue to see what transition names are valid. Returns a list of {id, name, to_status}; pass a name to jira_transition_issue. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| issue_key | Yes | Key of the issue, e.g. PROJ-123, from jira_search_issues (its key field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, lowering the bar. The description still adds value beyond them: results are workflow-state-dependent ('right now'), the return shape {id, name, to_status} is disclosed despite no output schema, and 'Auto-approved' flags the approval posture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: what it lists, when to call it, and what it returns plus how to consume it. Scope is front-loaded before the routing advice.
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 despite no output schema, because the description declares the return structure and its consumption path. Nothing needed to call it correctly or chain it with jira_transition_issue is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so issue_key and reason are already documented in the schema; the description adds nothing about either parameter. The note that a transition name is 'passed to jira_transition_issue' adds cross-tool semantics but does not deepen the actual input params, so the baseline 3 is right.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (status transitions available for a Jira issue) with the crucial scope caveat 'right now ... given its current workflow state'. An agent can distinguish it from jira_transition_issue (which performs the move) purely from the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use before jira_transition_issue to see what transition names are valid', naming the sibling and the sequencing condition that selects this tool. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_list_fieldsARead-onlyIdempotent
List the Jira site's fields, built-in and custom, with the id and JQL names behind each display name. Returns a list of {id, name, custom, type, jql_names}, sorted by name, at most max_results (default 50, capped at 200). Pass a name in the fields parameter of jira_search_issues_with_fields or jira_get_issue; in a JQL query for jira_search_issues use one of jql_names, e.g. cf[10016] > 3 or "Story Points" > 3. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Part of a field name or id, case-insensitive, e.g. 'story' or 'customfield_100'. Empty lists every field. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| custom_only | No | True to list only custom fields. Default false lists built-in fields too. | |
| max_results | No | Maximum number of fields to return. Default 50, capped at 200. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds genuine context beyond that: the return record shape {id, name, custom, type, jql_names}, sort order by name, the max_results cap of 200, and an 'Auto-approved' note.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the outcome and return shape, followed by the concrete cross-tool usage example. Every sentence carries information an agent needs; 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?
There is no output schema, but the description supplies the return shape, sort order and result cap, plus the cross-tool usage pattern. For a four-parameter read-only listing tool this is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents query, custom_only and max_results. The description largely restates the schema (default 50, capped at 200) rather than adding new parameter meaning, so no uplift.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the Jira site's fields, built-in and custom') and immediately distinguishes its output from that of siblings by noting it returns the id and JQL names behind display names. An agent can tell this apart from jira_search_issues or jira_get_issue without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent: pass a name in the fields parameter of jira_search_issues_with_fields or jira_get_issue, and use one of jql_names in a JQL query for jira_search_issues, with concrete examples. It gives clear context but does not state when this tool is *not* needed (e.g., when display names are already known).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_list_projectsARead-onlyIdempotent
List Jira projects accessible to the user (key, name, type, lead). Returns a list of {key, name, project_type, description, lead}, at most max_results (default 50, capped at 500), in the API's order. Use the key as project_key in jira_create_issue, or in a JQL query for jira_search_issues. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Maximum number of projects to return. Default 50, capped at 500. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds real behavioral context beyond them: the exact return shape, ordering ('in the API's order'), the result cap, and the auto-approval status. This is meaningful disclosure the structured fields do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with purpose and return shape, followed by downstream usage. Every clause 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?
With no output schema, the description correctly compensates by enumerating return fields, and it documents both cap behavior and ordering. Nothing an agent needs to invoke this list tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description restates max_results (default 50, capped at 500) but adds no syntax or format detail beyond the schema, and the required `reason` parameter is never explained. No net value added over the structured field.
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 Jira projects accessible to the user') and enumerates the returned fields (key, name, type, lead), clearly distinguishing it from siblings like jira_search_issues and jira_get_issue. An agent can identify the tool's function 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?
Gives clear downstream context — use the returned key as project_key in jira_create_issue or in a JQL query for jira_search_issues — which tells the agent where this fits in a workflow. It stops short of stating when-not-to-use or naming a competing listing alternative, so it falls just below the explicit when/when-not bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_refresh_user_cacheARead-onlyIdempotent
Re-fetch the names of every Atlassian account id PrivacyFence has cached. Auto-approved -- use this when a renamed or newly added person shows up wrong; cached names otherwise refresh on their own after 7 days. Returns {cached_users: n}, the number of account ids re-fetched. Use jira_find_users instead to look up someone by name.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), and the description adds valuable context beyond them: it is 'auto-approved' (no approval gate), cached names self-refresh after 7 days, and the return shape is {cached_users: n}. It doesn't discuss rate limits or failure behavior, 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?
Three compact sentences, front-loaded with the action, then usage conditions and the sibling alternative. 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 single-param cache-refresh tool with no output schema, the description covers what it does, when to use it, the alternative, and the return value. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'reason' parameter is fully documented in the schema, so the description needn't elaborate. Baseline 3 is appropriate since no additional parameter meaning is added.
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 (re-fetch) and resource (cached Atlassian account names) and scopes it to PrivacyFence's cache, distinguishing it from the sibling jira_find_users lookup tool. An agent can tell what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('when a renamed or newly added person shows up wrong'), notes the default 7-day refresh that makes it unnecessary otherwise, and names the alternative (jira_find_users) with its distinct purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_search_issuesARead-onlyIdempotent
Search Jira issues using JQL. Returns summary info for matching issues, as a list of {key, summary, status, issue_type, priority, assignee, reporter, labels, created, updated, url} with description left empty, at most max_results (default 20, capped at 500), in the order the JQL gives. Use jira_get_issue instead for one issue's description and comments. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| jql | Yes | A JQL query, e.g. "project = MYPROJ AND status = 'In Progress' ORDER BY updated DESC". Must not be empty. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Maximum number of issues to return. Default 20, capped at 500. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint and destructiveHint, so the safety profile is covered. The description adds real behavioral context beyond that: the exact returned field set, that description is deliberately emptied, the cap/order semantics, and the 'Auto-approved' fact that it does not require human sign-off. It does not mention rate limits or pagination beyond the cap, 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?
Four sentences, front-loaded with the core verb+mechanism, then return shape, then limits/ordering, then the sibling routing. 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 read-only search tool with no output schema, the description compensates by enumerating the exact returned fields and their order, the result cap, and the ordering rule. Combined with full annotation coverage, an agent has everything needed to call 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 jql, reason and max_results are all documented in the schema. The description restates the default and the 500 cap, which duplicates the max_results schema description rather than adding new meaning. Baseline 3 is appropriate when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (Jira issues) plus the mechanism (JQL), and explicitly distinguishes itself from the sibling jira_get_issue by describing when to use each. An agent can route between the two search-vs-detail tools 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 names the alternative (jira_get_issue) and the condition that selects it ('for one issue's description and comments'). It does not cover when-not-to-search or non-JQL alternatives, but the primary routing decision is settled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_search_issues_with_fieldsARead-onlyIdempotent
Search Jira issues using JQL and add extra fields to each one: custom fields such as Story Points or Sprint, or built-in ones such as due date or fix versions. Returns the list jira_search_issues returns, each issue with an added fields object mapping each requested field's Jira name to its value (people as display names, options and statuses as their names, rich text as plain text with mentions as @Name, an empty field as null), at most max_results (default 20, capped at 100), in the order the JQL gives. Find field names with jira_list_fields. Use jira_search_issues instead when its standard fields are enough: it needs no approval. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| jql | Yes | A JQL query, e.g. "project = MYPROJ AND status = 'In Progress' ORDER BY updated DESC". Must not be empty. | |
| fields | Yes | JSON array of the fields to add, by the name shown in Jira (case-insensitive), by id (customfield_10016, duedate) or by JQL id (cf[10016]), e.g. ["Story Points", "Sprint"]. 1 to 20 fields; jira_list_fields lists them. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Maximum number of issues to return. Default 20, capped at 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial beyond-annotation context: the exact return shape, value normalization rules (people as display names, rich text flattened, empty as null), result cap and ordering. It also discloses the approval requirement, though the interaction with readOnlyHint could be clearer.
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 purpose before mechanics, and every sentence carries information. The single dense paragraph packs the return format, cap, ordering and alternatives together, which slightly reduces readability for such a wide surface.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description correctly shoulders the burden of explaining the return structure, normalization and limits. Combined with annotations covering the safety profile, an agent has everything needed to call 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 schema already documents jql, fields, reason and max_results. The description reinforces the field-name formats and output mapping but adds little input-side guidance the schema lacks, 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+resource ('Search Jira issues using JQL') and immediately scopes it as an extension of jira_search_issues by adding extra fields. An agent can distinguish it from the plain search 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?
Explicitly tells the agent to use jira_search_issues instead when its standard fields suffice, notes the approval trade-off, and points to jira_list_fields for discovering field names. Conditions for the alternative are stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_transition_issueA
Move a Jira issue to a new status by transition name (e.g. "Done", "In Progress") — call jira_get_transitions first to see what's valid from the issue's current status. Returns the issue after the move, in the same shape jira_get_issue returns minus comments; errors, listing the valid names, if the name is not available. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| issue_key | Yes | Key of the issue, e.g. PROJ-123, from jira_search_issues (its key field). | |
| transition_name | Yes | Name of the transition to apply, e.g. 'Done' or 'In Progress', as jira_get_transitions returns it in name (case-insensitive). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, idempotentHint=false, destructiveHint=false. The description adds far more: the return shape (same as jira_get_issue minus comments), the error behavior (lists valid names when the transition is unavailable), and an authorization constraint (requires user approval). These are exactly the traits an agent needs and none are restated from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences: what it does, the prerequisite, the return/error shape plus approval requirement. Front-loaded with the action and every clause carries information. Nothing repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description compensates by describing the return value shape and error payload. Combined with annotations covering the mutation profile, an agent has everything needed to invoke and interpret the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (including the reason field) are already documented in the schema. The description reinforces transition_name semantics with examples but adds no format or syntax 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 (move a Jira issue to a new status) with the exact mechanism (by transition name), and distinguishes itself from the sibling jira_get_transitions by explicitly pointing to it as the prerequisite lookup rather than something this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ordering rule: call jira_get_transitions first to see what is valid from the current status. It also names the failure mode and what it will report, so the agent knows the condition under which the call is appropriate. No exclusions are needed beyond this because the valid-name check is the whole decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_update_issueA
Update fields on an existing Jira issue (summary, description, priority, and/or custom fields). Only the fields you pass non-empty change, and at least one is required. Returns the updated issue in the same shape jira_get_issue returns minus comments. Use jira_transition_issue instead to change its status. Pass assignee_account_id to reassign it. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| summary | No | New one-line summary. Empty leaves the summary unchanged. | |
| priority | No | New priority name, e.g. 'High', 'Medium' or 'Low'. Empty leaves the priority unchanged. | |
| issue_key | Yes | Key of the issue, e.g. PROJ-123, from jira_search_issues (its key field). | |
| description | No | New plain-text description, replacing the current one. Empty leaves the description unchanged. | |
| custom_fields | No | JSON object mapping Jira Cloud custom field display names (as seen in the Jira UI, not their customfield_NNNNN id) to new values, e.g. {"Story Points": 5, "Sprint": "Sprint 12"}. Empty changes no custom fields. | |
| assignee_account_id | No | Atlassian account id to assign the issue to, from jira_find_users (its account_id field). Empty leaves the assignee unchanged or unset. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a non-read-only mutation, and the description adds genuine context: partial-update semantics ('only fields you pass non-empty change'), the return shape ('same shape jira_get_issue returns minus comments'), and an approval gate. It does not describe error/failure behavior or concurrency effects, which keeps 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?
Six tightly packed sentences, each earning its place: purpose, update semantics, return shape, alternative tool, reassignment, and approval. The most decision-relevant information (what it does and what it won't do) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with no output schema, the description compensates by stating the return shape, and annotations cover the safety profile. Partial-update semantics, approval requirement, and the sibling relationship are all present, leaving no critical gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all seven parameters are self-documented and the baseline is 3. The description adds meaning beyond the schema by clarifying that assignee_account_id reassigns the issue and by surfacing the at-least-one-field rule, pushing it slightly above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (existing Jira issue) and enumerates the affected fields (summary, description, priority, custom fields). It explicitly distinguishes itself from jira_transition_issue for status changes, so an agent can route correctly 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 tool and the condition selecting it ('Use jira_transition_issue instead to change its status'), states the minimum-field constraint ('at least one is required'), and flags the approval prerequisite. The main when-to-use/when-not decision is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
miro_create_connectorsA
Draw connector lines between existing items on one Miro board, up to 20 in one request. Returns {board_id, created_ids}. Use miro_list_connectors to read the lines already there. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| board_id | Yes | The board id from miro_list_boards (such as uXjVOD6LSME=), the part of the board's address after /app/board/. Not the full link. | |
| connectors | Yes | A JSON array of 1 to 20 lines, each {"start_item_id": ..., "end_item_id": ...} with optional shape (straight, elbowed or curved), caption (at most 200 characters) and color (#RRGGBB). The two ends are different existing items that are not frames. Example: [{"start_item_id": "3458764549483493025", "end_item_id": "3458764549483493026", "caption": "leads to"}]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false) by disclosing the 20-connector batch cap, the exact return shape {board_id, created_ids}, and that user approval is required. It does not say what happens on partial failure within a batch, so it falls 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 short sentences, front-loaded with the action and batch limit, then the sibling reference, then return and approval facts. No filler; every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-required-param mutation with no output schema, the description covers batch limits, approval requirement, and return keys, which is close to sufficient. The remaining gap is error semantics when some connectors in a batch fail.
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%: board_id source, the connectors JSON shape (start/end item ids, optional shape/caption/color), and the reason field are all documented in the schema. The description only restates the 20-item cap and non-frame constraint already present, adding no new semantics, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource ("Draw connector lines") with explicit scope: between existing items on one Miro board, batched up to 20. It also names the sibling read counterpart (miro_list_connectors), so the agent can distinguish create vs read without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the read alternative (miro_list_connectors) for inspection and constrains inputs to existing, non-frame items, which steers invocation correctly. It stops short of stating when NOT to use it (e.g., versus miro_create_items when the endpoints don't yet exist), but the implied context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
miro_create_itemsA
Add sticky notes, cards, texts, shapes or frames to one Miro board, up to 20 in one request. Returns {board_id, created: [{id, type}]}. Use miro_update_items to change items that already exist. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | A JSON array of 1 to 20 items, each {"type": sticky_note|card|text|shape|frame, ...}. Keys by type: sticky_note content, shape (square or rectangle), width or height, frame_id; card title, description, due_date (YYYY-MM-DD), width, height, frame_id; text content (required), width, frame_id; shape content, shape (rectangle, round_rectangle, circle, triangle, rhombus, star, cloud, ...), width, height, frame_id; frame title, width, height. Every type takes x, y and color: a sticky_note color is a name such as yellow, light_blue or green; a shape or frame color is one of Miro's 16 fill colors such as #fff9b1; a card or text color is any #RRGGBB. Inside a frame x and y are measured from the frame's top-left corner. Content may use simple HTML such as <p> and <strong>. Example: [{"type": "sticky_note", "content": "Idea", "color": "yellow", "x": 0, "y": 0}]. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| board_id | Yes | The board id from miro_list_boards (such as uXjVOD6LSME=), the part of the board's address after /app/board/. Not the full link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, and the description adds genuinely new context: the returned payload shape {board_id, created:[{id,type}]}, the 20-item request cap, and that user approval is required. It omits what happens on partial failure (e.g., whether one invalid item aborts the entire batch), which matters for a batch mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: capability plus cap first, return shape second, sibling routing and approval requirement last. No filler and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent batch mutation with rich annotations and a fully documented schema, the description supplies the return shape and the approval requirement that would otherwise be missing. The remaining gap is failure/atomicity semantics for partial batches.
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 items parameter is documented exhaustively with per-type keys, color formats, and an example. The description only restates the type list and the 20 cap, adding essentially no semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add) and enumerates the exact creatable resource types (sticky notes, cards, texts, shapes, frames), plus the scoping constraint 'one Miro board' and a batch cap of 20. An agent can immediately distinguish this from miro_update_items or miro_create_connectors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to miro_update_items for items that already exist, which is the primary confusion case for a create tool. It does not address other nearby alternatives such as miro_create_connectors (for linking created items) or miro_list_items, so the guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
miro_get_boardARead-onlyIdempotent
Get one Miro board's name, team, dates and link. Returns {id, name, team, created_at, modified_at, view_link}. Use miro_list_boards first to find the board_id, and miro_list_items to read what is on the board. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| board_id | Yes | The board id from miro_list_boards (such as uXjVOD6LSME=), the part of the board's address after /app/board/. Not the full link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds two genuinely useful facts beyond the annotations: the exact return fields and the 'Auto-approved' status (no approval gate). It does not discuss errors (e.g., invalid board_id), so it stops 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 short sentences, front-loaded with the purpose, then the return shape, then the workflow routing. No filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read with no output schema, the description supplies the return fields, the ID sourcing path, and the approval status — everything needed to 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% and board_id already documents the format ('such as uXjVOD6LSME=', the segment after /app/board/). The description only restates the dependency on miro_list_boards, adding no new syntax or constraint beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one Miro board') and enumerates exactly what is retrieved (name, team, dates, link), plus the return shape. An agent can distinguish it from miro_list_boards and miro_list_items 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 the agent: use miro_list_boards first to obtain board_id, and miro_list_items to read board contents. Both the prerequisite and the alternative are named with their selecting conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
miro_get_itemsARead-onlyIdempotent
Read specific items of one Miro board by their ids. Returns a list of items with their id, type, text, color, position, size and frame. Use miro_list_items to find the ids, and miro_update_items to change items. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| board_id | Yes | The board id from miro_list_boards (such as uXjVOD6LSME=), the part of the board's address after /app/board/. Not the full link. | |
| item_ids | Yes | Item ids from miro_list_items, separated by commas, 1 to 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered structurally; the description adds the non-obvious gate "Requires user approval" and spells out the returned field set. It stops short of mentioning pagination or per-call limits beyond the 1-50 cap already in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences: capability first, return shape second, routing plus approval gate last. Zero filler and the most decision-relevant content is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by listing the item fields returned. With 100% schema coverage, annotations covering the safety profile, and the approval requirement stated, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so board_id (id after /app/board/), item_ids (comma-separated, 1-50) and reason are already fully documented. The description only restates "by their ids" and adds no format or edge-case detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Read specific items of one Miro board by their ids" gives a concrete verb, resource, and scope (specific, id-targeted, single board), and the following sentence enumerates the returned fields. An agent can distinguish this from miro_list_items (all items) 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 routes explicitly: use miro_list_items to obtain the ids, miro_update_items to mutate them, so this tool is the read-by-id path in a three-tool workflow. Prerequisite and alternative are both named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
miro_list_boardsARead-onlyIdempotent
List the Miro boards this account can open in the connected Miro team, optionally only those matching a search text. Only boards in the Miro team chosen when PrivacyFence was signed in are visible. Returns a list of {id, name, team, modified_at, view_link}. Pass an id as board_id to miro_get_board. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Text to search for in board names and descriptions. Empty lists every board. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Most results to return. The result is cut to this many. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds genuinely new context beyond that: the team-scope visibility limit, the exact return shape ({id, name, team, modified_at, view_link}), and that calls are auto-approved. It does not mention pagination/truncation behavior beyond what the schema's max_results already implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the verb and scope, then filter, then constraint, then return shape and handoff. Every sentence contributes actionable information with no restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description supplies return fields, visibility scope, filter behavior, and the downstream call path. There is nothing an agent needs in order to invoke it correctly that is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so query and max_results are already fully documented; the description adds marginal value by tying the returned id to miro_get_board's board_id, but says nothing about max_results truncation or the required 'reason' parameter. Baseline 3 fits when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List the Miro boards'), scopes it to 'the connected Miro team', and explicitly names the follow-up sibling ('Pass an id as board_id to miro_get_board'), which cleanly separates it from miro_get_board and the item-level list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent when the query filter applies ('optionally only those matching a search text') and routes to the natural next tool, plus an explicit visibility precondition (only the team chosen at PrivacyFence sign-in). There is no explicit 'do not use this for X' exclusion, but the routing to miro_get_board covers the main ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
miro_list_connectorsARead-onlyIdempotent
Read the connector lines on one Miro board and the ids of the items each one joins. Returns a list of {id, start_item_id, end_item_id, shape, captions}. Use miro_create_connectors to draw new lines. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| board_id | Yes | The board id from miro_list_boards (such as uXjVOD6LSME=), the part of the board's address after /app/board/. Not the full link. | |
| max_results | No | Most results to return. The result is cut to this many. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is lowered. The description still adds two useful behaviors beyond the annotations: the exact return record fields and the 'Requires user approval' gate, which an agent needs before calling. Return shape plus approval requirement is solid 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 sentences, front-loaded with the action and return shape, then the alternative tool, then the approval prerequisite. Nothing is repeated from structured fields and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description supplies the return record shape, and annotations cover the safety profile. The approval requirement is the one behavioral fact an agent couldn't get elsewhere, and it is stated. Nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter (board_id, reason, max_results) carries its own description, so the schema does the heavy lifting. The description only implies that a board_id is needed via 'one Miro board' and adds no format or truncation detail 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?
Names a specific verb and resource ('Read the connector lines on one Miro board') and even spells out the returned record shape ({id, start_item_id, end_item_id, shape, captions}). It explicitly contrasts with miro_create_connectors, so an agent can distinguish read vs. write 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 context (one board's connectors) and points to miro_create_connectors as the alternative for drawing lines, which is clear routing. It doesn't describe exclusions (e.g., that there's no cross-board query or filtering), 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.
miro_list_itemsARead-onlyIdempotent
Read the items on one Miro board, optionally only one type of item or only the items inside one frame. Returns a list of items with their id, type, text, color, position, size and frame. Use miro_get_items to read specific items by id, and miro_create_items to add to the board. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Only items of this type: sticky_note, card, text, shape, frame, image, document, embed or app_card. Empty means every type; use frame to list the board's frames. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| board_id | Yes | The board id from miro_list_boards (such as uXjVOD6LSME=), the part of the board's address after /app/board/. Not the full link. | |
| frame_id | No | Only the items inside this frame (an item id of type frame from miro_list_items). Empty means the whole board. | |
| max_results | No | Most results to return. The result is cut to this many. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower; the description still adds the non-obvious fact that the call 'Requires user approval' and enumerates the returned fields. It does not describe pagination/truncation behavior beyond what max_results implies, 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?
Two sentences, zero filler: the capability and its scope come first, followed by routing guidance. The approval caveat is a single short clause that earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields (id, type, text, color, position, size, frame). Combined with the scope, sibling routing, and approval requirement, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains type, frame_id, board_id and max_results in detail. The description restates the type and frame filters at a high level without adding format or edge-case detail, which is the baseline when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (read items on one Miro board) plus the two narrowing scopes (single item type, single frame). It explicitly distinguishes itself from miro_get_items (by-id reads) and miro_create_items (writes), so an agent can route 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?
Names both alternatives and the condition that selects each: 'Use miro_get_items to read specific items by id, and miro_create_items to add to the board.' It also flags that user approval is required, which affects when the call can proceed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
miro_list_tagsARead-onlyIdempotent
List the tags defined on one Miro board. Returns a list of {id, title, color}. Use miro_list_items to read the board's items. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| board_id | Yes | The board id from miro_list_boards (such as uXjVOD6LSME=), the part of the board's address after /app/board/. Not the full link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new context beyond that: the exact return shape ({id, title, color}) and the governance note 'Auto-approved', which tells the agent no approval round-trip is needed. It omits pagination or behavior on boards with no tags.
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: purpose first, return shape second, routing hint third. No filler, no repetition of the schema, and 'Auto-approved' is a single word doing real work.
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 correctly compensates by naming the returned fields, and annotations carry the safety profile. Only minor gaps remain (pagination/limits, empty-result behavior) for a simple read-only list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the board_id description already explains the id format ('the part of the board's address after /app/board/, not the full link') as well as the reason parameter. The description adds no parameter-level detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the tags defined on one Miro board') with explicit scope limited to a single board, and it names the sibling miro_list_items to mark the boundary between tags and items. An agent can distinguish it from miro_list_items, miro_get_items and miro_list_connectors without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear routing hint by saying 'Use miro_list_items to read the board's items', which keeps the agent from calling this tool for item data. It does not state an explicit exclusion or precondition for tags themselves (e.g. when tags are empty or when another tag-related tool applies), so it stops short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
miro_update_boardA
Rename a Miro board or change its description. Returns {board_id, name, description}. Use miro_get_board to read the board's current name. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New board name, at most 60 characters. Empty keeps the current name. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| board_id | Yes | The board id from miro_list_boards (such as uXjVOD6LSME=), the part of the board's address after /app/board/. Not the full link. | |
| description | No | New board description, at most 300 characters. Empty keeps the current description. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, idempotentHint=false, destructiveHint=false; the description adds two genuinely new behavioral facts: the call requires user approval and the response shape {board_id, name, description}. It does not explain that empty-string defaults mean fields are left untouched in prose (that lives only in the schema), which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, followed by return shape and then the approval constraint. No filler and nothing repeated from the schema verbatim.
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 correctly supplies the return shape, and the approval gate is called out. For a 4-parameter mutation tool this is nearly sufficient; only failure modes (invalid board_id, name over 60 chars) are left entirely 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 coverage is 100%, so every parameter — including the required `reason` — is already documented with limits and defaults. The description's "Rename... or change its description" only restates which two fields are editable and adds nothing about the mandatory reason parameter, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with the exact editable fields: "Rename a Miro board or change its description." It also names the read counterpart (miro_get_board), making it easy to distinguish from the sibling read/list tools in the miro_* family.
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 guidance for the read case ("Use miro_get_board to read the board's current name") and signals a prerequisite via "Requires user approval." It does not state when-not to use it or address overlap with miro_update_items, 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.
miro_update_itemsA
Change existing items on one Miro board (text, color, position, size, or which frame they are in), up to 20 in one request. Nothing can be deleted; to take an item out of its frame set frame_id to an empty string. Returns {board_id, updated_ids}. Use miro_get_items to read the items first, and miro_create_items to add new ones. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| changes | Yes | A JSON array of 1 to 20 changes, each {"id": <item id>, <key>: <new value>, ...} using the keys miro_create_items allows for that item's type (not type). Set frame_id to a frame's id to move the item into it, or to an empty string to take it out; a change that sets frame_id sets no x or y. Example: [{"id": "3458764549483493025", "content": "Done", "color": "green"}]. | |
| board_id | Yes | The board id from miro_list_boards (such as uXjVOD6LSME=), the part of the board's address after /app/board/. Not the full link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details critical behavioral rules not easily captured in annotations or schema, such as the lack of a deletion mechanism (setting frame_id to empty string to remove an item) and the fact that nothing can be deleted directly.
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 dense, but highly efficient. Every sentence conveys essential operational constraints or workflow directions without unnecessary 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?
Given the complexity of manipulating objects (position, framing), the description covers all necessary technical details, constraints, and dependencies (e.g., needing the item's current ID) for correct tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description is vital for the 'changes' parameter. It explains the complex logic—specifically how `frame_id` interacts with X/Y coordinates and the required JSON array structure—making it highly accessible to an agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action (Change existing items), the resource (Miro board), and the specific scope of change (text, color, position, size, or frame). It effectively differentiates this from read (`miro_get_items`) or add (`miro_create_items`) operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The tool provides explicit workflow guidance: suggesting the agent first use miro_get_items to read items before attempting the update. It also specifies the limit (up to 20) and the operational constraint (requires user approval).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peek_add_commentA
Post a comment on a Peek page under your own Peek account name, on the latest version or the one you give. Copy selector and element_text from a comment returned by peek_get_comments to reply at the same spot. Returns {slug, version, comment: {id, author, verified, body, anchor_kind, selector, element_text, created_at}}. Use peek_get_comments to read the existing comments. Use peek_list_versions to find a version. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The comment text, 1 to 4000 bytes (UTF-8). | |
| slug | Yes | The page's slug: the slug field from peek_list_pages, or the last part of its link (…/p/<slug>). | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| version | No | Version number to comment on, from peek_list_versions; 0, the default, means the latest. | |
| selector | No | CSS selector of the element to pin the comment to, copied from a comment's selector in peek_get_comments. Empty comments on the whole page. | |
| element_text | No | Quoted text to anchor the comment to, up to 200 bytes (UTF-8), copied from a comment's element_text. Needs selector. Empty anchors to the element, or the page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, and the description adds genuinely useful context beyond them: the comment is authored under the caller's own account name, it requires user approval, and the exact return shape is spelled out. It stops short of describing failure modes or limits, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and scope, then alternatives, then the return shape. Every sentence carries information an agent needs; none 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?
No output schema exists, yet the description supplies the return shape, and no annotations gaps remain unexplained. For a 6-parameter mutation tool this is complete enough to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: selector/element_text should be copied from peek_get_comments output, element_text depends on selector, and version defaults to latest. That relationship guidance goes beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Post a comment on a Peek page") plus the posting identity and version targeting. It is clearly distinguishable from peek_get_comments, which it names as the read counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: peek_get_comments for reading, peek_list_versions for finding a version, and copying selector/element_text from a returned comment to reply in the same spot. When-to-use and prerequisites are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peek_delete_pageADestructive
Delete a Peek page, with its comments and visit history. Returns {deleted: slug}. Use peek_list_pages to find the slug. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The page's slug: the slug field from peek_list_pages, or the last part of its link (…/p/<slug>). | |
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint=true annotation, the description discloses exactly what is destroyed (the page plus comments and visit history), the auth requirement (user approval), and the return shape ({deleted: slug}). The cascade scope is the single most important behavioral fact for a destructive tool and it is stated explicitly.
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 destructive action, then scope, then return value, then prerequisite, then gating condition. No filler; every clause carries an actionable fact.
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?
Although there is no output schema, the description supplies the return shape, the cascade impact, and the approval gate. For a two-parameter destructive tool with full annotation coverage, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents both slug (its source and link format) and reason. The description only repeats the peek_list_pages provenance for slug and adds nothing new, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a Peek page') and immediately scopes it by naming the cascade ('with its comments and visit history'). This clearly separates it from siblings like peek_rename_page and peek_set_visibility without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Points the agent at the prerequisite sibling ('Use peek_list_pages to find the slug') and flags a gating condition ('Requires user approval'). It gives clear context for invocation but stops short of stating when NOT to use this tool or any alternative deletion path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peek_get_commentsARead-onlyIdempotent
Read the reviewers' comments on one Peek page, with what each comment is anchored to. Comments belong to one version of the page: the latest unless you give version. Returns {slug, name, version, comments: [{id, author, verified, body, anchor_kind, selector, element_text, created_at, version}]}, where version is the one read and verified is true when a signed-in Peek account wrote the comment and false when a viewer typed the author name. Use peek_get_stats to see how often the page was opened and peek_add_comment to reply. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The page's slug: the slug field from peek_list_pages, or the last part of its link (…/p/<slug>). | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| version | No | Version number of the page to read comments of, from peek_list_pages' version field (the latest) or an earlier one. 0, the default, means the latest. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, yet the description still adds real context: comments are scoped to a single page version (latest by default), the `verified` flag's meaning is explained, and it warns that user approval is required. The only omission is error behavior for a missing slug or version.
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 the action and scope, then moves to return shape and alternatives in a logical order with no filler sentences. It is dense but every clause carries information, including the inline return schema that substitutes for a missing output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the full return shape (slug, name, version, comment fields) and explains the `verified` flag, so an agent knows what comes back. Combined with version scoping, sibling routing, and the approval requirement, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents slug, reason, and the version default of 0 meaning latest, so the description largely repeats that. It adds only a mild restatement of the version scoping rule. Baseline 3 applies when the schema carries the parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Read the reviewers' comments on one Peek page") and adds scope ("with what each comment is anchored to"). This clearly distinguishes it from peek_add_comment (writing) and peek_get_stats (view counts) in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to two alternatives: peek_get_stats for views and peek_add_comment to reply, which tells the agent when not to use this tool. It also states the version-scoping rule. It stops short of spelling out a general "use this when..." condition, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peek_get_statsARead-onlyIdempotent
Read how often one Peek page was opened, and the names visitors gave. IP addresses and browsers are never returned. Returns {slug, name, total_visits, unique_visitors, recent: [{visitor_name, visited_at}]}. Use peek_get_comments to read the comments. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The page's slug: the slug field from peek_list_pages, or the last part of its link (…/p/<slug>). | |
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds genuinely new behavior: visitor IPs and browsers are never returned (a privacy constraint) and that user approval is required. These go beyond annotations. Doesn't mention pagination or rate limits, 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 action, then privacy guarantees, then return shape, then sibling routing, then approval requirement – no wasted words. It even specifies the return object fields, adding value efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter read tool with rich annotations and full schema coverage, the description covers purpose, privacy constraints, approval requirement, sibling routing, and expected output shape. An agent has everything needed to call 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% and the slug parameter is fully documented in-schema (including cross-reference to peek_list_pages). The description adds no syntax detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (read how often one Peek page was opened, names visitors gave) and distinguishes itself from peek_get_comments by explicitly routing comments to that sibling. An agent can identify the exact scope and output without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly directs the agent to peek_get_comments for comments, establishing a use boundary. It notes user approval is required, implying a gated usage context. No explicit when-not-to-use beyond the sibling routing, so short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peek_grant_accessA
Let a person or a Google group open a restricted Peek page. Peek emails them the link when the page is restricted and they did not have access yet. Returns {slug, kind, email, notified}. Use peek_set_visibility to restrict the page, and peek_list_grants to see who has access. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | user (one person's email, the default) or group (a Google group's email; needs group lookup on the Peek server). | user |
| slug | Yes | The page's slug: the slug field from peek_list_pages, or the last part of its link (…/p/<slug>). | |
| Yes | The email address of the person, or of the Google group. | ||
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: it discloses the email side-effect, the condition under which the email is sent (page restricted and recipient lacked access), the exact return payload {slug, kind, email, notified}, and the user-approval gate. These are real operational facts an agent cannot derive from readOnlyHint=false / idempotentHint=false / destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action and followed by effect, return shape, sibling routing and the approval caveat. Every sentence carries distinct information with no restatement of the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation with annotations present but no output schema, the description supplies the return shape inline, the side effect, the approval requirement and alternative tools. Nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so kind, slug, email and reason are already fully documented in the input schema. The description adds no extra syntax or constraint detail for the parameters, which is acceptable but not additive; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Let a person or a Google group open a restricted Peek page') and immediately names the sibling tools it is not (peek_set_visibility, peek_list_grants). An agent can distinguish granting access from restricting a page or auditing grants without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use peek_set_visibility to restrict the page and peek_list_grants to see who already has access, and flags that user approval is required. It stops short of stating the negative case (e.g. what to do if the page is already public or the person already has access), which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peek_list_grantsARead-onlyIdempotent
List who can open one restricted Peek page: the people and Google groups granted access. Returns {slug, name, visibility, grants: [{kind, email, created_at}]}. Grants apply only while the page is restricted. Use peek_grant_access and peek_revoke_access to change them. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The page's slug: the slug field from peek_list_pages, or the last part of its link (…/p/<slug>). | |
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond the readOnly/idempotent annotations: the conditional invariant that grants only exist while the page is restricted, the exact return shape, and the gating requirement 'Requires user approval'. The approval and conditional-existence details are exactly the kind of behavior an agent needs and cannot infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the read purpose, then return shape, then the restriction invariant, then the sibling routing and approval gate. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description inlines the return structure, and with only two fully documented parameters and annotation coverage of safety traits, nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already explains both slug (derived from peek_list_pages or the …/p/<slug> link) and reason. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List who can open one restricted Peek page') plus the exact objects returned (people and Google groups). An agent can distinguish it from peek_grant_access/peek_revoke_access without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes mutation cases to 'peek_grant_access and peek_revoke_access', and scopes applicability with 'Grants apply only while the page is restricted'. It does not state an explicit when-not-to-call case (e.g. unrestricted pages return nothing), but the context and alternatives are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peek_list_pagesARead-onlyIdempotent
List the Peek pages this account can manage, newest first, with each page's link and who can open it. An admin account sees every page. Returns a list of {slug, name, owner, size_bytes, visibility, url, created_at, version}, where version is the page's latest version. Use peek_get_comments to read the comments on a page and peek_get_stats to see how often it was opened. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Most pages to return, newest first. Default 50, 1 to 200. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description still adds real behavioral context: admin accounts see every page, results are newest-first, and the 'Auto-approved' note signals that this call clears the approval gate without a human in the loop.
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 purpose, then return shape, then sibling routing. Every sentence earns its place; the full field enumeration is slightly long but justified by the absence of an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return envelope ({slug, name, owner, size_bytes, visibility, url, created_at, version}) plus the meaning of 'version'. Combined with annotations, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (reason, max_results) are already documented in the schema. The description's 'newest first' phrasing reinforces the ordering semantics of max_results but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the Peek pages'), scopes it ('this account can manage'), and adds ordering ('newest first'). The admin-visibility clause further distinguishes it from narrower peek_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes related tasks to alternatives: peek_get_comments for comments and peek_get_stats for open counts. It gives clear context for when this tool is the right entry point, though it stops short of stating when *not* to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peek_list_versionsARead-onlyIdempotent
List the versions of one Peek page you manage, newest first, with each version's size, time and link. Returns {slug, name, versions: [{version, size_bytes, created_at, url}]}. Use a version number with peek_get_comments or peek_add_comment. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The page's slug: the slug field from peek_list_pages, or the last part of its link (…/p/<slug>). | |
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real value: newest-first ordering, the exact payload shape, and 'Auto-approved' (a meaningful signal given the surrounding privacyfence approval tools). Minor gap: no pagination or result-count behavior for pages with many versions.
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: purpose/ordering, return shape, then downstream use. No filler, and the most decision-relevant information (what it lists, newest first) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description supplies the return structure inline ({slug, name, versions:[{version, size_bytes, created_at, url}]}), so an agent knows exactly what it will get. Combined with the auto-approved note and the follow-up routing to comment tools, nothing essential 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 coverage is 100% and the slug parameter's own description already explains where to obtain it (peek_list_pages, or the tail of a /p/<slug> link). The description adds nothing about the slug or reason parameters beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the versions of one Peek page'), plus scope ('you manage') and ordering ('newest first'). The resource is unambiguous against siblings like peek_list_pages or peek_get_comments, which operate on pages/comments rather than versions.
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 by naming the downstream consumers: 'Use a version number with peek_get_comments or peek_add_comment,' which tells the agent why and when to call this. It stops short of explicit exclusions (e.g., what to use instead if you already know the version), so it is clear context without full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peek_rename_pageA
Rename a Peek page; its link may change to match the new name, and old links keep redirecting to it in browsers. Use the slug it returns from then on; the old slug no longer works in the other Peek tools. Get the current slug from peek_list_pages. Returns {old_slug, slug, url, name}. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The page's new name, 1 to 200 characters, such as Q3 report.html. Peek derives the page's link from it. | |
| slug | Yes | The page's slug: the slug field from peek_list_pages, or the last part of its link (…/p/<slug>). | |
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (not read-only, not idempotent, not destructive); the description goes well beyond by disclosing the link-change side effect, that old browser links keep redirecting while the old slug stops working in other Peek tools, the approval requirement, and the exact return shape. This is exactly the extra mutation context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences: the mutation and its link consequence first, then the follow-up usage rule, the slug source, the return shape, and the approval gate. Zero filler and correctly 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?
Covers the operation, the side effects, the required follow-up behavior, the return fields (compensating for the absent output schema), and the approval gate. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter descriptions already explain name length/link derivation and how to source the slug from peek_list_pages or the link. The description largely restates the slug-sourcing guidance, adding only the 'use the returned slug from then on' nuance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Rename a Peek page") that is instantly distinguishable from siblings like peek_delete_page, peek_upload_page, and peek_set_visibility. No ambiguity about what operation is performed.
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 tells the agent where to get the required slug (peek_list_pages), that the old slug becomes invalid in other Peek tools, and that user approval is required. It stops short of naming an explicit when-not-to-use or a true alternative rename path, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peek_revoke_accessA
Remove a person's or a Google group's access to a restricted Peek page. Returns {slug, kind, email, removed}. Use peek_list_grants to see who has access. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | user (one person's email, the default) or group (a Google group's email; needs group lookup on the Peek server). | user |
| slug | Yes | The page's slug: the slug field from peek_list_pages, or the last part of its link (…/p/<slug>). | |
| Yes | The email address of the person, or of the Google group. | ||
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=false; the description adds the concrete return shape {slug, kind, email, removed} and the approval requirement, which the annotations do not convey. It does not explain behavior when no matching grant exists (error vs. removed=false), which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences: action first, then return value, then the related tool and prerequisite. Nothing is redundant and the most important information (what is removed and from where) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape, the discovery alternative, and the approval gate, which is close to sufficient for a small 4-parameter mutation tool. Edge-case semantics for a nonexistent grant are the only meaningful omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter (kind, slug, email, reason) is documented in the schema itself, including the user/group distinction and slug derivation. The description adds no parameter-level meaning 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 and resource ('Remove a person's or a Google group's access to a restricted Peek page') with both supported grantee types. It is clearly separable from siblings peek_grant_access, peek_list_grants, and peek_set_visibility without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Points the agent at peek_list_grants for discovering current access and notes the 'Requires user approval' prerequisite, which is real routing information. It stops short of stating when not to use it (e.g., if the caller only wants to change a role rather than remove access).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peek_set_visibilityA
Change who can open a Peek page: anyone with the link, anyone signed in to Peek, or only the people granted access (restricted). Returns {slug, visibility, notified}, where notified says whether Peek emailed the people granted access. Use peek_upload_page to publish a new version. Use peek_grant_access to choose who can open a restricted page. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The page's slug: the slug field from peek_list_pages, or the last part of its link (…/p/<slug>). | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| visibility | Yes | Who can open the page: public (anyone with the link), signed-in (anyone signed in to Peek) or restricted (only you, Peek admins and the people or groups granted access). Grant access with peek_grant_access. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive mutation, and the description adds real value beyond that: it discloses the return shape {slug, visibility, notified}, clarifies the side effect that Peek may email granted people, and warns 'Requires user approval.' It does not say whether switching to restricted revokes or preserves existing grants, which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: purpose and options first, then return value, then sibling routing. Every sentence earns its place with no repetition of annotation data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description supplies the return fields, the notification side effect, the approval requirement, and the follow-up tools. Only the interaction between visibility changes and pre-existing grants is left unstated, a minor but real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (slug, visibility, reason) are already well documented in the schema, including the slug derivation from peek_list_pages and the enum-like visibility values. The description restates the same visibility options without adding new format or constraint detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('change who can open a Peek page') and immediately enumerates the three possible values, so the agent knows exactly what state the resource moves to. It is clearly distinguishable from siblings like peek_grant_access or peek_delete_page.
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?
Routes the agent to alternatives with conditions: 'Use peek_upload_page to publish a new version' and 'Use peek_grant_access to choose who can open a restricted page.' Combined with the explicit purpose, an agent can pick the right tool without opening any schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peek_upload_pageA
Publish an HTML page on Peek, or a new version of one of your pages, and get its share link. Give the page as html, local_path or upload_id. Give slug to replace what an existing page's link shows with this new version; its visibility stays as it is. A new page is restricted unless you choose otherwise: only you, Peek admins and the people granted access can open it. Returns {slug, url, visibility, version, version_url}. Use peek_set_visibility to change who can open a page later. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| html | No | The page's full HTML source. Give exactly one of html, local_path and upload_id; empty otherwise. | |
| name | No | File name Peek shows for the page and builds its link from, such as report.html. Empty uses the local file's name, or page.html. | |
| slug | No | Slug of one of your pages, from peek_list_pages, to publish this as its next version under the same link. Empty publishes a new page. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| upload_id | No | Id returned by privacyfence_create_upload_slot after you PUT the file's bytes to its upload_url. Give exactly one of html, local_path and upload_id; empty otherwise. | |
| local_path | No | Path of an HTML file on the user's computer, absolute or starting with ~/. Not available on an organization-managed install. Give exactly one of html, local_path and upload_id; empty otherwise. | |
| visibility | No | Who can open the page: public (anyone with the link), signed-in (anyone signed in to Peek) or restricted (only you, Peek admins and the people or groups granted access). Grant access with peek_grant_access. Empty means restricted for a new page; leave it empty with slug. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read/write and destructive flags; the description adds genuinely non-obvious behavior: the default restricted visibility and who that includes, that republishing via slug leaves visibility unchanged, the exact return shape, and that user approval is required. This is context an agent cannot get from the structured fields.
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 and the source-selection rule, then the return shape and the alternative tool. Dense with no filler, though the approval requirement — arguably the most operationally important fact — is buried in the final sentence rather than surfaced early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no output schema, the description covers the essentials: input sourcing, version semantics, default access posture, return fields, approval gate, and the follow-up tool for access changes. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already carries a detailed description, including the exactly-one-of html/local_path/upload_id constraint. The description restates the source triad and the slug effect, adding only the visibility-stays-as-is nuance. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — publish an HTML page on Peek — and immediately covers the two modes (new page vs. new version of an existing page). It is clearly distinguishable from siblings like peek_set_visibility, peek_list_versions, and peek_delete_page, which are either named or implied by scope.
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 conditions for the two modes: empty slug publishes a new page, a slug from peek_list_pages republishes under the existing link. It also routes the agent to peek_set_visibility for later access changes. It stops short of explicit 'when not to use' guidance (e.g., use peek_rename_page/peek_delete_page for other page operations).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacyfence_await_approvalARead-onlyIdempotent
Long-poll pending approvals from gated calls' {status: 'approval_pending', approval_id, ...} results; status only, never content. Before the first call for an approval, relay that result's message and url (binder_url if several) to the user -- never wait silently. If pending_count > 1, first issue your other ready gated calls, then pass all approval_ids in one call (one human pass). Keep timeout_seconds under your client's tool-call timeout. Returns {approval_id: status}: 'pending' (schedule a follow-up if you can, else call again), 'approved' (re-issue the ORIGINAL call with identical arguments -- the only way to get the data), 'denied' (a human said no -- re-issuing will not change that; don't retry, ask the user how to proceed unless denial_feedback says otherwise), 'expired' (re-issuing starts a fresh approval) or 'unknown' (no such id here). denial_feedback holds the user's instruction for a denial: follow it. Returns on any change or at the timeout. Prefer this over re-issuing the original call to poll.
| Name | Required | Description | Default |
|---|---|---|---|
| approval_ids | Yes | ||
| timeout_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/non-destructive annotations, it explains long-poll behavior, status-only return semantics, and the full status lifecycle: pending, approved, denied, expired, unknown. It also documents the critical follow-up behavior for each outcome, including re-issuing the original call only after approval and not retrying after denial unless denial_feedback says otherwise.
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 dense but front-loaded: it opens with what the tool does and immediately covers user-relay requirements, batching, and timeout constraints. Every sentence contributes operational guidance, and the status-specific return handling is compactly enumerated.
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 asynchronous approval workflow with no output schema, the description supplies the missing return semantics, follow-up rules, batching behavior, timeout caveat, and denial-feedback handling. An agent has enough information to invoke and act on the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains that approval_ids come from gated-call results, should all be passed in one call when pending_count > 1, and that timeout_seconds should stay under the client's tool-call timeout. It does not document ID format or timeout units/default, so it is strong but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: long-poll pending approvals from gated calls' results, and clarifies the payload is status only, never content. It distinguishes this tool from re-issuing the original call for polling and from broader status tools by specifying that it watches approval state.
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 sequencing: relay the message and URL before the first call, never wait silently, and if pending_count > 1, issue other ready gated calls first then pass all IDs in one call. It also names the alternative and when to prefer this tool over simply re-issuing the original call to poll.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacyfence_begin_unattended_sessionAIdempotent
Tell PrivacyFence this conversation is an unattended/scheduled Cowork run (e.g. a Routine firing on a schedule) with no human necessarily watching, for the rest of this connection. From then on, any gated tool call that isn't already covered by a configured auto-accept rule is denied immediately with a clear error, instead of PrivacyFence opening a native approval dialog that nobody will answer. Call this once at the start of a scheduled run, and pair it with privacyfence_check_policy to plan which steps are safe to attempt. Never changes what auto-accepts, only what happens when nothing does. Errors if an administrator hasn't enabled unattended sessions for this install. Do not call this during a normal interactive conversation -- it makes denials immediate instead of prompting. reason: one sentence on why this session is unattended (e.g. the Routine/schedule that triggered it) -- logged in the audit entry for this session change, since no popup is shown for it to appear in.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: subsequent gated calls not covered by auto-accept rules are denied immediately with a clear error instead of opening a dialog, auto-accept configuration is never altered, the call errors if an admin hasn't enabled unattended sessions, and the change is audit-logged. These are exactly the side-effect and failure-mode details the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core instruction and the 'for the rest of this connection' scope are front-loaded, and each sentence carries new information (denial behavior, admin precondition, audit logging). It is somewhat dense and the trailing 'reason:' fragment is awkwardly concatenated, but there is little true filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter, no output schema, and annotations covering safety/idempotency, the description fills every remaining gap an agent needs: when to invoke, when not to, the resulting denial semantics, the admin-enabled precondition, the error case, and the audit behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden for the single 'reason' parameter. It explains what the value is for, the expected form ('one sentence on why this session is unattended'), an example trigger, and its consequence (logged in the audit entry since no popup is shown). That compensates well for the empty schema, though it doesn't state a length limit or validation rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action on a specific resource: marking this conversation as an unattended/scheduled Cowork run for the remainder of the connection. It is immediately distinguishable from the sibling privacyfence_end_unattended_session, which does the inverse.
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 ('Call this once at the start of a scheduled run'), explicit when-not ('Do not call this during a normal interactive conversation'), and names a companion tool to pair it with (privacyfence_check_policy) for planning safe steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacyfence_check_policyARead-onlyIdempotent
Before calling a gated tool, ask whether that exact call would auto-accept or need a human. Pass the connector, tool and args you're about to call. Returns {gate, verdict, matched_rule, matched_rule_id, reason, pii_gate_may_apply, pii_gate, pii_gate_detail, suggested_rules}. verdict: 'auto_accept' (the real call passes through identically), 'requires_review' (no rule can match these args) or 'unknown' (depends on fetched content). matched_rule_id (auto_accept only) is privacyfence_propose_policy_change's rule_id. suggested_rules: rules that would cover an uncovered call, {group, label, value, value_known, verb, operation, requires_args?}; value is null if the call reaches it at run time, [] if the rule takes none; requires_args: args the call must also pass. pii_gate: whether the PII scan can still force a popup or, unattended or with a scoped token, a denial: 'none', 'allowed_by_token', 'allowed_unless_inline' or 'applies' (see pii_gate_detail). No side effects. reason: why you check (logged, unverified).
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | ||
| tool | Yes | ||
| reason | Yes | ||
| connector | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, and the description reinforces that with 'No side effects' and the important disclosure that the check is logged and unverified. It goes further than annotations by explaining each verdict's meaning ('auto_accept' passes through identically, 'unknown' depends on fetched content) and the pii_gate states. It does not explain failure modes if the connector/tool name is unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core instruction, which is good, but the remaining text is a single dense run-on cramming verdict values, suggested_rules field structure, and pii_gate enumeration into one paragraph. Since there is no output schema, documenting returns is justified, but the semicolon-chained structure makes it harder to parse than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the necessary work of enumerating return fields and the verdict enumeration. It is nearly complete for a gate-check tool, though it doesn't say what an agent should do next on 'requires_review' or 'unknown' (e.g. call privacyfence_await_approval).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load, and it does: connector + tool identify the call, args must be exactly what would be sent, and reason is the logged, unverified justification. It still leaves format details implicit (what connector identifiers look like, whether reason has any length/format constraints).
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: pre-flight check of whether an exact gated call will auto-accept or need a human. It clearly separates itself from the approval sibling (privacyfence_await_approval) by being a read-only prediction step with 'No side effects'. The verdict vocabulary makes the tool's output goal unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call it: 'Before calling a gated tool'. It also makes clear the check must be for the exact args about to be used, otherwise the verdict is meaningless. It never states when not to bother (e.g. after a prior identical check, or for ungated tools), so no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacyfence_create_upload_slotA
Get a one-time URL to upload a local file to PrivacyFence, for a client without the PrivacyFence extension (e.g. Claude Code) -- use it when a tool's local_path/attachments parameter says PrivacyFence can't read your files directly. Returns {upload_id, upload_url, method: 'PUT', max_bytes, expires_at, example}: PUT the raw bytes to upload_url (e.g. the curl -T example); no Authorization header -- the URL is the credential. Then pass upload_id to the tool that needs the file (its upload_id parameter, e.g. drive_upload_file, or an 'upload:<upload_id>' attachments entry, e.g. gmail_*_with_attachments). Never fetch upload_url yourself or pass it as local_path. Single-use, expires in 10 minutes, claimable only by your next tool call in this conversation. This uploads, gates and approves nothing: that happens when the destination tool runs. reason: one sentence on why this file is needed now (logged, self-reported, unverified).
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | ||
| filename | Yes | ||
| size_bytes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only assert non-readOnly, non-idempotent, non-destructive. The description adds life-cycle and security traits well beyond them: single-use, 10-minute expiry, claimable only by the next tool call, no Authorization header because the URL is the credential, and that it neither gates nor approves anything.
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: purpose, then trigger, then return shape and usage, then constraints. The single paragraph format for such a nuanced tool is acceptable, though the trailing 'reason:' clause and example could be trimmed for scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description enumerates the return fields ({upload_id, upload_url, method, max_bytes, expires_at, example}), the required next step, and the security constraints. Nothing an agent needs to invoke and chain this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It thoroughly explains the meaning and intent of 'reason' (logged, self-reported, unverified) and implies 'filename', but leaves 'size_bytes' undocumented even though upload limits are relevant. Strong on the semantically important params, with one gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get a one-time URL to upload a local file to PrivacyFence') and immediately scopes it to a client without the extension. An agent can distinguish this from siblings like drive_upload_file without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('use it when a tool's local_path/attachments parameter says PrivacyFence can't read your files directly'), names the follow-up destinations (drive_upload_file, gmail_*_with_attachments), and states two negative rules ('Never fetch upload_url yourself or pass it as local_path'). When, how, and when-not are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacyfence_end_unattended_sessionAIdempotent
Clear the unattended-session flag set by privacyfence_begin_unattended_session for this connection, restoring normal interactive approval behavior. Call this when a scheduled run finishes. Not strictly required -- the flag also clears automatically when the connection closes -- but call it if this connection might be reused afterward for something interactive. reason: one sentence on why the unattended session is ending now -- logged the same way as privacyfence_begin_unattended_session's.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly=false, idempotent=true, destructive=false. The description adds substantial context beyond that: it names the flag being cleared, states the effect (restoring normal interactive approval behavior), discloses that the flag auto-clears on connection close, and marks the call as optional. The idempotent annotation is consistent with a flag-clear operation.
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 purpose is front-loaded in the first clause, and each subsequent sentence adds a distinct fact (timing, optionality, fallback, parameter meaning). Slightly dense — the parameter note is run-on — but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param, no-output-schema flag-clearing tool, the description covers purpose, timing, optionality, the automatic fallback, and the lone parameter. An agent has everything needed to decide whether to call it and how to populate reason.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single parameter is required, so the description must carry the burden — and it does: reason is described as "one sentence on why the unattended session is ending now" and cross-referenced to how begin_unattended_session logs it. Format constraints (length caps, etc.) are left unstated, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Clear) and resource (the unattended-session flag), and explicitly ties it to its counterpart privacyfence_begin_unattended_session. An agent can distinguish it from all siblings, including the begin/await/status PrivacyFence tools, without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit timing ("Call this when a scheduled run finishes") and an explicit conditional for the optional case ("call it if this connection might be reused afterward for something interactive"). It also names the alternative path — automatic clearing on connection close — so the agent knows when NOT to bother calling it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacyfence_list_policyARead-onlyIdempotent
List every configured auto-accept rule, plus the scope catalogue privacyfence_propose_policy_change accepts. Returns {rules, scope_groups}. Each rule has: id (pass as privacyfence_propose_policy_change's rule_id to update or remove it), sentence (human-readable), connector, scope_type, value, operations (internal keys, informational), verbs ({verb, family} pairs; family is 'read', 'write', 'send' or 'destructive'), conditions, and covered_tools (every tool name the rule can auto-accept). Each scope_groups entry has an id (pass as group), the verbs that scope can govern (pass a subset as verbs; any other verb is rejected before a popup), and whether it needs a value. Call this before proposing a change: an id or group only matches something real if you listed it rather than guessed. Read-only, no popup. reason: one sentence on why you're listing the policy now (logged, self-reported; this discloses the full rule set).
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: no popup, the reason is logged and self-reported, and the call discloses the full rule set. That is meaningful additional transparency, though not exhaustive about permissions or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loads the core purpose and return shape before detailing fields. It is longer than strictly necessary, but the field-level detail is useful because there is no output schema. Most sentences earn their place by helping the agent use the returned data correctly.
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, so the description properly explains the return object {rules, scope_groups} and describes the important fields, including how ids and groups map to privacyfence_propose_policy_change. The single parameter is explained, and the read-only, no-popup behavior is covered with annotations. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there is one required parameter, so the description must carry the semantic burden. It explains that reason should be one sentence on why the policy is being listed now, that it is logged and self-reported, and that this call discloses the full rule set. This substantially compensates for the missing schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: list every configured auto-accept rule plus the scope catalogue accepted by privacyfence_propose_policy_change. It distinguishes itself from the sibling mutation tool by naming that tool directly. An agent can tell what this tool does 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?
It explicitly says to call this before proposing a change and explains why: an id or group only matches something real if it was listed rather than guessed. This gives a clear when-to-use condition tied to the sibling tool privacyfence_propose_policy_change. No alternative listing tool is relevant, so the guidance is complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacyfence_propose_policy_changeAIdempotent
Propose adding, updating or removing an auto-accept rule (a scope plus allowed verbs). ALWAYS blocks on a human-approved dialog. If declined, or in an unattended session, it errors -- never assume success. Call privacyfence_list_policy first: group, verbs and rule_id must be listed, not guessed; a verb not in that group's scope_groups entry is rejected before any popup.
operation='add'/'update' need group (a scope_groups id, e.g. 'drive.folder'), value (the resource's id -- folder id, channel ID, project key -- not its name or title, except label names and file types; a non-id is refused; omit unless needs_value or value_optional) and verbs (non-empty subset of the group's verbs). Verbs: read, download, search, add, update, restructure, move, send, delete (older names map). 'update' also takes rule_id (replaces that rule). 'remove' needs only rule_id.
Returns {confirmed, changed, description, rule_ids}; changed is false if nothing differed.
reason: one sentence on why you're proposing this (logged).
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | ||
| value | No | ||
| verbs | No | ||
| reason | Yes | ||
| rule_id | No | ||
| operation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the blocking human-approval dialog, that declines and unattended sessions produce errors, that success must never be assumed, that invalid verbs are rejected before any popup, and the exact return shape including changed=false. This is exactly the operational context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the two most important facts (what it does, and that it always blocks and can fail), then per-operation parameter rules. It is dense with parentheticals and semicolons, which slows scanning slightly, but essentially every sentence carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, no-output-schema mutation-proposal tool with 0% schema coverage, the description covers prerequisites, per-operation requirements, failure modes, verb vocabulary, and return fields. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does: group is defined as a scope_groups id with an example, value must be a resource id rather than a name with documented exceptions and an omit rule, verbs is a non-empty subset with an enumerated list, and operation/rule_id/reason are all constrained.
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 ('Propose adding, updating or removing an auto-accept rule') and immediately defines the object of that verb ('a scope plus allowed verbs'), so an agent knows exactly what is being created. It is clearly distinguishable from privacyfence_list_policy and privacyfence_check_policy, which it references by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite ('Call privacyfence_list_policy first: group, verbs and rule_id must be listed, not guessed'), tells which fields are required per operation, and states the failure conditions (declined, unattended). No inference is left to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacyfence_propose_scoped_tokenA
Propose a scoped token (a named, expiring bearer credential limited to some rules and tools, for a routine or scheduled job) for the person to review in PrivacyFence Settings. Returns at once with review_url: give it to the person. Nothing is created until they review it, type its name and confirm; they may narrow it. You never receive the token, nor whether it was created. Set from_session=true to build its rules and tools from the calls approved in this session, or pass rules (each {kind:'new', group, value, verbs} with group and verbs from privacyfence_list_policy's scope_groups and value a comma-separated id list, or {kind:'copy', rule_id}) and tools. days defaults to 90. Ask for allow_personal_data or allow_personal_data_reads only if the job needs them. Refused in an unattended session. reason: one sentence on what the token is for (logged and shown to the person).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| label | Yes | ||
| rules | No | ||
| tools | No | ||
| reason | Yes | ||
| from_session | No | ||
| allow_personal_data | No | ||
| allow_personal_data_reads | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations: it states that nothing is created until the person reviews, types the name, and confirms; that the call returns immediately with a review_url; that the agent never sees the token or whether it was created; and that the session must be attended. These are exactly the non-obvious facts an agent needs and are consistent with readOnlyHint=false / destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the review flow are front-loaded before the parameter mechanics, and nearly every clause carries load-bearing information. The dense parenthetical describing rule object syntax is the one spot that reads as a run-on, but that detail is unavoidable given zero schema descriptions.
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 and eight undocumented parameters, the description still covers what the call returns (review_url), the out-of-band approval gate, the unattended-session refusal, and the shape of nearly every argument. Nothing an agent needs to invoke this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries all eight parameters, and it does: from_session semantics, the rules object shape ({kind:'new', group, value, verbs} or {kind:'copy', rule_id}) with the source of group/verbs and the format of value, tools, the 90-day default, the two personal-data flags with a caution, and reason's expected content. Only label relies on the implicit 'type its name' reference, which is minor against this level of detail.
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 and resource ('Propose a scoped token') and immediately defines what that object is — a named, expiring bearer credential limited to rules and tools for a routine or scheduled job. This is readily distinguishable from policy-change or check/list siblings because the object and its lifecycle are spelled out.
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 spells out the two construction modes (from_session=true vs explicit rules/tools), the default for days, the conditional advice to request allow_personal_data only if the job needs it, and an explicit when-not ('Refused in an unattended session'). It also routes the agent to privacyfence_list_policy for scope_groups and verbs, so the dependency is named rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacyfence_statusARead-onlyIdempotent
Check whether THIS PrivacyFence install is set up: call it before the first PrivacyFence-governed action in a conversation, or when asked why a connector (gmail_*, ...) is missing. An empty or partial tool list means connectors aren't authenticated yet, NOT that PrivacyFence is irrelevant -- this is the one tool guaranteed to exist even when every other tool is missing. Returns {mode ('local'/'org'), setup_complete (any connector authenticated), connectors [{name, enabled, authenticated, blocked_by: null, 'no_org_config', 'not_authenticated' or a reason}], next_step, message, sign_in_url (always null)}. If setup isn't complete, relay message to the human as-is. next_step 'open_privacyfence_companion' (local): the human opens PrivacyFence's companion app (menu-bar/tray icon; Linux: applications menu) and chooses Open Settings; you can't, and have no link. 'contact_your_administrator' (org): sign-in is via the org's IdP. Only side effect: an audit entry. reason: one sentence on why you're checking now (logged).
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior well beyond the annotations: the full return shape, how to relay message to the human, what next_step values mean (open_privacyfence_companion vs contact_your_administrator), the org-IdP sign-in path, and the audit-entry side effect. The audit entry is the one nuance worth noting against readOnlyHint=true, but it is honestly disclosed rather than hidden, so this reads as transparency rather than 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?
Long and dense, but front-loaded with the action triggers before the return-shape and next_step details. Nearly every sentence informs a decision the agent must make (when to call, how to relay, what next_step means), though the density could be tightened slightly.
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 and no annotation coverage of returns, the description carries the full burden and delivers: mode, setup_complete, connectors with blocked_by reasons, next_step, message, and sign_in_url. Nothing an agent needs to interpret the result or act on it appears to be 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?
The single parameter has 0% schema description coverage, so the description must carry it, and it does: reason is defined as 'one sentence on why you're checking now (logged)', which conveys both format and that it is persisted. It adds real meaning beyond the bare {type: string} schema, though it stops short of any length/format constraint.
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: verifying whether this PrivacyFence install is set up. It also carves out a scope no sibling covers ('this is the one tool guaranteed to exist even when every other tool is missing'), so it is unmistakable against privacyfence_check_policy and the other privacyfence_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggers: call before the first PrivacyFence-governed action in a conversation, or when a connector like gmail_* appears missing. It further explains what an empty/partial tool list does and does not imply, which is exactly the ambiguity an agent would face at call time.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
salesforce_create_recordA
Create one new Salesforce record. fields maps field API names to values, such as {"Name": "Acme", "Industry": "Retail"}; the names are checked against the object's own fields before you are asked. Returns {object_type, id}, the new record's 18-character id. Use salesforce_create_records to create several records of one object type in one approval, and salesforce_get_record to see an existing record's field names. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | A JSON object mapping field API names to values: text, numbers, true/false, dates as YYYY-MM-DD and date-times as ISO 8601. Lookup fields take a record id. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| object_type | Yes | API name of the Salesforce object, e.g. 'Account', 'Contact', 'Opportunity' or a custom object like 'Invoice__c'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the description's job is to add context, which it does: field names are validated against the object's schema before approval, user approval is required, and the return shape is {object_type, id}. It does not discuss duplicate-creation risk or error behavior, so it falls just short of the top mark.
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 with zero filler: create action and scope first, then field mechanics, then return value, then routing alternatives. Every sentence earns its place and the most important constraint (one record, needs approval) lands early.
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 supplies the return payload ({object_type, id}) and the 18-character id detail, plus the approval and validation steps. For a three-parameter mutation tool, an agent has everything it needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented, and the description's example JSON for 'fields' largely repeats the schema's own explanation. Baseline 3 applies since the schema, not the description, carries 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 and resource and immediately scopes it to exactly one record, distinguishing it from the plural sibling salesforce_create_records. An agent can pick it apart from salesforce_update_record and the bulk-create tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative for bulk creation (salesforce_create_records) and the tool to consult for field names (salesforce_get_record), giving both a when-to-use-this and a when-to-use-something-else. 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.
salesforce_create_recordsA
Create 1 to 200 new records of one Salesforce object type in one approval, all or none: if Salesforce refuses one record, none is created and the error names each refused record by its position. Returns {object_type, created, ids}, the new ids in input order. Use salesforce_create_record for a single record. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| records | Yes | A JSON array of 1 to 200 objects, each mapping field API names to one new record's values, as fields on salesforce_create_record. | |
| object_type | Yes | API name of the Salesforce object, e.g. 'Account', 'Contact', 'Opportunity' or a custom object like 'Invoice__c'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the write/safety profile, while the description adds substantial behavior: atomic all-or-none semantics, error behavior ('names each refused record by its position'), and the return shape. This is far richer than what the structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core create action, atomicity, return shape, sibling routing, and approval requirement each earn their place in compact sentences 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?
Even without an output schema, the description explains the return value, atomicity, failure reporting, sibling routing, and the approval requirement. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents object_type, records, and reason. The description restates the 1-200 batch bound and input-order semantics but adds no syntax beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with precise scope ('Create 1 to 200 new records of one Salesforce object type in one approval') and explicitly differentiates from the sibling salesforce_create_record. An agent can tell exactly what this does and how it differs from the single-record variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to salesforce_create_record 'for a single record,' giving a clear selection condition, and notes 'Requires user approval.' It does not state when-not to use this tool beyond the single-record alternative, so it stops short of full when/when-not/exclusions guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
salesforce_export_reportARead-onlyIdempotent
Write every row of a Salesforce report to a CSV or JSON file on the user's computer, in one approval. Columns are the report's column API names. columns and filters narrow this export as on salesforce_run_report: for example [{"column": "LAST_UPDATE", "operator": "greaterOrEqual", "value": "2026-10-04"}] exports only rows changed since that date. A report of more than 2,000 rows, or a grouped report, needs page_by; the export then reads it page by page internally. Returns {rows, columns, sha256, path, name, size_bytes, delivery}, never the rows; read the file at path. On an organization-managed install nothing is saved to destination_dir: the result carries a one-time download_url instead. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| columns | No | Comma-separated report column API names to return, a subset of the report's own reportMetadata.detailColumns, e.g. 'OPPORTUNITY.NAME,AMOUNT'. Leave empty for all of the report's columns. Columns outside the saved report are rejected. | |
| filters | No | JSON array of extra row filters for this run only, ANDed onto the report's saved filters, e.g. [{"column": "Opportunity.Opp_Id__c", "operator": "equals", "value": ["006A...", "006B..."]}]. value is a string or a list of strings (a list matches any of them; it is split across several filters automatically). operator is one of equals, notEqual, lessThan, greaterThan, lessOrEqual, greaterOrEqual, contains, notContain, startsWith, includes, excludes, within. Leave empty for none. | |
| page_by | No | Report column API name whose values are unique per row (best an auto-number column the report includes), e.g. 'Opportunity.Opp_Number__c'. Reads every row of the report, page by page in order of this column; a grouped report is read as one flat table. Leave empty for one run as saved. | |
| file_name | No | File name ending in .csv or .json; the ending picks the format. Empty means <report_id>.csv. | |
| report_id | Yes | Salesforce id of the report (starts with '00O'), from salesforce_list_reports (its id field). | |
| cell_format | No | value (default) writes Salesforce's raw value: dates as YYYY-MM-DD, amounts as numbers, record ids for name columns. label writes the text Salesforce shows, such as $1,200.00. both writes each column twice, raw value as the column name and the shown text as <column>.label, plus <column>.currency for money columns. | value |
| destination_dir | Yes | Folder on the user's computer to write the file to, absolute or starting with ~/. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read profile for Salesforce data, and the description adds substantial behavior beyond them: one approval, the 2,000-row/grouped-report boundary that forces page_by, the exact return shape ({rows, columns, sha256, path, name, size_bytes, delivery}), and the org-managed-install divergence where nothing lands in destination_dir and a one-time download_url is returned instead. That is precisely the kind of non-obvious context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, destination, and output format, and every subsequent sentence carries load (limits, return shape, install caveat, approval). It is a single dense paragraph with long parenthetical examples, which slightly hurts scannability but not information density.
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 8-parameter tool with no output schema, the description is nearly self-sufficient: it explains the return shape, the page_by precondition, the org-managed download_url fallback, and the approval requirement. It stops short of covering file-collision behavior (overwrite vs error if the target file exists) or whether destination_dir must already exist, which are relevant for a local write.
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 8 parameters in detail (including a filters example and page_by semantics), setting the baseline at 3. The description adds marginal value: the notion that columns/filters 'narrow this export as on salesforce_run_report' and the page_by requirement for grouped reports, but most of its parameter text restates what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+destination up front: 'Write every row of a Salesforce report to a CSV or JSON file on the user's computer.' It also differentiates from the closest sibling by tying column/filter semantics to salesforce_run_report and pointing at salesforce_list_reports for report_id, so the agent can distinguish it without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions and alternatives: use page_by for reports over 2,000 rows or grouped reports, and read the file at path because rows are never returned inline. However, it never explicitly states when *not* to use this tool (e.g. 'use salesforce_run_report instead if you only need rows in-context'), so the run_report-vs-export choice is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
salesforce_get_recordARead-onlyIdempotent
Fetch a Salesforce record by object type and id. Returns {object_type, id, fields}, where fields maps every field name the object returns to its value. Use salesforce_search instead when you only have a name and need the id. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| record_id | Yes | The record's 15- or 18-character Salesforce id, e.g. '0015g00000XyZabAAB', from salesforce_search (its id field). | |
| object_type | Yes | API name of the Salesforce object, e.g. 'Account', 'Contact', 'Opportunity' or a custom object like 'Invoice__c'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the genuinely new fact that user approval is required, plus the exact return shape. It stops short of noting rate limits or failure modes, but what it adds is real and not restated annotation material.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the alternate-tool routing, then the approval gate. No sentence is filler and nothing important is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and does so explicitly ({object_type, id, fields}). Combined with the approval requirement and full schema coverage, an agent has what it needs; only error handling is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so object_type, record_id, and reason are already fully documented, including the id format and that it comes from salesforce_search. The description merely restates that a record is fetched 'by object type and id' and adds no format or syntax detail beyond the schema. 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 ('Fetch') and resource ('a Salesforce record by object type and id'), which cleanly separates it from salesforce_search, salesforce_run_report, and salesforce_list_reports. An agent can identify the right tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative and the condition that selects it: use salesforce_search when you only have a name and need the id. It also flags the 'Requires user approval' prerequisite, so the agent knows the invocation has a gate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
salesforce_list_reportsARead-onlyIdempotent
List Salesforce reports accessible to the user. Returns a list of {id, name, report_type, folder_name, description}, ordered by name, at most 200 (no paging). report_type is the report's developer name. Pass an id as report_id to salesforce_run_report. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the read-only/idempotent safety profile, but the description goes well beyond them by disclosing the exact return fields, the ordering (by name), a hard cap of 200 results, and that there is no paging — critical behavioral constraints an agent cannot get from 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?
Tight, front-loaded sentences: purpose first, then return shape, ordering, cap, and the downstream tool, all without 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?
There is no output schema, so the description carries the return-value burden and does so fully — fields, ordering, result cap, and paging behavior are all specified, which is everything an agent needs to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the only parameter is a generic 'reason' string, so the description has no parameter to add meaning to. Per the calibration baseline, no description-side param detail is needed when the schema is fully documented.
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: 'List Salesforce reports accessible to the user.' It also implicitly distinguishes itself from the sibling salesforce_run_report by stating that ids from this list are fed to it.
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 context for the tool's place in a workflow ('Pass an id as report_id to salesforce_run_report') and notes 'Auto-approved', telling the agent it can call without approval friction. It does not state when not to use it versus salesforce_search, but the routing intent is unmistakable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
salesforce_run_reportARead-onlyIdempotent
Run a Salesforce report by id and return the results. Returns Salesforce's Analytics API report result as-is: reportMetadata, reportExtendedMetadata, groupingsDown/groupingsAcross and a factMap holding each group's rows and aggregates. By default it runs the report as saved; columns, filters and summary_only narrow this one run without changing the saved report. Salesforce returns at most 2,000 detail rows per run: allData false means rows were cut off. To read every row, pass page_by (a column with a unique value per row) and call again with cursor=next_cursor until next_cursor is null; each page is one report run and carries page {number, first_row, last_row, more}. Get report_id from salesforce_list_reports. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Opaque cursor from a previous paged result's next_cursor. Pass it with the same report_id, columns, filters and page_by. Leave empty for the first page. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| columns | No | Comma-separated report column API names to return, a subset of the report's own reportMetadata.detailColumns, e.g. 'OPPORTUNITY.NAME,AMOUNT'. Leave empty for all of the report's columns. Columns outside the saved report are rejected. | |
| filters | No | JSON array of extra row filters for this run only, ANDed onto the report's saved filters, e.g. [{"column": "Opportunity.Opp_Id__c", "operator": "equals", "value": ["006A...", "006B..."]}]. value is a string or a list of strings (a list matches any of them; it is split across several filters automatically). operator is one of equals, notEqual, lessThan, greaterThan, lessOrEqual, greaterOrEqual, contains, notContain, startsWith, includes, excludes, within. Leave empty for none. | |
| page_by | No | Report column API name whose values are unique per row (best an auto-number column the report includes), e.g. 'Opportunity.Opp_Number__c'. Reads every row of the report, page by page in order of this column; a grouped report is read as one flat table. Leave empty for one run as saved. | |
| report_id | Yes | Salesforce id of the report (starts with '00O'), from salesforce_list_reports (its id field). | |
| summary_only | No | True to return only groupings and aggregates (totals), with no detail rows: the smallest response. Default false returns detail rows too. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover safety (readOnly, idempotent, non-destructive); the description adds substantial behavior beyond them: the 2,000-row cap and allData=false cutoff signal, the paging protocol and per-page metadata (page {number, first_row, last_row, more}), and the fact that user approval is required. This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and result shape, then limits, then the paging escape hatch, then the id source and approval note. Every sentence carries concrete, non-redundant information; length is justified by 7 params, no output schema, and a non-obvious pagination model.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers return structure (reportMetadata, groupings, factMap), truncation behavior, pagination termination condition, the immutability of the saved report, id provenance, and the approval requirement. Nothing an agent needs to invoke and loop this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds cross-parameter semantics the schema does not: cursor must be passed with the same report_id/columns/filters/page_by, and page_by must be a unique-per-row column. The 2,000-row rationale for paging also explains why page_by exists.
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 ('Run a Salesforce report by id and return the results') and immediately differentiates itself from salesforce_list_reports by telling the agent where the id comes from. The scope is also distinguished from salesforce_export_report implicitly via the Analytics API result shape described.
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 routing ('Get report_id from salesforce_list_reports') and clear conditional usage: default runs as saved, columns/filters/summary_only narrow one run without mutating it, page_by + cursor loop is required to read past 2,000 rows. It never names the closest sibling, salesforce_export_report, as an alternative, so an agent may not know when to prefer export over a run.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
salesforce_searchARead-onlyIdempotent
Search Salesforce by name or id across one or more object types — the same mechanism as the search bar at the top of the Salesforce UI. Returns lightweight matches as a list of {object_type, id, fields}: fields is {Id, Name} when object_types is set (objects with no Name field, such as Case, fail that query) and only {Id} without it. At most max_results (default 20, capped at 200), per object type when object_types is set; call salesforce_get_record for full field details on a match. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| account_id | No | Scope results to this Account's related records (e.g. its Opportunities). Requires object_types to be set, since not every object has an AccountId field. | |
| max_results | No | Maximum matches (per object type when object_types is set). Default 20, capped at 200. | |
| search_term | Yes | Name, partial name, or id to search for, e.g. 'Acme'. Must not be empty. | |
| object_types | No | Comma-separated Salesforce object API names to restrict the search to, e.g. 'Opportunity,Contact'. Leave empty to search Salesforce's default globally-searchable objects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description adds genuinely new context: a user-approval requirement, the failure mode where objects lacking a Name field (e.g. Case) break the {Id, Name} query, and the exact result envelope {object_type, id, fields}. This is well beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the mechanism is stated first, then result shape, then limits, then the sibling pointer and approval note. Each clause carries information, though it is a single long paragraph that could be broken up 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?
With no output schema, the description compensates by specifying the return structure and the field-set variability. Combined with the approval note and failure mode, an agent has everything needed to call and interpret this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, including the max_results cap, account_id's dependency on object_types, and the empty-object_types default. The description largely restates these, adding the per-object-type nuance but little else beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (search Salesforce), the search surface (name or id across object types), and grounds it in a familiar analogue (the UI search bar). It also names the sibling salesforce_get_record as the follow-up for full details, so it is distinguishable 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?
Explicitly routes to salesforce_get_record when full field details are needed, and explains the object_types empty-vs-set distinction and the account_id scoping precondition. It stops short of saying when not to use it (e.g. when a precise record id is already known), so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
salesforce_update_recordA
Change fields of one existing Salesforce record, by its id. Only the fields you list change; a field set to null is cleared. The approval card shows each field's current and new value; fields that already hold the given value are left as they are. Returns {object_type, id, fields}. Use salesforce_update_records to change several records in one approval, and salesforce_get_record to read the record first. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | A JSON object mapping field API names to values: text, numbers, true/false, dates as YYYY-MM-DD and date-times as ISO 8601. Lookup fields take a record id. null clears a field. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| record_id | Yes | The record's 15- or 18-character Salesforce id, from salesforce_search or salesforce_get_record (its id field). | |
| object_type | Yes | API name of the Salesforce object, e.g. 'Account', 'Contact', 'Opportunity' or a custom object like 'Invoice__c'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses meaningful behavior: only listed fields change, null clears a field, the approval card shows current vs new values, unchanged values are left as-is, and user approval is required. This is exactly the extra context the annotations don't carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core action and each sentence carries content (semantics, approval UX, return shape, alternatives). Slightly dense but no filler, so just short of perfect.
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?
Although there is no output schema, the description states the return shape {object_type, id, fields}, covers mutation semantics, approval requirement, and sibling routing. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters and the field-value format. The description restates the null-clears behavior but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (change fields) and a precisely scoped resource (one existing Salesforce record, by id), and it distinguishes itself from salesforce_update_records (several records) and salesforce_get_record (read first) without needing 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?
It explicitly routes the agent: use salesforce_update_records for multiple records in one approval, and salesforce_get_record to read the record first, plus states the approval prerequisite. When-to-use is concrete and alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
salesforce_update_recordsA
Change 1 to 200 existing records of one Salesforce object type in one approval, all or none. Each record is found by key_field: Id (default) or a field marked External ID. Only the fields listed change, records that already have those values are left alone, and a key that matches no record or several records refuses the whole call. Returns {object_type, updated, ids}. Use salesforce_update_record for one record by id and salesforce_search to find ids. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| records | Yes | A JSON array of 1 to 200 objects, each holding key_field's value and the fields to change, such as [{"Id": "001...", "Phone": "+1 555 0100"}]. null clears a field. | |
| key_field | No | Field that identifies each record: Id (the default), or the API name of a field marked External ID on this object, such as 'Customer_Number__c'. It is never changed itself. | Id |
| object_type | Yes | API name of the Salesforce object, e.g. 'Account', 'Contact', 'Opportunity' or a custom object like 'Invoice__c'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing atomicity ('all or none', a key matching none or several refuses the whole call), no-op handling, partial-field update semantics, match resolution via key_field, and the return payload shape. These are the exact behaviors annotations (readOnly/idempotent/destructive) 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-loads the core behavior (batch update, all-or-none) in the first sentence, then conditions, then return shape, then sibling routing. Every clause carries information and nothing is repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a batch mutation tool with no output schema, the description supplies the batch limit, atomicity, error/abort conditions, approval requirement, and the return keys ({object_type, updated, ids}). An agent has everything needed to call 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 already 100%, so the baseline is 3, but the description adds meaning the schema does not: key_field defaults to Id or an External ID-marked field and 'is never changed itself', plus that only listed fields change and null clears a field. That is genuine semantic enrichment beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with exact scope: change 1 to 200 existing records of one Salesforce object type. It differentiates itself from siblings by contrast ('Use salesforce_update_record for one record by id'), so an agent can pick the bulk vs. single variant without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to alternatives: salesforce_update_record for a single record by id and salesforce_search to find ids. It also names the prerequisite ('Requires user approval') and the batch-size window, giving the agent clear conditions for when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_create_group_chatA
Create (or reopen the existing) group-DM conversation with the given participants and return its channel id, ready for slack_send_message. Participants must already have a Slack user id (from slack_list_dms, slack_list_group_chats, or a message's user_id) -- this does not resolve email addresses or handles. Returns {id, name, member_ids, member_names}; member ids and names may be redacted by the user's privacy settings. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| participants | Yes | Comma-separated Slack user IDs to include (at least 2, e.g. 'U123,U456') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (not read-only, not idempotent, not destructive). The description adds real context: the create-or-reopen semantics, the exact return shape, possible redaction of member ids/names by privacy settings, and that user approval is required. The reopen behavior sits in mild tension with idempotentHint=false, but is not a direct 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 sentences, front-loaded with the action and outcome, then preconditions, then return/privacy caveats. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return fields and their redaction caveat, the input precondition, and the approval requirement. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the 'at least 2' constraint and the rejection of email/handle inputs, which the schema does not state. That is meaningful added semantics over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create/reopen), a specific resource (group-DM conversation), its scope (given participants), and its outcome (returns channel id ready for slack_send_message). An agent can distinguish it from slack_list_dms/slack_list_group_chats without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the precondition that participants must already be Slack user IDs and names the three sources for obtaining them, plus the negative case (does not resolve emails or handles). It also signals the downstream step (slack_send_message). No explicit 'when not to use' beyond that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_get_channel_historyARead-onlyIdempotent
Fetch recent messages in a Slack channel. Returns {messages: [...], has_more: bool, next_cursor: str}, plus a note when has_more is true -- more messages exist than were returned (a Slack-imposed cap can make a page smaller than limit; see docs/slack-setup.md) -- call again with cursor=next_cursor to read the next page instead of assuming this is everything. Each message is {ts, channel_id, channel_name, user_id, user_name, text, thread_ts, reply_count, read_state}, newest first (read_state is 'unread', 'read' or 'unknown', from your own Slack read marker), one page of up to limit messages (default 50, capped at 1000); text and names may be redacted by the user's privacy settings. Use slack_get_thread_replies for a thread's replies, or slack_search_messages to find messages by text or person. Requires user approval. Pass minutes to read only the last N minutes of this conversation; it reads the conversation itself, so nothing is lost to search-index delay.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum messages to fetch, newest first. Default 50, capped at 1000. | |
| cursor | No | Opaque cursor from a previous result's next_cursor; empty starts at the newest messages. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| minutes | No | Only fetch messages from the last N minutes (1-10080, up to 7 days). 0 (the default) means no cutoff. | |
| channel_id | Yes | Id of the channel or conversation, from the id field of slack_list_channels, slack_list_dms or slack_list_group_chats, or from slack_resolve_permalink. A name is not accepted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the return shape, pagination behavior, Slack-imposed page-size caps, next_cursor usage, message fields, read-state provenance, privacy redaction, and that user approval is required. These are meaningful behavioral details not covered by readOnlyHint, idempotentHint, or destructiveHint. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and return behavior, and every major clause conveys operational information. However, it is a long single block with some repetition of schema details, so it is slightly less concise than ideal. It remains appropriately dense for a paginated fetch 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 read-only paginated fetch tool, the description covers the return structure, pagination, redaction, approval needs, and alternatives. Annotations already establish the safety profile and the schema fully documents parameters, so no critical agent-facing context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds useful semantics for pagination and time filtering. It explains that has_more/next_cursor should be used for the next page and that minutes reads the conversation itself without search-index delay. It still repeats some schema-level details such as default 50 and cap 1000, so it is strong but not maximally additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: "Fetch recent messages in a Slack channel." It also distinguishes this tool from siblings by directing thread replies to slack_get_thread_replies and text/person searches to slack_search_messages. An agent can identify the operation and its scope immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names alternatives and when to use them: slack_get_thread_replies for a thread's replies and slack_search_messages to find messages by text or person. It also explains pagination behavior, the minutes parameter for recent-only reads, and the approval requirement. This gives clear when-to-use and when-to-use-alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_get_read_stateARead-onlyIdempotent
Get your own Slack read state for a few specific messages you already have, without reading them again. Use it sparingly, only for messages whose read state matters (for example the ones you are about to report as new), not for every search result: each distinct conversation costs one Slack request and each distinct thread one rate-limited conversations.replies request (about a minute each on an app distributed outside the Slack Marketplace). Returns a list of {channel_id, ts, thread_ts, read_state}, one per distinct requested message in request order, where read_state is 'unread', 'read' or 'unknown' (a thread you do not follow, or no marker). Prefer it over slack_search_messages' read_state=true for more than a few conversations. Returns no message text. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| messages | Yes | Comma-separated messages to check, 1 to 20, each channel_id:ts for a top-level message or channel_id:ts:thread_ts for a reply in a thread, from a message's channel_id, ts and thread_ts fields in slack_search_messages, slack_get_channel_history or slack_get_thread_replies. At most 3 distinct threads. A repeated entry is checked once. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, but the description adds substantial operational context: request costs per distinct conversation, rate-limited thread requests, return shape, read_state values, omission of message text, and auto-approval. This is rich behavioral disclosure beyond structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and usage warning, then adds cost, return format, and fallback guidance. It is dense but well structured, and each sentence contributes useful selection or invocation context.
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?
Although there is no output schema, the description fully describes the return list and read_state values, and notes that no message text is returned. Combined with rich parameter schema coverage and safety annotations, an agent has enough information to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the schema already documents both parameters. The description adds operational meaning by tying message limits to Slack request costs and thread rate limits, though most of the input-format details duplicate the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: get your own Slack read state for specific messages. It also distinguishes the tool from nearby alternatives by saying it avoids reading messages again and should be preferred over slack_search_messages' read_state=true for many conversations.
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 when-to-use guidance: use sparingly, only for messages whose read state matters, such as ones about to be reported as new. It also gives an explicit alternative and threshold: prefer slack_search_messages' read_state=true for only a few conversations, use this tool for more than a few.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_get_thread_repliesARead-onlyIdempotent
Fetch all replies in a Slack thread. Returns {messages: [...], has_more: bool, next_cursor: str}, plus a note when has_more is true -- more replies exist than were returned; call again with cursor=next_cursor to read the next page (see slack_get_channel_history's own note on why the page can be short). Each message is {ts, channel_id, channel_name, user_id, user_name, text, thread_ts, reply_count, read_state}, the parent message included, in Slack's order; read_state is 'unread', 'read' or 'unknown' (a reply in a thread you do not follow); text and names may be redacted by the user's privacy settings. Use slack_get_channel_history for the channel's top-level messages; get thread_ts from a permalink with slack_resolve_permalink. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Opaque cursor from a previous result's next_cursor; empty starts at the newest messages. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| thread_ts | Yes | Timestamp (ts) of the thread's parent message, e.g. '1700000000.123456', from slack_get_channel_history or slack_resolve_permalink. | |
| channel_id | Yes | Id of the channel or conversation, from the id field of slack_list_channels, slack_list_dms or slack_list_group_chats, or from slack_resolve_permalink. A name is not accepted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive safety, and the description adds substantial context beyond them: pagination semantics with cursor=next_cursor, a warning that pages can be short (cross-referenced to channel_history), read_state semantics ('unknown' = reply in an unfollowed thread), redaction by privacy settings, and 'Requires user approval.' Rich and specific.
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 action before the detailed return-value and pagination notes. It is dense—a single long paragraph—but each clause (pagination, read_state meanings, redaction, approval) earns its place given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a read tool: with no output schema, the description fully describes the return shape (messages, has_more, next_cursor, per-message fields), pagination, edge cases (redaction, unknown read_state), and the approval requirement. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining cursor pagination flow (call again with cursor=next_cursor) and the source of thread_ts, which reinforces correct invocation beyond the schema's per-field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch all replies in a Slack thread') and distinguishes itself from slack_get_channel_history, which it explicitly names for top-level messages. An agent can tell exactly what this does 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?
Explicit routing: 'Use slack_get_channel_history for the channel's top-level messages; get thread_ts from a permalink with slack_resolve_permalink.' It names both alternatives and the condition that selects them, plus the prerequisite of getting thread_ts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_list_channelsARead-onlyIdempotent
List Slack channels visible to the user (id, name, privacy, topic, purpose, member count). Optionally filter to channels a specific participant belongs to. Returns a list of {id, name, is_private, topic, purpose, member_count}, in Slack's order, up to max_results (default 100, capped at 1000); names and topics may be redacted by the user's privacy settings. Use slack_list_dms for 1:1 conversations or slack_list_group_chats for group DMs. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Maximum channels to return. Default 100, capped at 1000. | |
| participant | No | Filter to channels this participant (user id, handle, or name) belongs to; comma-separated to require all of them as members of the same channel; empty returns all | |
| exclude_archived | No | Skip archived channels. Default true; pass false to include archived channels too. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), but the description adds genuinely useful context beyond them: return ordering is Slack's order, the max_results cap, and the privacy redaction caveat on names/topics. The 'Auto-approved' note also signals no human gate, which the annotations don't 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 core action and scope, then return fields, filtering, cap, caveats, and sibling routing in a compact block. 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?
No output schema exists, so the description compensates by enumerating the returned fields, their ordering, and the redaction caveat. Combined with the read-only annotations, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters, including the comma-separated 'require all' semantics for participant and the default/cap for max_results. The description largely restates those same facts, adding little meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Slack channels), enumerates the returned fields, and explicitly differentiates from the two nearest siblings, slack_list_dms and slack_list_group_chats. An agent can route to it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternatives (slack_list_dms for 1:1, slack_list_group_chats for group DMs) so the agent knows which tool to pick for other conversation types. It does not, however, say when this tool is the wrong choice versus search or history tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_list_dmsARead-onlyIdempotent
List 1:1 direct-message conversations visible to the user (id, other participant). Optionally filter to the DM with a specific participant (user id, handle, or display name). Returns a list of {id, user_id, user_name}, up to max_results (default 100, capped at 1000); with a participant, the filter is applied while reading, so max_results bounds the matches returned, not the DMs searched. Names may be redacted by the user's privacy settings. Use slack_list_channels for channels or slack_list_group_chats for group DMs. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Maximum DMs to read and return. Default 100, capped at 1000. | |
| participant | No | Filter to the DM with this participant (user id, handle, or name); empty returns all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses the subtle read-time filtering behavior ('max_results bounds the matches returned, not the DMs searched'), that names may be redacted by privacy settings, the default and hard cap on results, and that the call is auto-approved. These are exactly the operational traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: purpose and return shape come first, then optional filtering semantics, then privacy caveat and sibling routing. Every sentence contributes information and none is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by stating the exact return shape ({id, user_id, user_name}), the filtering semantics, and the redaction caveat. Nothing needed to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it clarifies that max_results bounds returned matches rather than the search space when a participant filter is applied, and that participant accepts a user id, handle, or display name. That said, most parameter contract details are still carried by the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (1:1 direct-message conversations) plus scope ('visible to the user') and the returned fields. It also names the sibling tools it is not (slack_list_channels, slack_list_group_chats), so an agent can route without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use slack_list_channels for channels or slack_list_group_chats for group DMs,' and explains that the optional participant filter narrows to a single conversation. When-to-use and when-to-use-something-else are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_list_group_chatsARead-onlyIdempotent
List group-DM conversations visible to the user (id, name, participants). Optionally filter to group chats containing a specific participant (user id, handle, or display name). Returns a list of {id, name, member_ids, member_names}, up to max_results (default 100, capped at 1000); with a participant, the filter is applied while reading, so max_results bounds the matches returned, not the chats searched. Member ids and names may be redacted by the user's privacy settings. Use slack_list_dms for 1:1 conversations, or slack_create_group_chat to open a group DM that does not exist yet. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| max_results | No | Maximum group chats to read and return. Default 100, capped at 1000. | |
| participant | No | Filter to group chats containing this participant (user id, handle, or name); comma-separated to require all of them as members of the same group chat; empty returns all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, but the description adds genuinely useful behavior beyond them: max_results bounds the matches returned rather than the chats searched when a participant filter is applied, and member ids/names may be redacted by privacy settings. It also notes auto-approval. This is rich disclosure beyond the structured fields.
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 purpose and scope, then return shape, then edge semantics, then siblings. Dense but every clause carries information; only slightly packed, which is justified by the behavioral nuances it conveys.
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 supplies the return shape ({id, name, member_ids, member_names}), the max_results semantics, and the redaction caveat. Combined with annotations covering safety, nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it clarifies the read-time filtering semantics of max_results and reiterates that participant accepts id, handle, or display name. The comma-separated 'require all as members' nuance is a useful amplof the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List group-DM conversations visible to the user') with the returned fields in parentheses, and explicitly distinguishes itself from the sibling slack_list_dms (1:1) and slack_create_group_chat. An agent can disambiguate without opening another 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 two relevant alternatives explicitly and the conditions that select them: slack_list_dms for 1:1 conversations, slack_create_group_chat to open a group DM that doesn't exist yet. The 'optionally filter to a participant' guidance also clarifies the primary use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_refresh_channel_cacheARead-onlyIdempotent
Force an immediate refresh of PrivacyFence's local cache of Slack channel/DM/group-DM names, used to resolve which conversation a message belongs to in search results and history/thread reads without a per-message conversations.info call. Refreshes automatically about once a week; call this after a new channel is created so it resolves by name right away. On a workspace with a lot of channels, one call may not finish the whole sync -- check the result's has_more flag and, if true, call this tool again (same args) to continue from where it left off. Returns {cached_channels: , has_more: bool}, plus a note when has_more is true. Auto-approved -- refreshes name lookups only, reads no message content.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, but the description adds genuinely new context: it is auto-approved, it reads no message content, and a single call may not complete the sync so has_more must be checked and the call repeated. That is meaningful operational detail beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and packs when-to-use, pagination, and return shape into a few dense sentences with no filler. It is on the long side for a single-parameter tool, but each sentence adds a distinct fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description states the return shape ({cached_channels, has_more}) and the extra note when has_more is true, plus the approval status. An agent has everything needed to call and correctly resume this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (reason) and schema description coverage is 100%, so the schema already carries the semantics. The description adds nothing about the reason field, so the baseline 3 for a fully-documented schema 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 precise verb ('force an immediate refresh') and the exact resource ('PrivacyFence's local cache of Slack channel/DM/group-DM names'), and explains what the cache is for. This distinguishes it from the neighbouring slack_refresh_user_cache sibling, which targets a different cache.
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 ('call this after a new channel is created so it resolves by name right away'), states that refresh already happens weekly so no routine call is needed, and contrasts with the per-message conversations.info alternative. It even spells out the pagination continuation condition using has_more.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_refresh_user_cacheARead-onlyIdempotent
Force an immediate refresh of PrivacyFence's local cache of Slack workspace member names/emails, used to resolve message authors in channel history, thread replies, and search results without a per-message users.info call. Refreshes automatically about once a week; call this when a teammate who joined recently isn't resolving correctly yet. Returns {cached_users: }. Auto-approved -- refreshes name/email lookups only, reads no message content.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds real value beyond them: it discloses auto-approval, that only name/email lookups are refreshed, that no message content is read, and even the return shape. Missing details on cost/latency of a forced refresh, but the disclosure is notably richer than the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the mechanism, then the trigger, then the return and safety note. Dense and nearly waste-free, though the single long sentence chain could be split for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description supplies the return shape ({cached_users: count}) along with the trigger, automatic cadence, and scope limits. An agent has everything needed to decide when and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (reason) at 100% schema description coverage, so the schema already documents it fully. The description adds no semantics about the reason field beyond what the schema states, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (force refresh of PrivacyFence's Slack member cache) and immediately scopes it: name/email lookups only, not message content. This clearly distinguishes it from slack_refresh_channel_cache and telegram_refresh_chat_cache by naming exactly what is cached.
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 gives the trigger condition: 'call this when a teammate who joined recently isn't resolving correctly yet,' and notes the automatic weekly cadence so the agent knows this is an exception path. It does not explicitly point at slack_refresh_channel_cache as the alternative for channel-scoped staleness, so sibling routing is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_resolve_permalinkARead-onlyIdempotent
Parse a Slack message permalink (from a message's "Copy link") into the channel id, timestamp, and (if the link points at a threaded reply) thread root timestamp needed by slack_get_channel_history/slack_get_thread_replies. Reads no message content -- just decodes the link. Returns {channel_id, channel_name, ts, thread_ts}; thread_ts is empty unless the link points at a threaded reply. Pass channel_id and thread_ts (or ts when thread_ts is empty) to slack_get_thread_replies. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | A Slack message permalink, from a message's "Copy link", e.g. https://workspace.slack.com/archives/C0123/p1700000000123456 | |
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, idempotent, and non-destructive; the description goes further by clarifying it decodes only (no content fetch), states the exact return shape, explains the thread_ts-empty edge case, and notes it is auto-approved. That is meaningful context beyond the structured hints.
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 verb and resource, then routing and return shape. Dense and largely waste-free, though the middle clauses about thread_ts and downstream passing are slightly repetitive and could be tightened.
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, so the description supplies the return contract ({channel_id, channel_name, ts, thread_ts}) plus the edge-case semantics. For a two-parameter, read-only decoder, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: the url encodes a thread root when it points at a reply, and the derived values map to specific downstream parameters. The 'reason' param is only documented in the schema, which caps this below 5.
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 (parse/decode) and a specific resource (Slack message permalink), and names exactly what it produces (channel id, timestamp, thread root timestamp). It is clearly distinguished from the sibling consumers slack_get_channel_history and slack_get_thread_replies.
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 frames when to use it: input is a permalink from 'Copy link', and the outputs feed slack_get_thread_replies (channel_id + thread_ts, or ts when thread_ts is empty). It also pre-empts a wrong expectation by stating it reads no message content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_search_messagesARead-onlyIdempotent
Search Slack messages by query, participant, time window, or a combination. For messages from or with someone prefer participant over query -- 'Bob wrote me' is participant='Bob'; 'Bob in a chat with Jane' is participant='Bob,Jane' -- it reads those DM/group-chat conversations directly, more reliably than search; query then filters their text. Defaults to 90 days; widen or disable via days. For the last N minutes in every channel, DM, group DM and thread, pass minutes (query may be empty): newest first; search-index delay can miss the last minute or two. Returns a list of {ts, channel_id, channel_name, user_id, user_name, text, thread_ts, reply_count}, up to count (default 20, max 100); a participant search reads at most 10 conversations. Text and names may be redacted. Use read_state=true with care: one Slack request per conversation, easily rate-limited; prefer slack_get_read_state for a few messages. Use slack_get_channel_history for one known channel. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Only include messages from the last N days (default 90, ~3 months); set to 0 to search all history with no cutoff | |
| count | No | Maximum messages to return. Default 20, capped at 100. | |
| query | No | Text to search for, in Slack search syntax. With participant it is a case-insensitive substring filter instead. At least one of query, participant and minutes is required; empty means no text filter. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| minutes | No | Only include messages from the last N minutes (1-10080, up to 7 days); overrides days, and makes query and participant optional. 0 (the default) means no minute window | |
| read_state | No | Also return each message's read_state: 'unread' or 'read' against your own Slack read marker for its conversation, or 'unknown' for a thread reply or a conversation with no marker. Use with care: it costs one extra conversations.info request per conversation in the results (50/min) before the approval card appears, so a large sweep is easily rate-limited. For a handful of messages use slack_get_read_state instead. Default false. | |
| member_only | No | Only return messages from conversations you are a member of right now (channels, DMs and group DMs); PrivacyFence asks Slack for your conversations on each call. Use it for a sweep of everything since your last run; a 'conversations I'm a member of' rule can then auto-accept the search. It reads at most 300 search matches, so in a busy window it can miss older messages: if it returns exactly count results, search again with a smaller minutes. | |
| participant | No | Filter to the DM/group-chat conversation(s) with this participant (user id, handle, or name); comma-separated to match a group chat containing all of them | |
| exclude_channels | No | Comma-separated channel ids whose messages are dropped from the results. Pass the ids a 'conversations I'm a member of' rule excludes; a result from one of them stops that rule from covering the search. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations covering safety, the description adds substantive behavior: search-index delay can miss the last minute or two, read_state triggers one conversations.info request per conversation (50/min) before the approval card, participant caps at 10 conversations, member_only reads at most 300 matches, and it requires user approval. None of this is inferable from 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?
Front-loaded with purpose and the highest-value guidance (participant vs query) first, then caveats. It is dense and run-on with heavy semicolon chaining, but nearly 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 9-param read tool with no output schema, the description explains the return shape, the count cap, redaction caveat, and every rate-limit/edge case an agent needs to call 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 schema already documents parameters. The description adds genuine value on the participant/query interplay and the minutes-overrides-days precedence, though much of it restates the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Search') and resource ('Slack messages') with the four selection axes (query, participant, time window, combination). An agent can immediately tell this apart from slack_get_channel_history and slack_get_read_state.
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 between alternatives: prefer participant over query for 'messages from/with someone', use slack_get_read_state for a few messages, slack_get_channel_history for one known channel. It also explains when to widen/disable days and when to use minutes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_send_messageA
Send a message to a Slack channel or DM. Requires user approval. Set mark_unread=true to leave the message unread after sending (useful when sending a DM to yourself as a note; requires the im:write scope on the user token for DMs). Returns {channel_id, ts, text} of the sent message; channel_id is the resolved conversation id, which for a DM is the D... id even if you passed a user id. Use slack_create_group_chat first to message a new group of people.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Message text to send, in Slack mrkdwn. Must not be empty. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| thread_ts | No | Timestamp (ts) of the parent message to reply to in its thread, from slack_get_channel_history or slack_resolve_permalink. Empty posts a new top-level message. | |
| channel_id | Yes | Id of the channel, DM or group DM to post in, from the id field of slack_list_channels, slack_list_dms or slack_list_group_chats. A user id also works for a DM. A name is not accepted. | |
| mark_unread | No | Leave the sent message unread for you. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic non-readonly/non-idempotent/non-destructive profile; the description adds real behavioral context beyond that: the required user approval step, the im:write scope needed for DMs, and the side effect that mark_unread leaves the message unread. It also discloses the resolved return identity behavior for DMs.
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 the verb and approval requirement, then layers scope and return-value detail with no filler sentences. The parenthetical caveats make it slightly dense, but every clause carries distinct information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape ({channel_id, ts, text}) and explains the DM id resolution quirk, covers the approval and scope prerequisites, and points to the correct sibling for the one adjacent use case. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning the schema lacks: mark_unread's scope requirement and use case, and the fact that channel_id is resolved to a D... conversation id even when a user id is passed. The text/thread_ts/reason params are left to the schema, which already documents them fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Send a message to a Slack channel or DM') and immediately scopes it against a sibling by naming slack_create_group_chat for new group messaging. An agent can distinguish this from slack_create_group_chat, slack_search_messages, and the list tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: an approval requirement, the specific case for mark_unread (self-DM as a note), and a routing rule to use slack_create_group_chat first for new groups. It does not explicitly state when-not to use this tool (e.g. replying in an existing thread is only implied via the schema), so it stops short of a full when/when-not/exclusions treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_complete_taskA
Mark a task as completed. Returns the updated task in the same shape tasks_get_task returns, with status 'completed' and the completion time in completed. Use tasks_uncomplete_task to undo it. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| task_id | Yes | Id of the task, from tasks_list_tasks (its id field). | |
| task_list_id | Yes | Id of the task list, from tasks_list_task_lists (its id field, not its title). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present, the description still adds meaningful context: the returned payload shape (same as tasks_get_task), the resulting status value, the completed timestamp field, and the user-approval requirement. It does not address re-calling on an already-completed task, which matters given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, action stated first, then return contract, then the alternative. Every sentence carries distinct information 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?
No output schema exists, and the description compensates by describing the return shape and status/completed fields. Combined with 100% schema coverage and annotations, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so task_id, task_list_id and reason are already fully documented in the schema; the description adds no parameter-level meaning. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Mark a task as completed') and immediately names the inverse sibling, tasks_uncomplete_task, so an agent can route between 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?
Gives the undo path ('Use tasks_uncomplete_task to undo it') and a prerequisite ('Requires user approval'), which is real usage context. It stops short of stating when-not to use it, e.g. what happens with an already-completed or non-existent task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_create_taskA
Create a new task. Returns the created task, with its new id, in the same shape tasks_get_task returns. Get task_list_id from tasks_list_task_lists. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | Due date as an RFC 3339 timestamp, e.g. '2026-10-15T00:00:00Z'; Google Tasks keeps only the date. Empty means no due date. | |
| notes | No | Free-text notes for the task (its description). Empty means no notes. | |
| title | Yes | Title of the new task, as shown in Google Tasks. Must not be empty. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| task_list_id | Yes | Id of the task list, from tasks_list_task_lists (its id field, not its title). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the mutation profile is covered. The description adds genuinely new behavioral context beyond that: the approval requirement and the exact return contract (new id, same shape as tasks_get_task).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and return contract, then prerequisites. Every sentence carries information an agent needs; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates well by describing the return value's shape via tasks_get_task, and it covers the approval gate. For a mutation tool with full schema coverage and annotations, only edge-case behavior (e.g. what happens if title is empty) is left 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 five parameters, including the sourcing of task_list_id and the RFC 3339 format for due. The description's task_list_id hint largely duplicates what the schema already states, so it adds little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new task') and immediately pins down the return value's shape by reference to tasks_get_task, so the agent knows exactly what it gets back. It also names tasks_list_task_lists as the source of the required task_list_id, distinguishing it from sibling task tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete precondition ('Get task_list_id from tasks_list_task_lists') and flags that 'Requires user approval', which directly affects when an agent may invoke it. It stops short of stating exclusions or naming an alternative for cases where creation is not appropriate, but the routing guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_get_taskARead-onlyIdempotent
Fetch a single task by id. Returns one task in the same shape tasks_list_tasks lists; deleted is true for a task deleted but not yet purged, and notes may be redacted by the user's privacy settings. Get the id from tasks_list_tasks. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| task_id | Yes | Id of the task, from tasks_list_tasks (its id field). | |
| task_list_id | Yes | Id of the task list, from tasks_list_task_lists (its id field, not its title). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the 'deleted but not yet purged' semantics of the deleted flag, redaction of notes by privacy settings, and the 'Auto-approved' note signaling it passes the privacy fence without approval.
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 core action and then the caveats that actually matter (deleted flag, redaction). No redundant or filler content.
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 single-fetch with full annotation coverage and no output schema, the description supplies the return shape and the two non-obvious field caveats. It is essentially complete; only minor detail (e.g., error behavior when the id is invalid) is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters, including the reason field and the source of each id. The description reinforces the task_id source but adds nothing about task_list_id or reason, 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 and resource ('Fetch a single task by id') and implicitly distinguishes itself from the list sibling by emphasizing 'single task' and contrasting the return shape with 'tasks_list_tasks lists'. An agent can tell it apart from tasks_list_tasks immediately.
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?
Tells the agent where to source the id ('Get the id from tasks_list_tasks') and by implication when to use it (single-task lookup with a known id). It does not explicitly state when not to use it versus siblings like tasks_update_task, but the context is clear enough to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_list_task_listsARead-onlyIdempotent
List all Google Task lists. Returns a list of {id, title, updated}. Pass an id as task_list_id to tasks_list_tasks and the other task tools. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds operational context beyond that: the exact return shape and the 'Auto-approved' note, which tells the agent no human approval gate applies. It doesn't mention pagination or result limits, 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?
Three short sentences, front-loaded with the purpose, then the return shape, then the downstream usage. Every sentence earns its place with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by naming the returned fields ({id, title, updated}), which is exactly what an agent needs to chain into tasks_list_tasks. For a simple read-only list tool, nothing material 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?
There is a single 'reason' parameter fully documented in the schema (100% coverage), so the schema carries the burden. The description says nothing about the reason parameter, which is fine for a self-describing generic field, but it adds no parameter-level meaning. 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 ('List all Google Task lists') and immediately distinguishes itself from the sibling tasks_list_tasks by naming what it returns ({id, title, updated}). An agent can tell exactly what this tool produces 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?
Gives action-oriented workflow guidance: 'Pass an id as task_list_id to tasks_list_tasks and the other task tools', which tells the agent this is the entry point for the task tool family. It stops short of stating when-not to use it or any exclusions, so it falls 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.
tasks_list_tasksARead-onlyIdempotent
List tasks in a task list. Returns a list of tasks as {id, task_list_id, title, notes, due, status ('needsAction' or 'completed'), completed, updated, position, parent, deleted}, in the API's order. Reads up to 100 tasks across pages; notes may be redacted by the user's privacy settings. Use tasks_get_task instead when you already have a task's id. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| task_list_id | Yes | Id of the task list, from tasks_list_task_lists (its id field, not its title). | |
| show_completed | No | Include completed tasks, including ones completed in Google's own Tasks, Gmail or Calendar apps. Default false: only tasks still to do. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only/idempotent profile, and the description adds genuinely useful non-obvious traits: pagination up to 100 tasks, ordering follows the API's order, notes can be redacted by the user's privacy settings, and the call is auto-approved. These are behavioral details not derivable from annotations or 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?
Front-loaded with the purpose, then the return shape, then pagination caveats and the sibling alternative. The inline field list is long but earns its place given there is no output schema; only the trailing 'Auto-approved' is loosely attached.
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 compensates well by enumerating returned fields, noting the status enum values, the ordering, and the 100-task page limit. Handles complexity adequately, though it omits pagination/continuation mechanics for retrieving beyond 100 tasks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented in the schema, including show_completed's default and meaning. The description adds no syntax, format, or edge-case detail about the parameters beyond what the schema states, 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 and resource ('List tasks in a task list') and immediately distinguishes itself from the sibling 'tasks_get_task' by naming the condition that selects the alternative (when you already have the task id). An agent can route between it and tasks_list_task_lists/tasks_get_task 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?
Provides a clear usage rule for the get-vs-list decision ('Use tasks_get_task instead when you already have a task's id'), but gives no guidance on when to list at all, whether show_completed should typically be set, or how to handle the 100-task page cap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_move_taskA
Move a task from one list to another. The task keeps its id, status and subtasks. Recurring tasks cannot be moved between lists. Returns the moved task in the same shape tasks_get_task returns. Get both list ids from tasks_list_task_lists. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| task_id | Yes | Id of the task to move, from tasks_list_tasks on the source list. | |
| source_list_id | Yes | Id of the list the task is in now, from tasks_list_task_lists. | |
| destination_list_id | Yes | Id of the list to move the task to, from tasks_list_task_lists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the task preserves its id, status and subtasks; recurring tasks are rejected; the return payload matches tasks_get_task; and user approval is required. This directly complements the non-readOnly, non-idempotent hints instead of merely restating them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, each carrying distinct information, with the core action front-loaded and constraints following. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers return shape by reference ('same shape tasks_get_task returns'), restrictions, approval gating, and id sourcing. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (including reason) are already documented in the schema. The description only points at tasks_list_task_lists as the id source, which the schema already says, adding no new semantic detail.
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 ('Move a task from one list to another') with an unambiguous scope. An agent can distinguish it immediately from siblings like tasks_update_task or tasks_create_task without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete prerequisites ('Get both list ids from tasks_list_task_lists') and an exclusion ('Recurring tasks cannot be moved between lists') plus an approval requirement. It does not explicitly name a competing sibling tool or say when update_task is preferable, so it stops 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.
tasks_uncomplete_taskA
Mark a task as not completed. Returns the updated task in the same shape tasks_get_task returns, with status 'needsAction' and completed cleared. Use tasks_complete_task for the opposite. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? | |
| task_id | Yes | Id of the task, from tasks_list_tasks (its id field). | |
| task_list_id | Yes | Id of the task list, from tasks_list_task_lists (its id field, not its title). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring readOnly/idempotent/destructive hints, the description adds real value: it discloses the exact resulting state ('status needsAction and completed cleared') and the fact that user approval is required. It does not discuss idempotency or error behavior, but the added context goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the return shape, then the alternative and prerequisite. Every sentence carries distinct information; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description compensates by describing the returned shape relative to tasks_get_task. Combined with the approval requirement and clear counterpart tool, an agent has everything needed to 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 description coverage is 100%, and the schema already documents all three parameters including the reason field's intent. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Mark a task as not completed') and explicitly contrasts with the sibling tasks_complete_task. An agent can distinguish it from tasks_complete_task and tasks_update_task without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the opposite operation's tool (tasks_complete_task) for the inverse case and states the approval prerequisite, giving clear routing context. It does not, however, give an explicit 'when-not' condition or mention tasks_update_task as an alternative for other field changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_update_taskA
Update a task's title, notes, or due date. Only the fields you pass non-empty change: an empty value leaves that field as it is; to remove notes or the due date, set clear_notes or clear_due. Returns the updated task in the same shape tasks_get_task returns. Use tasks_complete_task or tasks_uncomplete_task to change whether it is done. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | New due date as an RFC 3339 timestamp, e.g. '2026-10-15T00:00:00Z'; only the date is kept. Empty leaves the due date unchanged. | |
| notes | No | New notes, replacing the current ones. Empty leaves the notes unchanged. | |
| title | No | New title for the task. Empty leaves the title unchanged. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| task_id | Yes | Id of the task, from tasks_list_tasks (its id field). | |
| clear_due | No | Set true to remove the due date; ignored when due is also given. | |
| clear_notes | No | Set true to remove the notes; ignored when notes is also given. | |
| task_list_id | Yes | Id of the task list, from tasks_list_task_lists (its id field, not its title). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), and the description adds substantial value beyond them: partial-update semantics (empty leaves unchanged), explicit removal via clear_notes/clear_due, the return shape (same as tasks_get_task), and the user-approval requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the update scope, then mutation semantics, then the return shape, then the sibling routing and approval note. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully states the return shape, and it covers partial-update behavior, removal semantics, approval requirements, and sibling routing. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter, including the empty-value and clear_* precedence rules, is already documented in the schema. The description restates those semantics rather than adding new syntax or format detail, so it sits at the baseline for a fully-documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (a task) plus the exact mutable fields (title, notes, due date). It also explicitly disambiguates from the done-state siblings by naming tasks_complete_task and tasks_uncomplete_task, so an agent can select it without opening other 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 the done-state case by routing to tasks_complete_task/tasks_uncomplete_task, and explains the empty/clear semantics for keeping vs removing values. It does not address tasks_move_task even though the tool takes a task_list_id, leaving ambiguity about whether list changes belong here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_get_messagesARead-onlyIdempotent
Fetch recent messages from a Telegram chat by chat id. Returns a list of {id, sender_name, text, date} (date is ISO 8601), newest first, up to limit messages (default 50, capped at 200); media messages carry only their text or caption, if any. Use telegram_search_messages to find messages by keyword across all chats; get chat_id from telegram_list_chats. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum messages to fetch, newest first. Default 50, capped at 200. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| chat_id | Yes | Numeric id of the chat, from the id field of telegram_list_chats. A chat name or @username is not accepted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuinely new behavior: the return fields, ISO 8601 dates, newest-first ordering, the limit default/cap, how media messages are represented, and that user approval is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: return contract first, then routing to the alternative and chat_id source, then the approval prerequisite. Every clause carries information and nothing is repeated for 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?
With no output schema and only three parameters, the description supplies exactly what is missing – return fields, ordering, limit semantics and media handling – plus the approval requirement. An agent has everything needed to call 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 description coverage is 100%, so chat_id and limit are already fully documented in the schema. The description restates the cap and the 'chat name not accepted' constraint without adding new syntax or format detail, meeting the baseline for schema-covered parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch recent messages from a Telegram chat by chat id'), names the scope (single chat, newest first), and previews the return shape. It is clearly distinguishable from the sibling telegram_search_messages, which it explicitly contrasts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to telegram_search_messages for keyword search across all chats, and tells it where chat_id comes from (telegram_list_chats). It gives clear context but stops short of stating any when-not condition, e.g. when a chat id is unknown or the chat has no messages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_list_chatsARead-onlyIdempotent
List Telegram chats (id, name, type, unread count). Returns a list of {id, name, username, type, unread_count, is_self}, most recently active first, up to limit (default 50, capped at 200); username is the @handle without the @, empty if none; type is 'user', 'group', 'channel' or 'bot', and is_self marks Saved Messages. Pass an id as chat_id to telegram_get_messages or telegram_send_message; call telegram_refresh_chat_cache first if a new chat is missing or shows no name. Auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum chats to return, most recently active first. Default 50, capped at 200. | |
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, and the description adds ordering semantics ('most recently active first'), the limit cap, and the approval state ('Auto-approved'), which the annotations do not cover. It is missing pagination behavior beyond the cap, so it stops just short of the top score.
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?
Purpose is front-loaded and the usage routing comes last, but the returned fields are listed twice — once parenthetically as '(id, name, type, unread count)' and again in full — creating minor redundancy in an otherwise dense single paragraph.
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 fully specifies the return shape field-by-field (including username/@handle convention, type enum, and is_self meaning) plus the prerequisite refresh step. Nothing an agent needs to call and consume the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description's explanation of 'limit' ('default 50, capped at 200', most recently active first) duplicates the schema wording almost verbatim, and the required 'reason' parameter is not addressed. Baseline 3 is correct when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list Telegram chats) and enumerates the returned fields up front, distinguishing it plainly from siblings like telegram_search_messages and telegram_get_messages. An agent can identify the 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?
Explicitly routes the agent: 'Pass an id as chat_id to telegram_get_messages or telegram_send_message', and gives a conditional prerequisite ('call telegram_refresh_chat_cache first if a new chat is missing or shows no name'). Both the when and the alternative are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_refresh_chat_cacheARead-onlyIdempotent
Force an immediate refresh of PrivacyFence's local cache of Telegram chat/group/channel names, used to resolve which chat a message belongs to in search results and chat history without a per-message lookup. Refreshes automatically about once a week; call this after a new chat starts so it resolves by name right away. Auto-approved -- refreshes name lookups only, reads no message content. Returns {cached_chats: }.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint, idempotentHint, destructiveHint false), but the description adds materially: it is 'Auto-approved', refreshes name lookups only, reads no message content, and returns {cached_chats: <count>}. The explicit statement that no message content is read is exactly the kind of scope disclosure an agent needs on a cache-affecting call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and followed by the trigger condition, scope limits, and return shape. Every clause carries information the agent needs; nothing is redundant with the name or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description states the return shape ({cached_chats: <count>}), the auto-approval behavior, and the no-message-content scope, which fully covers what an agent needs before calling this low-risk, single-parameter refresh tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, 'reason', and schema coverage is 100% – the schema already documents it as 'One sentence: why are you calling this tool right now?'. The description adds no further semantics about the parameter, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (refresh) and resource (PrivacyFence's local cache of Telegram chat/group/channel names), then explains the downstream purpose: resolving which chat a message belongs to without a per-message lookup. This clearly differentiates it from sibling read tools like telegram_list_chats and telegram_get_messages.
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 trigger context: 'Refreshes automatically about once a week; call this after a new chat starts so it resolves by name right away.' This tells the agent when to invoke it and implies when not to (the automatic cadence handles the common case). It does not name a specific alternative tool to use instead, which keeps it 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.
telegram_search_messagesARead-onlyIdempotent
Search messages across Telegram chats by keyword. Returns a list of {id, chat_id, chat_name, sender_name, text, date} (date is ISO 8601), newest first, up to limit messages (default 30, capped at 100); id is the message id and chat_id is the value telegram_get_messages takes. Use telegram_get_messages to read one chat's recent messages in full. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum messages to return, newest first. Default 30, capped at 100. | |
| query | Yes | Keyword or phrase to search for in message text, across all chats. | |
| reason | Yes | One sentence: why are you calling this tool right now? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly/idempotent/non-destructive), so the bar is lower; the description adds genuinely new context: the 'Requires user approval' auth requirement and the limit cap behavior (default 30, capped at 100).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense but well-ordered paragraph: purpose, return shape, ordering/caps, then the sibling alternative and approval requirement. Every clause carries information; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return-value burden and does so fully (field list, ISO 8601 dates, ordering, limit semantics). Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds cross-tool semantics not in the schema — that 'chat_id is the value telegram_get_messages takes' and that 'id is the message id' — which helps the agent chain calls correctly.
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 ('Search messages across Telegram chats by keyword') with clear scope (across all chats), and explicitly distinguishes itself from the sibling telegram_get_messages.
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 ('Use telegram_get_messages to read one chat's recent messages in full'), giving the agent a clear routing rule for the common ambiguity. It stops short of an explicit when-not condition (e.g., when keyword search is a poor fit), so it lands just below the top.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_send_messageA
Send a message to a Telegram chat or user by chat id. Returns {chat_id, chat_name, msg_id, text} of the sent message. Get chat_id from telegram_list_chats. Requires user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Message text to send. Must not be empty. | |
| reason | Yes | One sentence: why are you calling this tool right now? | |
| chat_id | Yes | Numeric id of the chat or user to send to, from the id field of telegram_list_chats. A name or @username is not accepted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the safety profile is covered. The description adds two things the annotations do not: that user approval is required, and the exact response shape ({chat_id, chat_name, msg_id, text}), which is valuable for a mutation 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?
Three tight sentences, each earning its place: action, return shape, id source, approval. The primary action is front-loaded with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description supplies the return fields, the identifier prerequisite, and the approval constraint. For a three-parameter write tool with full schema coverage, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters in detail, including that a name or @username is not accepted. The description only repeats the chat_id sourcing note, adding no syntax or format detail beyond the schema; a 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 a specific verb and resource ('Send a message to a Telegram chat or user') and even names the identifier semantics (by chat id). It is not differentiated from the sibling slack_send_message, which is the only thing keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite ('Get chat_id from telegram_list_chats') and warns that approval is required, which is real usage context. It does not say when to prefer this over the sibling Slack send tool, so it stops short of explicit alternatives.
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.
10 tool updates
v6.12.0- Changed
peek_add_comment3 fields changed- changed
Input schema / properties / body / descriptionPrevious value: -"The comment text, 1 to 4000 characters."New value: +"The comment text, 1 to 4000 bytes (UTF-8)." - changed
Input schema / properties / element_text / descriptionPrevious value: -"Quoted text to anchor the comment to, up to 200 characters, copied from a comment's element_text. Needs selector. Empty anchors to the element, or the page."New value: +"Quoted text to anchor the comment to, up to 200 bytes (UTF-8), copied from a comment's element_text. Needs selector. Empty anchors to the element, or the page." - added
Input schema / properties / versionAdded value: +{ + "default": 0, + "description": "Version number to comment on, from peek_list_versions; 0, the default, means the latest.", + "type": "integer" +}
- Added
peek_grant_access - Added
peek_list_grants - Added
peek_list_versions - Added
peek_revoke_access - Changed
peek_set_visibility2 fields changed- removed
Input schema / properties / passwordRemoved value: -{ - "default": "", - "description": "The page password, 1 to 72 bytes. Required with password visibility and empty otherwise. It goes to Peek and is never shown on the approval card.", - "type": "string" -} - changed
Input schema / properties / visibility / descriptionPrevious value: -"Who can open the page: public (anyone with the link), password (anyone with the link and the password) or private (signed-in Peek accounts only)."New value: +"Who can open the page: public (anyone with the link), signed-in (anyone signed in to Peek) or restricted (only you, Peek admins and the people or groups granted access). Grant access with peek_grant_access."
- Changed
peek_upload_page2 fields changed- removed
Input schema / properties / passwordRemoved value: -{ - "default": "", - "description": "The page password, 1 to 72 bytes. Required with password visibility and empty otherwise (always empty with slug). It goes to Peek and is never shown on the approval card.", - "type": "string" -} - changed
Input schema / properties / visibility / descriptionPrevious value: -"Who can open the page: public (anyone with the link), password (anyone with the link and the password) or private (signed-in Peek accounts only). Empty means private for a new page; leave it empty with slug."New value: +"Who can open the page: public (anyone with the link), signed-in (anyone signed in to Peek) or restricted (only you, Peek admins and the people or groups granted access). Grant access with peek_grant_access. Empty means restricted for a new page; leave it empty with slug."
- Added
privacyfence_propose_scoped_token - Added
slack_get_read_state - Changed
slack_search_messages1 field changed- added
Input schema / properties / read_stateAdded value: +{ + "default": false, + "description": "Also return each message's read_state: 'unread' or 'read' against your own Slack read marker for its conversation, or 'unknown' for a thread reply or a conversation with no marker. Use with care: it costs one extra conversations.info request per conversation in the results (50/min) before the approval card appears, so a large sweep is easily rate-limited. For a handful of messages use slack_get_read_state instead. Default false.", + "type": "boolean" +}
10 tool updates
v6.9.1- Added
miro_create_connectors - Added
miro_create_items - Added
miro_get_board - Added
miro_get_items - Added
miro_list_boards - Added
miro_list_connectors - Added
miro_list_items - Added
miro_list_tags - Added
miro_update_board - Added
miro_update_items
2 tool updates
v6.8.0- Changed
slack_get_channel_history1 field changed- added
Input schema / properties / minutesAdded value: +{ + "default": 0, + "description": "Only fetch messages from the last N minutes (1-10080, up to 7 days). 0 (the default) means no cutoff.", + "type": "integer" +}
- Changed
slack_search_messages4 fields changed- added
Input schema / properties / exclude_channelsAdded value: +{ + "default": "", + "description": "Comma-separated channel ids whose messages are dropped from the results. Pass the ids a 'conversations I'm a member of' rule excludes; a result from one of them stops that rule from covering the search.", + "type": "string" +} - added
Input schema / properties / member_onlyAdded value: +{ + "default": false, + "description": "Only return messages from conversations you are a member of right now (channels, DMs and group DMs); PrivacyFence asks Slack for your conversations on each call. Use it for a sweep of everything since your last run; a 'conversations I'm a member of' rule can then auto-accept the search. It reads at most 300 search matches, so in a busy window it can miss older messages: if it returns exactly count results, search again with a smaller minutes.", + "type": "boolean" +} - added
Input schema / properties / minutesAdded value: +{ + "default": 0, + "description": "Only include messages from the last N minutes (1-10080, up to 7 days); overrides days, and makes query and participant optional. 0 (the default) means no minute window", + "type": "integer" +} - changed
Input schema / properties / query / descriptionPrevious value: -"Text to search for, in Slack search syntax. With participant it is a case-insensitive substring filter instead. At least one of query and participant is required; empty means no text filter."New value: +"Text to search for, in Slack search syntax. With participant it is a case-insensitive substring filter instead. At least one of query, participant and minutes is required; empty means no text filter."
12 tool updates
v6.3.0- Added
assets_export_objects - Added
assets_get_connected_tickets - Added
assets_get_object - Added
assets_get_related_objects - Added
assets_list_attributes - Added
assets_list_object_types - Added
assets_list_schemas - Added
assets_search_objects - Added
salesforce_create_record - Added
salesforce_create_records - Added
salesforce_update_record - Added
salesforce_update_records
28 tool updates
v6.2.0- Added
drive_copy_file - Added
drive_get_revision_content - Added
drive_list_revisions - Added
grist_add_columns - Added
grist_add_records - Added
grist_create_table - Added
grist_export_records - Added
grist_export_sql - Added
grist_get_records - Added
grist_import_csv - Added
grist_list_documents - Added
grist_list_tables - Added
grist_update_csv - Added
grist_update_records - Added
jira_export_issues - Changed
jira_get_issue1 field changed- added
Input schema / properties / fieldsAdded value: +{ + "default": "", + "description": "Optional JSON array of extra fields to return, as in jira_search_issues_with_fields, e.g. [\"Story Points\"]. Empty returns only the standard fields.", + "type": "string" +}
- Added
jira_list_fields - Added
jira_search_issues_with_fields - Added
peek_add_comment - Added
peek_delete_page - Added
peek_get_comments - Added
peek_get_stats - Added
peek_list_pages - Added
peek_rename_page - Added
peek_set_visibility - Added
peek_upload_page - Added
salesforce_export_report - Changed
salesforce_run_report2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "default": "", + "description": "Opaque cursor from a previous paged result's next_cursor. Pass it with the same report_id, columns, filters and page_by. Leave empty for the first page.", + "type": "string" +} - added
Input schema / properties / page_byAdded value: +{ + "default": "", + "description": "Report column API name whose values are unique per row (best an auto-number column the report includes), e.g. 'Opportunity.Opp_Number__c'. Reads every row of the report, page by page in order of this column; a grouped report is read as one flat table. Leave empty for one run as saved.", + "type": "string" +}
9 tool updates
v5.5.0- Changed
confluence_create_page1 field changed- changed
Input schema / properties / body / descriptionPrevious value: -"Page body in Confluence storage format (XHTML-based HTML), e.g. '<p>Hello</p>'."New value: +"Page body in Confluence storage format (XHTML-based HTML), e.g. '<p>Hello</p>'. Mention someone with @[Name](accountId), the id from confluence_find_users."
- Added
confluence_find_users - Added
confluence_refresh_user_cache - Changed
confluence_update_page1 field changed- changed
Input schema / properties / body / descriptionPrevious value: -"New body in Confluence storage format (XHTML-based HTML), replacing the whole current body. Omit or leave empty to keep the current body."New value: +"New body in Confluence storage format (XHTML-based HTML), replacing the whole current body. Omit or leave empty to keep the current body. Mention someone with @[Name](accountId), the id from confluence_find_users."
- Changed
jira_add_comment1 field changed- changed
Input schema / properties / body / descriptionPrevious value: -"Comment text, plain text (not Jira markup). Must not be empty."New value: +"Comment text, plain text (not Jira markup). Must not be empty. Mention someone with @[Name](accountId), the id from jira_find_users."
- Changed
jira_create_issue1 field changed- added
Input schema / properties / assignee_account_idAdded value: +{ + "default": "", + "description": "Atlassian account id to assign the issue to, from jira_find_users (its account_id field). Empty assigns nobody.", + "type": "string" +}
- Added
jira_find_users - Added
jira_refresh_user_cache - Changed
jira_update_issue1 field changed- added
Input schema / properties / assignee_account_idAdded value: +{ + "default": "", + "description": "Atlassian account id to assign the issue to, from jira_find_users (its account_id field). Empty leaves the assignee unchanged or unset.", + "type": "string" +}
103 tool updates
- Changed
apps_script_get_content1 field changed- added
Input schema / properties / script_id / descriptionAdded value: +"Id of the script project, from apps_script_list_projects (its id field)."
- Changed
apps_script_get_execution_log2 fields changed- added
Input schema / properties / max_results / descriptionAdded value: +"Most runs to return. Default 10, capped at 50." - added
Input schema / properties / script_id / descriptionAdded value: +"Id of the script project, from apps_script_list_projects (its id field)."
- Changed
apps_script_list_projects1 field changed- added
Input schema / properties / max_results / descriptionAdded value: +"Most projects to return. Default 50, capped at 1000."
- Changed
apps_script_write_content2 fields changed- changed
Input schema / properties / files / descriptionPrevious value: -"JSON array of {\"name\": str, \"type\": \"SERVER_JS\"|\"HTML\"|\"JSON\", \"source\": str}, one entry per file (a JSON manifest file is named \"appsscript\" with type \"JSON\")."New value: +"JSON array of {\"name\": str, \"type\": \"SERVER_JS\"|\"HTML\"|\"JSON\", \"source\": str}, one entry per file (a JSON manifest file is named \"appsscript\" with type \"JSON\"). Replaces the project's whole file set: any file left out is deleted. Must be valid JSON with at least one file." - added
Input schema / properties / script_id / descriptionAdded value: +"Id of the script project to overwrite, from apps_script_list_projects (its id field)."
- Changed
calendar_create_event9 fields changed- changed
Input schema / properties / attendees / descriptionPrevious value: -"Comma-separated email addresses"New value: +"Comma-separated email addresses of the guests to invite, e.g. 'a@example.com,b@example.com'. Empty invites nobody." - added
Input schema / properties / calendar_id / descriptionAdded value: +"Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar." - changed
Input schema / properties / color / descriptionPrevious value: -"Event color id (1-11) or name, e.g. \"Tomato\" -- see calendar_list_colors"New value: +"Event color id (1-11) or name, e.g. \"Tomato\" -- see calendar_list_colors. Empty uses the calendar's default color." - added
Input schema / properties / description / descriptionAdded value: +"Free-text description of the event. Empty means none." - changed
Input schema / properties / end_time / descriptionPrevious value: -"ISO 8601 datetime"New value: +"End as an RFC 3339 timestamp, same format as start_time; must be after it." - added
Input schema / properties / location / descriptionAdded value: +"Free-text location of the event. Empty means none." - changed
Input schema / properties / rooms / descriptionPrevious value: -"Comma-separated room resource email addresses to book"New value: +"Comma-separated room resource email addresses to book, from calendar_list_rooms (its resource_email field). Empty books no room." - changed
Input schema / properties / start_time / descriptionPrevious value: -"ISO 8601 datetime"New value: +"Start as an RFC 3339 timestamp, e.g. '2026-10-15T09:00:00+02:00'. A time without an offset is read as UTC. Date-only values are not accepted." - added
Input schema / properties / title / descriptionAdded value: +"Title of the event, as shown on the calendar."
- Changed
calendar_create_out_of_office4 fields changed- changed
Input schema / properties / decline_message / descriptionPrevious value: -"Message sent to organizers of auto-declined invitations"New value: +"Message sent to organizers of auto-declined invitations. Empty sends no custom message." - changed
Input schema / properties / end_time / descriptionPrevious value: -"ISO 8601 datetime"New value: +"End as an RFC 3339 timestamp, same format as start_time; must be after it." - changed
Input schema / properties / start_time / descriptionPrevious value: -"ISO 8601 datetime"New value: +"Start as an RFC 3339 timestamp, e.g. '2026-10-15T09:00:00+02:00'. A time without an offset is read as UTC. Date-only values are not accepted." - added
Input schema / properties / title / descriptionAdded value: +"Title shown on the calendar. Default 'Out of Office'."
- Changed
calendar_delete_event2 fields changed- added
Input schema / properties / calendar_id / descriptionAdded value: +"Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar." - added
Input schema / properties / event_id / descriptionAdded value: +"Id of the event, from calendar_list_events (its id field)."
- Changed
calendar_get_event_details2 fields changed- added
Input schema / properties / calendar_id / descriptionAdded value: +"Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar." - added
Input schema / properties / event_id / descriptionAdded value: +"Id of the event, from calendar_list_events (its id field)."
- Changed
calendar_get_event_visibility2 fields changed- added
Input schema / properties / calendar_id / descriptionAdded value: +"Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar." - added
Input schema / properties / event_id / descriptionAdded value: +"Id of the event, from calendar_list_events (its id field)."
- Changed
calendar_get_free_busy3 fields changed- changed
Input schema / properties / emails / descriptionPrevious value: -"Comma-separated list of email addresses"New value: +"Comma-separated email addresses of the people (or room resource emails) to check, e.g. 'a@example.com,b@example.com'." - changed
Input schema / properties / time_max / descriptionPrevious value: -"ISO 8601 datetime"New value: +"End of the range, same RFC 3339 format as time_min. Required." - changed
Input schema / properties / time_min / descriptionPrevious value: -"ISO 8601 datetime"New value: +"Start of the range as an RFC 3339 timestamp with an offset, e.g. '2026-10-15T09:00:00+02:00'. Required; a bare date is not accepted."
- Changed
calendar_list_events5 fields changed- added
Input schema / properties / calendar_id / descriptionAdded value: +"Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar." - added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of events to return. Default 20, clamped to between 1 and 250." - added
Input schema / properties / query / descriptionAdded value: +"Free-text search matched against event fields such as title, description, location and attendees. Empty returns every event in the window." - added
Input schema / properties / time_max / descriptionAdded value: +"Only events starting before this time, same RFC 3339 format as time_min. Empty means no upper bound." - added
Input schema / properties / time_min / descriptionAdded value: +"Only events ending after this time, as an RFC 3339 timestamp with an offset, e.g. '2026-10-15T00:00:00Z' or '2026-10-15T09:00:00+02:00'; a bare date is not accepted. Empty means now."
- Changed
calendar_set_event_color3 fields changed- added
Input schema / properties / calendar_id / descriptionAdded value: +"Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar." - changed
Input schema / properties / color / descriptionPrevious value: -"Event color id (1-11) or name, e.g. \"Tomato\""New value: +"Event color id (1-11) or name, e.g. \"Tomato\" (case-insensitive), from calendar_list_colors. Required." - added
Input schema / properties / event_id / descriptionAdded value: +"Id of the event, from calendar_list_events (its id field)."
- Changed
calendar_set_event_visibility3 fields changed- added
Input schema / properties / calendar_id / descriptionAdded value: +"Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar." - added
Input schema / properties / event_id / descriptionAdded value: +"Id of the event, from calendar_list_events (its id field)." - changed
Input schema / properties / visibility / descriptionPrevious value: -"'default', 'public', 'private', or 'confidential'"New value: +"New visibility: 'default', 'public', 'private' or 'confidential' (case-insensitive). Any other value is rejected before approval is requested."
- Changed
calendar_set_working_location4 fields changed- changed
Input schema / properties / building_id / descriptionPrevious value: -"Workspace building id (office only; see calendar_list_rooms)"New value: +"Workspace building id (office only), from calendar_list_rooms (its building_id field). Empty leaves the building unset." - changed
Input schema / properties / date / descriptionPrevious value: -"ISO 8601 date, e.g. 2026-07-10"New value: +"The day as YYYY-MM-DD, e.g. 2026-07-10." - changed
Input schema / properties / label / descriptionPrevious value: -"Office label shown on Calendar (office only)"New value: +"Office label shown on Calendar (office only). Empty shows no label." - changed
Input schema / properties / location / descriptionPrevious value: -"\"office\" or \"home\""New value: +"Where you work that day: exactly \"office\" or \"home\". Anything else is rejected."
- Changed
calendar_update_event9 fields changed- added
Input schema / properties / calendar_id / descriptionAdded value: +"Id of the calendar, from calendar_list_calendars (its id field), or 'primary' for the user's main calendar." - changed
Input schema / properties / color / descriptionPrevious value: -"Event color id (1-11) or name, e.g. \"Tomato\" -- see calendar_list_colors"New value: +"New event color id (1-11) or name, e.g. \"Tomato\" -- see calendar_list_colors. Empty leaves the color unchanged." - added
Input schema / properties / description / descriptionAdded value: +"New description, replacing the current one. Empty leaves it unchanged." - added
Input schema / properties / end_time / descriptionAdded value: +"New end, same format as start_time. Empty leaves the end unchanged." - added
Input schema / properties / event_id / descriptionAdded value: +"Id of the event, from calendar_list_events (its id field)." - added
Input schema / properties / location / descriptionAdded value: +"New location, replacing the current one. Empty leaves it unchanged." - changed
Input schema / properties / rooms / descriptionPrevious value: -"Comma-separated room resource email addresses to book"New value: +"Comma-separated room resource email addresses to book, from calendar_list_rooms (its resource_email field); they replace the rooms already booked. Empty leaves the rooms unchanged." - added
Input schema / properties / start_time / descriptionAdded value: +"New start as an RFC 3339 timestamp, e.g. '2026-10-15T09:00:00+02:00'; a time without an offset uses the event's own time zone (UTC if it has none). Empty leaves the start unchanged." - added
Input schema / properties / title / descriptionAdded value: +"New title. Empty leaves the title unchanged."
- Changed
confluence_cql_search2 fields changed- changed
Input schema / properties / cql / descriptionPrevious value: -"e.g. 'space = MYSPACE AND type = page'"New value: +"A CQL query, e.g. \"space = MYSPACE AND type = page AND title ~ 'roadmap' order by lastmodified desc\"." - added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of results to return. Default 20, capped at 100."
- Changed
confluence_create_page4 fields changed- changed
Input schema / properties / body / descriptionPrevious value: -"HTML storage format body"New value: +"Page body in Confluence storage format (XHTML-based HTML), e.g. '<p>Hello</p>'." - changed
Input schema / properties / parent_id / descriptionPrevious value: -"Optional parent page ID"New value: +"Id of the page to nest the new page under, from confluence_list_pages. Empty creates it at the top level of the space." - added
Input schema / properties / space_key / descriptionAdded value: +"Key of the space to create the page in, e.g. 'ENG', from confluence_list_spaces (its key field)." - added
Input schema / properties / title / descriptionAdded value: +"Title of the new page, as shown in Confluence."
- Changed
confluence_download_attachment2 fields changed- added
Input schema / properties / attachment_name / descriptionAdded value: +"Exact file name of the attachment, as confluence_list_attachments returns it in its name field." - added
Input schema / properties / page_id / descriptionAdded value: +"Numeric id of the page the attachment is on, from confluence_list_pages or confluence_search."
- Changed
confluence_get_page1 field changed- added
Input schema / properties / page_id / descriptionAdded value: +"Numeric id of the page, from confluence_list_pages, confluence_search or confluence_cql_search (the id field)."
- Changed
confluence_get_page_by_title2 fields changed- added
Input schema / properties / space_key / descriptionAdded value: +"Key of the space the page is in, e.g. 'ENG', from confluence_list_spaces (its key field)." - added
Input schema / properties / title / descriptionAdded value: +"Exact title of the page, as shown in Confluence (not a partial match)."
- Changed
confluence_list_attachments1 field changed- added
Input schema / properties / page_id / descriptionAdded value: +"Numeric id of the page, from confluence_list_pages, confluence_search or confluence_get_page (the id field)."
- Changed
confluence_list_pages2 fields changed- added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of pages to return. Default 20, capped at 1000." - added
Input schema / properties / space_key / descriptionAdded value: +"Key of the space, e.g. 'ENG' (not its numeric id or display name), from confluence_list_spaces (its key field)."
- Changed
confluence_list_spaces1 field changed- added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of spaces to return. Default 50, capped at 1000."
- Changed
confluence_search2 fields changed- added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of results to return. Default 20, capped at 100." - changed
Input schema / properties / query / descriptionPrevious value: -"Plain-text search terms"New value: +"Plain-text words to find in page and blog post text, e.g. 'quarterly roadmap'. Not CQL: it is wrapped in a text-contains clause."
- Changed
confluence_update_page6 fields changed- added
Input schema / properties / body / defaultAdded value: +"" - changed
Input schema / properties / body / descriptionPrevious value: -"New HTML storage format body"New value: +"New body in Confluence storage format (XHTML-based HTML), replacing the whole current body. Omit or leave empty to keep the current body." - added
Input schema / properties / page_id / descriptionAdded value: +"Numeric id of the page to update, from confluence_list_pages or confluence_search (the id field)." - added
Input schema / properties / title / defaultAdded value: +"" - added
Input schema / properties / title / descriptionAdded value: +"New title for the page. Omit or leave empty to keep the current title." - changed
Input schema / requiredPrevious value: -[ - "page_id", - "title", - "body", - "reason" -]New value: +[ + "page_id", + "reason" +]
- Changed
contacts_add_label2 fields changed- added
Input schema / properties / label_name / descriptionAdded value: +"Name of the label (contact group) to add, for example 'Clients'. An unknown name creates a new label." - added
Input schema / properties / resource_name / descriptionAdded value: +"Resource name of the contact ('people/c12345'), from contacts_search or contacts_list."
- Changed
contacts_create6 fields changed- added
Input schema / properties / display_name / descriptionAdded value: +"Full name of the new contact, split on spaces into given and family name." - changed
Input schema / properties / emails / descriptionPrevious value: -"JSON array of {value, type} dicts"New value: +"JSON array of {value, type} objects, e.g. '[{\"value\": \"a@b.com\", \"type\": \"work\"}]'. Empty means no emails." - added
Input schema / properties / job_title / descriptionAdded value: +"Job title. Empty means none." - added
Input schema / properties / notes / descriptionAdded value: +"Free-text notes about the contact. Empty means no notes." - added
Input schema / properties / organization / descriptionAdded value: +"Company name. Empty means none." - changed
Input schema / properties / phones / descriptionPrevious value: -"JSON array of {value, type} dicts"New value: +"JSON array of {value, type} objects, e.g. '[{\"value\": \"+15551234567\", \"type\": \"mobile\"}]'. Empty means no phones."
- Changed
contacts_get2 fields changed- added
Input schema / properties / resource_name / descriptionAdded value: +"Resource name of the contact ('people/c12345'), from contacts_search or contacts_list (the resource_name field)." - changed
Input schema / properties / source / descriptionPrevious value: -"'personal', 'directory', or 'both' (default)."New value: +"Kind of contact you expect: 'personal', 'directory', or 'both' (default, accepts either). The call fails if the contact is not of that kind."
- Changed
contacts_list2 fields changed- added
Input schema / properties / max_results / descriptionAdded value: +"Most contacts to fetch. Default 50, capped at 1000." - changed
Input schema / properties / source / descriptionPrevious value: -"'personal' (saved contacts only), 'directory' (Workspace directory only), or 'both' (default)."New value: +"Which contacts to return: 'personal' (contacts with a saved-contact source), 'directory' (contacts with a Workspace directory source; a contact can match both), or 'both' (default, no filtering). Anything else is an error."
- Changed
contacts_remove_label2 fields changed- added
Input schema / properties / label_name / descriptionAdded value: +"Name of the label (contact group) to remove, matched without regard to case. The label itself is not deleted." - added
Input schema / properties / resource_name / descriptionAdded value: +"Resource name of the contact ('people/c12345'), from contacts_search or contacts_list."
- Changed
contacts_search3 fields changed- added
Input schema / properties / max_results / descriptionAdded value: +"Most contacts to return. Default 20, capped at 30 for saved contacts, up to 1000 for directory." - added
Input schema / properties / query / descriptionAdded value: +"Text to look for in contacts' names and email addresses (case-insensitive substring match for 'directory')." - changed
Input schema / properties / source / descriptionPrevious value: -"'personal', 'directory', or 'both' (default)."New value: +"Which contacts to search: 'personal' (contacts with a saved-contact source), 'directory' (contacts with a Workspace directory source; a contact can match both), or 'both' (default, saved contacts only). Anything else is an error."
- Changed
contacts_update7 fields changed- added
Input schema / properties / display_name / descriptionAdded value: +"New full name, split on spaces into given and family name. Empty leaves the name unchanged." - changed
Input schema / properties / emails / descriptionPrevious value: -"JSON array of {value, type} dicts"New value: +"JSON array of {value, type} objects, e.g. '[{\"value\": \"a@b.com\", \"type\": \"work\"}]'. Replaces all the contact's emails, so include the ones to keep. Empty leaves them unchanged; '[]' clears them." - added
Input schema / properties / job_title / descriptionAdded value: +"New job title. Empty leaves it unchanged." - added
Input schema / properties / notes / descriptionAdded value: +"New notes, replacing the current ones. Empty leaves the notes unchanged." - added
Input schema / properties / organization / descriptionAdded value: +"New company name. Empty leaves it unchanged." - changed
Input schema / properties / phones / descriptionPrevious value: -"JSON array of {value, type} dicts"New value: +"JSON array of {value, type} objects, e.g. '[{\"value\": \"+15551234567\", \"type\": \"mobile\"}]'. Replaces all the contact's phones, so include the ones to keep. Empty leaves them unchanged; '[]' clears them." - added
Input schema / properties / resource_name / descriptionAdded value: +"Resource name of the contact to update ('people/c12345'), from contacts_search or contacts_list."
- Changed
drive_add_comment2 fields changed- added
Input schema / properties / comment / descriptionAdded value: +"Text of the comment to post on the file." - added
Input schema / properties / file_id / descriptionAdded value: +"Id of the Drive file, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/)."
- Changed
drive_create_blank_file3 fields changed- added
Input schema / properties / mime_type / descriptionAdded value: +"MIME type of the file to create, e.g. 'application/vnd.google-apps.document' for a Google Doc or 'text/plain' for a text file." - added
Input schema / properties / name / descriptionAdded value: +"Name of the new file, as shown in Drive." - added
Input schema / properties / parent_folder_id / descriptionAdded value: +"Id of the folder to create it in. Empty creates it in My Drive's root."
- Changed
drive_docs_edit_content4 fields changed- added
Input schema / properties / file_id / descriptionAdded value: +"Id of the Google Doc to edit, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/)." - changed
Input schema / properties / find_text / descriptionPrevious value: -"Exact plain-text substring to locate"New value: +"Exact plain-text substring to locate, as typed in the document with no Markdown markers. Must match exactly one place unless replace_all is true." - added
Input schema / properties / replace_all / descriptionAdded value: +"Default false: find_text must match exactly one place or the call fails. True replaces every occurrence." - changed
Input schema / properties / replace_markdown / descriptionPrevious value: -"Markdown to insert in its place"New value: +"Markdown to insert in place of the match, in the syntax drive_write_doc_content accepts. Empty deletes the matched text."
- Changed
drive_docs_format_content3 fields changed- added
Input schema / properties / file_id / descriptionAdded value: +"Id of the Google Doc to format, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/)." - changed
Input schema / properties / find_text / descriptionPrevious value: -"Exact plain-text substring to locate"New value: +"Exact plain-text substring to format, as typed in the document with no Markdown markers. Must match exactly one place unless replace_all is true." - added
Input schema / properties / replace_all / descriptionAdded value: +"Default false: find_text must match exactly one place or the call fails. True formats every occurrence."
- Changed
drive_download_file1 field changed- added
Input schema / properties / file_id / descriptionAdded value: +"Id of the Drive file, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/)."
- Changed
drive_get_file_content1 field changed- added
Input schema / properties / file_id / descriptionAdded value: +"Id of the Drive file, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/)."
- Changed
drive_get_file_metadata1 field changed- added
Input schema / properties / file_id / descriptionAdded value: +"Id of the Drive file, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/)."
- Changed
drive_list_files1 field changed- added
Input schema / properties / max_results / descriptionAdded value: +"Most files to return. Default 20, capped at 1000. Reads up to max_results items across pages."
- Changed
drive_list_folder2 fields changed- added
Input schema / properties / folder_id / descriptionAdded value: +"Id of the folder whose children to list, from drive_list_files, another file's parent_ids, or drive_list_shared_drives (a shared drive's id lists its top level)." - added
Input schema / properties / max_results / descriptionAdded value: +"Most children to return. Default 50, capped at 1000. Reads up to max_results items across pages."
- Changed
drive_list_shared_drives1 field changed- added
Input schema / properties / max_results / descriptionAdded value: +"Most shared drives to return. Default 50, capped at 1000. Reads up to max_results items across pages."
- Changed
drive_move_file2 fields changed- added
Input schema / properties / destination_folder_id / descriptionAdded value: +"Id of the folder to move it into, from drive_list_folder or drive_list_files." - added
Input schema / properties / file_id / descriptionAdded value: +"Id of the file or folder to move, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/)."
- Changed
drive_sheets_add_sheet4 fields changed- added
Input schema / properties / cols / descriptionAdded value: +"Number of columns the new tab starts with. Default 26, at least 1." - added
Input schema / properties / rows / descriptionAdded value: +"Number of rows the new tab starts with. Default 1000, at least 1." - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name." - added
Input schema / properties / title / descriptionAdded value: +"Name of the new tab. Must not be empty or already used by another tab."
- Changed
drive_sheets_create2 fields changed- added
Input schema / properties / name / descriptionAdded value: +"Title of the new spreadsheet, as shown in Drive." - added
Input schema / properties / parent_folder_id / descriptionAdded value: +"Id of the folder to move the new spreadsheet into. Empty leaves it in My Drive's root."
- Changed
drive_sheets_delete_dimensions5 fields changed- added
Input schema / properties / count / descriptionAdded value: +"How many rows or columns to delete, starting at start_index. Default 1." - changed
Input schema / properties / dimension / descriptionPrevious value: -"'ROWS' or 'COLUMNS'"New value: +"What to delete: 'ROWS' or 'COLUMNS'." - changed
Input schema / properties / sheet_id / descriptionPrevious value: -"Numeric tab id, from drive_sheets_get_metadata"New value: +"Numeric id of the tab (its sheet_id), from drive_sheets_get_metadata; not the tab's title and not the spreadsheet_id." - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name." - changed
Input schema / properties / start_index / descriptionPrevious value: -"0-based, inclusive of the first row/column removed"New value: +"0-based index of the first row or column to delete (row 1 or column A is 0)."
- Changed
drive_sheets_format_range2 fields changed- changed
Input schema / properties / sheet_id / descriptionPrevious value: -"Numeric tab id, from drive_sheets_get_metadata"New value: +"Numeric id of the tab (its sheet_id), from drive_sheets_get_metadata; not the tab's title and not the spreadsheet_id." - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name."
- Changed
drive_sheets_get_metadata1 field changed- added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name."
- Changed
drive_sheets_get_values3 fields changed- changed
Input schema / properties / include_formatting / descriptionPrevious value: -"Also fetch per-cell formatting for the range (bold/italic/text color/background color/number format/horizontal/vertical alignment/text wrap -- the same aspects drive_sheets_format_range can set)."New value: +"Default false: values only. True also fetches per-cell formatting (bold/italic/text color/background color/number format/horizontal/vertical alignment/text wrap -- the same aspects drive_sheets_format_range can set)." - changed
Input schema / properties / range_a1 / descriptionPrevious value: -"A1 notation range, e.g. 'Sheet1!A1:C10'"New value: +"Range in A1 notation including the tab name, e.g. 'Sheet1!A1:C10' or 'Sheet1!A:A'." - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name."
- Changed
drive_sheets_insert_dimensions5 fields changed- added
Input schema / properties / count / descriptionAdded value: +"How many rows or columns to insert. Default 1." - changed
Input schema / properties / dimension / descriptionPrevious value: -"'ROWS' or 'COLUMNS'"New value: +"What to insert: 'ROWS' or 'COLUMNS'." - changed
Input schema / properties / sheet_id / descriptionPrevious value: -"Numeric tab id, from drive_sheets_get_metadata"New value: +"Numeric id of the tab (its sheet_id), from drive_sheets_get_metadata; not the tab's title and not the spreadsheet_id." - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name." - changed
Input schema / properties / start_index / descriptionPrevious value: -"0-based index to insert before"New value: +"0-based index of the row or column to insert before (0 inserts at the very top or left)."
- Changed
drive_sheets_rename_sheet3 fields changed- added
Input schema / properties / new_title / descriptionAdded value: +"New name for the tab. Must not be empty or already used by another tab." - changed
Input schema / properties / sheet_id / descriptionPrevious value: -"Numeric tab id, from drive_sheets_get_metadata"New value: +"Numeric id of the tab (its sheet_id), from drive_sheets_get_metadata; not the tab's title and not the spreadsheet_id." - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name."
- Changed
drive_sheets_write_range3 fields changed- changed
Input schema / properties / range_a1 / descriptionPrevious value: -"A1 notation range, e.g. 'Sheet1!A1:C10'"New value: +"Range to write, in A1 notation including the tab name, e.g. 'Sheet1!A1:C10'. The values fill it from its top-left cell." - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"Id of the spreadsheet (a Drive file id), from drive_list_files, drive_sheets_create or a spreadsheet URL (the token after /d/); not a tab name." - changed
Input schema / properties / values / descriptionPrevious value: -"JSON 2D array of rows, e.g. [[\"Name\",\"Total\"],[\"Alice\",\"=B2*2\"]]"New value: +"JSON 2D array of rows, e.g. [[\"Name\",\"Total\"],[\"Alice\",\"=B2*2\"]]. Each inner array is one row; a string starting with '=' is written as a formula."
- Changed
drive_upload_file5 fields changed- added
Input schema / properties / content_base64 / descriptionAdded value: +"The file's bytes, base64-encoded. Requires name. Give exactly one of local_path, content_base64 and upload_id; empty otherwise." - added
Input schema / properties / local_path / descriptionAdded value: +"Path of the file to upload, absolute or starting with ~/. Give exactly one of local_path, content_base64 and upload_id; empty otherwise." - added
Input schema / properties / name / descriptionAdded value: +"Name for the new Drive file. Required with content_base64; otherwise empty uses the local file's own name." - added
Input schema / properties / parent_folder_id / descriptionAdded value: +"Id of the folder to upload into. Empty uploads to My Drive's root." - added
Input schema / properties / upload_id / descriptionAdded value: +"Id returned by privacyfence_create_upload_slot after you PUT the bytes to its upload_url. Give exactly one of local_path, content_base64 and upload_id; empty otherwise."
- Changed
drive_write_doc_content2 fields changed- added
Input schema / properties / file_id / descriptionAdded value: +"Id of the Google Doc to overwrite, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/)." - added
Input schema / properties / markdown / descriptionAdded value: +"Markdown for the document's new content, in the syntax listed above. Replaces everything already in the Doc."
- Changed
drive_write_file_content2 fields changed- added
Input schema / properties / content / descriptionAdded value: +"The full new content of the file, as plain text. It replaces everything already in the file." - added
Input schema / properties / file_id / descriptionAdded value: +"Id of the Drive file, from drive_list_files, drive_list_folder or a Drive URL (the id is the long token after /d/ or /folders/)."
- Changed
gmail_add_label2 fields changed- added
Input schema / properties / label_name / descriptionAdded value: +"Name of the label to add, as gmail_list_labels returns it in its name field (nested labels look like 'Work/Projects'). A name that does not exist yet is created." - added
Input schema / properties / message_id / descriptionAdded value: +"Id of the Gmail message, from gmail_list_messages (its id field)."
- Changed
gmail_archive_message1 field changed- added
Input schema / properties / message_id / descriptionAdded value: +"Id of the Gmail message, from gmail_list_messages (its id field)."
- Changed
gmail_create_draft4 fields changed- added
Input schema / properties / bcc / descriptionAdded value: +"Bcc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none." - added
Input schema / properties / cc / descriptionAdded value: +"Cc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none." - added
Input schema / properties / subject / descriptionAdded value: +"Subject line of the new draft." - added
Input schema / properties / to / descriptionAdded value: +"Recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma."
- Changed
gmail_create_draft_with_attachments4 fields changed- added
Input schema / properties / bcc / descriptionAdded value: +"Bcc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none." - added
Input schema / properties / cc / descriptionAdded value: +"Cc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none." - added
Input schema / properties / subject / descriptionAdded value: +"Subject line of the new draft." - added
Input schema / properties / to / descriptionAdded value: +"Recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma."
- Changed
gmail_create_filter10 fields changed- changed
Input schema / properties / add_label_names / descriptionPrevious value: -"Comma-separated label names to apply; created if missing"New value: +"Comma-separated label names to apply, e.g. 'Work,Work/Projects'; a name that does not exist yet is created. Empty means no label is applied." - changed
Input schema / properties / archive / descriptionPrevious value: -"Skip the Inbox"New value: +"Skip the Inbox: matching messages are archived on arrival. Default false." - added
Input schema / properties / forward_to / descriptionAdded value: +"Address to forward matching messages to; Gmail only accepts an address the user has verified as a forwarding address. Empty means no forwarding." - added
Input schema / properties / from_address / descriptionAdded value: +"Match messages from this sender address. Empty means no sender criterion." - added
Input schema / properties / has_attachment / descriptionAdded value: +"Match only messages that have an attachment. Default false: attachments not required." - added
Input schema / properties / mark_as_read / descriptionAdded value: +"Mark matching messages as read on arrival. Default false." - changed
Input schema / properties / query / descriptionPrevious value: -"Gmail search syntax; matches the filter's 'Has the words' field"New value: +"Gmail search syntax, e.g. 'from:alice has:attachment'; matches the filter's 'Has the words' field. Empty means no search criterion." - added
Input schema / properties / star / descriptionAdded value: +"Star matching messages on arrival. Default false." - added
Input schema / properties / subject / descriptionAdded value: +"Match messages whose subject contains this text. Empty means no subject criterion." - added
Input schema / properties / to_address / descriptionAdded value: +"Match messages sent to this address. Empty means no recipient criterion."
- Changed
gmail_create_label1 field changed- added
Input schema / properties / label_name / descriptionAdded value: +"Name for the new label; use '/' to nest it, e.g. 'Work/Projects'. Must not already exist."
- Changed
gmail_download_attachment2 fields changed- added
Input schema / properties / attachment_name / descriptionAdded value: +"File name of the attachment, exactly as gmail_list_message_attachments returns it in its name field; a name that matches none fails." - added
Input schema / properties / message_id / descriptionAdded value: +"Id of the Gmail message, from gmail_list_messages (its id field)."
- Changed
gmail_get_message1 field changed- added
Input schema / properties / message_id / descriptionAdded value: +"Id of the Gmail message, from gmail_list_messages (its id field)."
- Changed
gmail_get_thread1 field changed- added
Input schema / properties / thread_id / descriptionAdded value: +"Id of the Gmail thread, from gmail_list_threads (its id field) or gmail_list_messages (its thread_id field)."
- Changed
gmail_list_message_attachments1 field changed- added
Input schema / properties / message_id / descriptionAdded value: +"Id of the Gmail message, from gmail_list_messages (its id field)."
- Changed
gmail_list_messages2 fields changed- added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of results to return. Default 10; capped at 100, and a value below 1 is treated as 1." - added
Input schema / properties / query / descriptionAdded value: +"Gmail search syntax, as typed in Gmail's search box, e.g. 'from:alice is:unread'. Empty matches every message."
- Changed
gmail_list_threads2 fields changed- added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of results to return. Default 10; capped at 100, and a value below 1 is treated as 1." - added
Input schema / properties / query / descriptionAdded value: +"Gmail search syntax, as typed in Gmail's search box, e.g. 'from:alice is:unread'. Empty matches every message."
- Changed
gmail_remove_label2 fields changed- added
Input schema / properties / label_name / descriptionAdded value: +"Name of the label to remove, as gmail_list_labels returns it in its name field (nested labels look like 'Work/Projects')." - added
Input schema / properties / message_id / descriptionAdded value: +"Id of the Gmail message, from gmail_list_messages (its id field)."
- Changed
gmail_reply_all_draft3 fields changed- added
Input schema / properties / bcc / descriptionAdded value: +"Bcc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none." - added
Input schema / properties / cc / descriptionAdded value: +"Extra Cc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none." - added
Input schema / properties / message_id / descriptionAdded value: +"Id of the message to reply to, from gmail_list_messages (its id field). The draft goes in that message's thread."
- Changed
gmail_reply_all_draft_with_attachments3 fields changed- added
Input schema / properties / bcc / descriptionAdded value: +"Bcc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none." - added
Input schema / properties / cc / descriptionAdded value: +"Extra Cc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none." - added
Input schema / properties / message_id / descriptionAdded value: +"Id of the message to reply to, from gmail_list_messages (its id field). The draft goes in that message's thread."
- Changed
gmail_reply_draft3 fields changed- added
Input schema / properties / bcc / descriptionAdded value: +"Bcc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none." - added
Input schema / properties / cc / descriptionAdded value: +"Extra Cc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none." - added
Input schema / properties / message_id / descriptionAdded value: +"Id of the message to reply to, from gmail_list_messages (its id field). The draft goes in that message's thread."
- Changed
gmail_reply_draft_with_attachments3 fields changed- added
Input schema / properties / bcc / descriptionAdded value: +"Bcc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none." - added
Input schema / properties / cc / descriptionAdded value: +"Extra Cc recipient address(es): one, or several separated by commas. Each may be a bare address or 'Name <name@example.com>'; a display name must not contain a comma. Empty means none." - added
Input schema / properties / message_id / descriptionAdded value: +"Id of the message to reply to, from gmail_list_messages (its id field). The draft goes in that message's thread."
- Changed
gmail_update_filter11 fields changed- added
Input schema / properties / add_label_names / descriptionAdded value: +"Comma-separated label names to apply, e.g. 'Work,Work/Projects'; a name that does not exist yet is created. Empty means no label is applied." - added
Input schema / properties / archive / descriptionAdded value: +"Skip the Inbox: matching messages are archived on arrival. Default false." - added
Input schema / properties / filter_id / descriptionAdded value: +"Id of the filter to replace, from gmail_list_filters (its id field); the replacement gets a new id." - added
Input schema / properties / forward_to / descriptionAdded value: +"Address to forward matching messages to; Gmail only accepts an address the user has verified as a forwarding address. Empty means no forwarding." - added
Input schema / properties / from_address / descriptionAdded value: +"Match messages from this sender address. Empty means no sender criterion." - added
Input schema / properties / has_attachment / descriptionAdded value: +"Match only messages that have an attachment. Default false: attachments not required." - added
Input schema / properties / mark_as_read / descriptionAdded value: +"Mark matching messages as read on arrival. Default false." - added
Input schema / properties / query / descriptionAdded value: +"Gmail search syntax, e.g. 'from:alice has:attachment'; matches the filter's 'Has the words' field. Empty means no search criterion." - added
Input schema / properties / star / descriptionAdded value: +"Star matching messages on arrival. Default false." - added
Input schema / properties / subject / descriptionAdded value: +"Match messages whose subject contains this text. Empty means no subject criterion." - added
Input schema / properties / to_address / descriptionAdded value: +"Match messages sent to this address. Empty means no recipient criterion."
- Changed
jira_add_comment2 fields changed- changed
Input schema / properties / body / descriptionPrevious value: -"Comment text (plain text)"New value: +"Comment text, plain text (not Jira markup). Must not be empty." - changed
Input schema / properties / issue_key / descriptionPrevious value: -"e.g. PROJ-123"New value: +"Key of the issue, e.g. PROJ-123, from jira_search_issues (its key field)."
- Changed
jira_create_issue5 fields changed- added
Input schema / properties / description / descriptionAdded value: +"Plain-text description of the issue. Empty means no description." - changed
Input schema / properties / issue_type / descriptionPrevious value: -"e.g. Task, Bug, Story"New value: +"Name of the issue type, e.g. 'Task', 'Bug' or 'Story'; it must exist in the project. Default 'Task'." - changed
Input schema / properties / priority / descriptionPrevious value: -"e.g. High, Medium, Low"New value: +"Name of the priority, e.g. 'High', 'Medium' or 'Low'. Empty uses the project's default priority." - changed
Input schema / properties / project_key / descriptionPrevious value: -"e.g. MYPROJ"New value: +"Key of the project to create the issue in, e.g. MYPROJ, from jira_list_projects (its key field)." - added
Input schema / properties / summary / descriptionAdded value: +"One-line title of the issue. Must not be empty."
- Changed
jira_get_issue1 field changed- changed
Input schema / properties / issue_key / descriptionPrevious value: -"e.g. PROJ-123"New value: +"Key of the issue, e.g. PROJ-123, from jira_search_issues (its key field)."
- Changed
jira_get_transitions1 field changed- changed
Input schema / properties / issue_key / descriptionPrevious value: -"e.g. PROJ-123"New value: +"Key of the issue, e.g. PROJ-123, from jira_search_issues (its key field)."
- Changed
jira_list_projects1 field changed- added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of projects to return. Default 50, capped at 500."
- Changed
jira_search_issues2 fields changed- changed
Input schema / properties / jql / descriptionPrevious value: -"e.g. 'project = MYPROJ AND status = Open'"New value: +"A JQL query, e.g. \"project = MYPROJ AND status = 'In Progress' ORDER BY updated DESC\". Must not be empty." - added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of issues to return. Default 20, capped at 500."
- Changed
jira_transition_issue2 fields changed- changed
Input schema / properties / issue_key / descriptionPrevious value: -"e.g. PROJ-123"New value: +"Key of the issue, e.g. PROJ-123, from jira_search_issues (its key field)." - changed
Input schema / properties / transition_name / descriptionPrevious value: -"e.g. Done, In Progress"New value: +"Name of the transition to apply, e.g. 'Done' or 'In Progress', as jira_get_transitions returns it in name (case-insensitive)."
- Changed
jira_update_issue5 fields changed- changed
Input schema / properties / custom_fields / descriptionPrevious value: -"JSON object mapping Jira Cloud custom field display names (as seen in the Jira UI, not their customfield_NNNNN id) to new values, e.g. {\"Story Points\": 5, \"Sprint\": \"Sprint 12\"}"New value: +"JSON object mapping Jira Cloud custom field display names (as seen in the Jira UI, not their customfield_NNNNN id) to new values, e.g. {\"Story Points\": 5, \"Sprint\": \"Sprint 12\"}. Empty changes no custom fields." - added
Input schema / properties / description / descriptionAdded value: +"New plain-text description, replacing the current one. Empty leaves the description unchanged." - added
Input schema / properties / issue_key / descriptionAdded value: +"Key of the issue, e.g. PROJ-123, from jira_search_issues (its key field)." - added
Input schema / properties / priority / descriptionAdded value: +"New priority name, e.g. 'High', 'Medium' or 'Low'. Empty leaves the priority unchanged." - added
Input schema / properties / summary / descriptionAdded value: +"New one-line summary. Empty leaves the summary unchanged."
- Changed
salesforce_get_record2 fields changed- changed
Input schema / properties / object_type / descriptionPrevious value: -"e.g. Account, Contact, Opportunity"New value: +"API name of the Salesforce object, e.g. 'Account', 'Contact', 'Opportunity' or a custom object like 'Invoice__c'." - added
Input schema / properties / record_id / descriptionAdded value: +"The record's 15- or 18-character Salesforce id, e.g. '0015g00000XyZabAAB', from salesforce_search (its id field)."
- Changed
salesforce_run_report4 fields changed- added
Input schema / properties / columnsAdded value: +{ + "default": "", + "description": "Comma-separated report column API names to return, a subset of the report's own reportMetadata.detailColumns, e.g. 'OPPORTUNITY.NAME,AMOUNT'. Leave empty for all of the report's columns. Columns outside the saved report are rejected.", + "type": "string" +} - added
Input schema / properties / filtersAdded value: +{ + "default": "", + "description": "JSON array of extra row filters for this run only, ANDed onto the report's saved filters, e.g. [{\"column\": \"Opportunity.Opp_Id__c\", \"operator\": \"equals\", \"value\": [\"006A...\", \"006B...\"]}]. value is a string or a list of strings (a list matches any of them; it is split across several filters automatically). operator is one of equals, notEqual, lessThan, greaterThan, lessOrEqual, greaterOrEqual, contains, notContain, startsWith, includes, excludes, within. Leave empty for none.", + "type": "string" +} - added
Input schema / properties / report_id / descriptionAdded value: +"Salesforce id of the report (starts with '00O'), from salesforce_list_reports (its id field)." - added
Input schema / properties / summary_onlyAdded value: +{ + "default": false, + "description": "True to return only groupings and aggregates (totals), with no detail rows: the smallest response. Default false returns detail rows too.", + "type": "boolean" +}
- Changed
salesforce_search2 fields changed- added
Input schema / properties / max_results / descriptionAdded value: +"Maximum matches (per object type when object_types is set). Default 20, capped at 200." - changed
Input schema / properties / search_term / descriptionPrevious value: -"Name, partial name, or id to search for"New value: +"Name, partial name, or id to search for, e.g. 'Acme'. Must not be empty."
- Changed
slack_get_channel_history3 fields changed- added
Input schema / properties / channel_id / descriptionAdded value: +"Id of the channel or conversation, from the id field of slack_list_channels, slack_list_dms or slack_list_group_chats, or from slack_resolve_permalink. A name is not accepted." - added
Input schema / properties / cursorAdded value: +{ + "default": "", + "description": "Opaque cursor from a previous result's next_cursor; empty starts at the newest messages.", + "type": "string" +} - added
Input schema / properties / limit / descriptionAdded value: +"Maximum messages to fetch, newest first. Default 50, capped at 1000."
- Changed
slack_get_thread_replies3 fields changed- added
Input schema / properties / channel_id / descriptionAdded value: +"Id of the channel or conversation, from the id field of slack_list_channels, slack_list_dms or slack_list_group_chats, or from slack_resolve_permalink. A name is not accepted." - added
Input schema / properties / cursorAdded value: +{ + "default": "", + "description": "Opaque cursor from a previous result's next_cursor; empty starts at the newest messages.", + "type": "string" +} - added
Input schema / properties / thread_ts / descriptionAdded value: +"Timestamp (ts) of the thread's parent message, e.g. '1700000000.123456', from slack_get_channel_history or slack_resolve_permalink."
- Changed
slack_list_channels2 fields changed- added
Input schema / properties / exclude_archived / descriptionAdded value: +"Skip archived channels. Default true; pass false to include archived channels too." - added
Input schema / properties / max_results / descriptionAdded value: +"Maximum channels to return. Default 100, capped at 1000."
- Changed
slack_list_dms1 field changed- added
Input schema / properties / max_results / descriptionAdded value: +"Maximum DMs to read and return. Default 100, capped at 1000."
- Changed
slack_list_group_chats1 field changed- added
Input schema / properties / max_results / descriptionAdded value: +"Maximum group chats to read and return. Default 100, capped at 1000."
- Changed
slack_resolve_permalink1 field changed- changed
Input schema / properties / url / descriptionPrevious value: -"A Slack message permalink, e.g. https://workspace.slack.com/archives/C0123/p1700000000123456"New value: +"A Slack message permalink, from a message's \"Copy link\", e.g. https://workspace.slack.com/archives/C0123/p1700000000123456"
- Changed
slack_search_messages2 fields changed- added
Input schema / properties / count / descriptionAdded value: +"Maximum messages to return. Default 20, capped at 100." - added
Input schema / properties / query / descriptionAdded value: +"Text to search for, in Slack search syntax. With participant it is a case-insensitive substring filter instead. At least one of query and participant is required; empty means no text filter."
- Changed
slack_send_message4 fields changed- added
Input schema / properties / channel_id / descriptionAdded value: +"Id of the channel, DM or group DM to post in, from the id field of slack_list_channels, slack_list_dms or slack_list_group_chats. A user id also works for a DM. A name is not accepted." - added
Input schema / properties / mark_unread / descriptionAdded value: +"Leave the sent message unread for you. Default false." - added
Input schema / properties / text / descriptionAdded value: +"Message text to send, in Slack mrkdwn. Must not be empty." - added
Input schema / properties / thread_ts / descriptionAdded value: +"Timestamp (ts) of the parent message to reply to in its thread, from slack_get_channel_history or slack_resolve_permalink. Empty posts a new top-level message."
- Changed
tasks_complete_task2 fields changed- added
Input schema / properties / task_id / descriptionAdded value: +"Id of the task, from tasks_list_tasks (its id field)." - added
Input schema / properties / task_list_id / descriptionAdded value: +"Id of the task list, from tasks_list_task_lists (its id field, not its title)."
- Changed
tasks_create_task4 fields changed- changed
Input schema / properties / due / descriptionPrevious value: -"Due date in RFC 3339 format"New value: +"Due date as an RFC 3339 timestamp, e.g. '2026-10-15T00:00:00Z'; Google Tasks keeps only the date. Empty means no due date." - added
Input schema / properties / notes / descriptionAdded value: +"Free-text notes for the task (its description). Empty means no notes." - added
Input schema / properties / task_list_id / descriptionAdded value: +"Id of the task list, from tasks_list_task_lists (its id field, not its title)." - added
Input schema / properties / title / descriptionAdded value: +"Title of the new task, as shown in Google Tasks. Must not be empty."
- Changed
tasks_get_task2 fields changed- added
Input schema / properties / task_id / descriptionAdded value: +"Id of the task, from tasks_list_tasks (its id field)." - added
Input schema / properties / task_list_id / descriptionAdded value: +"Id of the task list, from tasks_list_task_lists (its id field, not its title)."
- Changed
tasks_list_tasks2 fields changed- added
Input schema / properties / show_completed / descriptionAdded value: +"Include completed tasks, including ones completed in Google's own Tasks, Gmail or Calendar apps. Default false: only tasks still to do." - added
Input schema / properties / task_list_id / descriptionAdded value: +"Id of the task list, from tasks_list_task_lists (its id field, not its title)."
- Changed
tasks_move_task3 fields changed- added
Input schema / properties / destination_list_id / descriptionAdded value: +"Id of the list to move the task to, from tasks_list_task_lists." - added
Input schema / properties / source_list_id / descriptionAdded value: +"Id of the list the task is in now, from tasks_list_task_lists." - added
Input schema / properties / task_id / descriptionAdded value: +"Id of the task to move, from tasks_list_tasks on the source list."
- Changed
tasks_uncomplete_task2 fields changed- added
Input schema / properties / task_id / descriptionAdded value: +"Id of the task, from tasks_list_tasks (its id field)." - added
Input schema / properties / task_list_id / descriptionAdded value: +"Id of the task list, from tasks_list_task_lists (its id field, not its title)."
- Changed
tasks_update_task7 fields changed- added
Input schema / properties / clear_dueAdded value: +{ + "default": false, + "description": "Set true to remove the due date; ignored when due is also given.", + "type": "boolean" +} - added
Input schema / properties / clear_notesAdded value: +{ + "default": false, + "description": "Set true to remove the notes; ignored when notes is also given.", + "type": "boolean" +} - added
Input schema / properties / due / descriptionAdded value: +"New due date as an RFC 3339 timestamp, e.g. '2026-10-15T00:00:00Z'; only the date is kept. Empty leaves the due date unchanged." - added
Input schema / properties / notes / descriptionAdded value: +"New notes, replacing the current ones. Empty leaves the notes unchanged." - added
Input schema / properties / task_id / descriptionAdded value: +"Id of the task, from tasks_list_tasks (its id field)." - added
Input schema / properties / task_list_id / descriptionAdded value: +"Id of the task list, from tasks_list_task_lists (its id field, not its title)." - added
Input schema / properties / title / descriptionAdded value: +"New title for the task. Empty leaves the title unchanged."
- Changed
telegram_get_messages2 fields changed- added
Input schema / properties / chat_id / descriptionAdded value: +"Numeric id of the chat, from the id field of telegram_list_chats. A chat name or @username is not accepted." - added
Input schema / properties / limit / descriptionAdded value: +"Maximum messages to fetch, newest first. Default 50, capped at 200."
- Changed
telegram_list_chats1 field changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum chats to return, most recently active first. Default 50, capped at 200."
- Changed
telegram_search_messages2 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum messages to return, newest first. Default 30, capped at 100." - added
Input schema / properties / query / descriptionAdded value: +"Keyword or phrase to search for in message text, across all chats."
- Changed
telegram_send_message2 fields changed- added
Input schema / properties / chat_id / descriptionAdded value: +"Numeric id of the chat or user to send to, from the id field of telegram_list_chats. A name or @username is not accepted." - added
Input schema / properties / text / descriptionAdded value: +"Message text to send. Must not be empty."
122 tool updates
v5.3.0- First observed
apps_script_get_content - First observed
apps_script_get_execution_log - First observed
apps_script_list_projects - First observed
apps_script_write_content - First observed
calendar_create_event - First observed
calendar_create_out_of_office - First observed
calendar_delete_event - First observed
calendar_get_event_details - First observed
calendar_get_event_visibility - First observed
calendar_get_free_busy - First observed
calendar_list_calendars - First observed
calendar_list_colors - First observed
calendar_list_events - First observed
calendar_list_rooms - First observed
calendar_set_event_color - First observed
calendar_set_event_visibility - First observed
calendar_set_working_location - First observed
calendar_update_event - First observed
confluence_cql_search - First observed
confluence_create_page - First observed
confluence_download_attachment - First observed
confluence_get_page - First observed
confluence_get_page_by_title - First observed
confluence_list_attachments - First observed
confluence_list_pages - First observed
confluence_list_spaces - First observed
confluence_search - First observed
confluence_update_page - First observed
contacts_add_label - First observed
contacts_create - First observed
contacts_get - First observed
contacts_list - First observed
contacts_remove_label - First observed
contacts_search - First observed
contacts_update - First observed
drive_add_comment - First observed
drive_create_blank_file - First observed
drive_docs_edit_content - First observed
drive_docs_format_content - First observed
drive_download_file - First observed
drive_get_file_content - First observed
drive_get_file_metadata - First observed
drive_list_files - First observed
drive_list_folder - First observed
drive_list_shared_drives - First observed
drive_move_file - First observed
drive_sheets_add_sheet - First observed
drive_sheets_create - First observed
drive_sheets_delete_dimensions - First observed
drive_sheets_format_range - First observed
drive_sheets_get_metadata - First observed
drive_sheets_get_values - First observed
drive_sheets_insert_dimensions - First observed
drive_sheets_rename_sheet - First observed
drive_sheets_write_range - First observed
drive_upload_file - First observed
drive_write_doc_content - First observed
drive_write_file_content - First observed
gmail_add_label - First observed
gmail_archive_message - First observed
gmail_create_draft - First observed
gmail_create_draft_with_attachments - First observed
gmail_create_filter - First observed
gmail_create_label - First observed
gmail_download_attachment - First observed
gmail_get_message - First observed
gmail_get_thread - First observed
gmail_list_filters - First observed
gmail_list_labels - First observed
gmail_list_message_attachments - First observed
gmail_list_messages - First observed
gmail_list_threads - First observed
gmail_remove_label - First observed
gmail_reply_all_draft - First observed
gmail_reply_all_draft_with_attachments - First observed
gmail_reply_draft - First observed
gmail_reply_draft_with_attachments - First observed
gmail_update_filter - First observed
jira_add_comment - First observed
jira_create_issue - First observed
jira_get_issue - First observed
jira_get_transitions - First observed
jira_list_projects - First observed
jira_search_issues - First observed
jira_transition_issue - First observed
jira_update_issue - First observed
privacyfence_await_approval - First observed
privacyfence_begin_unattended_session - First observed
privacyfence_check_policy - First observed
privacyfence_create_upload_slot - First observed
privacyfence_end_unattended_session - First observed
privacyfence_list_policy - First observed
privacyfence_propose_policy_change - First observed
privacyfence_status - First observed
salesforce_get_record - First observed
salesforce_list_reports - First observed
salesforce_run_report - First observed
salesforce_search - First observed
slack_create_group_chat - First observed
slack_get_channel_history - First observed
slack_get_thread_replies - First observed
slack_list_channels - First observed
slack_list_dms - First observed
slack_list_group_chats - First observed
slack_refresh_channel_cache - First observed
slack_refresh_user_cache - First observed
slack_resolve_permalink - First observed
slack_search_messages - First observed
slack_send_message - First observed
tasks_complete_task - First observed
tasks_create_task - First observed
tasks_get_task - First observed
tasks_list_task_lists - First observed
tasks_list_tasks - First observed
tasks_move_task - First observed
tasks_uncomplete_task - First observed
tasks_update_task - First observed
telegram_get_messages - First observed
telegram_list_chats - First observed
telegram_refresh_chat_cache - First observed
telegram_search_messages - First observed
telegram_send_message
TDQS
Scored across 180 tools
Most tools within a connector are clearly scoped and heavily cross-referenced in their descriptions, which does a lot of the disambiguation work. But the set contains many near-twin pairs that an agent must pick between on subtle grounds: jira_search_issues vs jira_search_issues_with_fields, confluence_search vs confluence_cql_search, gmail_create_draft vs gmail_create_draft_with_attachments, and drive_get_file_content vs drive_download_file. Across 15+ connectors the volume makes misselection realistically likely even though individual boundaries are documented.
Almost everything follows a predictable connector_verb_noun snake_case convention (gmail_list_messages, jira_create_issue, drive_sheets_write_range), which makes scanning by prefix easy. Minor deviations exist: privacyfence_status and miro_list_boards/get_board use noun-only or shortened forms, and a few names are long compounds (assets_get_connected_tickets). Overall the pattern holds well.
180 tools is an extreme mismatch for any single assistant surface, far past the 50+ threshold. Even if each connector's subset is reasonable in isolation, the combined set is not a well-scoped tool list — it is a federation of fifteen products. Agents cannot reliably hold this surface in context, and the approval/policy meta-tools add further weight.
Coverage is unusually broad: CRUD across Drive, Gmail, Calendar, Jira, Confluence, Salesforce, Slack, Miro, Grist, Peek, Tasks and Contacts, plus lifecycle extras (revisions, drafts, filters, transitions, caches, policy tools). Gaps exist — contact deletion is explicitly unsupported, Miro has no delete, Drive has no folder creation or permission tools — but these are minor and workaroundable.
Maintenance
Related MCP Connectors
Zero-secret MCP gateway for AI agents: risk-scored, audited calls with human-in-the-loop approval.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Security gateway for AI agents: policy, approval, and audited execution, no secrets shared.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceHuman-in-the-Loop authorization gateway for AI Agents. Securely pause MCP workflows and route high-risk actions to human approvers via Slack or Email.142 npm1MIT

mcpgateofficial
FlicenseNot gradedqualityAmaintenanceSelf-hosted MCP gateway that connects Claude, ChatGPT, and other AI agents to 20+ enterprise tools (GitLab, Jira, Notion, Google Workspace, Slack, Grafana, …) with OAuth, audit logs, and zero data leaving your infrastructure3-- FlicenseNot gradedqualityBmaintenanceSelf-hosted MCP server that filters sensitive data from email and calendar before it reaches AI assistants, masking or withholding confidential content based on user policy.-
- AlicenseNot gradedqualityBmaintenancePermission gateway that hands an AI agent a scoped MCP endpoint instead of an OAuth token: connect 27 services (Gmail, Google Calendar/Drive/Ads/Search Console, Slack, Notion, GitHub, Jira, Salesforce, HubSpot, Stripe, LinkedIn, X, Meta Ads and more), grant per-action permissions finer than native OAuth scopes, audit every call and revoke a key in one click. Self-hostable, MIT.10 npm18MIT