Google Workspace MCP Server - Control Gmail, Calendar, Docs, Sheets, Slides, Chat, Forms & Drive
The Google Workspace MCP Server enables seamless integration with Google Workspace services, providing:
Authentication: Secure OAuth 2.0 flow for Google Workspace access
Gmail: Search, read, send, and manage emails, drafts, threads, and labels
Google Drive: Search, access, and manage files/folders including shared drives and Office formats
Google Calendar: Create, modify, delete, and retrieve events and calendars
Google Docs: Search, read, create, and manage documents
Google Sheets: Create, read, modify spreadsheets and cell values
Google Forms: Create forms, manage publish settings, and retrieve responses
Google Chat: Manage chat spaces, send messages, and search chat history
The server supports multiple transport methods (HTTP, SSE) and integrates with AI assistants like Claude Desktop and Open WebUI.
Enables complete email management including searching messages, retrieving content, sending emails, and creating drafts with full support for Gmail query syntax.
Provides full calendar management capabilities including listing calendars, fetching events, creating/modifying/deleting events with support for all-day and timed events.
Allows searching for documents, reading document content, listing documents in folders, and creating new documents directly from chat.
Enables searching files, listing folder contents, reading file content, and creating new files with support for extraction and retrieval of Microsoft Office formats.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Google Workspace MCP Server - Control Gmail, Calendar, Docs, Sheets, Slides, Chat, Forms & Drivecheck my calendar for meetings tomorrow and send me a summary"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Google Workspace MCP Server
Full natural language control over Google Calendar, Drive, Gmail, Docs, Sheets, Slides, Forms, Tasks, Contacts, and Chat through all MCP clients, AI assistants and developer tools. Includes a full featured CLI & Code Mode for use with tools like Claude Code and Codex!
The most feature-complete Google Workspace MCP server is in a class of it's own: it can do things that Google's own tooling and the built in integrations with Claude and ChatGPT can't come close to with multi-user support, rich fine-grained editing tools and the most extensive coverage of any Workspace AI integration in existence.
By leveraging native OAuth 2.1, stateless deployment capability and external auth server & gateway passthrough auth support, it's also the only Workspace MCP you can host for your whole organization centrally & securely!
Supports all free Google accounts & Google Workspace plans with expanded app options like Chat & Spaces. Interested in a managed cloud instance? That can be arranged (starting at $5/mo).
See it in action:
What It Does
Workspace MCP connects AI assistants to all twelve major Google Workspace services - 120+ tools behind a single MCP server, with OAuth 2.1 multi-user auth, three progressive tool tiers, read-only mode, a full CLI, and stateless container deployment. It runs locally over stdio for legacy clients and remotely over streamable HTTP with full implementation of the latest MCP spec.
The README covers just enough to get you running, with extensive documentation on the website:
Where to go | What you'll find |
Google Cloud setup, credentials, and client connection with screenshots | |
Every tool, parameter, and auth mode | |
Reverse proxy & nginx config, origin validation, credential store backends (GCS/CMEK), trusted-gateway identity, and the complete environment variable reference | |
Claude Desktop/web Connectors, ChatGPT Developer Mode, and more | |
OAuth errors, redirect URIs, Google Chat setup, client quirks |
Related MCP server: google-workspace-mcp-advanced
Security & Compliance
For Security Teams
By default, this server sends no data anywhere except Google's APIs, on behalf of the authenticated user, using your own OAuth client credentials. There is no usage reporting, analytics, license server, or SaaS dependency outside optional OTel support for your own usage.
Fully open source — every line is auditable in this repo
Your OAuth client, your GCP project — credentials never leave your environment & you control scopes
You control the network — deploy behind your reverse proxy, in your VPC, on your own terms
Stateless mode — zero disk writes for locked-down container environments
Sensitive path blocking — local file reads default to the managed attachment directory, and
validate_file_path()still blocks.env*files plus common home-directory credential stores such as~/.ssh/and~/.aws/even ifALLOWED_FILE_DIRSis broadened
Full dependency tree in pyproject.toml, pinned in uv.lock.
For Legal & Procurement
This project is MIT licensed — not "open core," not "source available," not "free with a CLA." There is no dual licensing, no commercial tier gating features, and no contributor license agreement.
Use commercially without restriction — build products, sell services, deploy internally
Fork, embed, redistribute — MIT requires only attribution
No CLA — contributions remain under MIT
No built-in telemetry to disclose — optional tracing is off unless you configure it
No network effects — the server never contacts any endpoint you didn't configure
Standard dependency licenses — MIT, Apache 2.0, and BSD throughout the dependency chain; no copyleft, no AGPL
Services
Each page lists every tool with its tier, parameters, required scopes, and example prompts. The complete reference covers all twelve in one place.
💬 Google Chat needs a one-time Chat app configuration and a Workspace account - see the Chat setup FAQ.
Quick Start
Set credentials → pick a launch command → connect your client. Full walkthrough with screenshots: workspacemcp.com/quick-start
You'll need an OAuth client from Google Cloud Console with the APIs enabled for the services you plan to use - the quick start guide walks through it in about five minutes.
Confidential Client
# 1. Credentials
export GOOGLE_OAUTH_CLIENT_ID="..."
export GOOGLE_OAUTH_CLIENT_SECRET="..."
# 2. Launch - pick a tier
uvx workspace-mcp --tool-tier core # essential tools
uvx workspace-mcp --tool-tier extended # core + management ops
uvx workspace-mcp --tool-tier complete # everything
# Or cherry-pick services
uvx workspace-mcp --tools gmail drive calendarOAuth 2.1 (PKCE)
# 1. Credentials - MCP clients connect with PKCE and no
# secret, but Google still requires one server-side
export MCP_ENABLE_OAUTH21=true
export GOOGLE_OAUTH_CLIENT_ID="..."
export GOOGLE_OAUTH_CLIENT_SECRET="..."
# Alternatively, point GOOGLE_CLIENT_SECRET_PATH at a client_secret.json
# that contains the client id and secret (env vars take precedence).
export WORKSPACE_MCP_PORT=8000
export GOOGLE_OAUTH_REDIRECT_URI="http://localhost:${WORKSPACE_MCP_PORT}/oauth2callback"
export OAUTHLIB_INSECURE_TRANSPORT=1
# 2. Launch - OAuth 2.1 requires HTTP transport
uvx workspace-mcp --transport streamable-http --tool-tier coreTool tiers keep context windows lean: core is the essential set, extended adds management operations, complete loads everything. Combine with --tools <service> ..., --read-only, or per-service --permissions, and subtract individual tools with --disabled-tools <name> ... - details in the server modes docs.
Connect Your Client
Claude Desktop, web & mobile - run the server in HTTP mode and add it as a Connector (Settings → Connectors → Add custom connector). This is the recommended path; the Connector guide has step-by-step screenshots. Legacy stdio configuration remains available for clients without Connector support - see the FAQ.
Claude Code
# Start the server in HTTP mode, then:
claude mcp add --transport http workspace-mcp http://localhost:8000/mcp
# Optional: install the bundled skill for better Workspace tool routing
ln -s "$(pwd)/skills/managing-google-workspace" ~/.claude/skills/managing-google-workspaceChatGPT - connect via Developer Mode with the ChatGPT guide.
VS Code, LM Studio, Open WebUI, and everything else - any MCP client works over streamable HTTP (recommended) or stdio. Client-specific walkthroughs live in the guides and FAQ.
CLI
workspace-cli lists and calls tools against a running server with encrypted, disk-backed OAuth token caching - authenticate once, script forever:
uv run workspace-cli list
uv run workspace-cli call search_gmail_messages query="is:unread" max_results=5Install globally with uv tool install . from this repo. ⚠️ Don't use uvx workspace-cli - an abandoned PyPI package squats that name.
Deployment & Advanced Configuration
Everything you need to run this in production lives in two places. The documentation covers auth modes and server configuration:
OAuth 2.1 multi-user auth - bearer tokens, required for remote or shared HTTP endpoints
Stateless container mode - zero disk writes for locked-down deployments
OAuth proxy storage backends - memory, disk, or Valkey/Redis for distributed setups
External OAuth provider mode - bring your own auth server, validate bearer tokens only
Service accounts with domain-wide delegation - per-request user impersonation with an optional domain allowlist
Trusted-gateway identity - proxy-verified per-user isolation with Pomerium, Cloudflare Access, oauth2-proxy, or any JWKS-verifiable gateway
OpenTelemetry tracing - optional, off unless you configure an OTLP endpoint
Docker -
docker build -t workspace-mcp . && docker run -p 8000:8000 workspace-mcp
The Advanced Deployment guide covers self-hosting specifics: reverse proxy setup with WORKSPACE_EXTERNAL_URL (including the nginx Origin: null consent workaround, the WORKSPACE_MCP_ALLOW_NULL_ORIGIN_CONSENT escape hatch, and the Referrer-Policy pitfall), origin validation and VS Code webview allowlisting, credential store backends (local directory or GCS with CMEK enforcement), and the complete environment variable reference.
Optional per-download payload ceiling for container deployments: set WORKSPACE_MCP_MAX_FILE_BYTES to a positive byte count (e.g. 5242880 for 5 MiB) to reject Drive / Gmail / Chat / Google Docs downloads that would otherwise be fully buffered in-process. Unset or 0 leaves the total size uncapped; uncapped Drive transfers still use 256 KiB transport chunks instead of the Google client's 100 MiB default. This is a file-size limit, not a process-RSS limit: leave headroom for parsing, base64/JSON representation, and concurrent tool calls. Invalid or negative values fail server startup instead of silently disabling the limit. Downloads streamed directly to disk are not subject to this in-memory payload ceiling.
Advanced OAuth 2.1 deployments affected by concurrent client token refreshes can tune FastMCP's early-refresh threshold and client-facing access-token lifetime. See .env.oauth21 for the bounded settings, recommended values, and security tradeoffs. These settings reduce how often the race occurs; they do not add a grace period to FastMCP's one-time-use refresh-token rotation.
Security Best Practices
By default this server sends no data anywhere except Google's APIs, using your own OAuth client credentials - no usage reporting, analytics, license server, or SaaS dependency. MIT licensed with no CLA, no dual licensing, and no copyleft in the dependency chain. The full security posture - scope minimization, sensitive-path blocking, stateless mode - is documented at workspacemcp.com.
A few things worth internalizing before you connect an LLM to your email:
Prompt injection is real. Emails, docs, and events can contain hidden instructions. Only connect trusted data to an LLM, and be deliberate about which write tools you enable.
Never commit
.env,client_secret.json, or.credentials/to source control.Local file reads are sandboxed to the managed attachment directory. Broaden with
ALLOWED_FILE_DIRSonly if you trust the client and its data sources;.env*,~/.ssh/,~/.aws/, and similar paths are always blocked.Production deployments should use HTTPS and OAuth 2.1.
Development
uv sync --group dev # install deps
uv run ruff check . # lint
uv run pytest # testSingle-file service modules live in g<service>/, tools are registered with @server.tool decorators, and tiers are defined in core/tool_tiers.yaml. PRs welcome.
License
MIT - see LICENSE. The license is 21 lines and says what it means.
Validations:
Available Tools
123 toolsappend_table_rowsAppend Table RowsA
Appends rows to a structured table in a Google Sheet. The rows are added to the end of the table body, automatically extending the table range.
Use list_sheet_tables first to find the table ID.
| Name | Required | Description | Default |
|---|---|---|---|
| values | Yes | 2D array of values to append. Each inner list is one row. Can be a JSON string or Python list. Required. | |
| table_id | Yes | The ID of the table to append to (get from list_sheet_tables). Required. | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only, non-idempotent, non-destructive operation. The description adds useful behavioral context by specifying that rows are appended to the end of the table body and that the table range automatically extends. This clarifies the exact side effect without contradicting 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 short, front-loaded with the core action, and every sentence contributes: one defines the operation and behavior, the other provides the essential prerequisite. There is 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 simple append operation, the description is complete: it covers what the tool does, the side effect on the table range, and the required discovery step for table_id. The output schema handles return-value expectations, and annotations handle the safety profile, so no critical guidance 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 fully documents all four parameters. The description only reinforces that table_id comes from list_sheet_tables, which is already stated in the schema's table_id description, so it adds no significant new 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?
The description states a specific verb and resource: 'Appends rows to a structured table in a Google Sheet.' It also explains the distinctive behavior—rows are added to the end of the table body and the range is automatically extended—which clearly separates it from plain spreadsheet writers like modify_sheet_values or table creation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete prerequisite: 'Use list_sheet_tables first to find the table ID,' which tells the agent the required preceding step. It does not explicitly discuss when not to use this tool or name alternatives, 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.
batch_modify_gmail_message_labelsBatch Modify Gmail Message LabelsADestructive
Adds or removes labels from multiple Gmail messages in a single batch request.
Takes MESSAGE ids, not thread ids. Gmail's batch endpoint returns no per-message result and silently ignores ids it does not recognise, so by default this reads the messages back afterwards and reports which ids actually changed.
| Name | Required | Description | Default |
|---|---|---|---|
| verify | No | Read the messages back and report per-id outcomes. Costs one extra (batched) read per id. Set False for very large sweeps where that cost matters and an unverified result is acceptable. | |
| message_ids | Yes | A list of message IDs to modify. | |
| add_label_ids | No | List of label IDs to add to the messages. | |
| remove_label_ids | No | List of label IDs to remove from the messages. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavior not visible in annotations: the batch endpoint silently ignores unrecognized ids, returns no per-message result, and defaults to reading messages back to verify which ids changed. This significantly strengthens the agent's understanding of the mutation's real-world behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the main action, then delivers the critical caveats in clear, economical sentences. 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?
The description covers the most important operational quirks and the verify behavior, and an output schema exists so return values need not be spelled out. Minor gaps remain, such as not explicitly requiring at least one of add_label_ids or remove_label_ids and not naming the singular alternative for redirection.
Complex tools with many parameters or behaviors need more documentation. Simple 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 meaningful value by clarifying that message_ids must be MESSAGE ids rather than thread ids, and by explaining the verify parameter's purpose in relation to the endpoint's silent-id 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 clearly states the specific action ('adds or removes labels'), the resource ('multiple Gmail messages'), and the batching scope ('single batch request'). This distinguishes it from sibling message-label tools like modify_gmail_message_labels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for batch label modifications and warns that it takes MESSAGE ids, not thread ids, which is useful guidance. However, it never explicitly names the singular sibling tool or states when to prefer this batch version over alternatives, leaving some selection 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.
batch_update_docBatch Update DocADestructive
Executes multiple low-level document operations in a single atomic batch update.
For normal header/footer text, prefer update_doc_headers_footers. Only use create_header_footer here for advanced section-break layouts.
RECOMMENDED WORKFLOW FOR BUILDING DOCUMENTS:
To avoid index calculation errors, build documents in phases:
PHASE 1 - INSERT ALL CONTENT (use end_of_segment=true, no index math): Append text, section breaks, and page breaks sequentially. Each operation appends to the end of the body. No index needed. Example batch: [ {"type": "insert_text", "end_of_segment": true, "text": "Report Title\n"}, {"type": "insert_text", "end_of_segment": true, "text": "\nExecutive Summary\n"}, {"type": "insert_text", "end_of_segment": true, "text": "Revenue grew 15%.\n"}, {"type": "insert_section_break", "end_of_segment": true, "section_type": "NEXT_PAGE"}, {"type": "insert_text", "end_of_segment": true, "text": "Detailed Analysis\n"} ]
PHASE 2 - CREATE HEADERS/FOOTERS (if needed): For normal header/footer text, use update_doc_headers_footers (it auto-creates if missing and writes the content for you). Only include create_header_footer operations in a batch when you are intentionally managing advanced section-break-specific layouts.
| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | List of operation dicts. Each operation MUST have a 'type' field. All operations accept an optional 'tab_id' to target a specific tab. | |
| document_id | Yes | ID of the document to update | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover destructiveness and read-only status, so the bar is lower. The description adds valuable behavioral context: the update is atomic, and building documents in phases with end_of_segment=true avoids index-calculation errors. It does not over-explain side effects beyond what the annotations already signal.
Agents need to know what a tool does to the 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 well-organized with a front-loaded core statement, a clear alternative callout, and a structured two-phase workflow. It is slightly redundant by repeating the update_doc_headers_footers guidance in both the opening and Phase 2, but the extra context about auto-creation and advanced layouts 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 complex tool with a large operation schema and an output schema, the description covers the high-risk workflow decisions—atomicity, phase ordering, and header/footer routing. It does not enumerate all operation types, but the schema handles those details. It is complete enough for an agent to select the tool and invoke it correctly in the most common scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful operational guidance on the operations parameter: a concrete example batch, the recommendation to use end_of_segment=true during content insertion, and the warning about index math. This clarifies how to structure the array beyond the raw 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: 'Executes multiple low-level document operations in a single atomic batch update.' It clearly identifies the tool's role and distinguishes it from alternatives like update_doc_headers_footers by telling agents when that sibling is preferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 explicit when-to-use guidance: prefer update_doc_headers_footers for normal header/footer text, and only use create_header_footer here for advanced section-break layouts. It also provides a phased workflow with concrete instructions to avoid index calculation errors, which goes well beyond vague context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_update_formBatch Update FormADestructive
Apply batch updates to a Google Form.
Supports adding, updating, and deleting form items, as well as updating form metadata and settings. This is the primary method for modifying form content after creation.
| Name | Required | Description | Default |
|---|---|---|---|
| form_id | Yes | The ID of the form to update. | |
| requests | Yes | List of update requests to apply. Supported request types: - createItem: Add a new question or content item - updateItem: Modify an existing item - deleteItem: Remove an item - moveItem: Reorder an item - updateFormInfo: Update form title/description - updateSettings: Modify form settings (e.g., quiz mode) | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this tool as destructive and non-read-only; the description adds useful context by specifying that deleting form items, updating metadata, and changing settings are all possible. It does not contradict the annotations and gives the agent a clearer picture of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and every sentence adds value. The supported-operation summary is compact and avoids redundant detail already present 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 mutation tool with destructive annotations and a 100%-covered schema, the description is largely complete. It could mention execution semantics such as request ordering, atomicity, or auth prerequisites, but the existing annotations and schema cover the main safety and parameter needs.
Complex tools with many parameters or behaviors need more documentation. Simple 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 input schema already documents form_id, user_google_email, and the supported request types inside the requests parameter. The description summarizes the same operations but does not add meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Apply batch updates to a Google Form.' It enumerates the supported operations and adds 'primary method for modifying form content after creation,' which clearly separates it from create_form, get_form, and set_publish_settings among the 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 provides clear context: use this tool after form creation to modify content, metadata, or settings. It does not explicitly name alternatives or state when not to use it, but the 'primary method' phrasing and scope are enough to orient an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_update_presentationBatch Update PresentationCDestructive
Apply batch updates to a Google Slides presentation.
| Name | Required | Description | Default |
|---|---|---|---|
| requests | Yes | List of update requests to apply. | |
| presentation_id | Yes | The ID of the presentation to update. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation risk is known. However, the description adds no behavioral detail beyond that: it does not mention atomicity, partial failure, irreversible changes, or what kinds of modifications can be applied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It is efficient and clear, though slightly under-specified for the complexity of the operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a destructive, open-ended batch operation with an unstructured requests array, but the description is only one generic sentence. It leaves out valid request categories, failure semantics, and usage context. The presence of an output schema covers return values, not operational guidance.
Complex tools with many parameters or behaviors need more documentation. 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 already provides 100% parameter coverage, so the bar for the description is lower. The description adds no parameter-level context beyond the schema, and the open-ended 'requests' array in particular would benefit from an example or explanation of the expected shape.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('apply batch updates') and the resource ('Google Slides presentation'), which is enough to differentiate it from read/create tools like get_presentation and create_presentation, and from the Docs/Forms batch update siblings by resource. It does not enumerate update types or scope, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives such as create_presentation, get_presentation, or batch_update_doc. An agent must infer from the name and sibling list that this is the choice for batch-mutating an existing Slides presentation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_drive_file_public_accessCheck Drive File Public AccessARead-onlyIdempotent
Searches for a file by name and checks if it has public link sharing enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| drive_id | No | ID of the shared drive to scope the search to. When set, the underlying files.list call uses corpora='drive' and the given driveId, which is required to reliably find files that live only in that shared drive. When None, behaviour is unchanged (default API corpora applies). | |
| file_name | Yes | The name of the file to check. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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, covering the safety profile. The description adds that the search is performed by file name rather than ID, but it does not disclose additional behavioral nuance such as what counts as 'public link sharing', how the user email is used, or whether only the first match is evaluated. No contradiction with annotations 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?
The description is a single, front-loaded sentence with no filler. It communicates the essential action and outcome immediately, and every word contributes to the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the strong annotations, 100% schema coverage, and the presence of an output schema, the description covers the core intent well. The only notable gap is the potential ambiguity around what exactly qualifies as 'public link sharing' and whether the tool returns a simple boolean or detailed sharing information, but the output schema likely addresses 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%, including a notably detailed explanation of the drive_id parameter and its effect on the underlying files.list call. The description itself adds no new parameter-level meaning beyond restating that the tool searches by file name and inspects public link sharing, so 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?
The description states a specific verb and resource: 'Searches for a file by name and checks if it has public link sharing enabled.' This clearly distinguishes it from siblings like get_drive_file_permissions or get_drive_shareable_link, since the focus is specifically on detecting public link sharing rather than listing permissions or retrieving links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage context: use this tool when you need to verify whether a file is publicly shareable via link. However, it does not explicitly state when not to use it or name alternatives such as get_drive_file_permissions or get_drive_shareable_link, leaving the routing decision to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_drive_fileCopy Drive FileB
Creates a copy of an existing Google Drive file.
This tool copies the template document to a new location with an optional new name. The copy maintains all formatting and content from the original file.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | The ID of the file to copy. Required. | |
| new_name | No | New name for the copied file. If not provided, uses "Copy of [original name]". | |
| parent_folder_id | No | The ID of the folder where the copy should be created. Defaults to 'root' (My Drive). | root |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (non-read-only, non-idempotent, non-destructive), so the bar is lower. The description adds useful context — the copy 'maintains all formatting and content from the original' and can be placed in a new location — but omits copy-specific behavioral caveats such as whether sharing settings or permissions are inherited by the copy, which agents often need for Drive operations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences with the core purpose front-loaded in the first. The third sentence earns its place by adding the fidelity guarantee (formatting and content preserved), while the second is largely redundant with the first plus the schema — a minor flaw, not a structural problem.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema and 100% parameter coverage give the agent a complete input contract, and annotations cover mutability and safety, so return values need no explanation. What is missing are copy-specific caveats that matter for correct invocation: whether permissions are inherited by the copy, whether a copied native Google file stays in its original format, and the access required on the source file.
Complex tools with many parameters or behaviors need more documentation. Simple 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 schema already documents file_id, new_name including the 'Copy of [original name]' default, parent_folder_id defaulting to root, and user_google_email. The description restates 'new location' and 'optional new name' at a high level but adds no meaning beyond what the schema's parameter descriptions already provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb+resource: 'Creates a copy of an existing Google Drive file,' which clearly separates it from creation tools like create_drive_file. However, it never explicitly names a sibling it is NOT, and the second sentence's reference to 'the template document' slightly muddies whether this operates on one specific template or on any arbitrary Drive 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?
No sentence tells an agent when to choose this tool versus alternatives such as create_drive_file (blank new file), import_to_google_doc (converting imports), update_drive_file (editing an existing file), or get_drive_file_content (reading). Among roughly 100 sibling tools, the only routing signal is the word 'copy' itself, which is definitional rather than actual usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_calendarCreate CalendarA
Creates a new secondary Google Calendar.
| Name | Required | Description | Default |
|---|---|---|---|
| summary | Yes | The title/name of the new calendar. | |
| timezone | No | IANA timezone for the calendar (e.g. 'America/New_York'). | |
| description | No | An optional description for the calendar. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a non-read-only, non-idempotent, non-destructive external write, and the description aligns with those hints. The description adds no extra behavioral context such as duplicate-calendar side effects or permission requirements, but the structured annotations carry enough of that burden to make the gap moderate rather than severe.
Agents need to know what a tool does to the 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 one short sentence with no filler, starts with the operative verb, and states the core resource and scope immediately. Every word earns its place, and nothing is redundant with the tool 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 simple scalar-parameter create operation with full schema coverage and an output schema, this description is nearly sufficient for correct invocation. The main missing elements are usage context and side-effect nuance, but those are partly addressed by annotations and do not block an agent from 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?
The schema documents all four parameters with descriptions and defaults, so the 100% schema coverage means the description does not need to compensate. The description adds no parameter-specific nuance, so the schema-driven 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 names a specific action ('Creates') and a specific resource ('a new secondary Google Calendar'), which clearly distinguishes it from list_calendars or event-management tools. The word 'secondary' adds important scope by indicating this tool does not create or modify the primary calendar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as list_calendars or manage_event. It also does not mention prerequisites like Google authentication or any exclusions beyond the word 'secondary', leaving the agent to infer usage context from the tool name and sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_docCreate DocA
Creates a new Google Doc and optionally inserts initial content.
After creation, the document body starts at index 1. A new empty doc has total length 2 (one section break at index 0, one newline at index 1).
To build a rich document after creation, use batch_update_doc with insert_text operations using end_of_segment=true to append content sequentially without calculating indices. Then call inspect_doc_structure to get exact positions before applying formatting in a separate batch call.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the new document | |
| content | No | Optional initial plain text content to insert | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by revealing important internal details: the body starts at index 1, a new empty doc has total length 2 with a section break at index 0 and newline at index 1. This is exactly the kind of behavioral context that helps an agent understand side effects and subsequent index calculations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is mostly concise and front-loaded with the primary purpose. It includes useful operational details, though the inner-document index explanation could be tightened slightly. Overall, every sentence earns its place and no filler 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?
Given that the tool has an output schema, fully described parameters, and annotations, the description provides complete context for correct invocation. It covers creation behavior, initial content limitations, and a clear follow-up workflow. Nothing critical is missing for an agent to use the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add significant parameter-specific semantics beyond what the schema already documents. It does clarify that the content parameter is for initial plain text and that rich content should be built with batch_update_doc, but this is contextual rather than parameter-specific.
Input schemas describe structure but not intent. Descriptions should explain 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: 'Creates a new Google Doc and optionally inserts initial content.' This clearly states the tool's function and differentiates it from siblings like import_to_google_doc and create_drive_file by explicitly focusing on creating a Google Doc from scratch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear workflow guidance: after creation, use batch_update_doc with insert_text operations and end_of_segment=true, then inspect_doc_structure before formatting. It does not explicitly compare create_doc with alternative creation tools like import_to_google_doc, but the post-creation workflow is strong enough to guide an agent on when and how to proceed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_drive_fileCreate Drive FileA
Creates a new file in Google Drive, supporting creation within shared drives. Accepts direct text content, inline base64 bytes, or a fileUrl to fetch content from. This stores the supplied bytes without converting them to Google Docs, Sheets, or Slides. Use the matching import_to_google_* tool for Google-native conversion.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | If provided, the content to write to the file. | |
| fileUrl | No | If provided, fetches the file content from this URL. Supports file://, http://, and https:// protocols. | |
| file_name | Yes | The name for the new file. | |
| folder_id | No | The ID of the parent folder. Defaults to 'root'. For shared drives, this must be a folder ID within the shared drive. | root |
| mime_type | No | The MIME type of the file. Defaults to 'text/plain'. | text/plain |
| base64_sha256 | No | Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks. | |
| base64_content | No | Standard base64-encoded file bytes. | |
| content_mime_type | No | MIME type for base64_content uploads. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutating, non-idempotent operation. The description adds valuable behavior beyond that: it stores the exact bytes without converting formats, and it may fetch content from a URL. It does not discuss failure modes, size limits, or parameter precedence, but the core behavioral traits are well disclosed.
Agents need to know what a tool does to the 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 efficient sentences, front-loaded with the primary action and scope, followed by input modes and the key non-conversion caveat plus routing to the sibling tool. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich 100%-covered schema and an output schema, the description provides enough high-level context for an agent to understand the tool's purpose and boundaries. A minor gap is that it does not specify what happens if multiple content sources (content, base64_content, fileUrl) are provided simultaneously.
Complex tools with many parameters or behaviors need more documentation. Simple 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 groups content parameters into three modes ('direct text content, inline base64 bytes, or a fileUrl') but mostly restates what the schema already documents. It adds little parameter-specific detail beyond that conceptual grouping.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Creates') and resource ('a new file in Google Drive'), and adds clarifying scope: creation within shared drives and non-conversion to Google-native formats. It clearly distinguishes the tool from sibling import_to_google_* and Google-native creation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states that for Google-native conversion the agent should use the matching import_to_google_* tool, giving a clear when-not-to-use signal. It does not, however, give guidance on how to choose among the three content input methods (text, base64, fileUrl) for different scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_drive_folderCreate Drive FolderA
Creates a new folder in Google Drive, supporting creation within shared drives.
| Name | Required | Description | Default |
|---|---|---|---|
| folder_name | Yes | The name for the new folder. | |
| parent_folder_id | No | The ID of the parent folder. Defaults to 'root'. For shared drives, use a folder ID within that shared drive. | root |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey the key behavioral traits: non-read-only, non-idempotent, non-destructive, open-world. The description confirms the mutating creation behavior and adds shared-drive support as extra context. It does not detail auth requirements or side effects, but the annotation coverage lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the core action first and adds the shared-drive qualifier without redundancy. It contains no filler and does not repeat schema or annotation information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward create operation, the description, schema, and annotations together give an agent enough to invoke the tool correctly: required parameters are documented, safety traits are annotated, and an output schema exists. Minor details like permission prerequisites are unstated but are not essential for basic selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description's shared-drive mention aligns with and echoes the existing parent_folder_id schema note rather than adding materially new 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?
The description states a specific verb and resource: 'Creates a new folder in Google Drive.' It clearly distinguishes from siblings like create_drive_file by limiting the action to folders, and it adds the meaningful shared-drive capability 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?
The description gives clear context for when to use the tool: creating folders in Google Drive, including within shared drives. It does not explicitly name alternatives or exclusions, but the resource type is unambiguous enough that an agent can route to this tool for folder creation versus file creation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_formCreate FormB
Create a new form using the title given in the provided form message in the request.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | The title of the form. | |
| description | No | The description of the form. | |
| document_title | No | The document title (shown in browser tab). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a mutating, non-idempotent operation, so the bar is lower. The description adds a small behavioral detail about the title coming from 'the provided form message,' but it doesn't clarify side effects, authentication needs, or the created form's lifecycle.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. However, the phrasing 'using the title given in the provided form message in the request' is roundabout and slightly hurts clarity, preventing a top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple creation tool, the full schema, annotations, and output schema carry much of the burden. The description is mostly sufficient, but it leaves a gap around when to use create_form versus form-update tools, and it never clarifies what 'provided form message' means.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already fully documents the parameters. The description adds no meaningful parameter semantics beyond the schema, and the phrase 'title given in the provided form message' could even create confusion about the source of the title parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource ('Create a new form'), and the word 'new' distinguishes it from update/get form siblings. The tail clause about 'provided form message' is ambiguous, but the core purpose is still clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance about when to use this tool versus alternatives like batch_update_form, get_form, or set_publish_settings. It also doesn't mention prerequisites such as completing authentication or requiring an authenticated Google account.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_presentationCreate PresentationB
Create a new Google Slides presentation.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | The title for the new presentation. Defaults to "Untitled Presentation". | Untitled Presentation |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the description does not need to cover those basics. It adds only 'new' to indicate a fresh resource is created, but provides no details on return values, side effects, or relationship to Google Drive. However, since an output schema exists and there is no contradiction with annotations, a mid-range score is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that conveys the essential action without filler. Every word earns its place, and the key verb and resource are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter create tool with full schema coverage, an output schema, and meaningful annotations, the one-sentence description is largely sufficient. It lacks only occasional context such as that the resulting presentation will be stored in Google Drive, but this is not critical given the schema and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both user_google_email and title have adequate schema descriptions. The tool description adds no additional parameter meaning beyond what the schema already provides, so the baseline of 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Create') and resource ('a new Google Slides presentation'), making the core purpose clear. It does not explicitly differentiate from the sibling import_to_google_slides, which also results in a Slides presentation, so it falls short of full sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as import_to_google_slides or create_drive_file. There is no mention of prerequisites, when a new blank presentation is appropriate, or when another sibling would be a better choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_reactionCreate ReactionA
Adds an emoji reaction to a Google Chat message.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | The message resource name (e.g. spaces/X/messages/Y). | |
| emoji_unicode | Yes | The emoji character to react with (e.g. 👍). | |
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a non-read-only, non-idempotent, non-destructive operation, and the description aligns with that. However, the description adds no extra behavioral context beyond the core action, such as the reaction being publicly visible to space members, duplicate-reaction behavior, or any authorization requirements. It is adequate but not informative beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that immediately states the action and target. Every word contributes value and there is no filler or repetition of the 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?
The tool is simple and an output schema exists, so the description does not need to cover return values. However, the required user_google_email parameter is left ambiguous in both the schema and the description, and no usage context (e.g., acting as a specific user or needing space membership) is provided. The description is minimally viable but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes message_id and emoji_unicode, but user_google_email has no schema description. The tool description does not explain any parameters or compensate for the undocumented required field. Since schema coverage is only 67% and the description adds no param-level meaning, the agent is left to guess the role of user_google_email.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Adds') with a specific resource ('emoji reaction') and target ('Google Chat message'). It is immediately clear what the tool does and it distinguishes itself from all sibling tools, none of which mention reactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: the tool is for adding an emoji reaction to a Chat message. No sibling tool performs this action, so no exclusions or alternatives need to be named. It falls short of a 5 only because it does not explicitly state when not to use it or mention related Chat tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_script_projectCreate Script ProjectB
Creates a new Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Project title | |
| parent_id | No | Optional Drive folder ID or bound container ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutating, non-idempotent operation, so the safety profile is covered. The description adds that this creates a new project rather than modifying an existing one, which is useful but minimal. It does not disclose details such as whether the project is created in Drive, what happens if a project with the same title exists, or whether any additional resources are implicitly created. No contradiction with annotations 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?
The description is a single sentence with no wasted words, making it easy to parse and front-loaded with the key verb and noun. It is appropriately concise for a simple creation tool, though it could have used the brief format to add a bit more context without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and annotations, the description covers the basic action but lacks context about the project lifecycle, the role of parent_id, and the need for prior Google authentication. The sibling list hints at a script-project management workflow, but the description does not explicitly connect this tool to that workflow. It is minimally viable but leaves the agent to discover important surrounding context elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters, including title, parent_id, and user_google_email. The description adds no additional meaning about these parameters or their relationships. This is the expected baseline case where the schema carries the parameter documentation 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 uses a specific verb and resource: 'Creates a new Apps Script project.' It clearly distinguishes this from sibling tools like list_script_projects, get_script_project, update_script_content, and delete_script_project by focusing on creation. It does not state the broader context of what an Apps Script project is, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives, such as when to use create_script_project instead of create_drive_file or update_script_content. The description does not mention prerequisites like prior authentication or the relationship to other script-management tools. Agents are left to infer usage from the tool name and sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sheetCreate SheetB
Creates a new sheet or duplicates an existing sheet (user_google_email: str, spreadsheet_id: str, sheet_name: Optional[str] = None, source_sheet_name: Optional[str] = None, insert_sheet_index: Optional[int] = None).
| Name | Required | Description | Default |
|---|---|---|---|
| sheet_name | No | ||
| spreadsheet_id | Yes | ||
| source_sheet_name | No | ||
| user_google_email | Yes | ||
| insert_sheet_index | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a non-read-only, non-idempotent, non-destructive operation. The description adds the key behavioral fact that it can either create a blank sheet or duplicate an existing sheet, which goes beyond the annotations. It does not describe side effects, copy behavior, naming conflicts, or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one dense, front-loaded sentence followed by a compact signature. There is no filler, though the signature partially duplicates information already present 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 tool with five parameters and zero schema descriptions, the description is adequate but lean: it states the core operation and lists all parameters, and an output schema exists so return values need not be described. Missing context includes when each optional parameter applies, how duplication differs from creating a blank sheet, and how this tool differs from create_spreadsheet.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description includes the full function signature, which helps identify all five parameters and their optionality, and the phrase 'duplicates an existing sheet' gives meaning to source_sheet_name. This partially compensates for the 0% schema description coverage, but there are no per-parameter explanations such as how insert_sheet_index behaves or the relationship between sheet_name and source_sheet_name.
Input schemas describe structure but not intent. Descriptions should explain 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 clear action and resource: it creates a new sheet or duplicates an existing one, which is specific and not a tautology. It does not explicitly distinguish itself from the sibling create_spreadsheet, but the use of 'sheet' and the spreadsheet_id parameter make the target resource reasonably clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 intended use case is implied by the phrasing: use this tool when a new sheet tab or a duplicate of an existing sheet is needed. However, there is no explicit guidance about when to prefer create_spreadsheet instead, nor any exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_spreadsheetCreate SpreadsheetB
Creates a new Google Spreadsheet.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | The title of the new spreadsheet. Required. | |
| sheet_names | No | List of sheet names to create. If not provided, creates one sheet with default name. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate that this is a mutating operation (readOnlyHint=false) and non-destructive (destructiveHint=false), and the description does not contradict them. The description adds the domain context that the created resource is a Google Spreadsheet, but it does not disclose side effects like Drive file creation, default sharing, or permission implications. This is acceptable given the annotations but lacks deeper behavioral detail.
Agents need to know what a tool does to the 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 one short, direct sentence that front-loads the core action and resource. Every word earns its place, and there is no redundant or filler content. For a simple creation tool, this is appropriately concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The input schema and output schema cover the technical details, so the description does not need to explain return values or parameter formats. However, given the large sibling toolset, the description lacks enough context to help an agent decide between 'create_spreadsheet' and related tools like 'create_sheet' or 'import_to_google_sheets'. It is minimally viable but incomplete for tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters 'title', 'sheet_names', and 'user_google_email' are already well documented in the schema. The description adds no additional parameter-level meaning, which is acceptable because the schema carries the full burden. This aligns with the baseline 3 for fully documented schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Creates') and the resource ('a new Google Spreadsheet'), so an agent can understand the core purpose. However, it does not differentiate from the sibling tool 'create_sheet', which could be confused as creating a spreadsheet rather than a worksheet within one. A more explicit distinction would earn 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?
There is no guidance about when to use this tool versus alternatives such as 'create_sheet', 'create_drive_file', or 'import_to_google_sheets'. The description gives no context about prerequisites, ownership implications, or which sibling tools are more appropriate in specific scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_table_with_dataCreate Table with DataA
Creates a table and populates it with data in one reliable operation.
CRITICAL: YOU MUST CALL inspect_doc_structure FIRST TO GET THE INDEX!
MANDATORY WORKFLOW - DO THESE STEPS IN ORDER:
Step 1: ALWAYS call inspect_doc_structure first Step 2: Use the 'total_length' value from inspect_doc_structure as your index Step 3: Format data as 2D list: [["col1", "col2"], ["row1col1", "row1col2"]] Step 4: Call this function with the correct index and data
EXAMPLE DATA FORMAT: table_data = [ ["Header1", "Header2", "Header3"], # Row 0 - headers ["Data1", "Data2", "Data3"], # Row 1 - first data row ["Data4", "Data5", "Data6"] # Row 2 - second data row ]
CRITICAL INDEX REQUIREMENTS:
NEVER use index values like 1, 2, 10 without calling inspect_doc_structure first
ALWAYS get index from inspect_doc_structure 'total_length' field
Index must be a valid insertion point in the document
DATA FORMAT REQUIREMENTS:
Must be 2D list of strings only
Each inner list = one table row
All rows MUST have same number of columns
Use empty strings "" for empty cells, never None
Use debug_table_structure after creation to verify results
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | Document position (MANDATORY: get from inspect_doc_structure 'total_length') | |
| tab_id | No | Optional tab ID to create the table in a specific tab | |
| table_data | Yes | 2D list of strings - EXACT format: [["col1", "col2"], ["row1col1", "row1col2"]] | |
| document_id | Yes | ID of the document to update | |
| header_rows | No | Number of leading rows to mark as a repeating header that reappears after each page break. Must be between 0 and the number of table rows (default: 0 = none) | |
| bold_headers | No | Whether to make first row bold (default: true) | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=false and destructiveHint=false, so the mutation behavior is established. The description adds valuable behavioral context: it creates and populates a table in one operation, requires an index from inspect_doc_structure, enforces a 2D string-only format, and recommends debug_table_structure for verification. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized into sections and clearly front-loads the critical inspect_doc_structure call, but it is repetitive: the same index requirement is emphasized in the workflow, the critical requirements, and the schema parameter description. The all-caps warnings add urgency but also length without adding much 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 tool with 7 parameters and an output schema, the description covers the essential invocation context: the mandatory prior call, how to derive the index, the exact table_data structure, and a post-verification step. It does not need to explain return values because an output schema exists, and the remaining schema fields like tab_id, header_rows, and bold_headers are already described in the input schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter. The description adds meaningful semantics beyond the schema by showing the exact 2D array format with a header row example, requiring equal-length rows, and explicitly stating that empty strings should be used instead of None. This compensates for any ambiguity in the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain 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 opening line states a specific verb and resource: 'Creates a table and populates it with data in one reliable operation.' This is clear and distinct from the generic tool name, though it does not explicitly contrast with sibling tools like insert_doc_elements or create_sheet.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 an explicit mandatory workflow: call inspect_doc_structure first, use the returned total_length as the index, format data as a 2D list, and verify with debug_table_structure. It clearly states when to invoke this tool and the required precondition, though it does not discuss when not to use it or name an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_versionCreate VersionA
Creates a new immutable version of a script project.
Versions capture a snapshot of the current script code. Once created, versions cannot be modified.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID | |
| description | No | Optional description for this version | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a mutating (readOnlyHint=false), non-idempotent operation. The description adds genuinely useful behavioral context beyond annotations: versions are immutable snapshots, and 'Once created, versions cannot be modified' warns the agent of a permanent consequence. This is consistent with idempotentHint=false and destructiveHint=false, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero waste: the core action is front-loaded, the second sentence explains what a version is, and the third states the critical constraint. Every sentence earns its place and no information is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (so return values need no explanation) and annotations cover the safety profile, the description adequately conveys the semantics and the immutable nature of the created artifact. A minor gap is the absence of guidance on prerequisites or sequencing relative to update_script_content, but nothing essential blocks correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (script_id, description, user_google_email) are already documented structurally. The description adds minimal param-specific meaning beyond reinforcing that the snapshot captures 'current script code' for the given script project. Baseline 3 is appropriate; 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-resource pair ('Creates a new immutable version of a script project') and adds the key attribute 'immutable'. This clearly distinguishes it from siblings like list_versions, get_version, create_script_project, and update_script_content, so an agent can tell them apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case — 'Versions capture a snapshot of the current script code' suggests you call this when you want to freeze the current code state. However, it never explicitly names alternatives or states when not to use it (e.g., when you need to modify code first via update_script_content, or when you simply want to view versions via list_versions).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_docs_runtime_infoDebug Docs Runtime InfoARead-onlyIdempotent
Return runtime/source information for diagnosing stale MCP server instances.
This is a temporary diagnostic tool intended to verify which code checkout the running MCP server has loaded.
| Name | Required | Description | Default |
|---|---|---|---|
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, so the description does not need to repeat that. It adds useful context beyond annotations by marking the tool as temporary and diagnostic, clarifying that it inspects runtime/source state rather than user data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with no filler. The main action and diagnostic purpose are front-loaded, and the temporary nature is stated concisely in the second 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 simple one-parameter tool with a rich output schema and strong annotations, the description covers what the tool does and when to use it. The only notable gap is the unexplained parameter semantics, which is partially mitigated by the clear parameter name.
Complex tools with many parameters or behaviors need more documentation. Simple 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 needed to explain the required `user_google_email` parameter but does not. The parameter name is somewhat self-explanatory, but the description does not clarify whose email is expected or how it is used for diagnosis.
Input schemas describe structure but not intent. Descriptions should explain 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: 'Return runtime/source information' and 'verify which code checkout the running MCP server has loaded.' It clearly distinguishes itself as a temporary diagnostic tool among the many operational Google Workspace sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly identifies the use case: 'diagnosing stale MCP server instances' and verifies which code checkout is loaded. It gives clear context for when to use the tool, though it does not name alternatives or exclusions, which are largely unnecessary given its unique diagnostic role.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_table_structureDebug Table StructureARead-onlyIdempotent
ESSENTIAL DEBUGGING TOOL - Use this whenever tables don't work as expected.
USE THIS IMMEDIATELY WHEN:
Table population put data in wrong cells
You get "table not found" errors
Data appears concatenated in first cell
Need to understand existing table structure
Planning to use populate_existing_table
WHAT THIS SHOWS YOU:
Exact table dimensions (rows × columns)
Each cell's position coordinates (row,col)
Current content in each cell
Insertion indices for each cell
Table boundaries and ranges
HOW TO READ THE OUTPUT:
"dimensions": "2x3" = 2 rows, 3 columns
"position": "(0,0)" = first row, first column
"current_content": What's actually in each cell right now
"insertion_index": Where new text would be inserted in that cell
WORKFLOW INTEGRATION:
After creating table → Use this to verify structure
Before populating → Use this to plan your data format
After population fails → Use this to see what went wrong
When debugging → Compare your data array to actual table structure
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes | ID of the document to inspect | |
| table_index | No | Which table to debug (0 = first table, 1 = second table, etc.) | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive; the description adds valuable behavioral detail by specifying exactly what the output contains and how to interpret fields like dimensions, position, current_content, and insertion_index. It also makes clear the tool inspects rather than mutates, with no contradiction to 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 long but well-structured with bolded trigger conditions, output explanations, and workflow steps that are easy to scan. Each section conveys actionable guidance, though some repetition of the tool's core purpose 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?
The description covers when to use the tool, how to read its output, and how it fits into a workflow, while the output schema handles the return structure. One minor gap: it references 'populate_existing_table' as a scenario, but that tool does not appear in the sibling tool list, creating slight routing ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters with helpful descriptions and a default for table_index. The description does not add parameter-specific guidance beyond what the schema provides, so the baseline score of 3 is appropriate given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool debugs table structure and enumerates what it reveals: dimensions, cell positions, current content, insertion indices, and boundaries. It is unambiguous about the resource and purpose, though it does not explicitly contrast with sibling inspection tools like inspect_doc_structure or create_table_with_data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit 'USE THIS IMMEDIATELY WHEN' list and a workflow integration section covering after creation, before population, and after failures. It lacks an explicit when-not-to-use section or named alternative tools, 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.
delete_script_projectDelete Script ProjectADestructive
Deletes an Apps Script project.
This permanently deletes the script project. The action cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID to delete | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false. The description adds valuable behavioral context by stating 'This permanently deletes the script project. The action cannot be undone.' This reinforces the irreversibility in a way the annotations do not fully convey. No contradiction 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?
The description is two short sentences, with the core action first and the critical permanent-deletion warning second. Every sentence earns its place, and there is no filler or redundant 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 simple two-parameter destructive tool with output schema, annotations, and full schema coverage, the description covers the essential irreversible nature of the operation. It is slightly incomplete because it does not mention when deletion should be used or what happens to related resources, but these are largely covered by the annotations and clear purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both script_id and user_google_email already documented in the input schema. The description adds no additional parameter-level meaning, but it does not need to because the schema covers the parameters adequately. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Deletes an Apps Script project.' It further clarifies that the deletion is permanent, which clearly distinguishes this destructive tool from sibling tools like list_script_projects, get_script_project, create_script_project, and update_script_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?
The description gives no guidance about when to use this tool versus alternatives, when deletion is appropriate, or what prerequisites apply. It only restates the action itself and its irreversibility. There is no explicit or implicit comparison to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_chat_attachmentDownload Chat AttachmentA
Downloads an attachment from a Google Chat message and saves it to local disk.
In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour).
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | The message resource name (e.g. spaces/X/messages/Y). | |
| attachment_index | No | Zero-based index of the attachment to download (default 0). | |
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false) are consistent with the description, so no contradiction. The description adds genuine value beyond annotations: it discloses the side effect of writing to local disk and the mode-dependent return semantics (local path in stdio vs temporary URL with a 1-hour expiry in HTTP), 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?
Two compact sentences carry all essential information with no filler. The core function is front-loaded in the first sentence, and the mode-specific details occupy the second. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists to cover return values, and annotations cover the safety profile, lowering the burden on the description. The mode-specific behavior disclosure is a meaningful addition. Remaining gaps are the undocumented required user_google_email parameter and lack of error-behavior guidance (e.g., out-of-range attachment_index or messages with no attachments), but these are minor given the structured coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the two documented parameters (message_id with a concrete example, attachment_index with default semantics) are well described. However, the required parameter user_google_email has zero documentation in both the schema and the description, and the description does nothing to compensate for this gap. With one required param unexplained, the agent cannot confidently construct valid calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb ('Downloads'), resource ('attachment from a Google Chat message'), and outcome ('saves it to local disk'). It clearly distinguishes this from sibling tools like get_gmail_attachment_content (Gmail domain) and get_drive_file_download_url (URL only, not a download) by explicitly scoping to Google Chat.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 operational context by explaining stdio vs HTTP mode return behavior, which helps the agent know what to do with the result. However, it never explicitly states when to use this tool versus similar alternatives such as get_gmail_attachment_content or get_drive_file_download_url; the routing is left to inference from the Chat domain in the name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_gmail_messageDraft Gmail MessageA
Creates a draft email in the user's Gmail account. Supports both new drafts and reply drafts with optional attachments. Supports Gmail's "Send As" feature to draft from configured alias addresses.
SCHEDULED SEND IS NOT AVAILABLE. Gmail's REST API exposes no send-time parameter; the Schedule send feature is web-UI only, and a message cannot be placed in the Scheduled folder through the API. Do not claim a message was scheduled. To deliver at a chosen time, create a draft with draft_gmail_message. An external scheduler must retain the message data to create and send a new message via send_gmail_message then, or call users.drafts.send with the draft ID returned by draft_gmail_message. Alternatively, let the user schedule the draft in the Gmail UI.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Optional CC email address. | |
| to | No | Optional recipient email address. | |
| bcc | No | Optional BCC email address. | |
| body | Yes | Email body (plain text). | |
| subject | Yes | Email subject. | |
| from_name | No | Optional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'. | |
| thread_id | No | Optional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID. | |
| from_email | No | Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the account's default Send As address, falling back to the authenticated user's email when Gmail returns no usable Send-As entry or settings access is not authorized. | |
| references | No | Optional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target. | |
| attachments | No | Optional list of attachments. Each can have: 'url' (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR 'path' (file path, auto-encodes), OR 'content' (standard base64, not urlsafe) + 'filename'. Optional 'mime_type'. Optional 'content_id' (string) makes the attachment inline-rendered: it lands in a multipart/related part with `Content-ID: <content_id>` and `Content-Disposition: inline`, and the HTML body can reference it via `<img src="cid:<content_id>">` (RFC 2392). Without `content_id` the attachment is a regular multipart/mixed attachment. | |
| body_format | No | Email body format. Use 'plain' for plaintext or 'html' for HTML content. | plain |
| in_reply_to | No | Optional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id. | |
| quote_original | No | Whether to include the original message as a quoted reply. Only has an effect when thread_id is provided. Defaults to false. | |
| include_signature | No | Whether to append the Gmail signature from Settings > Signature when available. Defaults to true. | |
| user_google_email | Yes | The user's Google email address. Required for authentication. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark the tool as a non-destructive mutation (readOnlyHint=false, destructiveHint=false), and the description adds the critical behavioral caveat that no send-time parameter exists and drafts cannot be placed in the Scheduled folder. It also discloses Send As behavior and reply-draft capability, though it does not explicitly state that no email is sent until a separate send action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and the scheduled-send warning is important enough to justify its length. However, the warning paragraph repeats the same limitation in several ways ('no send-time parameter', 'web-UI only', 'cannot be placed in the Scheduled folder'), so it is slightly less tight than it could 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?
For a 15-parameter tool, the schema and output schema carry the detailed semantics, and the description covers the non-obvious scheduling limitation and the correct alternate workflow. An agent selecting this tool has everything it needs to avoid the scheduled-send misconception.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter, including the attachment object shape and body_format enum, is documented there. The description only repeats the existence of attachments and Send As, adding little parameter-level meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb ('Creates'), a resource ('draft email in the user's Gmail account'), and the tool's core output. It also names reply drafts, attachments, and Send As, and the scheduling section explicitly points to send_gmail_message as the sending counterpart, so an agent can distinguish it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly warns that scheduled send is not available and tells agents not to claim a message was scheduled. It then gives the correct workflow: draft now, then use an external scheduler with send_gmail_message or users.drafts.send, or let the user schedule in the Gmail UI. This is 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.
export_doc_to_pdfExport Doc to PDFA
Exports a Google Doc to PDF format and saves it to Google Drive.
| Name | Required | Description | Default |
|---|---|---|---|
| folder_id | No | Drive folder ID to save PDF in (optional - if not provided, saves in root) | |
| document_id | Yes | ID of the Google Doc to export | |
| pdf_filename | No | Name for the PDF file (optional - if not provided, uses original name + "_PDF") | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal a non-read-only, non-idempotent, non-destructive operation. The description adds that the result is saved to Google Drive, which clarifies the output location, but it does not disclose prerequisites, permission requirements, or duplicate/overwrite behavior. This is acceptable but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word contributes: the action, the source format, the target format, and the destination are all included 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 relatively simple conversion tool, the description, full parameter schema, annotations, and existing output schema provide enough information for an agent to call it correctly. It is slightly incomplete only in not addressing edge cases like file naming defaults or authorization context, but those are covered elsewhere or are non-essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all four parameters with 100% coverage. The description does not add parameter-level meaning beyond aligning document_id with the source doc and folder_id with the Drive destination, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Exports') and resource ('Google Doc to PDF format'), and also notes the output destination ('saves it to Google Drive'). This is distinguishable from siblings such as get_doc_as_markdown or copy_drive_file, none of which perform PDF conversion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use this when you need a PDF version of a Google Doc saved to Drive. However, the description provides no explicit when-to-use guidance, no exclusions, and does not name alternatives such as get_doc_as_markdown or get_drive_file_download_url.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_and_replace_docFind and Replace DocADestructive
Finds and replaces text throughout a Google Doc. No index calculation required.
This is the safest way to update specific text in a document because it does not require knowing any indices. Use this tool when you need to:
Replace placeholder text (e.g., {{TITLE}}) with real content
Update specific words or phrases throughout the document
Make targeted text changes without risk of index errors
For building documents from scratch, consider inserting text with unique placeholders via batch_update_doc, then using this tool to replace them.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional ID of the tab to target | |
| find_text | Yes | Text to search for | |
| match_case | No | Whether to match case exactly | |
| document_id | Yes | ID of the document to update | |
| replace_text | Yes | Text to replace with | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and idempotentHint=false, so the safety burden is partially carried there. The description adds useful context that replacement happens 'throughout' the document and frames it as the 'safest way' to avoid index errors. It does not contradict the annotations, and no annotation contradiction is present.
Agents need to know what a tool does to the 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 behavior and then provides a clear, scannable bullet list of use cases. It is slightly repetitive with 'safest way' and 'without risk of index errors,' but overall each section earns its place and the structure supports quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists and parameter coverage is complete, the description provides enough context for an agent to select and invoke the tool correctly. It covers scope, use cases, and a relevant alternative workflow. It could be more complete by explicitly noting that all occurrences are replaced or by naming index-based sibling tools, but these are gaps rather than blockers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all six parameters. The description adds context around placeholder replacement and content updating, which helps illustrate find_text and replace_text usage, but does not substantially deepen the meaning of individual parameters beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Finds and replaces text throughout a Google Doc.' It also adds a distinctive behavioral claim, 'No index calculation required,' which differentiates it from index-based document editing tools. The use-case bullets reinforce what the tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 explicit when-to-use scenarios: replacing placeholders, updating words or phrases, and making targeted changes without index errors. It also names an alternative workflow using batch_update_doc for building documents from scratch. However, it does not explicitly contrast itself with sibling tools like modify_doc_text when index-based edits are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
format_sheet_rangeFormat Sheet RangeA
Applies formatting to a range: colors, number formats, text wrapping, alignment, and text styling.
Colors accept hex strings (#RRGGBB). Number formats follow Sheets types (e.g., NUMBER, CURRENCY, DATE, PERCENT). If no sheet name is provided, the first sheet is used.
| Name | Required | Description | Default |
|---|---|---|---|
| bold | No | Whether to apply bold formatting. | |
| italic | No | Whether to apply italic formatting. | |
| font_size | No | Font size in points. | |
| range_name | Yes | A1-style range (optionally with sheet name). Required. | |
| text_color | No | Hex text color (e.g., "#000000"). | |
| wrap_strategy | No | Text wrap strategy - WRAP (wrap text within cell), CLIP (clip text at cell boundary), or OVERFLOW_CELL (allow text to overflow into adjacent empty cells). | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| background_color | No | Hex background color (e.g., "#FFEECC"). | |
| user_google_email | Yes | The user's Google email address. Required. | |
| number_format_type | No | Sheets number format type (e.g., "DATE"). | |
| vertical_alignment | No | Vertical text alignment - TOP, MIDDLE, or BOTTOM. | |
| horizontal_alignment | No | Horizontal text alignment - LEFT, CENTER, or RIGHT. | |
| number_format_pattern | No | Custom pattern for the number format. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish that the tool mutates state but is not destructive. The description adds meaningful behavior beyond the schema: colors must be hex strings, number formats follow Sheets types, and an unspecified sheet means the first sheet is used. It does not mention whether existing formatting is overwritten, but the destructiveHint already frames the tool as non-destructive.
Agents need to know what a tool does to the 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 with no filler. It front-loads the core purpose, then provides concrete syntax guidance and a default-behavior note, all of which earn their 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 13 parameters, complete schema coverage, an output schema, and annotations, the description provides the essential operating rules without needing to restate every parameter. It could be slightly more explicit about overriding existing formatting, but nothing critical is missing for an agent 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 description coverage is 100%, so the baseline is 3, but the description adds cross-cutting value by explaining the accepted format for colors, the Sheets-specific number format types, and the fallback behavior when range_name omits a sheet name. These details are not fully captured by the schema's 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?
The description opens with a clear active verb and resource: 'Applies formatting to a range,' then enumerates the kinds of formatting covered. This makes it distinct from value-editing spreadsheet siblings like modify_sheet_values or read_sheet_values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 usage context is implied by the formatting-specific vocabulary, but the description never explicitly says when to choose this tool over alternatives such as modify_sheet_values or manage_conditional_formatting. It adds a useful default-sheet note but no when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_trigger_codeGenerate Trigger CodeARead-onlyIdempotent
Generates Apps Script code for creating triggers.
The Apps Script API cannot create triggers directly - they must be created from within Apps Script itself. This tool generates the code you need.
| Name | Required | Description | Default |
|---|---|---|---|
| schedule | No | Schedule details (depends on trigger_type): - For time_minutes: "1", "5", "10", "15", or "30" - For time_hours: "1", "2", "4", "6", "8", or "12" - For time_daily: hour as "0"-"23" (e.g., "9" for 9am) - For time_weekly: "MONDAY", "TUESDAY", etc. - For simple triggers (on_open, on_edit): not needed | |
| trigger_type | Yes | Type of trigger. One of: - "time_minutes" (run every N minutes: 1, 5, 10, 15, 30) - "time_hours" (run every N hours: 1, 2, 4, 6, 8, 12) - "time_daily" (run daily at a specific hour: 0-23) - "time_weekly" (run weekly on a specific day) - "on_open" (simple trigger - runs when document opens) - "on_edit" (simple trigger - runs when user edits) - "on_form_submit" (runs when form is submitted) - "on_change" (runs when content changes) | |
| function_name | Yes | The function to run when trigger fires (e.g., "sendDailyReport") |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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, covering the safety profile. The description adds useful context about the API limitation and the code-generation nature of the tool, but does not go beyond that into further behavioral details such as output format or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief, front-loaded with the core purpose, and every sentence adds value. The constraint explanation is essential context and is presented in two compact sentences without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the rich input schema, and the presence of an output schema, the description is complete enough. It explains the key contextual constraint (API cannot directly create triggers) and the tool's role without needing to restate structured details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all parameters thoroughly. The description does not add parameter-level meaning, meeting 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?
The description uses a specific verb ('Generates') and identifies the exact resource ('Apps Script code for creating triggers'). It clearly distinguishes what the tool does from siblings by focusing on code generation rather than direct trigger creation or script management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when this tool is needed: because the Apps Script API cannot create triggers directly and they must be created from within Apps Script itself. This provides clear context for when to use the tool, though it does not explicitly name alternative tools or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactGet ContactARead-onlyIdempotent
Get detailed information about a specific contact.
| Name | Required | Description | Default |
|---|---|---|---|
| contact_id | Yes | The contact ID (e.g., "c1234567890" or full resource name "people/c1234567890"). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 clear. The description adds no extra behavioral context, such as authentication needs or error behavior, but it also does not contradict 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 a single concise sentence that immediately states the action and resource. Every word earns its place, and there is 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 simple read tool, the combination of a complete input schema, a true output schema, and safety annotations covers most of what an agent needs. The description is minimal but sufficient, though it does not mention how to obtain the contact_id (e.g., via list_contacts).
Complex tools with many parameters or behaviors need more documentation. Simple 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 are already well-documented in the input schema. The description does not add additional semantic meaning beyond the implicit 'specific contact' reference, which aligns with contact_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?
The description 'Get detailed information about a specific contact' clearly identifies a read operation for a single contact, using a specific verb and resource. It is distinct from sibling tools like list_contacts or search_contacts because it targets a specific contact, though it does not explicitly name any 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?
The phrase 'a specific contact' implies this tool should be used when a contact_id is already known, providing minimal usage context. However, it does not mention alternatives or conditions for choosing between get_contact, search_contacts, or list_contacts, so the guidance is only implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contact_groupGet Contact GroupARead-onlyIdempotent
Get details of a specific contact group including its members.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | The contact group ID. | |
| max_members | No | Maximum number of members to return (default: 100, max: 1000). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose read-only, idempotent, and non-destructive behavior, so the description does not need to repeat safety traits. It adds the useful detail that members are returned, but it does not describe pagination limits or other behavioral nuances beyond what the schema already conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that delivers the core purpose without filler. It is appropriately sized for a simple read operation and front-loads the key idea.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has full schema coverage, a rich set of annotations, and an output schema, so the description is largely sufficient. The only minor gap is the absence of explicit guidance about how this differs from list_group_members.
Complex tools with many parameters or behaviors need more documentation. Simple 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 description needs to add little about parameters. The description does not elaborate on group_id, max_members, or user_google_email, but the schema already documents these fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get details') and the resource ('a specific contact group'), and it explicitly calls out that members are included. This distinguishes it from list_contact_groups and list_group_members in the sibling set, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that this tool is for retrieving a single group by ID, especially with required 'group_id', but it does not explicitly say when to choose this over list_contact_groups or list_group_members. No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_doc_as_markdownGet Doc as MarkdownARead-onlyIdempotent
Reads a Google Doc and returns it as clean Markdown with optional comment context.
Unlike get_doc_content which returns plain text, this tool preserves document formatting as Markdown: headings, bold/italic/strikethrough, links, code spans, ordered/unordered lists with nesting, and tables.
When comments are included (the default), each comment's anchor text — the specific text the comment was attached to — is preserved, giving full context for the discussion.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional ID of a single tab to read (from inspect_doc_structure). When given, only that tab's content is rendered, without its child tabs and without a tab heading. When omitted, every tab is rendered. | |
| document_id | Yes | ID of the Google Doc (or full URL) | |
| comment_mode | No | How to display comments: - "inline": Footnote-style references placed at the anchor text location (default) - "appendix": All comments grouped at the bottom with blockquoted anchor text - "none": No comments included | inline |
| include_comments | No | Whether to include comments (default: True) | |
| include_resolved | No | Whether to include resolved comments (default: False) | |
| user_google_email | Yes | User's Google email address | |
| suggestions_view_mode | No | How to render suggestions in the returned content: - "DEFAULT_FOR_CURRENT_ACCESS": Default based on user's access level - "SUGGESTIONS_INLINE": Suggested changes appear inline in the document - "PREVIEW_SUGGESTIONS_ACCEPTED": Preview as if all suggestions were accepted - "PREVIEW_WITHOUT_SUGGESTIONS": Preview as if all suggestions were rejected | DEFAULT_FOR_CURRENT_ACCESS |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior; the description adds valuable behavioral detail beyond that: Markdown constructs preserved, comments included by default, and anchor text retained for comment context. 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?
Three focused paragraphs: core function, sibling differentiation, and comment behavior. Each sentence earns its place and the most important information 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 read-only tool with rich schema descriptions, an output schema, and safety annotations, the description supplies the missing high-level context: Markdown conversion, differentiation from get_doc_content, and comment anchoring. Nothing needed 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?
The input schema already has 100% description coverage with detailed parameter docs, so the baseline is 3. The description adds meaningful context about comment anchoring and default comment inclusion, though it appropriately leaves tab/suggestion-mode specifics to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Reads'), a clear resource ('Google Doc'), and a concrete output ('clean Markdown'), and immediately distinguishes itself from get_doc_content's plain-text output. An agent can identify what this tool does and which sibling it complements 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 names get_doc_content as the alternative and contrasts plain text vs. Markdown, giving a clear selection criterion. The comment-context sentence further clarifies a distinctive use case for this tool over the plain-text sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_doc_contentGet Doc ContentARead-onlyIdempotent
Retrieves content of a Google Doc or a Drive file (like .docx) identified by document_id.
Native Google Docs: Fetches content via Docs API.
Office files (.docx, etc.) stored in Drive: Downloads via Drive API and extracts text.
For native Google Docs the returned text is index-aligned with the document: empty paragraphs are preserved and every non-text element that occupies an index (inline object, page break, footnote reference, ...) is rendered as one U+FFFC placeholder per index. The document body starts at index 1, so an offset n into the text that follows "--- CONTENT ---" is document index n + 1, and that index can be passed straight to format_text or delete_text. Tables and multi-tab documents interleave separators, so alignment holds up to the first table or tab header.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional ID of a single tab to read (from inspect_doc_structure). When given, only that tab's content is returned with no tab separator, so the content stays index-aligned with that tab. When omitted, every tab is returned separated by "--- TAB: ... ---" markers. | |
| document_id | Yes | ID of the Google Doc (or full URL) | |
| user_google_email | Yes | User's Google email address | |
| suggestions_view_mode | No | How to render suggestions in the returned content: - "DEFAULT_FOR_CURRENT_ACCESS": Default based on user's access level - "SUGGESTIONS_INLINE": Suggested changes appear inline in the document - "PREVIEW_SUGGESTIONS_ACCEPTED": Preview as if all suggestions were accepted - "PREVIEW_WITHOUT_SUGGESTIONS": Preview as if all suggestions were rejected | DEFAULT_FOR_CURRENT_ACCESS |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and non-destructive behavior, and the description adds substantial behavioral detail beyond that: API routing for native docs vs. Drive files, U+FFFC placeholders for non-text elements, the start-at-index-1 convention, and the table/tab alignment caveat. This gives an agent strong predictive knowledge about the output contract.
Agents need to know what a tool does to the 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, followed by structured bullets, and every sentence earns its place by documenting indexing, placeholders, offsets, and limitations. The length is proportionate to the genuine complexity of the tool's contract, 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 read operation with strong annotations and an existing output schema, the description covers all non-obvious aspects: native vs. Office file handling, exact index mapping, tab and table separators, and the limitation that alignment holds only up to the first table or tab header. No essential calling information 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?
The input schema covers all four parameters at 100% coverage, so the schema carries most parameter semantics. The description adds useful context that document_id can refer to either a native Google Doc or a Drive file, but it does not elaborate meaningfully on tab_id or suggestions_view_mode 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 opens with a precise verb-resource pair: 'Retrieves content of a Google Doc or a Drive file (like .docx) identified by document_id.' It further distinguishes native Docs content via the Docs API from Office files via the Drive API, making the tool's scope unambiguous even among many doc-related 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 clear usage context by explaining the index-aligned output and explicitly stating that offsets can be passed straight to format_text or delete_text. It does not explicitly name alternatives such as get_doc_as_markdown or get_drive_file_content, so it stops short of full when-to-use-versus-alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_drive_file_contentGet Drive File ContentARead-onlyIdempotent
Retrieves the content of a specific Google Drive file by ID, supporting files in shared drives.
• Native Google Docs, Sheets, Slides → exported as text / CSV. • Office files (.docx, .xlsx, .pptx) → unzipped & parsed with std-lib to extract readable text. • PDFs → text extracted with pypdf when possible; scanned/image-only PDFs fall back to a download hint. • Images → returned as base64 with MIME metadata for multimodal clients. • Any other file → downloaded; tries UTF-8 decode, else notes binary.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | Drive file ID. | |
| user_google_email | Yes | The user’s Google email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and destructiveHint, but the description adds substantial behavioral detail beyond them: per-format export/parsing strategies, PDF fallback behavior, base64/MIME for images, and a binary-note fallback for unknown file types. This is rich disclosure of how the tool behaves in various scenarios.
Agents need to know what a tool does to the 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 compact and well-structured: a single lead sentence followed by a scannable bullet list where each item covers a distinct file category. No sentence is wasted, and the most important usage information (retrieves content by ID, supports shared drives) 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?
The tool has an output schema, so return-value details are already structured. The description covers all likely input file types, fallback behaviors, and edge cases such as binary files, making it sufficient for an agent to understand what will happen for any file. Combined with the annotations and schema, the description is contextually 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?
Input schema coverage is 100% and both parameters already have reasonable descriptions. The tool description adds little beyond the schema: it mentions 'by ID' and the fact that shared drives are supported, but it does not deepen the meaning of user_google_email or provide guidance on acquiring a file_id. This matches the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource statement: 'Retrieves the content of a specific Google Drive file by ID,' which clearly defines what the tool does. The bulletized format-specific breakdown further distinguishes it from related siblings like get_drive_file_download_url or get_doc_content by showing it returns extracted text/content rather than a URL or a Docs-specific artifact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 clearly implies when to use the tool: whenever you need the content of a Google Drive file, including shared drives. However, it never explicitly names alternatives such as get_drive_file_download_url or get_doc_content, nor does it state when to prefer one over the other; the guidance is inferred from the format-handling bullets rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_drive_file_download_urlGet Drive File Download URLARead-onlyIdempotent
Downloads a Google Drive file and saves it to local disk.
In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour).
For Google native files (Docs, Sheets, Slides), exports to a useful format:
Google Docs -> PDF (default) or DOCX if export_format='docx'
Google Sheets -> XLSX (default), PDF if export_format='pdf', or CSV if export_format='csv'
Google Slides -> PDF (default) or PPTX if export_format='pptx'
For other files, downloads the original file format.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | The Google Drive file ID to download. | |
| export_format | No | Optional export format for Google native files. Options: 'pdf', 'docx', 'xlsx', 'csv', 'pptx'. If not specified, uses sensible defaults (PDF for Docs/Slides, XLSX for Sheets). For Sheets: supports 'csv', 'pdf', or 'xlsx' (default). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses mode-dependent return behavior, the 1-hour URL validity, and the per-file-type export rules. It clearly explains what happens for Google native files versus other files, which is exactly the kind of context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized with a clear opening sentence followed by concise mode and format bullets. Every sentence adds necessary behavioral or usage detail, with no filler or repeated schema 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?
Given the tool's complexity, the description covers all essential call-time decisions: mode behavior, native-file export mapping, default formats, and the fact that original formats are used for non-native files. An output schema exists for return values, and annotations cover the safety profile, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by mapping export_format values to specific source file types (Docs, Sheets, Slides) and clarifying defaults per type, which the schema only partially conveys. This pushes it above baseline without fully re-explaining parameters like file_id and user_google_email.
Input schemas describe structure but not intent. Descriptions should explain 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 immediately states a specific action and resource: 'Downloads a Google Drive file and saves it to local disk.' It then distinguishes its behavior by mode and file type, making it clearly different from siblings like get_drive_file_content or get_drive_shareable_link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when different behaviors apply: stdio mode returns a local path, HTTP mode returns a temporary URL, and file type determines export formats. It does not explicitly name alternative tools or exclusion conditions, but the provided mode and format guidance is enough for an agent to decide when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_drive_file_permissionsGet Drive File PermissionsARead-onlyIdempotent
Gets detailed metadata about a Google Drive file including sharing permissions, parent folder IDs, ownership, and lifecycle timestamps.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | The ID of the file to check permissions for. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 context about what metadata categories are returned, but it does not disclose any additional behavioral traits such as auth requirements or rate limits. No contradiction 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?
The description is a single, focused sentence that front-loads the action and resource, then lists relevant metadata categories. There is no filler or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a low-complexity, read-only tool with only two documented parameters, rich annotations, and an output schema. The description sufficiently covers what the agent needs to know to select and invoke it correctly. Additional sibling differentiation would improve it, but that gap is already captured in the usage dimension.
Complex tools with many parameters or behaviors need more documentation. Simple 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, user_google_email) are already documented clearly in the schema. The description adds no additional parameter-level meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Gets') with a clear resource ('detailed metadata about a Google Drive file') and enumerates concrete content categories: sharing permissions, parent folder IDs, ownership, and lifecycle timestamps. This distinguishes it from siblings like set_drive_file_permissions, which perform writes, and check_drive_file_public_access, which is narrowly scoped.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given about when to use this tool versus related siblings such as check_drive_file_public_access, get_drive_shareable_link, or manage_drive_access. The usage context is only implied by the description, with no exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventsGet EventsARead-onlyIdempotent
Retrieves events from a specified Google Calendar. Can retrieve a single event by ID or multiple events within a time range. You can also search for events by keyword by supplying the optional "query" param.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | A keyword to search for within event fields (summary, description, location). Ignored if event_id is provided. | |
| detailed | No | Whether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also report the parent series ID needed to edit the whole series; recurring masters report their raw RFC5545 recurrence rules; and events that are not ordinary confirmed meetings report their event type (outOfOffice, workingLocation, focusTime) and status. Defaults to False. | |
| event_id | No | The ID of a specific event to retrieve. If provided, retrieves only this event and ignores time filtering parameters. | |
| time_max | No | The end of the time range (exclusive) in RFC3339 format. If omitted, events starting from `time_min` onwards are considered (up to `max_results`). Ignored if event_id is provided. | |
| time_min | No | The start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time when single_events=True. It is omitted from unexpanded queries so recurring masters that began in the past but still have future occurrences remain discoverable. Ignored if event_id is provided. | |
| page_token | No | Token for the next page, taken from a previous response. When single_events=True, also pass the response's Pagination time_min as time_min, even if omitted on the first call. Keep all other query parameters unchanged. Ignored if event_id is provided. | |
| calendar_id | No | The ID of the calendar to query. Use 'primary' for the user's primary calendar. Defaults to 'primary'. Calendar IDs can be obtained using `list_calendars`. | primary |
| max_results | No | The maximum number of events to return in one page. Defaults to 25. Ignored if event_id is provided. | |
| single_events | No | Whether to expand recurring series into individual instances. Defaults to True for backwards compatibility. Set to False with detailed=True to retrieve recurring master events and their exact RFC5545 recurrence rules instead of inferring cadence from expanded instances. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| include_attachments | No | Whether to include attachment information in detailed event output. When True, shows attachment details (fileId, fileUrl, mimeType, title) for events that have attachments. Only applies when detailed=True. Set this to True when you need to view or access files that have been attached to calendar events, such as meeting documents, presentations, or other shared files. Defaults to False. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the description does not need to repeat that. The description adds useful behavioral context about the different retrieval modes, though it does not disclose pagination or response behavior beyond what the schema and output schema provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler, front-loads the core action, and then efficiently covers the main retrieval modes. 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 an 11-parameter tool, the description is concise but sufficient because the schema covers every parameter and an output schema exists. It does not need to enumerate all parameters or return details; the main decision-relevant information (single vs. range vs. keyword search) is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage with rich per-parameter details, so the description's mention of the 'query' param adds little beyond the schema. The baseline of 3 applies because the schema carries the heavy lifting and the description does not contradict or meaningfully extend it.
Input schemas describe structure but not intent. Descriptions should explain 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 action ('Retrieves events') and a specific resource ('a specified Google Calendar'), and further clarifies the retrieval modes (single event by ID, multiple events by time range, keyword search). This makes it clearly distinguishable from sibling tools like query_freebusy or manage_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 the tool is appropriate: retrieving a single event by ID, events within a time range, or events matching a keyword. It does not explicitly name alternatives or exclusions, but it implies the correct scope without being misleading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_formGet FormCRead-onlyIdempotent
Get a form.
| Name | Required | Description | Default |
|---|---|---|---|
| form_id | Yes | The ID of the form to retrieve. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose readOnlyHint, idempotentHint, and destructiveHint, so the description does not need to restate safety. However, it also adds no behavioral context such as authentication requirements, scope of the returned form, or relationship to Google user email.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely short, but this reads as under-specification rather than effective conciseness. It contains only a restatement of the tool name and provides no useful elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema covers parameters completely, annotations cover safety semantics, and an output schema exists, so the tool is minimally callable. Still, the description omits any context about the form object versus form responses, which limits completeness for an agent navigating many form-related siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents both required parameters (user_google_email and form_id) with clear descriptions, so the description does not need to compensate. It also adds no extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: retrieve a form. It is clear about the core operation, but it does not differentiate from sibling tools like get_form_response or list_form_responses, which also involve forms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There is no mention of prerequisites, when to prefer get_form_response, or what distinguishes retrieving a form definition from retrieving responses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_form_responseGet Form ResponseBRead-onlyIdempotent
Get one response from the form.
| Name | Required | Description | Default |
|---|---|---|---|
| form_id | Yes | The ID of the form. | |
| response_id | Yes | The ID of the response to retrieve. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 description's minimal 'Get one response' is consistent. However, it adds no behavioral context beyond the annotations—such as account-scoping requirements or the need for prior listing—but there is also no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence with no redundant words. It front-loads the essential action and object, making it easy to process quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool with a fully described schema, clear annotations, and an output schema, the description is mostly adequate. However, it misses the practical context of how response_id is obtained and how this tool relates to list_form_responses, leaving a minor but notable gap for an agent deciding how to retrieve a response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all three parameters (form_id, response_id, user_google_email) individually described. The tool description adds no extra meaning to the parameters, so a baseline score of 3 is appropriate given the schema 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?
The description states a clear verb ('Get'), a specific resource ('one response'), and scope ('from the form'). It distinguishes itself from the sibling list_form_responses through the word 'one', but does not explicitly name the alternative or clarify that a specific response ID 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?
The description provides no guidance on when to use this tool versus list_form_responses, nor does it mention that response_id must be obtained beforehand (e.g., via listing responses). An agent is left to infer usage entirely from the parameter schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gmail_attachment_contentGet Gmail Attachment ContentA
Downloads an email attachment and saves it to local disk.
In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour). May re-fetch message metadata to resolve filename and MIME type.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | The ID of the Gmail message containing the attachment. | |
| attachment_id | Yes | The ID of the attachment to download. | |
| return_base64 | No | When True, includes the full attachment as a standard base64 string in the response (in addition to any file path or download URL). Useful for sandboxed clients that cannot reach localhost download URLs or the MCP server's local file paths (e.g. containerized agents with network allowlists). The returned base64 uses the standard alphabet, so it can be passed directly to tools like ``draft_gmail_message`` that expect standard (not URL-safe) base64. Default False preserves the existing behavior and response size. | |
| attachment_index | No | Zero-based attachment position from the message-content response. When the cap is enabled, this lets the server safely resolve Gmail's refreshed attachment IDs against current metadata before downloading. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing that the attachment is written to local disk, that stdio versus HTTP returns different access mechanisms, that the HTTP URL is temporary and valid for one hour, and that metadata may be re-fetched to resolve filename and MIME type. This gives the agent meaningful behavioral expectations without contradicting any 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 compact, front-loaded with the core action, and every sentence earns its place: saving behavior, mode-specific return values, and metadata resolution are all covered in under 50 words. There is 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?
Given the rich parameter schema, the presence of an output schema, and the annotations, the description covers the essential operational context: what happens to the file, how the agent accesses it in each mode, and the temporary nature of the HTTP URL. Nothing critical is missing for an agent 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?
The input schema already documents every parameter with 100% coverage, so the description does not need to repeat parameter details. The description adds general behavioral context about metadata re-fetching and delivery modes, but it does not specifically enrich the meaning of individual parameters beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Downloads an email attachment') and a concrete resource outcome ('saves it to local disk'), clearly distinguishing this tool from message-content and thread-content siblings. It also immediately clarifies the two delivery modes, so an agent knows exactly what this tool 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?
The tool's purpose makes its intended use reasonably evident, and the stdio/HTTP mode guidance helps the agent know what to expect. However, it does not explicitly say when to prefer this over siblings like get_gmail_message_content or download_chat_attachment, so the usage guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gmail_message_contentGet Gmail Message ContentARead-onlyIdempotent
Retrieves the full content (subject, sender, recipients, body) of a specific Gmail message.
Bodies are returned inline and truncated at 20,000 characters. Set full=True to get the complete, untruncated message instead: it is exported to disk and the response carries a short-lived download URL (HTTP transport) or file path (stdio transport) rather than the body, so large messages never stream through the model context. Stateless deployments have no file storage, so there full=True returns the untruncated body inline.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | When True, return the COMPLETE untruncated message: saved to local storage and referenced by download URL/file path instead of the body text, or inlined in the response when the server has no file storage (stateless mode). Use for messages large enough to hit the truncation limit, or when byte-exact fidelity is needed (pair with body_format='raw' for a .eml export). | |
| message_id | Yes | The unique ID of the Gmail message to retrieve. | |
| body_format | No | Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches the full raw MIME message and returns the base64url-decoded content. | text |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses the 20,000-character truncation, the disk-export/download-URL behavior for full=True, transport differences (HTTP vs stdio), and the stateless fallback. This is precisely the kind of behavioral context an agent needs to predict side effects and response shape.
Agents need to know what a tool does to the 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 a single sentence, and the follow-up paragraph is dense but essential, covering truncation, export behavior, and stateless deployments without 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?
With a fully described schema, an output schema present, and annotations covering safety and idempotency, the description adds the remaining behavioral details needed for correct invocation. Nothing necessary 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 each parameter. The description adds meaningful value by stating the default inline truncation limit and explaining why full=True matters—large messages never stream through the model context—which helps an agent reason about when to use it.
Input schemas describe structure but not intent. Descriptions should explain 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 operation: retrieving the full content (subject, sender, recipients, body) of a specific Gmail message, with a concrete verb and resource. It does not explicitly contrast itself with sibling tools like the batch or thread variants, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when full=True is needed (large messages, byte-exact fidelity) and the default truncation behavior. It does not, however, give explicit guidance on when to choose this tool over search_gmail_messages, get_gmail_messages_content_batch, or get_gmail_thread_content; usage context is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gmail_messages_content_batchGet Gmail Messages Content BatchARead-onlyIdempotent
Retrieves the content of multiple Gmail messages in a single batch request. Supports up to 25 messages per batch to prevent SSL connection exhaustion.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Message format. "full" includes body, "metadata" only headers. | full |
| body_format | No | Body output format (only applies when format='full'). 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches the full raw MIME message and returns the base64url-decoded content. | text |
| message_ids | Yes | List of Gmail message IDs to retrieve (max 25 per batch). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 detail beyond annotations: the batch limit and the reason for it, which helps the agent understand the tool's operational constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence states the action and resource immediately; the second provides the key constraint and rationale. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema supplies return-shape details and the annotations cover safety, so the description only needs to convey scope and constraints, which it does. It could have explicitly pointed to get_gmail_message_content for single-message needs, but the clear naming and sibling list make that omission 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%: all four parameters have meaningful descriptions and enums. The tool description only reinforces the 25-message limit already present in message_ids, adding no significant new parameter-level meaning, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieves'), names the resource ('content of multiple Gmail messages'), and clearly marks the batch scope, distinguishing it from the singular get_gmail_message_content sibling. 'Single batch request' reinforces the unique purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the appropriate context: fetching multiple messages in one batch, with a 25-message cap and the rationale (preventing SSL connection exhaustion). It does not explicitly name alternatives like the singular get_gmail_message_content, but the context is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gmail_thread_contentGet Gmail Thread ContentARead-onlyIdempotent
Retrieves the complete content of a Gmail conversation thread, including all messages.
Optionally also returns structured ownership analysis so a caller can determine who sent the last message and who owes whom a response without re-parsing the formatted string or making a second tool call.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | The unique ID of the Gmail thread to retrieve. | |
| body_format | No | Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches each message's full raw MIME content and returns the base64url-decoded body. | text |
| include_analysis | No | When True, the return value is a dict with both the formatted thread content AND structured ownership analysis (last sender, ball-in-court verdict, per-sender message counts, participants). Defaults to False, in which case the existing string return shape is preserved. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint, idempotentHint, non-destructive, openWorld), so the bar for the description is lower. The description adds meaningful behavioral context beyond annotations: the tool returns ALL messages in the thread, and the include_analysis flag flips the return shape from a formatted string to a structured dict containing last sender, ball-in-court verdict, per-sender counts, and participants. This explains behavior the annotations cannot convey and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: the first states the core function, the second explains the optional value-add and its benefit. The efficiency framing ('without re-parsing the formatted string or making a second tool call') earns its place by clarifying why the optional feature exists. Front-loaded, appropriately sized, 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 an output schema present, return-value documentation is handled elsewhere; annotations cover the read-only/idempotent profile; and the schema covers all parameters at 100%. The description is complete for the core task. The only meaningful gap is explicit routing to sibling alternatives (batch vs. single vs. message-level), which would round out the contextual picture but is not critical given the clear thread-scoped purpose.
Complex tools with many parameters or behaviors need more documentation. Simple 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 thoroughly, including defaults and enum semantics for body_format and include_analysis. Per the baseline rule, the description needn't repeat this. It adds marginal value by explaining the intent behind include_analysis ('who owes whom a response') but provides no additional meaning for thread_id, body_format, or user_google_email beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Retrieves the complete content of a Gmail conversation thread, including all messages.' This clearly distinguishes it from siblings like get_gmail_message_content (single message) and search_gmail_messages (search), and the second sentence's ownership-analysis feature further differentiates it from get_gmail_threads_content_batch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a use case — 'so a caller can determine who sent the last message and who owes whom a response... without making a second tool call' — which tells the agent when the optional analysis is valuable. However, it never explicitly addresses when NOT to use this tool or names alternatives (e.g., use get_gmail_threads_content_batch for multiple threads, get_gmail_message_content for one message). The guidance is implied, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gmail_threads_content_batchGet Gmail Threads Content BatchARead-onlyIdempotent
Retrieves the content of multiple Gmail threads in a single batch request. Supports up to 25 threads per batch to prevent SSL connection exhaustion.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_ids | Yes | A list of Gmail thread IDs to retrieve. The function will automatically batch requests in chunks of 25. | |
| body_format | No | Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches each message's full raw MIME content and returns the base64url-decoded body. | text |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description adds meaningful context about the 25-thread batch limit and the underlying reason (preventing SSL connection exhaustion), which is not present in annotations and helps the agent respect rate/connection constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences: the first states the core purpose, the second states the key limit and rationale. Every word earns its place, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema, an output schema present, and annotations covering side-effect safety, the call context is largely complete. The only notable gap is explicit guidance on when to use this tool versus related single/batch thread or message tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, including descriptions of thread_ids, body_format, and user_google_email. The description adds no parameter-level semantics beyond what the schema already provides, so it stays 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?
The description states a specific verb ('Retrieves'), a specific resource ('multiple Gmail threads'), and the batching scope ('in a single batch request'). This clearly differentiates it from single-thread retrieval and message-batch retrieval by resource type and batch behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a constraint (up to 25 threads per batch) but no explicit guidance on when to choose this tool over get_gmail_thread_content or get_gmail_messages_content_batch. It leaves usage selection to inference from the tool name rather than stating conditions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_messagesGet MessagesBRead-onlyIdempotent
Retrieves messages from a Google Chat space.
| Name | Required | Description | Default |
|---|---|---|---|
| order_by | No | createTime desc | |
| space_id | Yes | ||
| page_size | No | ||
| message_filter | No | Optional filter string using the Chat API filter syntax. Supports createTime and thread.name. Examples: 'createTime > "2026-03-18T00:00:00-03:00"' 'createTime > "2026-03-18T00:00:00-03:00" AND createTime < "2026-03-19T00:00:00-03:00"' 'thread.name = spaces/X/threads/Y' | |
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 agent knows this is a safe read. The description adds little beyond the annotations; it says 'retrieves messages' but doesn't describe pagination behavior, default ordering, or that it may return only messages not yet deleted. No contradiction found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise—one short sentence—and the parameter filter examples are helpful and well-structured. It is front-loaded with the core purpose. It could be slightly more informative, but it 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?
Given the presence of an output schema and rich annotations, the description doesn't need to explain return values. However, it lacks explicit guidance on how the message_filter syntax interacts with other parameters, pagination behavior, and required parameter semantics. It is minimally viable but not fully complete for an agent to call it with confidence in edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20%, so the description carries some burden, and it lists the main filter field and its supported syntax in detail (createTime and thread.name examples). However, it does not explain required parameters like user_google_email or space_id beyond their names, nor the order_by and page_size defaults. The filter details add real value over the schema, but gaps remain.
Input schemas describe structure but not intent. Descriptions should explain 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 'Retrieves messages from a Google Chat space' uses a specific verb + resource and communicates the primary scope. It distinguishes itself from Gmail siblings by explicitly naming Google Chat, but does not differentiate from sibling tools like send_message, search_messages, or list_spaces, though the list verb is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives such as search_messages or get_gmail_messages_content. It doesn't state exclusions, prerequisites, or conditions. The only context is that it is Chat-specific, which is implied but not explicitly routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pageGet PageARead-onlyIdempotent
Get details about a specific page (slide) in a presentation.
| Name | Required | Description | Default |
|---|---|---|---|
| page_object_id | Yes | The object ID of the page/slide to retrieve. | |
| presentation_id | Yes | The ID of the presentation. | |
| include_geometry | No | Also report each element's placement - its transform (translate, and scale/shear when not identity) and intrinsic size, in raw EMU. Set this when adding elements to an existing deck: it is the only way to discover the deck's margins, gutters and content width, which Slides exposes nowhere else, and it reports the same terms batch_update_presentation writes. Defaults to False to keep the default output's token cost unchanged. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 established. The description adds useful behavioral context via include_geometry: it explains that geometry output is in EMU, that it is needed for discovering deck margins/gutters, and that defaulting to false keeps token cost unchanged—information not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is one focused sentence that states the action and object with no filler. It is front-loaded and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool, the definition is largely complete: annotations cover safety, the schema covers all parameters, and an output schema exists. The only gap is the lack of explicit guidance on when to choose get_page over get_presentation, though the description's 'specific page' phrasing implies it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The tool description itself says nothing about parameters; all meaningful semantics live in the input schema, particularly the rich include_geometry explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states a read operation on a specific page/slide within a presentation, with a direct object and scope. It differentiates from sibling get_presentation (whole deck) and get_page_thumbnail (thumbnail) by specifying details rather than thumbnail or full presentation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not name alternative tools or give exclusion conditions for when not to use it. The include_geometry parameter does offer conditional advice about when to enable geometry, but tool-selection guidance remains implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_thumbnailGet Page ThumbnailARead-onlyIdempotent
Generate a thumbnail URL for a specific page (slide) in a presentation.
| Name | Required | Description | Default |
|---|---|---|---|
| page_object_id | Yes | The object ID of the page/slide. | |
| thumbnail_size | No | Size of thumbnail ("LARGE", "MEDIUM", "SMALL"). Defaults to "MEDIUM". | MEDIUM |
| presentation_id | Yes | The ID of the presentation. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already supply the safety profile (readOnlyHint, idempotentHint, non-destructive). The description adds that the result is a URL and that it targets a single slide, but it does not disclose authentication prerequisites, URL lifetime, or other behavioral details. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler. The action and target are front-loaded, and every word contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, idempotent thumbnail-URL tool with full parameter documentation, strong annotations, and an output schema, the description is sufficient. Nothing critical for invoking 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 description coverage is 100%, so each parameter is already documented with a useful description. The tool description only reinforces that page_object_id refers to a slide and does not add meaningful parameter-level 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?
The description uses a specific verb ('Generate') and a precise resource ('thumbnail URL for a specific page (slide) in a presentation'). It clearly distinguishes this tool from siblings like get_page, which would return slide content rather than a thumbnail URL.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 intended purpose is clear from the description, but it does not explicitly state when to use this tool over alternatives such as get_page, nor does it mention prerequisites or exclusions. Usage context is implied by the resource targeted, not explicitly spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_presentationGet PresentationARead-onlyIdempotent
Get details about a Google Slides presentation.
| Name | Required | Description | Default |
|---|---|---|---|
| presentation_id | Yes | The ID of the presentation to retrieve. | |
| include_geometry | No | Also list each slide's elements with their placement - transform (translate, and scale/shear when not identity) and intrinsic size, in raw EMU. Set this when adding slides to an existing deck so new elements can match its established margins and content width. Defaults to False. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| include_speaker_notes | No | Also report each slide's speaker (presenter) notes and the object ID of the shape holding them. Pass True when you need to read or edit notes: that shape ID is the only valid target for insertText/deleteText on notes, and batch_update_presentation writes notes by deleting the shape's existing text and inserting new text. Defaults to False. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety and side-effect profile is well covered. The description itself adds no further behavioral context, such as what the response contains, how optional include_* flags alter behavior, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no filler or redundant restatement of the title. It is appropriately sized for a simple retrieval tool, leaving detailed behavior to the schema and annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, complete schema descriptions, and the presence of an output schema, nothing essential is missing for an agent to call this tool correctly. The optional parameter behaviors are thoroughly explained in the schema, so the tool definition as a whole 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%, so the baseline is 3 and the one-sentence tool description does not need to compensate for missing parameter documentation. The description itself adds no parameter-level meaning beyond what the input schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete operation—get details about a Google Slides presentation—with a specific verb and resource type. It does not explicitly call out sibling tools, but the read-oriented verb and required presentation_id make its role clear versus creation/update 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?
There is no guidance about when to use this tool instead of create_presentation, batch_update_presentation, or other slides-related tools, and no exclusionary conditions are stated. The only usage signal is the verb 'get', which is implied rather than explicitly explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_script_contentGet Script ContentBRead-onlyIdempotent
Retrieves content of a specific file within a project.
| Name | Required | Description | Default |
|---|---|---|---|
| file_name | Yes | Name of the file to retrieve | |
| script_id | Yes | The script project ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations fully cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), and the description's 'Retrieves' aligns with these without contradiction. However, the description adds no behavioral context beyond the annotations: it doesn't clarify what kind of content is returned (source code, file size limits, raw vs rendered), whether the file must belong to the given script project, or if authentication flows through user_google_email. Since annotations carry the burden and no contradiction exists, a mid-range score is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single tight sentence of eleven words, front-loaded with the action verb and resource. There is zero filler, and every word contributes to meaning. This is appropriately sized for a simple read operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists (so return format is defined elsewhere), annotations fully declare the safety semantics, and the input schema covers all parameters at 100%, the description is nearly sufficient. The only minor gap is that it doesn't explicitly scope the tool to Apps Script project files or note that file_name refers to files within the script project. For a simple read-only tool with rich structured context, this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all three parameters (user_google_email, script_id, file_name) already documented in the input schema. The description adds no parameter-level meaning, but the baseline of 3 applies because the schema does the heavy lifting and no compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('Retrieves content of a specific file within a project') that naturally distinguishes it from siblings like get_script_project (metadata), list_script_projects (listing), update_script_content (mutation), and run_script_function (execution). It stops short of 5 because it doesn't explicitly state this concerns Apps Script source files (e.g., .gs/.html), which the agent must infer from the tool name and script_id parameter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. Given a large sibling set including get_script_project, get_drive_file_content, get_doc_content, and run_script_function, the description provides no exclusions, prerequisites, or conditions for selection. An agent receives zero direction on choosing this over similar content-retrieval tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_script_metricsGet Script MetricsBRead-onlyIdempotent
Gets execution metrics for a script project.
Returns analytics data including active users, total executions, and failed executions over time.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID | |
| user_google_email | Yes | User's email address | |
| metrics_granularity | No | Granularity of metrics - "DAILY" or "WEEKLY" | DAILY |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 context that the tool returns time-bucketed analytics, which is useful, but it does not disclose behavioral traits like what time range 'over time' spans, whether results are paginated, or whether prior authentication 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?
Two sentences with zero wasted words. The main action is front-loaded ('Gets execution metrics for a script project'), and the second sentence justifies its place by describing what data the agent can expect, which aids tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool, structured context is rich: an output schema exists, annotations cover the safety profile, and the schema fully documents parameters. The description adequately states purpose and return types; the only ambiguity is the unbounded 'over time' range, since no date-range parameter exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all three parameters (script_id, user_google_email, metrics_granularity) already documented in the input schema. The description adds no parameter-level 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?
The description states a specific verb and resource ('Gets execution metrics for a script project') and enumerates the returned data (active users, total executions, failed executions), making the tool's purpose unambiguous. Among the script-related siblings (get_script_project, list_script_processes), it is clearly the only analytics/metrics tool, though it never names a sibling explicitly to differentiate 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?
There is no guidance on when to use this tool versus alternatives. With over 130 siblings including overlapping Apps Script tools like list_script_processes and get_script_project, the description offers no routing criteria, no exclusions, and no contextual trigger for when an agent should choose metrics over a process list or project details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_script_projectGet Script ProjectBRead-onlyIdempotent
Retrieves complete project details including all source files.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior, so the description does not need to repeat safety details. It adds useful context by specifying that it fetches complete details including all source files. 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?
A single, front-loaded sentence with no filler. Every phrase ('complete project details', 'all source files') adds meaningful scope information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward read operation with rich annotations, a full output schema, and fully described parameters, the definition is mostly complete. The main gap is explicit disambiguation from get_script_content and related script tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters have descriptive entries in the schema, and schema description coverage is 100%. The description itself adds no additional parameter-level meaning, 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?
The description states a specific action ('Retrieves') and a clear resource ('complete project details including all source files'), going beyond the tool name. It clearly conveys the basic function, though it does not explicitly differentiate itself from the similar sibling get_script_content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to choose this tool over get_script_content, list_script_projects, or other script-related siblings. The description only states what it returns, leaving the agent to infer the appropriate selection context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_search_engine_infoGet Search Engine InfoBRead-onlyIdempotent
Retrieves metadata about a Programmable Search Engine.
| Name | Required | Description | Default |
|---|---|---|---|
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds that the tool returns metadata rather than content, which is mildly informative, but it does not discuss auth needs, rate limits, or which specific search engine is being referenced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no redundant wording, filler, or repeated annotation content. It is front-loaded with the action verb and direct object.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter read-only tool with an output schema and strong annotations, so the description only needs to be minimally complete. However, it leaves ambiguity about how the email parameter identifies the search engine and does not mention auth context, which slightly weakens completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully describes user_google_email as the user's Google email address and marks it required, so schema coverage is 100%. The description adds no additional meaning about how this email maps to a specific Programmable Search Engine, 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?
The description states a clear action ('Retrieves metadata') on a specific resource ('a Programmable Search Engine'), making the tool's basic function obvious. It is not a tautology and does not appear to overlap with content-returning siblings, but it does not explicitly differentiate itself from related tools like search_custom.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives, and it does not mention prerequisites such as completing Google authentication or whether this should be called before search_custom. Usage context is left entirely to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_spreadsheet_infoGet Spreadsheet InfoARead-onlyIdempotent
Gets information about a specific spreadsheet including its sheets.
| Name | Required | Description | Default |
|---|---|---|---|
| spreadsheet_id | Yes | The ID of the spreadsheet to get info for. Required. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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, covering the operation's safety profile. The description adds minimal contextual value beyond 'including its sheets'; it does not disclose auth requirements, error conditions, or other behavioral traits, though none are strongly needed given the simple read-only nature.
Agents need to know what a tool does to the 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 direct sentence contains all essential information with no filler. The key scoping detail ('specific spreadsheet') is front-loaded, and the additional 'including its sheets' detail is valuable without adding clutter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only metadata lookup, the description combined with complete parameter schemas, strong annotations, and an output schema provides enough context for an agent to select and invoke the tool correctly. No critical missing information is apparent.
Complex tools with many parameters or behaviors need more documentation. Simple 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 are already self-documented. The description provides no additional semantic detail about parameters, which is acceptable because the schema fully 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?
The description clearly states a specific verb ('Gets information') and a specific resource ('a specific spreadsheet'), and notes the included 'sheets' detail. This distinguishes it from sibling tools like list_spreadsheets, which would return a collection rather than a single spreadsheet's metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when you need information about one identified spreadsheet. However, it does not explicitly state when not to use it or mention alternatives such as list_spreadsheets or read_sheet_values, so the usage guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskGet TaskBRead-onlyIdempotent
Get details of a specific task.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The ID of the task to retrieve. | |
| task_list_id | Yes | The ID of the task list containing the task. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description is consistent with these and adds no additional behavioral context beyond what 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?
The description is a single, front-loaded sentence with no filler or redundancy. It is appropriately sized for a simple read-by-ID tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple single-resource read operation, and the output schema plus annotations cover most operational concerns. However, it does not mention how task_id is obtained or note any auth dependency, so completeness is strong but not maximal.
Complex tools with many parameters or behaviors need more documentation. Simple 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. The description adds no parameter-level meaning or context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Get details of a specific task.' The word 'specific' implies retrieval of a single task, distinguishing it from list_tasks, though it does not explicitly name sibling alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus list_tasks, manage_task, or get_task_list. There are no prerequisites, exclusions, or explicit routing to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_task_listGet Task ListBRead-onlyIdempotent
Get details of a specific task list.
| Name | Required | Description | Default |
|---|---|---|---|
| task_list_id | Yes | The ID of the task list to retrieve. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this as read-only, idempotent, non-destructive, and open-world, so the safety profile is covered. However, the description itself adds no behavioral context beyond 'get details,' such as scope limitations, authentication requirements, or response characteristics. It neither contradicts the annotations nor contributes meaningful behavioral disclosure beyond 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?
The description is a single, efficient sentence that immediately states the action and object. There is no filler, repetition, or unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with two fully documented required parameters, an output schema, and strong annotations, the description is largely complete. It lacks a brief pointer to list_task_lists for ID discovery, but the core invocation needs are satisfied by the schema and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters clearly documented in the input schema. The description does not add further semantic detail about the parameters, but the schema already carries the burden, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Get details of a specific task list.' It clearly identifies the operation as retrieving one list by ID, and the required task_list_id parameter reinforces this. It does not explicitly contrast with sibling tools like list_task_lists or get_task, but the resource and scope are unambiguous enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is provided. The description does not mention that list_task_lists should be used first to discover task_list_id, nor does it explain when get_task_list is preferred over list_task_lists or how it differs from get_task. The agent must infer usage from the name and parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_versionGet VersionBRead-onlyIdempotent
Gets details of a specific version.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID | |
| version_number | Yes | The version number to retrieve (1, 2, 3, etc.) | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context beyond those annotations—no mention of error behavior, existence requirements, authentication needs, or how a missing version is handled.
Agents need to know what a tool does to the 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 six words and front-loaded with the key verb and resource. There is no filler, repetition of the title, or unnecessary detail that would dilute the message.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 get-by-identifier tool with a fully described input schema, comprehensive annotations, and an output schema present, the description is sufficient. The only minor gap is the lack of a pointer to list_versions for discovering version numbers, but this is not essential for correct invocation when the caller already knows the version.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all three parameters already described clearly (script_id, version_number, user_google_email). The description does not add extra parameter semantics, so the baseline score of 3 is appropriate since the schema carries the 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 clearly states the operation ('Gets details') and the resource ('a specific version'), which is more specific than a generic 'get version'. It does not explicitly differentiate itself from sibling tools like list_versions or create_version, but the phrase 'specific version' implies a single-object retrieval rather than enumeration or creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied: retrieve details for one known version using its version_number. However, the description provides no explicit when-to-use guidance, no exclusions, and does not mention that list_versions should be used when version numbers need to be enumerated or when all versions are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_to_google_docImport to Google DocA
Imports a file (Markdown, DOCX, TXT, HTML, RTF, ODT) into Google Docs format with automatic conversion.
Google Drive automatically converts the source file to native Google Docs format, preserving formatting like headings, lists, bold, italic, etc. Binary sources may be passed directly as base64_content. For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | Text content for text-based formats. Use only for short snippets or content already in memory. | |
| file_url | No | Remote URL to fetch the file from (http/https). | |
| file_name | Yes | The name for the new Google Doc (extension will be ignored). | |
| file_path | No | Local file path or file:// URL for any supported format (MD, TXT, HTML, DOCX, ODT, RTF). Appropriate for larger files than content, but file_path may still load the file into memory or perform non-streaming reads. Avoid very large files that could exceed memory or time limits; use streaming/chunked uploads or an alternative API for huge files. | |
| folder_id | No | The ID of the parent folder. Defaults to 'root'. | root |
| base64_sha256 | No | Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks. | |
| source_format | No | Source format hint ('md', 'markdown', 'docx', 'txt', 'html', 'rtf', 'odt'). Auto-detected from file_name extension if not provided. | |
| base64_content | No | Standard base64-encoded bytes for a binary source such as DOCX or ODT. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations by explaining that Google Drive automatically converts the file, preserves formatting, and that binary sources can be passed as base64_content. It also discloses that file_path can still load files into memory, which is useful performance-related behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core action, and every sentence serves a purpose. It avoids restating the parameter schema and keeps additional guidance brief.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description, combined with 100% schema description coverage and an output schema, provides enough information to select and invoke the tool correctly. It covers supported formats, conversion behavior, input modes, and practical guidance for larger files.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds extra value by advising when to prefer file_path for batch operations and by clarifying that binary sources may use base64_content, going beyond what the schema fields already state.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Imports'), a clear target resource ('Google Docs format'), and enumerates the supported source formats. It differentiates from sibling import tools (import_to_google_slides, import_to_google_sheets) by making the destination format explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use file_path versus content/base64_content, especially for batch operations, telling callers to avoid loading full file contents into context. It does not explicitly contrast against sibling tools, but the intended use case is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_to_google_sheetsImport to Google SheetsA
Imports a spreadsheet (XLSX, XLS, ODS, CSV, TSV) into Google Sheets format with automatic conversion.
Google Drive automatically converts the source spreadsheet to native Google Sheets format, preserving rows, columns, sheets, and values. Binary sources may be passed directly as base64_content. For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | Text content for text-based formats (CSV, TSV). Use only for short snippets or content already in memory. | |
| file_url | No | Remote URL to fetch the spreadsheet from (http/https). | |
| file_name | Yes | The name for the new Google Sheets spreadsheet (extension will be ignored). | |
| file_path | No | Local file path or file:// URL for any supported format (XLSX, XLS, ODS, CSV, TSV). Appropriate for larger files than content, but file_path may still load the file into memory or perform non-streaming reads. Avoid very large files that could exceed memory or time limits; use streaming/chunked uploads or an alternative API for huge files. | |
| folder_id | No | The ID of the parent folder. Defaults to 'root'. | root |
| base64_sha256 | No | Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks. | |
| source_format | No | Source format hint ('xlsx', 'xls', 'ods', 'csv', 'tsv'). Auto-detected from file_name extension if not provided. | |
| base64_content | No | Standard base64-encoded bytes for an XLSX, XLS, or ODS source. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (mutating, non-destructive, non-idempotent, open-world); the description adds real behavioral context — 'Google Drive automatically converts the source spreadsheet to native Google Sheets format, preserving rows, columns, sheets, and values.' It stops short of covering auth prerequisites or failure modes, but 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?
Three sentences, each earning its place: purpose, conversion behavior, and delivery-channel guidance. The most important information (what it imports and where) is front-loaded, with no redundancy against 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 9-parameter tool with full schema coverage, an output schema, and annotations, the description covers purpose, behavior, and selection guidance in compact form. It could add one sentence on auth expectations (user_google_email is required) or where the resulting spreadsheet lands (folder_id defaults to 'root'), but those are already documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description pushes above it by explaining when to prefer file_path over base64_content/content and by framing base64_content as the channel for binary sources. The remaining parameters (folder_id, source_format, base64_sha256) are left to the already-detailed schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Imports a spreadsheet (XLSX, XLS, ODS, CSV, TSV) into Google Sheets format with automatic conversion.' The enumerated formats and explicit destination make it immediately distinguishable from the import_to_google_doc and import_to_google_slides siblings by target format.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 actionable delivery-channel guidance: 'Binary sources may be passed directly as base64_content' and 'For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.' It does not, however, say when to choose this over near-siblings (create_spreadsheet, import_to_google_doc, import_to_google_slides) or state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_to_google_slidesImport to Google SlidesA
Imports a presentation (PPTX, PPT, ODP) into Google Slides format with automatic conversion.
Google Drive automatically converts the source presentation to native Google Slides format, preserving slides, layouts, text, and images. Binary sources may be passed directly as base64_content. For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.
| Name | Required | Description | Default |
|---|---|---|---|
| file_url | No | Remote URL to fetch the presentation from (http/https). | |
| file_name | Yes | The name for the new Google Slides presentation (extension will be ignored). | |
| file_path | No | Local file path or file:// URL for any supported format (PPTX, PPT, ODP). Appropriate for larger files than content, but file_path may still load the file into memory or perform non-streaming reads. Avoid very large files that could exceed memory or time limits; use streaming/chunked uploads or an alternative API for huge files. | |
| folder_id | No | The ID of the parent folder. Defaults to 'root'. | root |
| base64_sha256 | No | Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks. | |
| source_format | No | Source format hint ('pptx', 'ppt', 'odp'). Auto-detected from file_name extension if not provided. | |
| base64_content | No | Standard base64-encoded bytes for a PPTX or ODP source. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses automatic Google Drive conversion, preservation of slides/layouts/text/images, and the important caveat that file_path may still load the file into memory or perform non-streaming reads, with advice to avoid very large files. This adds substantial behavioral context beyond the sparse annotations and contains no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three focused sentences: purpose first, then conversion behavior, then input-method guidance. Every sentence earns its place, and there is no redundant or vague wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter import tool, the description plus schema and output schema cover supported formats, conversion behavior, input methods, destination folder default, and performance/memory caveats. The description does not need to enumerate every parameter because the schema already does so comprehensively.
Complex tools with many parameters or behaviors need more documentation. Simple 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 useful semantics for choosing between base64_content and file_path, especially for batch operations and avoiding context bloat. It does not need to repeat the schema's detailed parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Imports a presentation (PPTX, PPT, ODP) into Google Slides format with automatic conversion.' It names supported source formats and the destination format, which clearly distinguishes it from siblings like import_to_google_doc and import_to_google_sheets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 practical guidance: binary sources may use base64_content, and batch operations should prefer file_path to avoid loading full contents into context. However, it does not explicitly compare this tool to alternatives such as create_presentation or other import tools, so when-not-to-use guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_doc_elementsInsert Doc ElementsC
Inserts structural elements like tables, lists, or page breaks into a Google Doc.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Number of rows for table (required for table) | |
| text | No | Initial text content for list items | |
| index | Yes | Position to insert element (0-based) | |
| columns | No | Number of columns for table (required for table) | |
| list_type | No | Type of list ("UNORDERED", "ORDERED") (required for list) | |
| document_id | Yes | ID of the document to update | |
| element_type | Yes | Type of element to insert ("table", "list", "page_break") | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true, so the description's 'inserts' adds little beyond confirming a write operation. It does not disclose behaviors like index validity constraints, whether insertion shifts existing content, or side effects of repeated calls at the same index — meaningful gaps for a mutation tool flagged openWorldHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler; every word earns its place. It is slightly under-structured in that a brief clause pointing to an alternative sibling would have made it near-optimal, but as written it is efficient and 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?
The schema (100% coverage) and output schema carry parameter and return semantics, and annotations carry the safety profile, so the description is not obliged to repeat those. However, for an 8-parameter mutation tool with openWorldHint=true, the missing usage differentiation and insertion-behavior context leave noticeable gaps in what 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 every parameter (element_type, index, rows, columns, list_type, text, etc.) is already documented in the schema. The description's mention of tables/lists/page breaks mirrors the element_type enum values and adds no new semantic meaning, warranting 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?
The description uses a specific verb ('Inserts') and names the resource (Google Doc) plus concrete element types (tables, lists, page breaks), which distinguishes it from obvious text/image siblings like modify_doc_text and insert_doc_image. It does not, however, differentiate from overlapping doc siblings such as create_table_with_data and batch_update_doc, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use/when-not-to-use guidance or alternatives are given. Given the dense sibling list with overlapping capabilities (create_table_with_data for tables, batch_update_doc for arbitrary doc updates), an agent gets no criteria for choosing this tool over those. Usage is only weakly implied by the description's purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_doc_imageInsert Doc ImageA
Inserts an image into a Google Doc from Drive or a URL.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | Position to insert image (0-based) | |
| width | No | Image width in points (optional) | |
| height | No | Image height in points (optional) | |
| document_id | Yes | ID of the document to update | |
| image_source | Yes | Drive file ID or public image URL | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal a mutating operation (readOnlyHint=false), and the description clarifies insertion of an image from Drive/URL without contradicting the annotations. It does not add deeper behavioral context such as content shifting at the insertion index or authentication dependences on user_google_email.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler, and it conveys the essential purpose and accepted source types 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 simple insertion tool this is close to adequate: schema covers parameters and an output schema is present. However, it omits guidance on choosing this over insert_doc_elements and any preconditions around Drive/URL access, so an agent relying solely on the description could still choose or invoke it incorrectly.
Complex tools with many parameters or behaviors need more documentation. Simple 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 all six parameters. The description adds no parameter-level meaning beyond restating the image source types already covered by image_source.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description names a specific action, object, destination, and source: 'Inserts an image into a Google Doc from Drive or a URL.' This clearly distinguishes it from text-modification tools like modify_doc_text and broader element tools like insert_doc_elements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 use case is implied by the verb ('inserts an image') and the schema's document/image parameters, but the description gives no explicit when-to-use or when-not-to-use guidance. It does not compare against insert_doc_elements or state prerequisites like Drive sharing permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_doc_structureInspect Doc StructureARead-onlyIdempotent
Essential tool for finding safe insertion points and understanding document structure.
USE THIS FOR:
Finding the correct index for table insertion
Understanding document layout before making changes
Locating existing tables and their positions
Getting document statistics and complexity info
Inspecting structure of specific tabs
CRITICAL FOR TABLE OPERATIONS: ALWAYS call this BEFORE creating tables to get a safe insertion index.
WHAT THE OUTPUT SHOWS:
total_elements: Number of document elements
total_length: Maximum safe index for insertion
tables: Number of existing tables
table_details: Position and dimensions of each table
headers / footers: Real segment IDs and previews for header/footer editing
tabs: List of available tabs in the document (if no tab_id specified)
empty_paragraphs: newline-only count, excluding existing/suggested object anchors
empty_paragraph_ranges: start/end extents, capped at 100
empty_paragraph_ranges_truncated: whether ranges were omitted
last_paragraph: is_list_item and is_empty, or null if no body paragraphs
Paragraph statistics cover top-level body paragraphs and appear at the top level in basic mode or under "statistics" in detailed mode. Ranges can include required empty paragraphs. Before cleanup, use detailed=true to check adjacent elements, formatting, and object anchors. Preserve the final newline and newlines before tables, tables of contents, or section breaks. The final range has end == total_length and may be omitted by truncation.
WORKFLOW FOR TABLE INSERTION: Step 1: Call this function Step 2: Note the "total_length" value Step 3: Use an index < total_length for table insertion Step 4: Create your table
FORMATTING WORKFLOW: After inserting all text via batch_update_doc with end_of_segment=true, call this tool with detailed=true to get exact start_index and end_index for every paragraph. Use those indices directly in format_text and update_paragraph_style operations in a second batch_update_doc call.
HEADER/FOOTER WORKFLOW: For ordinary header/footer text, use update_doc_headers_footers. If you need low-level segment editing, call this tool first and use the real segment_id values returned under headers/footers. Do not invent IDs.
The detailed output includes elements[].start_index and elements[].end_index with text_preview for each paragraph, making it easy to identify which ranges to format.
SUB-PARAGRAPH FORMATTING: text_preview is truncated to 100 characters by default. To compute the index of a token inside a longer paragraph, pass preview_chars=0 or None for untruncated text, then add the token's UTF-16 offset within that text to the paragraph's start_index (non-BMP characters such as emoji occupy two UTF-16 units).
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional ID of the tab to inspect. If not provided, inspects main document. | |
| detailed | No | Whether to return detailed structure information | |
| document_id | Yes | ID of the document to inspect | |
| preview_chars | No | Maximum characters of paragraph, header and footer text preview. Pass 0 or None for the full text, needed to locate a token inside a paragraph longer than the default 100 characters. | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior, and the description adds substantial context on top: total_length as a safe insertion bound, output truncation behavior, empty_paragraph_ranges semantics, and required newline preservation. It also warns against inventing segment IDs and explains UTF-16 offset handling for non-BMP characters.
Agents need to know what a tool does to the 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 long but well-organized with clear sections and front-loaded purpose. Most content earns its place given the complexity of the tool and its output. There is some redundancy across the output-shows list and the workflow sections, but not to a degree that harms usability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 inspection tool with an output schema, the description is exceptionally complete: it documents output fields, detailed vs basic modes, safe insertion index guidance, formatting and header/footer workflows, truncation caveats, and even sub-paragraph token index calculation. An agent has everything it needs 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. The description adds real value beyond the schema by explaining preview_chars truncation and the need to pass 0/None for full text, clarifying what detailed=true provides, and specifying tab_id default behavior. It does not meaningfully elaborate on document_id or user_google_email, but the schema already covers those adequately.
Input schemas describe structure but not intent. Descriptions should explain 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: 'finding safe insertion points and understanding document structure.' It clearly describes the tool's role and lists concrete use cases. However, it does not explicitly differentiate itself from adjacent siblings like debug_table_structure or get_doc_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?
The description gives explicit when-to-use guidance: ALWAYS call before creating tables, after batch_update_doc for formatting indices, and before low-level header/footer segment editing. It also names an alternative (update_doc_headers_footers) for ordinary header/footer text, making the routing decision explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_calendarsList CalendarsARead-onlyIdempotent
Retrieves a list of calendars accessible to the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
| page_token | No | Token for the next page, taken from a previous response. | |
| max_results | No | Maximum calendars to return in one page. Omit to use the API default. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds the auth-scope context ('accessible to the authenticated user'), which is useful beyond the schema and annotations. It does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that states the action, resource, and scope with no filler. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple read-only list operation with an output schema, complete parameter descriptions, and rich safety annotations. The description is sufficient for an agent to invoke it correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and every parameter, including the required user_google_email, is already documented in the input schema. The tool description adds no parameter-level meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieves') and resource ('calendars') with a clear scope ('accessible to the authenticated user'). It is immediately distinguishable from siblings like create_calendar or get_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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: this tool lists calendars for the authenticated user, which is the natural choice when enumerating available calendars. It does not explicitly name alternatives or exclusions, but the scope is specific enough to guide basic selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contact_groupsList Contact GroupsARead-onlyIdempotent
List contact groups (labels) for the user.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Maximum number of groups to return (default: 100, max: 1000). | |
| page_token | No | Token for pagination. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the 'labels' terminology and user scoping, but does not describe pagination or response behavior beyond the schema's own field descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that conveys the action, resource, and scope without wasted words. Every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only list operation, the description plus rich annotations and fully documented schema provide everything an agent needs to select and invoke the tool correctly. An output schema is present, so return-value details are covered elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description does not add parameter-level meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('contact groups'), with a clarifying parenthetical 'labels' and a clear user scope ('for the user'). It is immediately distinguishable from siblings like get_contact_group and manage_contact_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 clearly implies when to use this tool: to enumerate a user's contact groups. It does not explicitly name alternatives or exclusion conditions, but the list-vs-get/manage distinction among sibling tools makes the usage context reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contactsList ContactsARead-onlyIdempotent
List contacts for the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Maximum number of contacts to return (default: 100, max: 1000). | |
| page_token | No | Token for pagination. | |
| sort_order | No | Sort order: "LAST_MODIFIED_ASCENDING", "LAST_MODIFIED_DESCENDING", "FIRST_NAME_ASCENDING", or "LAST_NAME_ASCENDING". | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 fully covered. The description adds a useful scope constraint ('for the authenticated user') but does not disclose behavioral details such as pagination iteration or whether all contact groups are included. 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?
A single seven-word sentence that front-loads the verb and resource and contains zero filler. Nothing is repeated from the schema or annotations, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool, the structured data covers a lot: the output schema explains return values, the schema covers parameters, and the annotations cover safety. The main gap is that with search_contacts, get_contact, and list_contact_groups as siblings, the description does not clarify exactly what subset of contacts is returned or when listing should be chosen over searching.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all four parameters (page_size, page_token, sort_order, user_google_email). The description's phrase 'authenticated user' slightly reinforces that user_google_email is the token holder's email, but this is marginal value beyond what the schema already states. 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 uses a specific verb ('List') and a clear resource ('contacts'), scoped to 'the authenticated user.' This distinguishes it from mutating tools like manage_contact and single-item tools like get_contact, though it does not explicitly name or contrast any sibling such as search_contacts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 context is implied rather than stated: call this when you need the authenticated user's own contact list. However, there is no explicit guidance on when to prefer it over search_contacts (broader search) or get_contact (single contact), and no exclusions or alternative conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_deploymentsList DeploymentsARead-onlyIdempotent
Lists all deployments for a script project, including the bound version number of each deployment so callers can verify which version is served.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive, idempotent nature of the operation. The description adds useful behavioral context beyond the annotations by stating that each deployment exposes its bound version number and that this enables verification of which version is served.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the primary action and resource, then adds the most important distinguishing behavior. Every phrase earns its place and there is 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?
For a simple read-only list operation with two fully described parameters, strong annotations, and an output schema, the description is complete. It tells the agent what the tool does, what extra information it provides, and why that information matters.
Complex tools with many parameters or behaviors need more documentation. Simple 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 are already documented in the input schema. The description does not add parameter-level detail, but it also does not need to because the schema fully covers them.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Lists') and resource ('all deployments for a script project'), and explains the key distinguishing detail that each deployment includes its bound version number. This makes it easy to tell apart from sibling tools like manage_deployment or list_versions 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?
The description provides clear context for when to use the tool: to list deployments and verify which version is served. It does not explicitly name alternatives or state when not to use it, but the purpose is specific enough that an agent can infer the appropriate scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_docs_in_folderList Docs in FolderBRead-onlyIdempotent
Lists Google Docs within a specific Drive folder.
Returns: str: A formatted list of Google Docs in the specified folder.
| Name | Required | Description | Default |
|---|---|---|---|
| folder_id | No | root | |
| page_size | No | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover the safety profile (readOnlyHint, idempotentHint, non-destructive). The description adds minimal behavioral context by stating it returns a formatted list, but it does not disclose recursion behavior, auth requirements, or pagination effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loaded with the core purpose. The Returns line is a slight redundancy given an output schema exists, but overall the description is appropriately sized and easy 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?
This is a low-complexity read-only tool with rich annotations and an output schema, so the missing return details are not critical. However, the complete absence of parameter explanation and any usage routing leaves the definition only minimally viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning. It does not explain user_google_email, folder_id, or page_size. Even the folder concept is only implied by the tool name and one phrase, not by any parameter-level documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Lists Google Docs within a specific Drive folder.' This clearly distinguishes it from sibling tools like list_drive_items (all items) and search_drive_files (search across Drive).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as list_drive_items or search_docs. The description states what it does but offers no context, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_document_commentsList Document CommentsARead-onlyIdempotent
List all comments from a Google Document (optional max_comments to limit results).
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes | ||
| max_comments | No | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the read-only nature is covered elsewhere. The description adds the optional max_comments limiting behavior, but does not mention pagination, authentication requirements, or completeness caveats. This is adequate but not especially rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. The core action and resource are stated first, and the optional parameter is cleanly parenthesized, making it highly 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?
For a simple read-only listing tool with an output schema, the description covers the core action, target resource, and optional limit. A note about the required user_google_email or how it connects to Google authentication would make it fully complete, but that is inferable from the parameter name and sibling tools like start_google_auth.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description needs to compensate. It explains max_comments as a result limiter and implies document_id identifies a Google Document, but it does not explain the required user_google_email parameter or its role, leaving a meaningful gap for one of the two required parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('comments from a Google Document'), making it clear what the tool does. It also distinguishes itself from comment-related management tools and from spreadsheet/presentation comment listing tools via the explicit 'Google Document' scoping.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use this tool to retrieve comments from a Google Document, not from spreadsheets or presentations, and not to manage comments. However, it does not explicitly name alternatives like manage_document_comment or state when not to use this tool, so it falls just short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_drive_itemsList Drive ItemsARead-onlyIdempotent
Lists files/folders or shared drive containers, supporting shared drives.
If drive_id is specified, lists items within that shared drive. folder_id is then relative to that drive (or use drive_id as folder_id for root).
If drive_id is not specified, lists items from user's "My Drive" and accessible shared drives (if include_items_from_all_drives is True).
Set resource_type to "shared_drives" to list shared drive containers instead of folder contents.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Shared drive query used only when resource_type="shared_drives", e.g. "name contains 'Engineering'". | |
| corpora | No | Corpus to query ('user', 'drive', 'allDrives'). If `drive_id` is set and `corpora` is None, 'drive' is used. If None and no `drive_id`, API defaults apply. | |
| detailed | No | Whether to include size, modified time, and link in results. Defaults to True. | |
| drive_id | No | ID of the shared drive. If provided, the listing is scoped to this drive. | |
| order_by | No | Sort order. Comma-separated list of sort keys with optional 'desc' modifier. Valid keys: 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', 'viewedByMeTime'. Example: 'modifiedTime desc' or 'folder,modifiedTime desc,name'. Defaults to None (Drive API default ordering). | |
| file_type | No | Restrict results to a specific file type. Accepts a friendly name ('folder', 'document'/'doc', 'spreadsheet'/'sheet', 'presentation'/'slides', 'form', 'drawing', 'pdf', 'shortcut', 'script', 'site', 'jam'/'jamboard') or any raw MIME type string (e.g. 'application/pdf'). Defaults to None (all types). | |
| folder_id | No | The ID of the Google Drive folder. Defaults to 'root'. For a shared drive, this can be the shared drive's ID to list its root, or a folder ID within that shared drive. | root |
| page_size | No | The maximum number of items to return. Defaults to 100. | |
| page_token | No | Page token from a previous response's nextPageToken to retrieve the next page of results. | |
| resource_type | No | What to list. Use "items" for folder contents or "shared_drives" for shared drive containers. Defaults to "items". | items |
| user_google_email | Yes | The user's Google email address. Required. | |
| include_organizers | No | When resource_type="shared_drives", include principals with the organizer role. This costs one extra permissions.list API call per shared drive returned. Defaults to False. | |
| include_items_from_all_drives | No | Whether items from all accessible shared drives should be included if `drive_id` is not set. Defaults to True. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the read-only, idempotent, non-destructive profile. The description adds meaningful behavioral context about drive_id scoping, folder_id relativity, include_items_from_all_drives behavior, and the shared drive container mode. It does not contradict annotations; minor omission is listing depth (immediate vs recursive).
Agents need to know what a tool does to the 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 with no filler. The main action is front-loaded, and the conditional branches are expressed compactly. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high parameter count and two distinct modes, the description covers the primary scenarios and parameter relationships. Minor gaps like pagination behavior and non-recursive listing are largely handled by the schema and output schema, making it fairly 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 covers all 13 parameters with 100% description coverage, so baseline is 3. The description adds cross-parameter semantics: it explains how drive_id, folder_id, resource_type, and include_items_from_all_drives interact based on whether drive_id is set, which is more than the sum of individual schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a clear verb ('Lists') and distinguishes two modes: files/folders vs shared drive containers. It also explains drive scoping behavior, which differentiates it from siblings like search_drive_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 conditional guidance: if drive_id is specified, list within that drive; if not, list My Drive and accessible shared drives; set resource_type to 'shared_drives' for containers. However, it does not explicitly contrast with search_drive_files or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_form_responsesList Form ResponsesBRead-onlyIdempotent
List a form's responses.
| Name | Required | Description | Default |
|---|---|---|---|
| form_id | Yes | The ID of the form. | |
| page_size | No | Maximum number of responses to return. Defaults to 10. | |
| page_token | No | Token for retrieving next page of results. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world, and non-destructive behavior, so the description adds no new behavioral context. It does not mention pagination behavior, response ordering, or any other trait beyond what annotations and schema already provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short, front-loaded sentence with no filler or unnecessary detail. It is concise, though it largely restates the title and provides no additional structural information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with a full output schema, rich annotations, and complete parameter documentation, the description is sufficient to call the tool correctly. The main gap is usage guidance relative to sibling tools, which is already accounted for in that dimension.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All four parameters are fully described in the input schema (100% coverage), so no compensation is needed from the description. The description itself adds no parameter-level meaning, which is acceptable given the complete 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 ('List') and resource ('a form's responses'), making the operation clear. It does not explicitly mention sibling tools like get_form_response, so the agent must infer the collection-versus-single distinction from the plural noun and tool 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?
The description is a single clause with no guidance on when to use this tool versus alternatives such as get_form_response or get_form. There are no stated conditions, exclusions, or routing hints for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gmail_filtersList Gmail FiltersARead-onlyIdempotent
Lists all Gmail filters configured in the user's mailbox.
| Name | Required | Description | Default |
|---|---|---|---|
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds the scope 'all filters in the user's mailbox' but does not provide extra behavioral context such as pagination, ordering, or auth prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no filler. It is front-loaded with the verb and resource and does not waste tokens.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple one-parameter schema, the presence of an output schema, and rich annotations, the description is largely complete for correct invocation. It could be more complete by noting any required auth prerequisite, but this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so user_google_email is already well documented in the schema. The tool description adds no additional parameter meaning, which is acceptable per baseline but not enhancing.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Lists') and a clear resource ('all Gmail filters configured in the user's mailbox'). It cleanly distinguishes this from sibling tools like list_gmail_labels and manage_gmail_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?
The intended use is implied: call this tool when you need to see the Gmail filters for a user. However, it does not explicitly state when to avoid it or mention any alternative, such as using manage_gmail_filter to create/update filters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gmail_labelsList Gmail LabelsCRead-onlyIdempotent
Lists labels in the user's Gmail account.
| Name | Required | Description | Default |
|---|---|---|---|
| prefix | No | Return only labels whose name starts with this exact (case-sensitive) string. users.labels.list accepts no filter, so the full list is fetched and narrowed here: this shrinks what the caller receives, not the API call. | |
| compact | No | Return minimal JSON {"count", "labels": [{"id", "name"}]} sorted by name, instead of the formatted text list. For callers that parse the result, e.g. a label cache refresh. | |
| include_system | No | Include Gmail system labels (INBOX, SENT, ...). Set False to return user labels only. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already carry the safety profile (readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false), but the description itself adds zero behavioral context beyond restating the tool's name. It discloses no auth requirements, no account-scope nuances, and no output characteristics; notably, the schema's prefix parameter description ('the full list is fetched and narrowed here') does more behavioral disclosure than the tool description itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero filler and the core action front-loaded. It is appropriately sized for a simple read tool. It doesn't earn a 5 because the brevity comes at the cost of omitting usage guidance that similar tools include as a second 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?
With 100% schema coverage, detailed parameter descriptions, a present output schema, and four safety annotations, an agent can technically invoke and parse the result correctly. The description is adequate but complete only in a minimal sense: it fails to help an agent disambiguate between list_gmail_labels and list_gmail_filters, and it never states that this tool is the read-side counterpart to manage_gmail_label.
Complex tools with many parameters or behaviors need more documentation. Simple 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 of 3 applies. The tool description mentions no parameters, but each of the four parameters carries a rich description in the schema, including prefix case-sensitivity and the fetch-then-narrow behavior, the compact JSON response shape, and the include_system toggle. The schema does the heavy lifting here, and the description adds nothing beyond it.
Input schemas describe structure but not intent. Descriptions should explain 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 'Lists labels in the user's Gmail account' uses a specific verb (Lists) and a clear resource (labels in the user's Gmail account). It is precise about what is being listed and does not confuse the operation with mutation tools like manage_gmail_label. However, it does not explicitly differentiate from the closely related sibling list_gmail_filters, leaving the agent to infer the labels-vs-filters distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives. With siblings like list_gmail_filters, manage_gmail_label, and modify_gmail_message_labels, an agent receives no basis for choosing between listing labels, listing filters, or managing labels, so the when-to-use decision is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_presentation_commentsList Presentation CommentsARead-onlyIdempotent
List all comments from a Google Presentation (optional max_comments to limit results).
| Name | Required | Description | Default |
|---|---|---|---|
| max_comments | No | ||
| presentation_id | Yes | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavior beyond the annotations by mentioning the optional max_comments limit. However, the read-only, idempotent nature is already covered by annotations, and the description does not clarify subtleties like whether resolved comments or replies are included. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no redundant phrasing. Every element earns its place: the resource, the action, and the optional limiting parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with annotations and an output schema, this definition is nearly complete. It clearly states what the tool returns and the optional limit. It lacks only explicit context about alternative comment tools and details like comment types or reply handling, but those are not required for basic 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?
The schema has no parameter descriptions, so the description partially compensates by explaining max_comments as an optional limiter and by identifying the target resource as a Google Presentation for presentation_id. However, user_google_email is left to be inferred from its name, and no format or source guidance is provided. Partial compensation is present but not complete.
Input schemas describe structure but not intent. Descriptions should explain 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 action ('List all comments') and a specific resource ('from a Google Presentation'), which clearly distinguishes it from sibling tools like list_document_comments and list_spreadsheet_comments. It also conveys the optional limiting behavior via max_comments. This is exact and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance about when to use this tool versus alternatives such as manage_presentation_comment, list_document_comments, or list_spreadsheet_comments. The resource scope is implied, but the description does not say when to prefer this tool or when to avoid it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_script_processesList Script ProcessesBRead-onlyIdempotent
Lists recent execution processes for user's scripts.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Number of results (default: 50) | |
| script_id | No | Optional filter by script ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds only the vague qualifier 'recent' and does not clarify what timeframe that implies, whether processes include running vs. completed ones, or how pagination behaves. 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 definition is a single, front-loaded sentence with no filler. It efficiently communicates the action and resource, though its brevity contributes to the lack of usage and behavioral context. Strong on conciseness, slightly weak on completeness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 list operation with full schema coverage, safety annotations, and an output schema, the description is nearly enough. However, it does not define what qualifies as a 'process', what 'recent' means, or how this relates to get_script_metrics. These gaps keep it from being fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented with meaningful descriptions. The tool description's phrase 'user's scripts' loosely reflects user_google_email but adds no new semantic detail beyond the schema. 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?
The description states a specific action ('Lists') and a specific resource ('recent execution processes for user's scripts'). It is clearly distinguishable from obvious siblings like list_script_projects and run_script_function, though it does not explicitly separate itself from get_script_metrics, which could also relate to executions. Overall the core purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as get_script_metrics or list_script_projects. There are no stated prerequisites, conditions, or exclusions. An agent is left to infer the correct context from the name and schema alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_script_projectsList Script ProjectsARead-onlyIdempotent
Lists Google Apps Script projects accessible to the user.
Uses Drive API to find Apps Script files.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Number of results per page (default: 50) | |
| page_token | No | Token for pagination (optional) | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, openWorldHint, and destructiveHint. The description adds the implementation detail 'Uses Drive API to find Apps Script files' and the scope 'accessible to the user,' but nothing beyond that. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core purpose and followed by a one-line implementation note. No unnecessary detail, perfectly sized for a simple list operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with full parameter descriptions, robust annotations, and an output schema, the description covers the essential purpose and scope. Pagination is implied by page_token/page_size, so no critical information is missing, though a brief note on result ordering or returned fields would make it 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% and all three parameters (page_size, page_token, user_google_email) are well-described. The tool description adds no parameter-specific meaning 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?
The description clearly states the specific action and resource: 'Lists Google Apps Script projects accessible to the user.' This distinguishes it from sibling tools like list_drive_items, list_script_processes, and get_script_project without requiring the reader to inspect schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when you need to enumerate Apps Script projects) but does not explicitly state when to prefer alternatives or when not to use it. No guidance on exclusions or comparison with related list tools like list_drive_items.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sheet_tablesList Sheet TablesARead-onlyIdempotent
Lists all structured tables in a spreadsheet with their IDs, names, ranges, and column details. Use this to find table IDs for append_table_rows.
| Name | Required | Description | Default |
|---|---|---|---|
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 scope information ('all structured tables') and return contents, but does not disclose potential pagination, rate limits, or authorization nuances. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with zero waste. The primary behavior and return contents are front-loaded, followed immediately by the practical purpose. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, two required parameters, full schema coverage, rich annotations, and an output schema, this description is complete. An agent can correctly invoke it and understand why the result matters for append_table_rows.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters are described clearly ('The ID of the spreadsheet', 'The user's Google email address'). The description adds no additional parameter-level meaning, which is acceptable since the schema already carries the full 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: 'Lists all structured tables in a spreadsheet' with the exact outputs (IDs, names, ranges, column details). This clearly distinguishes it from siblings like list_spreadsheets, read_sheet_values, and get_spreadsheet_info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 context: 'Use this to find table IDs for append_table_rows.' This tells the agent when to call it. It does not explicitly mention when not to use it or name alternative tools for reading sheet values, so it stops short of full exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_spacesList SpacesBRead-onlyIdempotent
Lists Google Chat spaces (rooms and direct messages) accessible to the user.
Returns: str: A formatted list of Google Chat spaces accessible to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | ||
| space_type | No | all | |
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds that the result is a formatted string of spaces accessible to the user, but does not disclose pagination, ordering, or space-type filtering behavior beyond the schema's default. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the action in the first sentence. The second 'Returns' line is somewhat redundant but concisely specifies the return format. No rambling or unnecessary 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 simple list tool with strong annotations, the description is still incomplete because it omits any explanation of required parameter semantics and does not offer usage context such as discovering spaces before sending messages. With 0% schema coverage and no output schema details visible beyond 'str', the agent lacks enough guidance to filter spaces or understand the required email. The annotations cover safety, but not invocation semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides no information about the three parameters. With schema description coverage at 0%, it does not compensate by explaining why 'user_google_email' is required or what 'space_type' and 'page_size' mean. The agent must rely solely on parameter names, which is insufficient for correctly invoking the tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Lists Google Chat spaces') and clarifies scope ('rooms and direct messages') and access ('accessible to the user'). It is clearly distinct from sibling tools like get_messages or search_messages, which handle message content rather than spaces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when needing to enumerate the user's spaces but gives no explicit when-to-use or alternative guidance. It does not mention that list_spaces is a prerequisite for messaging tools or contrast it with search_messages. Sibling differentiation is left mostly to the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_spreadsheet_commentsList Spreadsheet CommentsBRead-onlyIdempotent
List all comments from a Google Spreadsheet (optional max_comments to limit results).
| Name | Required | Description | Default |
|---|---|---|---|
| max_comments | No | ||
| spreadsheet_id | Yes | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the core safety profile is covered. The description adds the behavioral detail that max_comments can limit the returned results, which is useful beyond the schema. It does not contradict the annotations, but it also does not disclose anything about pagination, reply inclusion, or comment ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, front-loading the action and resource before the optional parameter detail. Every word earns its place, and the parenthetical keeps the optional limit information out of the main clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with an output schema and strong safety annotations, the description is reasonably complete. However, it lacks guidance on tool selection and leaves the user_google_email parameter semantically unexplained. These are meaningful gaps, but not severe enough to make the tool unusable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the input schema's lack of explanations. It only adds meaning to max_comments by saying it limits results, and it implicitly maps spreadsheet_id to 'a Google Spreadsheet'. The required user_google_email parameter is completely unexplained, leaving the agent to infer its purpose from the name alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'List all comments from a Google Spreadsheet'. It distinguishes itself from sibling tools like list_document_comments and list_presentation_comments by explicitly naming the spreadsheet context. The optional max_comments parenthesis further clarifies the tool's 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?
The description gives no explicit guidance about when to use this tool versus alternatives such as manage_spreadsheet_comment or list_document_comments. It does not state any exclusions, prerequisites, or when to prefer a sibling tool. The only usage hint is the optional max_comments parameter, which is about result limiting rather than tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_spreadsheetsList SpreadsheetsBRead-onlyIdempotent
Lists spreadsheets from Google Drive that the user has access to.
| Name | Required | Description | Default |
|---|---|---|---|
| max_results | No | Maximum number of spreadsheets to return. Defaults to 25. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the access-based scoping (spreadsheets the user can access, not merely owns), which is useful beyond the annotations. It does not mention pagination or ordering, but with annotation coverage the bar is met at a basic level.
Agents need to know what a tool does to the 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 12-word sentence that front-loads the verb and resource with zero filler. Every word earns its place and the core scope ('spreadsheets from Google Drive that the user has access to') is stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no description; annotations cover the safety profile; and both parameters are fully documented. The real gap is tool-selection context: nothing distinguishes this from search_drive_files or list_drive_items, which matters in a sibling set this large. For a simple list operation, the definition is otherwise adequately 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%: both user_google_email and max_results are already fully described in the input schema, including the default of 25. The description adds no parameter-specific meaning, 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?
The description uses a specific verb ('Lists') and a specific resource ('spreadsheets from Google Drive that the user has access to'), so an agent can tell this enumerates accessible spreadsheets. It implicitly distinguishes from siblings like list_drive_items (all files) and get_spreadsheet_info (single spreadsheet metadata), but it does not name any alternative sibling, so the differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusions, and no alternatives named. With roughly 90 siblings including search_drive_files, list_drive_items, and get_spreadsheet_info, the description gives the agent no textual basis for selecting this tool over those that could also surface spreadsheet data. The phrase 'that the user has access to' supplies minor scope context but no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_task_listsList Task ListsBRead-onlyIdempotent
List all task lists for the user.
| Name | Required | Description | Default |
|---|---|---|---|
| page_token | No | Token for pagination. | |
| max_results | No | Maximum number of task lists to return (default: 1000, max: 1000). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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, covering the safety profile. The description adds the 'for the user' scoping, which is useful context. It does not disclose whether shared/delegated lists are included or how the 1000-item cap affects results, but with rich annotations the bar is lower and there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single 8-word sentence with zero filler, and the key scope ('all', 'for the user') is front-loaded. It is efficient, though it borders on under-specification since it carries no usage or differentiation 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?
For a simple read-only list tool, the schema covers parameters, annotations cover safety, and an output schema exists. The clear gap is routing: nothing tells the agent to prefer this over get_task_list or list_tasks, nor clarifies whether the result includes only the user's own lists. Adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all three parameters (page_token, max_results, user_google_email) already documented including defaults and the 1000 maximum. The description adds no 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?
The description states a specific verb (List), resource (task lists), and scope (all, for the user), so it is not a tautology. However, it does not explicitly differentiate itself from the sibling get_task_list, leaving the agent to infer the single-vs-collection distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus close siblings such as get_task_list, manage_task_list, or list_tasks. No alternatives, exclusions, or selection conditions are mentioned, so the agent must infer usage context from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksList TasksBRead-onlyIdempotent
List all tasks in a specific task list.
| Name | Required | Description | Default |
|---|---|---|---|
| due_max | No | Upper bound for due date (RFC 3339 timestamp). | |
| due_min | No | Lower bound for due date (RFC 3339 timestamp). | |
| page_token | No | Token for pagination. | |
| max_results | No | Maximum number of tasks to return. (default: 20, max: 10000). | |
| show_hidden | No | Whether to include hidden tasks (default: False). | |
| updated_min | No | Lower bound for last modification time (RFC 3339 timestamp). | |
| show_deleted | No | Whether to include deleted tasks (default: False). | |
| task_list_id | Yes | The ID of the task list to retrieve tasks from. | |
| completed_max | No | Upper bound for completion date (RFC 3339 timestamp). | |
| completed_min | No | Lower bound for completion date (RFC 3339 timestamp). | |
| show_assigned | No | Whether to include assigned tasks (default: False). | |
| show_completed | No | Whether to include completed tasks (default: True). Note that show_hidden must also be true to show tasks completed in first party clients, such as the web UI and Google's mobile apps. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the description does not need to restate safety. The description adds the scoping to a single task list but does not mention filtering defaults, pagination, or that hidden/deleted tasks are excluded by default; saying 'all tasks' is slightly overstated relative to the default parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct, front-loaded sentence with no filler or redundant wording. It is appropriately concise for a read-only list operation, though it could have used an additional sentence to clarify filters or sibling relationships.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 13 parameters, 2 required, and many task-related siblings, so a one-line generic description is thin. The output schema and rich parameter descriptions compensate partially, but the description still lacks guidance on when to choose this tool and what the default visibility/filter behavior is.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all 13 parameters, so the schema already carries the semantic burden. The description only adds the notion of 'specific task list', which maps to task_list_id, but it does not enhance understanding of filters, pagination, or default behaviors beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('tasks in a specific task list'), clearly identifying what the tool returns. It does not explicitly differentiate from sibling tools like list_task_lists or get_task, but the 'specific task list' phrasing helps disambiguate it from operations that manage task lists or individual tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives such as list_task_lists, get_task, or manage_task. The description only states what it does, with no mention of exclusions, prerequisites, or when a different task-related tool would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_versionsList VersionsARead-onlyIdempotent
Lists all versions of a script project.
Versions are immutable snapshots of your script code. They are created when you deploy or explicitly create a version.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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, covering safety. The description adds valuable context that versions are immutable snapshots created by deployments or explicit creation, which clarifies the data scope and reinforces the non-mutating nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core action front-loaded and the supporting snapshot context in a compact second sentence. 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 simple two-parameter read-only listing tool with full schema coverage and an output schema, the description covers what the tool does and the domain context. It does not mention pagination or ordering, but that is reasonably left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the two parameters (script_id, user_google_email) are already documented. The description adds no further parameter-level detail, so it meets 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?
The description opens with a specific verb+resource: 'Lists all versions of a script project.' It clearly distinguishes from sibling tools like get_version (single version) and create_version (write operation) by emphasizing 'all versions' and the snapshot nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No alternatives are named or exclusions given, but the immutability and creation context implies this is for enumerating historical script snapshots. It does not explicitly say when to prefer list_versions over get_version or list_deployments, leaving usage mostly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_conditional_formattingManage Conditional FormattingADestructive
Manages conditional formatting rules on a Google Sheet. Supports adding, updating, and deleting conditional formatting rules via a single tool.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The operation to perform. Must be one of "add", "update", or "delete". | |
| range_name | No | A1-style range (optionally with sheet name). Required for "add". Optional for "update" (preserves existing ranges if omitted). Not used for "delete". | |
| rule_index | No | 0-based index of the rule. For "add", optionally specifies insertion position. Required for "update" and "delete". | |
| sheet_name | No | Sheet name to locate the rule when range_name is omitted. Defaults to the first sheet. Used by "update" and "delete". | |
| text_color | No | Hex text color to apply when condition matches. Used by "add" and "update". | |
| condition_type | No | Sheets condition type (e.g., NUMBER_GREATER, TEXT_CONTAINS, DATE_BEFORE, CUSTOM_FORMULA). Required for "add". Optional for "update" (preserves existing type if omitted). | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| gradient_points | No | List (or JSON list) of gradient points for a color scale. If provided, a gradient rule is created and boolean parameters are ignored. Used by "add" and "update". | |
| background_color | No | Hex background color to apply when condition matches. Used by "add" and "update". | |
| condition_values | No | Values for the condition; accepts a list or a JSON string representing a list. Depends on condition_type. Used by "add" and "update". | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive and non-read-only behavior. The description adds that deletion is supported and that the tool consolidates add/update/delete operations, but it does not disclose side effects, auth requirements, or action-specific consequences beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The first sentence establishes the resource and the second enumerates the operations, making the purpose immediately clear 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 tool with 11 parameters and three distinct actions, the schema carries the detailed operational load very well, and an output schema exists so return-value explanation is unnecessary. The description could add a brief usage-selection note, but combined with the rich schema it is largely sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter description already documents action-specific requirements such as rule_index being required for update/delete and range_name being required for add. The tool description itself adds no parameter-level meaning, 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 names a specific resource—conditional formatting rules on a Google Sheet—and clearly enumerates the supported operations: adding, updating, and deleting. This distinguishes it from general formatting tools like format_sheet_range and avoids being a mere restatement of the tool 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?
The description implies the use case by focusing on conditional formatting rules, but it never explicitly says when to prefer this tool over alternatives or when not to use it. It states what the tool does but provides no exclusions or sibling-tool comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_contactManage ContactADestructive
Create, update, or delete a contact. Consolidated tool replacing create_contact, update_contact, and delete_contact.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | List of URL dicts {value, type?}. Supported types: homepage, blog, profile, work, ftp, reservations, other, etc. | |
| No | [DEPRECATED] Email address. Use emails=[{"address":..., "type":"other"}]. | ||
| notes | No | Additional notes (for create/update). | |
| phone | No | [DEPRECATED] Single phone number. Use phones=[{"number":..., "type":"mobile"}]. | |
| action | Yes | The action to perform: "create", "update", or "delete". | |
| emails | No | List of email dicts {address, type?}. | |
| phones | No | List of phone dicts {number, type?}. Supported types: mobile, work, home, main, workMobile, internal, other, etc. Use type="internal" for internal PBX/ATS short numbers (e.g. 250, 301) — stored as a standalone number without + prefix, displayed as "Internal: 250". | |
| address | No | Street address (for create/update). | |
| birthday | No | Birthday as 'YYYY-MM-DD', 'MM-DD' (no year), or 'clear'/'' to remove. | |
| job_title | No | [DEPRECATED] Job title. Use organizations=[{"title":...}]. | |
| nicknames | No | List of nickname dicts {value, type?}. Useful for bilingual contacts (e.g. Hebrew/English alternative forms). Android dialer and WhatsApp search both index nicknames, enabling cross-script lookup. Supported types: default, alternate_name, maiden_name, initials, other, etc. | |
| relations | No | List of relation dicts {person, type?}. Supported types: spouse, child, parent, friend, manager, assistant, etc. | |
| urls_mode | No | How to update urls on "update": "merge" (default), "replace", or "remove". merge dedups by normalized URL (lowercased, trailing slash stripped). | merge |
| contact_id | No | The contact ID. Required for "update" and "delete" actions. | |
| given_name | No | First name (for create/update). | |
| emails_mode | No | How to update emails on "update": "merge" (default), "replace", or "remove". | merge |
| family_name | No | Last name (for create/update). | |
| phones_mode | No | How to update phones on "update": "merge" (default), "replace", or "remove". merge = read-modify-write with dedup by canonicalForm/normalized value. replace = overwrite all phones with provided list. remove = delete phones matching provided numbers. | merge |
| organization | No | [DEPRECATED] Company name. Use organizations=[{"name":...}]. | |
| user_defined | No | List of custom field dicts {key, value}. Useful for structured data like account numbers, IDs, or custom dates. | |
| organizations | No | List of org dicts {name?, title?, department?, jobDescription?, type?}. | |
| nicknames_mode | No | How to update nicknames on "update": "merge" (default), "replace", or "remove". | merge |
| relations_mode | No | How to update relations on "update": "merge" (default), "replace", or "remove". | merge |
| user_defined_mode | No | How to update custom fields on "update": "merge" (default), "replace", or "remove". merge overrides value on matching key; new keys appended. | merge |
| user_google_email | Yes | The user's Google email address. Required. | |
| organizations_mode | No | How to update orgs on "update": "merge" (default), "replace", or "remove". | merge |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnly=false, and idempotent=false, and the description's create/update/delete verbs are consistent with those hints. The description adds no deeper behavioral detail such as merge semantics, read-modify-write behavior, or prerequisites for update/delete, but it does not contradict 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 a single front-loaded sentence with no filler. The first clause states the core action, and the second clause justifies why this tool exists, earning its place without bloating the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 very rich input schema, output schema presence, and annotations, the description does not need to enumerate parameters or return behavior. The only minor gap is the lack of an explicit pointer to manage_contacts_batch for multi-contact operations, but the schema and annotations otherwise make the tool sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema already documents all 26 parameters in detail, including action-specific requirements and mode semantics. The description itself contributes no additional parameter-level meaning, so it stays at the coverage baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's verb-resource scope: 'Create, update, or delete a contact.' It also frames the tool as a consolidated replacement for three legacy tools, making its role in the API unambiguous and easy to distinguish from read-only or batch-oriented contact tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful context by naming the three tools it replaces, which implies this is the single-contact CRUD entry point. However, it does not explicitly address when to use this tool versus sibling manage_contacts_batch or other contact-related tools, leaving the batch-vs-single decision implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_contact_groupManage Contact GroupADestructive
Create, update, delete a contact group, or modify its members. Consolidated tool replacing create_contact_group, update_contact_group, delete_contact_group, and modify_contact_group_members.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The group name. Required for "create" and "update" actions. | |
| action | Yes | The action to perform: "create", "update", "delete", or "modify_members". | |
| group_id | No | The contact group ID. Required for "update", "delete", and "modify_members" actions. | |
| add_contact_ids | No | Contact IDs to add (for "modify_members"). | |
| delete_contacts | No | If True and action is "delete", also delete contacts in the group (default: False). | |
| user_google_email | Yes | The user's Google email address. Required. | |
| remove_contact_ids | No | Contact IDs to remove (for "modify_members"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate that the tool is destructive, non-read-only, and non-idempotent, so the description need not repeat that. It does not add extra behavioral context beyond the listed actions, such as the cascading delete_contacts side effect, which is left to the parameter schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The core operations are front-loaded, and the consolidation rationale is stated in one short follow-up 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?
With full schema coverage and an output schema, an agent has enough structured detail to invoke the tool correctly. It could be improved by explicitly routing users to read-only group tools or highlighting the delete_contacts cascade, but the core consolidation intent is clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline applies. The description's action list maps directly onto the action parameter values, but it does not add dependency or relationship details beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear set of actions—create, update, delete, or modify members—tied to a specific resource: contact groups. It also distinguishes itself by explicitly noting it is a consolidated replacement for several older sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes this as the tool to use for contact group mutations, replacing four dedicated tools. However, it does not explicitly state when to prefer read-only siblings like list_contact_groups or get_contact_group.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_contacts_batchManage Contacts BatchCDestructive
Batch create, update, or delete contacts. Consolidated tool replacing batch_create_contacts, batch_update_contacts, and batch_delete_contacts.
| Name | Required | Description | Default |
|---|---|---|---|
| field | No | For "update" action — the single People API field to update across all contacts in this batch. Required. Must be one of: names, phoneNumbers, emailAddresses, organizations, nicknames, urls, userDefined, relations, biographies, addresses, birthdays. Using a single field per batch call prevents unintentional data loss from a union updateMask overwriting unrelated fields. | |
| action | Yes | The action to perform: "create", "update", or "delete". | |
| updates | No | List of update dicts for "update" action. Each dict must contain contact_id and may contain the same fields as contacts. | |
| contacts | No | List of contact dicts for "create" action. Each dict may contain: given_name, family_name, phones, emails, organizations, notes, address. Deprecated: phone, email, organization, job_title. | |
| contact_ids | No | List of contact IDs for "delete" action. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose the destructive, non-read-only, non-idempotent nature, and the description adds no behavioral context beyond the bare operations. Important caveats about update overwrite risk and field-specific behavior appear only in the schema, not in the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. It front-loads the core action and provides consolidation context, though it is slightly terse for a complex batch mutation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema and annotations carry most of the necessary context, including per-parameter semantics and destructive behavior. However, the description does not provide a high-level overview connecting actions to their required inputs (contacts vs updates vs contact_ids), which would help an agent plan a batch operation safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter has detailed descriptions, including action enums, field constraints, and which parameter applies to which action. The description adds no parameter information, but none is needed given the thorough 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 ('Batch create, update, or delete contacts') and a resource, clearly indicating the tool's consolidated purpose. It distinguishes itself from the replaced batch_* tools, though it does not explicitly contrast with current siblings like manage_contact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this batch tool versus the singular manage_contact, nor which action requires which parameter set. The phrase 'Consolidated tool replacing...' references tools that are no longer in the sibling list, so it provides little actionable routing for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_deploymentManage DeploymentBDestructive
Manages Apps Script deployments. Supports creating, updating, and deleting deployments.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform - "create", "update", or "delete" | |
| script_id | Yes | The script project ID | |
| description | No | Deployment description (required for create; optional for update when version_number is supplied) | |
| deployment_id | No | The deployment ID (required for update and delete) | |
| version_number | No | Version number to point the deployment at (for update only). Required to roll a deployment forward to a newly created script version. | |
| user_google_email | Yes | User's email address | |
| version_description | No | Optional version description (for create only) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=false. The description adds no context beyond those signals, such as whether deletion is irreversible, whether updates immediately change live deployments, or what authorization is needed. It is consistent with the annotations, so no contradiction, but it contributes no extra 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?
The description is two short sentences with no filler. The first sentence identifies the resource and the second enumerates actions; every sentence earns its place and the key scope 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?
The definition is adequate because the rich input schema covers conditional requirements and the annotations cover the destructive profile, while an output schema exists. Still, a reminder that list_deployments should be used to find deployment IDs, or a note on consequences of deletion, would make the context more complete for a multi-action mutation 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%, with per-parameter explanations of action-specific requirements, such as deployment_id for update/delete, version_number for update, and description for create. The description itself adds no parameter detail, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource (Apps Script deployments) and enumerates the concrete operations: creating, updating, and deleting. This makes it clear what the tool does and implicitly distinguishes it from the read-only sibling list_deployments, though it never names an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: whenever deployments must be created, updated, or deleted. However, it gives no explicit guidance about when not to use it or which sibling to prefer, such as using list_deployments for read-only inspection or to obtain deployment_id values before update/delete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_doc_tabManage Doc TabADestructive
Manage document tabs: create, rename, delete, or populate from Markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Position index for new tab, 0-based among siblings (required for create) | |
| title | No | Tab title (required for create; used by rename) | |
| action | Yes | Action to perform - "create", "rename", "delete", or "populate_from_markdown" | |
| tab_id | No | Tab ID (required for rename, delete, populate_from_markdown; use inspect_doc_structure to find IDs) | |
| document_id | Yes | ID of the document | |
| markdown_text | No | Markdown source to render (populate_from_markdown only) | |
| parent_tab_id | No | Optional parent tab ID to nest under (create only) | |
| replace_existing | No | Clear tab body before inserting markdown (default True) | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description is consistent with them. The description adds that deletion is one of the operations, which helps identify a destructive path, but it does not disclose effects such as tab-content replacement or the irreversibility of deletion beyond what the schema's replace_existing parameter already says. This is moderate disclosure beyond annotations but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the resource and then lists all supported operations with zero filler. Every word contributes to understanding the tool's scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich schema covering 100% of parameters, an output schema, and annotations signaling destructive behavior, the tool is adequately specified for invocation. The description could still add a sentence about when to choose this tool over other document-manipulation siblings, which prevents a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple 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 of 3 applies; all nine parameters have descriptions, including per-action requirements and the action enum. The description adds only the high-level 'populate from Markdown' concept, which maps to markdown_text but adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies document tabs as the resource and enumerates the four supported operations: create, rename, delete, and populate from Markdown. This is more specific than the generic title. It does not explicitly differentiate from sibling doc-editing tools, but the tab-specific resource and 'populate from Markdown' make the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action list implies the tool is for document-tab lifecycle operations, and the schema directs agents to use inspect_doc_structure for tab IDs. However, the description itself provides no explicit when-to-use or when-not-to-use guidance and names no alternative tools. The intended scope is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_document_commentManage Document CommentA
Manage comments on a Google Document.
Actions:
create: Create a new document-level comment. Requires comment_content. Note: The Drive API cannot anchor comments to specific text; only the Google Docs UI can do that.
reply: Reply to a comment. Requires comment_id and comment_content.
resolve: Resolve a comment. Requires comment_id.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| comment_id | No | ||
| document_id | Yes | ||
| comment_content | No | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: comments are document-level, and the Drive API cannot anchor comments to specific text, only the Google Docs UI can. This limitation is important and helps set expectations. The annotations already signal mutation (readOnlyHint false), so the description does not need to restate that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well structured: a one-line overview, then a bulleted action list, then a single note that prevents a common misuse. Every sentence contributes information, and the most important scoping/limitation information is front-loaded near its relevant 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 composite mutation tool, the description covers the action-dependent parameter requirements and the key API limitation, while the output schema covers return values. It could be slightly more explicit about not using comment_id when creating and about using list_document_comments to fetch comment IDs, but overall it gives an agent enough 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?
With 0% schema description coverage, the description carries the load by mapping each action to its required parameters: create needs comment_content, reply needs comment_id and comment_content, and resolve needs comment_id. This is essential because the schema only lists the parameters without relationships. It does not elaborate on user_google_email or document_id, but those are self-explanatory from their names and the required list.
Input schemas describe structure but not intent. Descriptions should explain 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 'Manage comments on a Google Document' and then enumerates three specific operations (create, reply, resolve), so an agent knows exactly what the tool does. The resource scope (Google Document comments) distinguishes it from sibling tools managing spreadsheet or presentation comments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action list makes the intended use fairly clear and each bullet states which parameters the action requires. However, it does not explicitly state when to prefer list_document_comments for reading comments or mention that comment_id should be obtained beforehand, so the guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_drive_accessManage Drive AccessADestructive
Consolidated tool for managing Google Drive file and folder access permissions.
Supports granting, batch-granting, updating, revoking permissions, and transferring file ownership -- all through a single entry point.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Permission role -- 'reader', 'commenter', or 'writer'. Used by "grant" (defaults to 'reader') and "update". | |
| action | Yes | The access management action to perform. Required. One of: - "grant": Share with a single user, group, domain, or anyone. - "grant_batch": Share with multiple recipients in one call. - "update": Modify an existing permission (role or expiration). - "revoke": Remove an existing permission. - "transfer_owner": Transfer file ownership to another user. | |
| file_id | Yes | The ID of the file or folder. Required. | |
| recipients | No | List of recipient objects for "grant_batch". Each should have: email (str), role (str, optional), share_type (str, optional), expiration_time (str, optional). For domain shares use 'domain' field instead of 'email'. | |
| share_type | No | Type of sharing -- 'user', 'group', 'domain', or 'anyone'. Used by "grant". Defaults to 'user'. | user |
| share_with | No | Email address (user/group), domain name (domain), or omit for 'anyone'. Used by "grant". | |
| email_message | No | Custom notification email message. Used by "grant" and "grant_batch". | |
| permission_id | No | The permission ID to modify or remove. Required for "update" and "revoke" actions. | |
| expiration_time | No | Expiration in RFC 3339 format (e.g., "2025-01-15T00:00:00Z"). Used by "grant" and "update". | |
| new_owner_email | No | Email of the new owner. Required for "transfer_owner". | |
| send_notification | No | Whether to send notification emails. Defaults to True. Used by "grant" and "grant_batch". | |
| user_google_email | Yes | The user's Google email address. Required. | |
| allow_file_discovery | No | For 'domain'/'anyone' shares, whether the file appears in search. Used by "grant". | |
| move_to_new_owners_root | No | Move file to the new owner's My Drive root. Defaults to False. Used by "transfer_owner". |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey that this is a mutating, destructive operation. The description adds specificity by naming revoke and transfer_owner, which are the destructive actions, but it does not disclose side effects, reversibility, or notification behavior beyond what the schema already documents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the tool's purpose, and contains no filler. Every sentence contributes to understanding what the tool 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?
For a 14-parameter tool with five action branches, the description is somewhat lean, but the input schema richly documents each parameter and the output schema handles return values. The main gap is unresolved overlap with the sibling set_drive_file_permissions tool, which prevents a higher completeness score.
Complex tools with many parameters or behaviors need more documentation. Simple 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 each parameter individually documented in the input schema. The description adds no parameter-level detail beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (Google Drive file and folder access permissions) and enumerates the supported operations: granting, batch-granting, updating, revoking permissions, and transferring ownership. It is specific about scope, though it does not explicitly differentiate from the sibling set_drive_file_permissions tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrasing 'Consolidated tool' and 'all through a single entry point' gives clear context that this is the intended hub for permission management. However, it does not name alternatives or state when to use get_drive_file_permissions or set_drive_file_permissions instead, so exclusion guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_eventManage EventBDestructive
Manages calendar events. Supports creating, updating, deleting, and RSVP.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform - "create", "update", "delete", or "rsvp". | |
| summary | No | Event title (required for create). | |
| color_id | No | Event color ID (1-11, update only). | |
| end_time | No | End time in RFC3339 format (required for create). | |
| event_id | No | Event ID (required for update and delete). | |
| location | No | Event location. | |
| response | No | RSVP response — "accepted", "declined", "tentative", or "needsAction" (rsvp action only). | |
| timezone | No | IANA timezone applied to both boundaries (e.g., "America/New_York"). Overridden per boundary by start_timezone/end_timezone. | |
| attendees | No | Attendee email addresses or objects. | |
| reminders | No | Custom reminder objects. | |
| recurrence | No | RFC5545 recurrence rules for a recurring event, e.g. ["RRULE:FREQ=WEEKLY;COUNT=10"]. | |
| start_time | No | Start time in RFC3339 format (required for create). | |
| visibility | No | "default", "public", "private", or "confidential". | |
| attachments | No | List of Google Drive file URLs or IDs to attach. On action="update" this replaces the event's existing attachments rather than appending to them, matching the Calendar API's patch semantics. | |
| calendar_id | No | Calendar ID (default: 'primary'). | primary |
| description | No | Event description. | |
| end_timezone | No | IANA timezone for the end boundary only, overriding timezone. See start_timezone. | |
| rsvp_comment | No | Optional message to include with the RSVP response (rsvp action only). | |
| send_updates | No | Notification behavior for create, update, delete, and rsvp — "all" (default), "externalOnly", or "none". | |
| transparency | No | "opaque" (busy) or "transparent" (free). | |
| conference_id | No | Optional provider-side conference/meeting ID. | |
| conference_uri | No | Join URL for the third-party conference (e.g. "https://zoom.us/j/123456789"). Required when conference_provider is set. | |
| start_timezone | No | IANA timezone for the start boundary only, overriding timezone. Use for events whose two ends sit in different zones - a flight departing 13:45 "Asia/Jerusalem" and landing 17:50 "Europe/Amsterdam" is one event authored in two zones. Passing a single timezone for such an event silently rewrites one end's wall-clock. | |
| add_google_meet | No | Whether to add/remove native Google Meet. | |
| conference_data | No | Raw Google Calendar `conferenceData` payload to attach a third-party conference (Zoom/Webex/Teams add-on). Use this for full control; mutually exclusive with the conference_provider helper params and with add_google_meet. (create/update only) | |
| guests_can_modify | No | Whether attendees can modify. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| conference_passcode | No | Optional passcode for the third-party conference. | |
| conference_provider | No | Higher-level helper: third-party provider name (e.g. "zoom", "webex", "teams"). Requires conference_uri. The MCP builds the addOn `conferenceData` block internally. (create/update only) | |
| use_default_reminders | No | Whether to use default reminders. | |
| guests_can_invite_others | No | Whether attendees can invite others. | |
| guests_can_see_other_guests | No | Whether attendees can see other guests. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose the safety profile (destructiveHint=true, readOnlyHint=false), and the description is consistent with them — "deleting" matches the destructive hint. The description adds no further behavioral context (notification behavior, deletion permanence, attachment patch-replace semantics), and the one meaningful schema note on that is tucked into a parameter description. No contradiction with annotations, so not a 1, but the description contributes minimal signal 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?
Two short sentences with the resource front-loaded and zero filler; the action enumeration in the second sentence earns its place. It is efficient but extremely terse for a 32-parameter, four-action tool, so there is room for one framing clause (e.g., that parameter requirements are action-dependent) before it is optimally sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema, 100%-covered parameter schema, and annotations already carry most of the burden, so the thin description is not crippling. What is missing is mode-specific guidance (which parameters each action needs, though the schema covers this) and routing among siblings such as get_events for reading or create_calendar for calendar-level operations. For a tool this complex, a small amount of cross-tool routing would materially improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all 32 parameters individually documented including action-scoped requirements ("required for create", "update only", "rsvp action only") and subtleties like dual-timezone overrides and attachment replacement semantics. The description's only parameter-adjacent content is the action enumeration, which maps directly onto the action parameter. Baseline 3 applies because the schema carries the full 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?
Names the resource ("calendar events") and enumerates all four operations (create, update, delete, RSVP), making its scope immediately legible and distinguishing its intent from read-only event tools like get_events. It earns a 4 rather than 5 because "manages" is a generic umbrella verb and no sibling is named for explicit contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 action list implies usage context — invoke this when an event must be created, updated, deleted, or RSVP'd — but the description never states when not to use it (e.g., reading events via get_events, or calendar-level operations via create_calendar). No exclusions or alternatives are given; per-action parameter requirements are left entirely to the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_focus_timeManage Focus TimeADestructive
Manages Focus Time events on Google Calendar. These special events auto-decline meeting invitations and, by default, set the user's chat status to Do Not Disturb, helping protect blocks of uninterrupted work time.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform - "create", "list", "update", or "delete". | |
| summary | No | Display text on the calendar. Defaults to "Focus Time". | |
| end_time | No | End date/time (exclusive). Same format as start_time. For a single full day on April 5, use start_time='2026-04-05' and end_time='2026-04-06'. Required for create. | |
| event_id | No | Event ID. Required for "update" and "delete" actions. | |
| time_max | No | For "list" action: end of time range. | |
| time_min | No | For "list" action: start of time range. Defaults to current time. Recurring series are expanded into individual instances in the requested range. | |
| timezone | No | Timezone for the event (e.g., "America/New_York", "Europe/London"). Required when using date-only values or dateTime values without an explicit UTC offset. | |
| recurrence | No | RFC5545 recurrence rules for a recurring Focus Time series, e.g. ["RRULE:FREQ=WEEKLY;COUNT=10"]. | |
| start_time | No | Start date/time. Use 'YYYY-MM-DD' for full-day or RFC3339 for partial-day (e.g., '2024-04-05T09:00:00Z'). Date-only values are auto-converted to dateTime (midnight-to-midnight). Required for create. | |
| calendar_id | No | Calendar ID. Defaults to 'primary'. Focus Time status events live on primary calendars, so use 'primary' or a user's primary calendar ID/email rather than a secondary calendar ID. | primary |
| chat_status | No | Google Chat status during the focus time. Supports "doNotDisturb" (default) and "available". | |
| description | No | Event description. Useful for adding context about what the focus time is for. | |
| max_results | No | For "list" action: maximum events to return. Defaults to 10. | |
| decline_message | No | Message included when auto-declining invitations. | |
| auto_decline_mode | No | How to handle conflicting invitations. One of: "declineAllConflictingInvitations" (default), "declineOnlyNewConflictingInvitations", "declineNone". | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description adds valuable behavioral context: Focus Time events auto-decline meeting invitations and, by default, set chat status to Do Not Disturb. These side effects are not obvious from the tool name alone and help the agent understand the real-world impact of creating such an event. The destructiveHint annotation is not contradicted by the description.
Agents need to know what a tool does to the 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 focused sentences front-load the core purpose and the key behavioral consequences. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema and output schema cover the parameter and return details, and the description covers the behavioral context. It is complete enough for an agent to understand this is a multi-action management tool for a special calendar event type, though it could have explicitly routed to regular-calendar or out-of-office siblings for contrast.
Complex tools with many parameters or behaviors need more documentation. Simple 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 parameters are already thoroughly documented with formats, defaults, and action-specific requirements. The description adds a conceptual layer by explaining the auto-decline and chat-status behavior that maps to auto_decline_mode and chat_status, but it does not need to restate the schema details. 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 names the specific resource (Focus Time events on Google Calendar) and explains their distinguishing behavior: auto-declining invitations and defaulting chat status to Do Not Disturb. It is clear what the tool operates on, though 'Manages' does not enumerate the create/list/update/delete actions covered by the action parameter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 establishes that this is for protecting uninterrupted work time and that these events behave differently from normal events, which implies when to use it. It does not explicitly name alternatives like manage_event or manage_out_of_office, nor does it state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_gmail_filterManage Gmail FilterBDestructive
Manages Gmail filters. Supports creating and deleting filters.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform - "create" or "delete". | |
| criteria | No | Filter criteria object (required for create). | |
| filter_id | No | ID of the filter to delete (required for delete). | |
| filter_action | No | Filter action object (required for create). Named 'filter_action' to avoid shadowing the 'action' parameter. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description simply restates the operations without adding behavioral context beyond the annotations, which already mark the tool as destructive and non-read-only. It does not disclose irreversibility, permission requirements, or what happens on duplicate filter creation.
Agents need to know what a tool does to the 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 short and front-loaded, with the second sentence adding specific operation detail. The first sentence is somewhat redundant with the tool name, but there is no wasted 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?
Combined with the well-documented schema and an existing output schema, the description is sufficient for correct invocation. The main missing piece is explicit usage routing, but the schema compensates for parameter-level guidance.
Complex tools with many parameters or behaviors need more documentation. Simple 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 each parameter documented, so the baseline is 3. The description adds no additional parameter-level meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (Gmail filters) and the specific actions (creating and deleting). It distinguishes itself from sibling tools like list_gmail_filters, though it doesn't explicitly name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys the tool's purpose—creating and deleting filters—so an agent knows when to invoke it. However, it provides no explicit guidance on when not to use it or how it relates to alternatives like list_gmail_filters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_gmail_labelManage Gmail LabelBDestructive
Manages Gmail labels: create, update, or delete labels.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Label name. Required for create, optional for update. | |
| action | Yes | Action to perform on the label. | |
| label_id | No | Label ID. Required for update and delete operations. | |
| text_color | No | Label text color as a hex string, e.g. "#ffffff". Set together with background_color. Same palette. On update, omitting both keeps the label's current color. | |
| clear_color | No | On update, remove the label's current color. Cannot be combined with background_color or text_color. | |
| background_color | No | Label background color as a hex string, e.g. "#fb4c2f". Set together with text_color; Gmail requires both. Gmail accepts only its own palette, and an unsupported value is rejected before the request. Colors apply to user labels, not system labels. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| label_list_visibility | No | Whether the label is shown in the label list. | labelShow |
| message_list_visibility | No | Whether the label is shown in the message list. | show |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds the action types but does not disclose additional behavioral traits such as irreversibility of delete, dependency on label_id for update/delete, or color constraints (these are in the schema). It does not contradict annotations, but adds minimal context beyond 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?
The description is a single concise sentence that front-loads the primary actions. There is no fluff, and it is appropriately sized for the tool's complexity. However, it lacks structured detail that could aid parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a rich input schema (100% coverage) and an output schema, so the description needn't explain return values. All parameter semantics and constraints are fully documented in the schema. The description, while minimal, does not omit anything critical when combined with the schema; an agent can 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 coverage is 100%, with detailed descriptions for all nine parameters including enums and constraints (e.g., color palette, mutual exclusivity of clear_color). The description adds nothing beyond the schema, 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 'Manages Gmail labels: create, update, or delete labels' clearly identifies the resource (Gmail labels) and enumerates the three actions. It distinguishes from siblings like list_gmail_labels (read-only) and modify_gmail_message_labels (applies labels to messages), though it doesn't explicitly name alternatives. The verb 'Manages' is generic, but the colon clarifies the 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?
No guidance is provided on when to use this tool versus siblings. There is no mention of alternatives such as list_gmail_labels for reading or modify_gmail_message_labels for message-label assignment, nor any exclusions. The agent must infer usage from the actions alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_out_of_officeManage Out of OfficeADestructive
Manages Out of Office events on Google Calendar. These special events auto-decline meeting invitations and set the user's status to "Out of office" across Google Workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform - "create", "list", "update", or "delete". | |
| summary | No | Display text on the calendar. Defaults to "Out of Office". | |
| end_time | No | End date/time (exclusive). Same format as start_time. For a single full day on April 5, use start_time='2026-04-05' and end_time='2026-04-06'. Required for create. | |
| event_id | No | Event ID. Required for "update" and "delete" actions. | |
| time_max | No | For "list" action: end of time range. | |
| time_min | No | For "list" action: start of time range. Defaults to current time. Recurring series are expanded into individual instances in the requested range. | |
| timezone | No | Timezone for the event (e.g., "America/New_York", "Europe/London"). Required when using date-only values or dateTime values without an explicit UTC offset. | |
| recurrence | No | RFC5545 recurrence rules for a recurring Out of Office series, e.g. ["RRULE:FREQ=WEEKLY;COUNT=10"]. | |
| start_time | No | Start date/time. Use 'YYYY-MM-DD' for full-day or RFC3339 for partial-day (e.g., '2024-04-05T09:00:00Z'). Date-only values are auto-converted to dateTime (midnight-to-midnight). Required for create. | |
| calendar_id | No | Calendar ID. Defaults to 'primary'. Out of Office status events live on primary calendars, so use 'primary' or a user's primary calendar ID/email rather than a secondary calendar ID. | primary |
| max_results | No | For "list" action: maximum events to return. Defaults to 10. | |
| decline_message | No | Message included when auto-declining invitations. | |
| auto_decline_mode | No | How to handle conflicting invitations. One of: "declineAllConflictingInvitations" (default), "declineOnlyNewConflictingInvitations", "declineNone". | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey readOnlyHint=false and destructiveHint=true, so the description does not need to restate mutation. It adds useful behavioral context by explaining that these events auto-decline invitations and set the user's status. However, it does not address consequences of update/delete actions, though annotations partially cover this.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The first sentence names the resource and the second explains what makes OOO events special. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with multiple actions, the description is minimal, but the input schema fully documents every parameter and an output schema exists. Annotations also flag mutability. The main gap is explicit routing versus sibling calendar tools, which is already captured in the usage_guidelines score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description contains no parameter-level detail, but schema_description_coverage is 100%, meaning every parameter already has semantic documentation. With the schema carrying that weight, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as 'Out of Office events on Google Calendar' and adds distinguishing behavior: auto-declining invitations and setting Workspace status. The verb 'Manages' is somewhat generic, but the specific resource and domain semantics make the tool's purpose evident.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case by explaining that OOO events are special auto-declining/status-setting events, but it never explicitly says when to prefer this tool over siblings like manage_event or manage_focus_time. No alternatives or exclusions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_presentation_commentManage Presentation CommentA
Manage comments on a Google Presentation.
Actions:
create: Create a new comment. Requires comment_content. Note: The Drive API cannot anchor comments to arbitrary text; Slides comments are element-scoped via the API.
reply: Reply to a comment. Requires comment_id and comment_content.
resolve: Resolve a comment. Requires comment_id.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| comment_id | No | ||
| comment_content | No | ||
| presentation_id | Yes | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds a meaningful behavioral note beyond annotations: Slides comments are element-scoped via the Drive API and cannot be anchored to arbitrary text. This warns the agent about a real API limitation that annotations do not convey. The stated create/reply/resolve mutations are consistent with readOnlyHint=false and 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?
The description is compact, scannable, and front-loaded with the resource and action list. The API limitation note is placed where relevant, and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderate-complexity management tool with an output schema and five parameters, the description covers the action semantics and the key API anchoring limitation. It could be more complete by pointing to list_presentation_comments for obtaining comment_id, but the essential call behavior is adequately specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does clarify action-conditional parameter requirements: create needs comment_content; reply needs comment_id and comment_content; resolve needs comment_id. However, it does not explain user_google_email, presentation_id, or the null defaults, leaving some parameters dependent on obvious naming.
Input schemas describe structure but not intent. Descriptions should explain 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 names the resource (comments on a Google Presentation) and enumerates the three concrete actions: create, reply, and resolve. This distinguishes it from list-only or other document comment tools, though it does not explicitly reference sibling tool 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?
The action list gives implied usage context by stating which parameters each action requires. However, it does not explicitly say when to prefer this tool over list_presentation_comments or other manage_comment siblings, nor does it provide exclusions or fallback guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_sheet_tabManage Sheet TabADestructive
Manages the lifecycle of an existing sheet tab: rename, delete, hide, unhide or reorder.
Use create_sheet to add a tab, and resize_sheet_dimensions for row and column level changes. This tool operates on the tab itself.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | One of "rename", "delete", "hide", "unhide", "reorder" | |
| new_name | No | New title, required for action="rename" | |
| new_index | No | New zero-based position, required for action="reorder" | |
| sheet_name | Yes | Title of the existing tab to act on | |
| spreadsheet_id | Yes | ID of the spreadsheet | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive and non-read-only behavior, and the description adds a meaningful behavioral boundary: it mutates the tab itself rather than content, and enumerates the possible lifecycle operations including delete. It does not elaborate on consequences such as data loss or authorization, but the destructiveHint plus schema coverage keep this from being a serious 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: the first front-loads the core purpose, the second names the two sibling alternatives, and the third states scope. No fluff or repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich 100%-covered schema, an output schema, and annotations indicating destructiveness, the description supplies the one thing an agent cannot infer reliably: when this tool is the right lifecycle tool versus create_sheet or resize_sheet_dimensions. Nothing needed to safely select and invoke it 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, the schema already documents all six parameters, including action-specific requirements like new_name for rename and new_index for reorder. The description does not add parameter-level detail, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise operation set (rename, delete, hide, unhide, reorder) applied to an existing sheet tab, so an agent immediately knows what the tool does. It goes beyond the name by adding a resource boundary and naming create_sheet and resize_sheet_dimensions to differentiate sibling 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 explicitly routes tab creation to create_sheet and row/column changes to resize_sheet_dimensions, and closes with 'This tool operates on the tab itself' as an exclusion rule. This gives an agent a clear when-to-use/when-not-to-use decision without opening the schemas.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_spreadsheet_commentManage Spreadsheet CommentA
Manage comments on a Google Spreadsheet.
Actions:
create: Create a new comment. Requires comment_content. Note: The Drive API cannot anchor comments to arbitrary text; Sheets comments are cell-scoped via the API.
reply: Reply to a comment. Requires comment_id and comment_content.
resolve: Resolve a comment. Requires comment_id.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| comment_id | No | ||
| spreadsheet_id | Yes | ||
| comment_content | No | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal write behavior via readOnlyHint=false, and the description adds a meaningful operational caveat: the Drive API cannot anchor comments to arbitrary text and Sheets comments are cell-scoped. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with each bullet contributing either a clear action definition or a critical API limitation. The cell-scoping note is the only extra detail and it adds genuine value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-action mutation tool with no schema-level parameter descriptions, the definition covers the main invocation paths and required fields, and the output schema can handle return values. Minor gaps remain around exact action enum values and the meaning of user_google_email, but these do not block correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by tying parameter requirements to specific actions, clarifying the roles of comment_content and comment_id. It does not explain user_google_email or spreadsheet_id, but those are largely inferable from their names and the tool's Google Workspace context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pair, 'Manage comments on a Google Spreadsheet,' and breaks out concrete actions: create, reply, and resolve. This makes it clearly distinct from sibling tools like manage_document_comment and manage_presentation_comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 action list gives clear context for when to use the tool and what each action requires, such as 'create: ... Requires comment_content' and 'reply: ... Requires comment_id and comment_content.' It does not explicitly name alternatives or exclusions, but the usage boundaries are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_taskManage TaskADestructive
Manage tasks: create, update, delete, or move tasks within task lists.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | Due date in RFC 3339 format (e.g., "2024-12-31T23:59:59Z"). Used by "create" and "update" actions. | |
| notes | No | Notes/description for the task. Used by "create" and "update" actions. | |
| title | No | The title of the task. Required for "create", optional for "update". | |
| action | Yes | The action to perform. Must be one of: "create", "update", "delete", "move". | |
| parent | No | Parent task ID (for subtasks). Used by "create" and "move" actions. | |
| status | No | Task status ("needsAction" or "completed"). Used by "update" action. | |
| task_id | No | The ID of the task. Required for "update", "delete", and "move" actions. | |
| previous | No | Previous sibling task ID (for positioning). Used by "create" and "move" actions. | |
| task_list_id | Yes | The ID of the task list. Required for all actions. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| destination_task_list | No | Destination task list ID (for moving between lists). Used by "move" action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=false and destructiveHint=true, so the description need not restate that this is a mutating tool. It does add the specific actions (create, update, delete, move), but it does not disclose side effects, permission requirements, or reversibility beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with a front-loaded verb and a concise action list. There is no wasted wording or redundant elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 action list plus the richly documented 100%-covered input schema and existing output schema make the definition largely sufficient for correct invocation. It could be slightly more complete with explicit alternatives, but that gap is minor given the schema and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter has a detailed description including which actions use it. The tool description itself adds no parameter-level meaning, 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?
The description uses a clear verb and resource: 'Manage tasks: create, update, delete, or move tasks within task lists.' It explicitly enumerates the supported operations and distinguishes this tool from sibling read-only tools like list_tasks/get_task and from task-list management via manage_task_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for task CRUD and moving operations, but it does not explicitly state when to use this tool versus alternatives such as list_tasks or get_task. There are no exclusions or routing guidance like 'for reads, use list_tasks instead.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_task_listManage Task ListBDestructive
Manage task lists: create, update, delete, or clear completed tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | The title for the task list. Required for "create" and "update" actions. | |
| action | Yes | The action to perform. Must be one of: "create", "update", "delete", "clear_completed". | |
| task_list_id | No | The ID of the task list. Required for "update", "delete", and "clear_completed" actions. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=false, establishing a mutating, destructive profile. The description's action list is consistent with those annotations and adds the concrete 'clear completed tasks' behavior, but it doesn't disclose consequences such as whether delete or clear_completed are permanent or whether update merges or replaces list properties. It adds some value beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single 11-word sentence with zero filler; the action list is front-loaded immediately after naming the resource. The only minor redundancy is that 'Manage task lists' closely echoes the tool title, but the colon-structured format is efficient and 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?
The structured data carries most of the burden: a full output schema covers return values, per-parameter schema descriptions cover inputs, and annotations cover the safety profile. The main gap is that action-selection semantics—which task_list_id applies to which action and what clear_completed actually does—are only implied by the schema, not explained in the description. Adequate for a well-annotated tool, but not rich.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (title, action, task_list_id, user_google_email) already has a documented description, including which actions require which fields. The description only restates the action enum values already present in the schema, adding no new meaning. The baseline 3 applies since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (task lists) and enumerates four concrete actions (create, update, delete, clear completed), which makes the tool's scope specific. It is implicitly distinguished from siblings: manage_task operates on individual tasks, and list_task_lists/get_task_list are read-only counterparts. The generic opener 'Manage' is slightly weak, but the action enumeration compensates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. The description never mentions that list_task_lists/get_task_list are the read-only options for task lists, nor that manage_task handles individual tasks, and it doesn't explain when each action (create vs update vs delete vs clear_completed) is appropriate. With dozens of siblings, the agent must infer selection entirely from the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modify_doc_textModify Doc TextADestructive
Modifies text in a Google Doc - can insert/replace text and/or apply formatting in a single operation.
TIP: To append text to the end of the document without calculating indices, set end_of_segment=true. This avoids index calculation errors.
For ordinary header/footer text, prefer update_doc_headers_footers. Only pass segment_id when you already have a real header/footer/footnote segment ID from inspect_doc_structure output. Do not guess IDs such as "kix.header" or "kix.footer".
| Name | Required | Description | Default |
|---|---|---|---|
| bold | No | Whether to make text bold (True/False/None to leave unchanged) | |
| text | No | New text to insert or replace with (optional - can format existing text without changing it) | |
| italic | No | Whether to make text italic (True/False/None to leave unchanged) | |
| tab_id | No | Optional document tab ID to target | |
| link_url | No | Hyperlink URL (http/https) | |
| end_index | No | End position for text replacement/formatting (if not provided with text, text is inserted) | |
| font_size | No | Font size in points | |
| underline | No | Whether to underline text (True/False/None to leave unchanged) | |
| clear_link | No | Remove hyperlink from the target range | |
| segment_id | No | Optional header/footer/footnote segment ID to target | |
| small_caps | No | Whether to apply small caps | |
| text_color | No | Foreground text color (#RRGGBB) | |
| document_id | Yes | ID of the document to update | |
| font_family | No | Font family name (e.g., "Arial", "Times New Roman") | |
| font_weight | No | Font weight (100-900 in steps of 100; requires font_family) | |
| start_index | Yes | Start position for operation using Docs API indices from inspect_doc_structure. For the main body, 0 is also accepted as an alias for the first writable position. | |
| strikethrough | No | Whether to strike through text (True/False/None to leave unchanged) | |
| end_of_segment | No | Insert text at the end of the targeted segment instead of start_index | |
| baseline_offset | No | One of NONE, SUPERSCRIPT, SUBSCRIPT | |
| background_color | No | Background/highlight color (#RRGGBB) | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal mutation and destructiveness, and the description adds useful context: a single operation can combine text insertion/replacement with formatting, and end_of_segment avoids index calculation errors. The segment_id warning adds a safeguard about where IDs must come from. The description doesn't enumerate every destructive consequence, but 'replace' plus destructiveHint covers the core risk.
Agents need to know what a tool does to the 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 four sentences with no filler. The main capability is front-loaded, followed by a practical tip and two targeted warnings. 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 21-parameter mutating tool, the description covers the main operations, a common failure mode, and the sensitive segment_id case, while the output schema handles return details. It does not explicitly explain deletion via empty-text replacement or all parameter combinations, but the schema covers those mechanics. Overall this is solid but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 21 parameters have schema descriptions, so the baseline is 3. The description adds genuinely non-obvious guidance: end_of_segment=true avoids index calculation errors, and segment_id should only come from inspect_doc_structure output, not guessed values. This goes beyond what the schema property descriptions provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Modifies text in a Google Doc.' It clearly distinguishes the tool's capabilities by naming insert, replace, and formatting in a single operation, and the header/footer note helps separate it from update_doc_headers_footers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 routes ordinary header/footer text to update_doc_headers_footers and warns against passing guessed segment IDs. It also gives concrete when-to-use advice for end_of_segment=true, making the selection and invocation guidance direct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modify_gmail_message_labelsModify Gmail Message LabelsADestructive
Adds or removes labels from a Gmail message. To archive an email, remove the INBOX label. To delete an email, add the TRASH label.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | The ID of the message to modify. | |
| add_label_ids | No | List of label IDs to add to the message. | |
| remove_label_ids | No | List of label IDs to remove from the message. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description is not contradicting them. The description adds value by explaining the side effects of specific label choices (removing INBOX archives, adding TRASH deletes), which is meaningful behavioral context beyond the raw annotation. However, it does not mention that changes are immediate, whether label removal can permanently delete messages, or any permissions/user-consent implications. With annotations present, the description's additional behavioral detail earns a 3 rather than lower.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core action. The two example sentences are useful and non-redundant. It could be slightly improved by adding a sentence on label ID format, but the current length is appropriate and every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-message label modification tool, the description is fairly complete: it states the action, gives the two most important use cases, and annotations cover the destructive nature. The output schema exists (though not shown) which may cover return values. It could have mentioned the relationship to batch_modify_gmail_message_labels and that custom label IDs are allowed, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters with descriptions, so the baseline is 3. The description's examples imply the meaning of add_label_ids and remove_label_ids but do not add technical details like label ID format (e.g., 'INBOX', 'TRASH', custom ID). Since the schema already documents all parameters, the description does not need to compensate for gaps; it just doesn't add much beyond the examples.
Input schemas describe structure but not intent. Descriptions should explain 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 action ('Adds or removes labels from a Gmail message') and immediately provides two concrete operational examples (archiving via removing INBOX, deleting via adding TRASH). This clearly distinguishes the tool from siblings like manage_gmail_label (which manages label definitions) and batch_modify_gmail_message_labels (which operates on multiple 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?
The description gives explicit usage context for common operations (archive and delete), which helps the agent understand when to use this tool. However, it does not explicitly mention when to prefer batch_modify_gmail_message_labels over this single-message tool, nor does it state any exclusions for when not to use it. The practical examples imply usage well but leave the single-vs-batch distinction implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modify_sheet_valuesModify Sheet ValuesBDestructive
Modifies values in a specific range of a Google Sheet - can write, update, or clear values.
| Name | Required | Description | Default |
|---|---|---|---|
| values | No | 2D array of values to write/update. Can be a JSON string or Python list. Required unless clear_values=True. | |
| range_name | Yes | The range to modify (e.g., "Sheet1!A1:D10", "A1:D10"). Required. | |
| clear_values | No | If True, clears the range instead of writing values. Defaults to False. | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| value_input_option | No | How to interpret input values ("RAW" or "USER_ENTERED"). Defaults to "USER_ENTERED". | USER_ENTERED |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide the safety profile (readOnlyHint=false, destructiveHint=true), and the description's mention of 'clear values' aligns with the destructive hint without adding substantive new behavioral context. It does add the scope specificity ('specific range') and the three modes, but it does not disclose overwrite semantics, irreversibility, or auth requirements beyond what the annotations imply. The bar is lower because of annotations, but the description still adds only modest 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?
The description is a single sentence with no filler, front-loading the core verb and resource before listing the modes. Every word earns its place, and it is appropriately sized for a tool whose schema is already self-documenting.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the full schema coverage, the presence of an output schema, and annotations that declare destructiveness, the description covers the essential behavioral contract. It clearly states the operation scope and the three modes, which is sufficient for an agent to invoke the tool correctly in most cases. It is slightly terse for a 6-parameter mutation tool, but the missing details are all present in the structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple 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 per the rubric. The description's phrase 'write, update, or clear values' loosely maps to the values and clear_values parameters, but it does not clarify representation, defaults, or interpretation rules that the schema does not already cover. No additional parameter-level 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?
The description states a specific verb ('Modifies') and resource ('values in a specific range of a Google Sheet'), and enumerates the three actions it can perform ('write, update, or clear values'). This is clear and non-tautological, and it implicitly distinguishes the tool from read-only siblings like read_sheet_values. However, it does not explicitly name a sibling or scope against alternatives such as append_table_rows, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance about when to use this tool versus alternatives, nor does it mention exclusions or related tools. The only usage signal is the verb 'Modifies', which is implied by the tool name rather than explained. The schema covers parameter-level conditions, but the description itself offers no decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_sheet_rowsMove Sheet RowsADestructive
Moves rows from one sheet to another within the same spreadsheet. The move is performed in a single batchUpdate (copyPaste followed by deleteDimension). Note: batchUpdate executes requests sequentially but does not roll back on partial failure — if the copy succeeds but the delete fails, rows may be duplicated. Formulas, data types, and formatting are preserved (unlike a values.get/append round-trip). Row numbers are 1-based (matching the spreadsheet UI).
| Name | Required | Description | Default |
|---|---|---|---|
| end_row | Yes | Last row to move (1-based, inclusive). Required. | |
| start_row | Yes | First row to move (1-based, inclusive). Required. | |
| source_sheet | Yes | Name of the sheet to move rows from. Required. | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| destination_sheet | Yes | Name of the sheet to move rows to. Required. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by revealing the batchUpdate sequence (copyPaste then deleteDimension), the lack of rollback on partial failure, and the risk of duplication if only the delete fails. It also discloses that formulas, data types, and formatting are preserved, and clarifies 1-based row indexing. This is rich, non-obvious behavioral detail that materially affects invocation and outcome expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the primary action, followed by implementation detail, a critical failure caveat, and a preservation note. Every sentence conveys essential operational or behavioral information without fluff. The structure allows an agent to quickly grasp what the tool does and what risks to anticipate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 destructive annotations and an output schema, the description covers the critical behavioral aspects: execution mechanism, failure semantics, preservation guarantees, and row indexing. It does not explicitly mention prerequisites such as the destination sheet needing to exist or constraints like source and destination differing, but these are less critical given the schema and output schema already provide structure. Overall, enough context is present for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters including the 1-based and inclusive nature of start_row and end_row. The description adds minimal parameter-level value beyond reaffirming 1-based row numbers and noting rows are moved within the same spreadsheet. This matches the baseline of 3 for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Moves rows from one sheet to another within the same spreadsheet.' This is a specific verb and resource, distinct from typical read/write tools. However, it does not explicitly name a sibling tool for differentiation, instead relying on the phrase 'unlike a values.get/append round-trip' to contrast with an approach rather than a specific named alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 context is implied rather than explicit. The description explains that formatting and formulas are preserved 'unlike a values.get/append round-trip,' which hints at when this tool is preferable, but it does not state clear when-to-use vs. when-not-to-use conditions or name alternatives. An agent must infer that this tool is for full-fidelity moves within the same spreadsheet.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_freebusyQuery FreebusyBRead-onlyIdempotent
Returns free/busy information for a set of calendars.
| Name | Required | Description | Default |
|---|---|---|---|
| time_max | Yes | The end of the interval for the query in RFC3339 format (e.g., '2024-05-12T18:00:00Z' or '2024-05-12'). | |
| time_min | Yes | The start of the interval for the query in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). | |
| calendar_ids | No | List of calendar identifiers to query. If not provided, queries the primary calendar. Use 'primary' for the user's primary calendar or specific calendar IDs obtained from `list_calendars`. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| group_expansion_max | No | Maximum number of calendar identifiers to be provided for a single group. Optional. An error is returned for a group with more members than this value. Maximum value is 100. | |
| calendar_expansion_max | No | Maximum number of calendars for which FreeBusy information is to be provided. Optional. Maximum value is 50. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), and the description adds the basic output scope ('free/busy information for a set of calendars'). However, it does not disclose limitations such as expansion caps, auth prerequisites, or the fact that detailed event data is not returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or redundancy. Every word contributes to the core meaning, and it is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description, complemented by a 100%-covered input schema and an output schema, is sufficient for an agent to invoke the tool correctly. The only notable gap is the absence of usage guidance versus sibling tools, but that is already captured in the usage dimension.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents all six parameters including defaults, formats, and maximum values. The description adds no parameter-level meaning 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?
The description uses a specific verb ('Returns') and resource ('free/busy information for a set of calendars'), making the core purpose clear. It does not explicitly differentiate itself from siblings like get_events, so it misses the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance about when to use this tool versus alternatives such as get_events or list_calendars. There is no mention of availability checking, exclusions, or conditions that would select this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_sheet_valuesRead Sheet ValuesARead-onlyIdempotent
Reads values from a specific range in a Google Sheet.
| Name | Required | Description | Default |
|---|---|---|---|
| range_name | No | The range to read (e.g., "Sheet1!A1:D10", "A1:D10"). Defaults to "A1:Z1000". Open-ended or oversized ranges are clamped to at most 1000 rows before the Sheets API request to bound memory use. | A1:Z1000 |
| include_notes | No | If True, also fetch cell notes for the range. Defaults to False to avoid expensive includeGridData requests. | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| include_formulas | No | If True, also fetch raw formula strings for cells that contain formulas. Useful for identifying cross-sheet references before writing back to a range. Defaults to False to avoid an extra API request. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| include_hyperlinks | No | If True, also fetch hyperlink metadata for the range. Defaults to False to avoid expensive includeGridData requests. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false) already cover the safety profile, and the description is consistent with them, adding no contradiction. The description itself adds no behavioral context beyond the annotations, though the schema parameter descriptions do disclose meaningful traits (1000-row range clamping, expensive includeGridData requests for notes/hyperlinks, extra API call for formulas). With annotations carrying the safety burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single ten-word sentence that front-loads the verb and object. Every word earns its place and nothing is redundant with the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with a rich 100%-covered schema, an output schema, and safety annotations, the one-line description is sufficient to complete the picture. The only minor gap is that it does not orient the agent between this tool and get_spreadsheet_info for structural/metadata reads, but the name and schema largely compensate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all six parameters with examples, defaults, and cost rationale (e.g., 'Defaults to False to avoid expensive includeGridData requests'). The description text 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?
The description states a specific verb ('reads') and resource ('values from a specific range in a Google Sheet'), which clearly identifies the tool's function. It is self-evidently distinct from the closest sibling, modify_sheet_values (the write counterpart), and from get_spreadsheet_info (metadata, not cell values), even without naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no when-to-use guidance, exclusions, or named alternatives. Usage is only implied by the tool name and the presence of modify_sheet_values as an obvious write counterpart. The schema's include_formulas parameter hints at a pre-write use case ('before writing back to a range'), but the description itself carries no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resize_sheet_dimensionsResize Sheet DimensionsADestructive
Manages sheet-level dimension properties: resize columns/rows, auto-resize to fit content, freeze rows/columns, hide/unhide rows/columns, and insert/delete rows/columns.
| Name | Required | Description | Default |
|---|---|---|---|
| hide_rows | No | List of 1-based row numbers to hide. Example: [3, 4]. | |
| row_sizes | No | Dict mapping 1-based row numbers to pixel heights. Example: {"1": 40, "3": 60}. Can be a JSON string or Python dict. | |
| sheet_name | No | Sheet name to target. Defaults to the first sheet if not provided. | |
| delete_rows | No | List of 1-based row numbers to delete. Example: [5, 6]. Best for non-contiguous rows. | |
| insert_rows | No | Number of rows to insert. | |
| unhide_rows | No | List of 1-based row numbers to unhide. Example: [3, 4]. | |
| column_sizes | No | Dict mapping column letters to pixel widths. Example: {"A": 200, "C": 300}. Can be a JSON string or Python dict. | |
| hide_columns | No | List of column letters to hide. Example: ["C", "D"]. | |
| delete_columns | No | List of column letters to delete. Example: ["E", "F"]. | |
| insert_columns | No | Number of columns to insert. | |
| insert_rows_at | No | 1-based row number to insert before. Appends to the end of the sheet if omitted. | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| unhide_columns | No | List of column letters to unhide. Example: ["C", "D"]. | |
| auto_resize_rows | No | List of 1-based row numbers to auto-resize to fit content. Example: [1, 2]. | |
| delete_row_range | No | Contiguous range of rows to delete, as "start:end" (1-based, inclusive). Example: "5:10" deletes rows 5 through 10. More efficient than delete_rows for large contiguous ranges. | |
| frozen_row_count | No | Number of rows to freeze from the top. Use 0 to unfreeze all rows. | |
| insert_columns_at | No | Column letter to insert before (e.g. "C"). Appends to the end if omitted. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| auto_resize_columns | No | List of column letters to auto-resize to fit content. Example: ["A", "B"]. | |
| frozen_column_count | No | Number of columns to freeze from the left. Use 0 to unfreeze all columns. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the destructiveHint annotation by spelling out the actual structural modifications: deleting/inserting rows and columns, hiding/unhiding, and freezing. This makes the mutating nature concrete for the agent. It stops short of noting consequences like irreversible data loss from deletion, but the annotations already flag destructiveness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the tool's scope and then lists its operation groups in a compact, scannable list. There is no filler or redundant explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 large parameter surface (20 params), the description plus the fully documented schema and existing output schema provide enough for an agent to invoke the tool correctly. It could add a note about combining multiple operations in one call, but that is reasonably implied by the optional parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents every parameter with types, defaults, and examples. The tool description only summarizes operation categories and does not add parameter-level semantics, which is acceptable given the schema's richness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the tool's domain: sheet-level dimension properties, and enumerates the concrete operations (resize, auto-resize, freeze, hide/unhide, insert/delete rows/columns). This distinguishes it from sibling sheet tools like modify_sheet_values or format_sheet_range, which handle content and formatting rather than dimensional 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?
The description provides clear context for when to use the tool: whenever an agent needs to alter row/column dimensions, visibility, or structure. It does not explicitly name alternatives or exclusion conditions, but the operation list is specific enough to route selection correctly among the large sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_script_functionRun Script FunctionBDestructive
Executes a function in a deployed script.
| Name | Required | Description | Default |
|---|---|---|---|
| dev_mode | No | Whether to run latest code vs deployed version | |
| script_id | Yes | The script project ID | |
| parameters | No | Optional list of parameters to pass | |
| deployment_id | No | Optional API Executable deployment ID. When supplied, skips the automatic deployment lookup. When omitted, the versioned API Executable deployment with the highest version number is used. | |
| function_name | Yes | Name of function to execute | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true. The description says 'Executes a function' which implies side effects, consistent with destructiveHint=true. However, the description doesn't add behavioral context beyond the annotations—it doesn't mention that execution may have side effects, require auth, or that dev_mode runs latest code vs deployed version. The schema covers dev_mode and deployment_id, but the description doesn't add behavioral transparency beyond what annotations provide. No contradiction, but no 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?
The description is a single sentence, concise and front-loaded with the core action. It earns its place by stating the resource type. However, it could be slightly more informative about side effects or dev_mode, but for a one-liner it's efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 6 params, 100% schema coverage, and an output schema, the description is minimal but the schema fills in the gaps. The annotations cover safety profile. However, the description doesn't explain the execution context (e.g., that it runs in Google Apps Script, that dev_mode uses latest code, that deployment_id skips lookup). These are in the schema but not synthesized for the agent. For a tool that executes arbitrary code, more context about side effects and auth would be valuable. The output schema exists, so return values are covered. Overall, adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 6 parameters. The description adds no parameter-level meaning beyond the schema. Baseline 3 is appropriate since the schema does the heavy lifting. The description's mention of 'deployed script' aligns with deployment_id but doesn't add new 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?
The description 'Executes a function in a deployed script' clearly states the verb (executes), resource (function in a deployed script), and action. It distinguishes from siblings like create_script_project or list_deployments, though it doesn't explicitly name a sibling alternative. The title 'Run Script Function' is nearly identical to the description, but the description adds the 'deployed script' context, which clarifies the resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: run a function in a deployed script. It doesn't explicitly state when to use this vs alternatives like list_deployments or get_script_content. The schema provides some context (deployment_id, dev_mode) but the description itself offers no when-to-use guidance or exclusions. This is adequate but with clear gaps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contactsSearch ContactsBRead-onlyIdempotent
Search contacts by name, email, phone number, or other fields.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query string (searches names, emails, phone numbers). | |
| page_size | No | Maximum number of results to return (default: 30, max: 30). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose read-only, idempotent, open-world, and non-destructive behavior, so the bar is lower. The description adds scope context (searches personal contacts by name/email/phone) but leaves matching semantics and the ambiguous 'other fields' undefined. 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?
A single 10-word sentence with the verb front-loaded and zero wasted words. The description is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema and annotations fully cover parameters and safety, and an output schema exists, so return values need no explanation. However, the description misses its key disambiguation role: given the large sibling set with several contact-related tools, an agent gets no help deciding between this and list_contacts or search_directory_people.
Complex tools with many parameters or behaviors need more documentation. Simple 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 fully documented in the schema. The tool description mostly echoes the query parameter description and adds only the vague 'other fields' extension.
Input schemas describe structure but not intent. Descriptions should explain 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 (Search) and resource (contacts) with explicit searchable fields (name, email, phone number). It is clear and distinguishes itself from list_contacts and get_contact, though it doesn't explicitly differentiate from search_directory_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?
No guidance is given on when to use this tool versus alternatives. With close siblings like list_contacts, get_contact, and search_directory_people, an agent receives no help selecting the appropriate tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_customSearch CustomCRead-onlyIdempotent
Performs a search using Google Custom Search JSON API.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | The search query. Required. | |
| num | No | Number of results to return (1-10). Defaults to 10. | |
| safe | No | Safe search level. Defaults to "off". | off |
| sites | No | List of sites/domains to restrict search to (e.g., ["example.com", "docs.example.com"]). When provided, results are limited to these sites. | |
| start | No | The index of the first result to return (1-based). Defaults to 1. | |
| country | No | Country code for results (e.g., "countryUS"). | |
| language | No | Language code for results (e.g., "lang_en"). | |
| file_type | No | Filter by file type (e.g., "pdf", "doc"). | |
| search_type | No | Search for images if set to "image". | |
| site_search | No | Restrict search to a specific site/domain. | |
| date_restrict | No | Restrict results by date (e.g., "d5" for past 5 days, "m3" for past 3 months). | |
| user_google_email | Yes | The user's Google email address. Required. | |
| site_search_filter | No | Exclude ("e") or include ("i") site_search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior, so safety is covered by structured metadata. The description adds no behavioral context beyond the API name, such as quota usage, authentication needs, or result variability. 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 a single front-loaded sentence with no filler or repetition. It is concise, though slightly under-specified for a tool with 13 parameters and many sibling search tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema and annotations cover return values and safety traits, so those gaps are filled by structured data. However, the description does not clarify what kind of content search_custom searches, when to choose it over sibling search tools, or what domain-specific setup (e.g., a configured custom search engine) might be required. For a tool with 13 parameters and a large sibling set, this one-liner is not complete enough.
Complex tools with many parameters or behaviors need more documentation. Simple 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, default, and constraint is already documented in the input schema. The description contributes no additional parameter meaning, but the high schema coverage means the description does not need to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Performs a search') and identifies the specific API ('Google Custom Search JSON API'), which is distinct from sibling search tools for Gmail, Drive, Docs, and other services. It does not explicitly describe the search scope (web, sites, images), but the API name and parameter schema provide enough orientation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as search_drive_files, search_gmail_messages, or search_docs. It also does not mention prerequisites, exclusions, or typical use cases. An agent must infer all usage context from the tool name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch DocsBRead-onlyIdempotent
Searches for Google Docs by name using Drive API (mimeType filter).
Returns: str: A formatted list of Google Docs matching the search query.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| page_size | No | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds useful context about the mimeType filter and return format, but does not disclose pagination, query syntax, or any limitations. With annotations covering the safety profile, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The core action and return type are front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even with output schema and annotations available, the description omits essential context such as how the query string should be formatted, the meaning of user_google_email, and the behavior of page_size. For a 3-parameter tool with zero schema descriptions, the definition is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only clarifies that 'query' searches by name; it does not explain 'user_google_email' or 'page_size'. The description leaves most parameter semantics to inference.
Input schemas describe structure but not intent. Descriptions should explain 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 ('searches'), a specific resource ('Google Docs'), and explains the mechanism ('Drive API (mimeType filter)'). This clearly differentiates it from generic Drive file search, although it does not explicitly name a sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives like search_drive_files or list_docs_in_folder. The description only states what the tool does, not when it should be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_drive_filesSearch Drive FilesARead-onlyIdempotent
Searches for files and folders within a user's Google Drive, including shared drives.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The search query string. Supports Google Drive search operators. NOTE: Owner-based queries ('user@example.com' in owners) DO NOT WORK in Shared Drives because files are owned by the shared drive itself, not individual users. For recent files by a specific user in Shared Drives, search by modifiedTime and use order_by='modifiedTime desc' instead. | |
| corpora | No | Bodies of items to query (e.g., 'user', 'domain', 'drive', 'allDrives'). If 'drive_id' is specified and 'corpora' is None, it defaults to 'drive'. Otherwise, Drive API default behavior applies. Prefer 'user' or 'drive' over 'allDrives' for efficiency. | |
| detailed | No | Whether to include size, modified time, and link in results. Defaults to True. | |
| drive_id | No | ID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`. | |
| order_by | No | Sort order. Comma-separated list of sort keys with optional 'desc' modifier. Valid keys: 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', 'viewedByMeTime'. Example: 'modifiedTime desc' or 'folder,modifiedTime desc,name'. Defaults to None (Drive API default ordering). | |
| file_type | No | Restrict results to a specific file type. Accepts a friendly name ('folder', 'document'/'doc', 'spreadsheet'/'sheet', 'presentation'/'slides', 'form', 'drawing', 'pdf', 'shortcut', 'script', 'site', 'jam'/'jamboard') or any raw MIME type string (e.g. 'application/pdf'). Defaults to None (all types). | |
| page_size | No | The maximum number of files to return. Defaults to 10. | |
| page_token | No | Page token from a previous response's nextPageToken to retrieve the next page of results. | |
| include_trashed | No | Whether to include files in the trash. Defaults to False, matching the Drive web UI and `list_drive_items`. Ignored when `query` already contains its own `trashed` clause (`=` or `!=`), which always wins. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| include_items_from_all_drives | No | Whether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds scope detail by mentioning shared drives and file/folder results, but does not disclose further behavioral traits like query edge cases or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that states the verb, resource, and scope with no filler or redundancy. It is appropriately concise for a tool whose parameter details live 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?
The tool is complex with 11 parameters, but the input schema thoroughly documents each one, including useful caveats like shared-drive owner query limitations. The output schema and annotations cover return values and safety. The only notable gap is the lack of explicit routing guidance versus sibling Drive tools like list_drive_items.
Complex tools with many parameters or behaviors need more documentation. Simple 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 burden on the top-level description is low. Parameter descriptions already document query operators, defaults, corpora behavior, MIME types, pagination, and trash handling. The top-level description adds only minimal context about files/folders and shared drives.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Searches') and resource ('files and folders within a user's Google Drive, including shared drives'). This clearly separates it from Gmail search, file content retrieval, and Drive listing tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like list_drive_items or search_gmail_messages. The intended usage is only implied by the word 'Searches,' with no mention of when to prefer or avoid this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_gmail_messagesSearch Gmail MessagesARead-onlyIdempotent
Searches messages in a user's Gmail account based on a query. Returns both Message IDs and Thread IDs for each found message, along with Gmail web interface links for manual verification. Supports pagination via page_token parameter.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The search query. Supports standard Gmail search operators. | |
| page_size | No | The maximum number of messages to return. Defaults to 10. | |
| page_token | No | Token for retrieving the next page of results. Use the next_page_token from a previous response. | |
| include_headers | No | If True, also fetch each message's metadata and include Subject, From, and Date per result. Costs one metadata get per result, grouped into HTTP batches of up to 10, plus retries for transient failures. Defaults to False (output unchanged from prior versions). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior, so the description only needs to add value beyond that. It does so by explaining the return payload (IDs, thread IDs, web links) and pagination via page_token, which are useful behavioral details not carried by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences cover the core behavior, return values, and pagination with no filler or repetition. The most important information is front-loaded, and every sentence contributes to an agent's ability to select and invoke the 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 search tool with a fully described schema and an output schema, the description is complete: it states what is searched, what is returned, and that pagination is supported. Parameter details and return structure are already covered by the schema and annotations, 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 description coverage is 100%, so the baseline is 3; the schema already documents query, page_size, page_token, include_headers, and user_google_email. The description only restates pagination support and does not materially add parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Searches') and resource ('messages in a user's Gmail account') and clearly states what is returned: Message IDs, Thread IDs, and Gmail web links. This distinguishes it from content-retrieval siblings like get_gmail_message_content and get_gmail_thread_content, since the focus is on search results and identifiers, not message bodies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 makes the tool's context clear: use it to find Gmail messages by query and get identifiers and verification links, with pagination support. It does not explicitly name alternatives or state when not to use it, but the search-versus-content-retrieval distinction is strongly implied by the result contents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_messagesSearch MessagesARead-onlyIdempotent
Searches for messages in Google Chat spaces by text content and/or time range.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional text to search for. If omitted, only time_filter is applied. | |
| space_id | No | Optional space to restrict the search to. | |
| page_size | No | Maximum number of messages to return per space. | |
| max_spaces | No | Maximum number of spaces to search when space_id is not provided (default 10). | |
| time_filter | No | Optional filter using Chat API createTime syntax. Examples: 'createTime > "2026-03-18T00:00:00-03:00"' 'createTime > "2026-03-18T00:00:00-03:00" AND createTime < "2026-03-19T00:00:00-03:00"' | |
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and non-destructive behavior. The description adds that search is by text content and/or time range but does not disclose cross-space search behavior, pagination, or result limits beyond what the schema already lists. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or redundancy. It clearly states the action, resource, and search dimensions in minimal space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich parameter schema, output schema, and annotations, the one-line description is mostly sufficient for an agent to invoke the tool correctly. The only notable gap is that it does not explicitly mention cross-space search behavior when space_id is omitted, but the max_spaces parameter description largely covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (83%), with detailed documentation for query, space_id, page_size, max_spaces, and time_filter. The description adds little parameter-level meaning beyond naming the text-content and time-range search modes, 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?
Description uses a specific verb ('Searches'), a clear resource ('messages in Google Chat spaces'), and explicit scoping ('by text content and/or time range'). This distinguishes it from siblings like search_gmail_messages and get_messages without requiring schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as get_messages or search_gmail_messages. There are no explicit exclusions or routing hints, so an agent must infer the right context from the tool name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_gmail_messageSend Gmail MessageA
Sends an email using the user's Gmail account. Supports new emails, replies, and forwards, with optional attachments. Supports Gmail's "Send As" feature to send from configured alias addresses.
To forward an existing message, pass forward_message_id. The original subject, body (quoted with a "Forwarded message" header), and attachments are carried over. In forward mode, body (if any) is prepended as a note and subject is optional. Threading, reply, and signature options do not apply when forwarding.
THIS TOOL SENDS IMMEDIATELY AND CANNOT SCHEDULE. Gmail's REST API exposes no send-time parameter; Schedule send is a web-UI feature with no API equivalent, so no argument to this tool can defer delivery. Never tell a user a message was scheduled. For "prepare now, deliver later", create a draft with draft_gmail_message. An external scheduler must retain the message data to create and send a new message via send_gmail_message at the chosen time, or call users.drafts.send with the draft ID returned by draft_gmail_message. Alternatively, let the user schedule that draft in the Gmail UI.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Optional CC email address. | |
| to | No | Recipient email address. Optional when replying with reply_all=True, which derives it from the thread. | |
| bcc | No | Optional BCC email address. | |
| body | No | Email body content (plain text or HTML). Required when sending. When forwarding, this is an optional note prepended above the quoted original. | |
| subject | No | Email subject. Required when sending; optional when forwarding (defaults to 'Fwd: <original subject>'). | |
| from_name | No | Optional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'. | |
| reply_all | No | Whether to derive reply-all recipients from the thread: To = the sender being replied to, Cc = the other participants, excluding the authenticated account and from_email. Requires thread_id. Explicit to/cc win; when cc is omitted the sender being replied to is added to the derived Cc if they are not already in To. Defaults to false. | |
| thread_id | No | Optional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID. | |
| from_email | No | Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email. | |
| references | No | Optional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target. | |
| attachments | No | Optional list of attachments. Each can have: "url" (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR "path" (file path, auto-encodes), OR "content" (standard base64, not urlsafe) + "filename". Optional "mime_type". Optional "content_id" (string) makes the attachment inline-rendered: it lands in a multipart/related part with `Content-ID: <content_id>` and `Content-Disposition: inline`, and the HTML body can reference it via `<img src="cid:<content_id>">` (RFC 2392). Without `content_id` the attachment is a regular multipart/mixed attachment. Example: [{"url": "https://host/attachments/abc-123", "filename": "report.pdf"}] | |
| body_format | No | Format of the body content (and of the prepended note when forwarding). Use 'plain' for plaintext or 'html' for HTML content. | plain |
| in_reply_to | No | Optional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id. | |
| quote_original | No | Whether to include the message being replied to as a quoted original. Only has an effect when thread_id is provided. Defaults to false. | |
| include_signature | No | Whether to append the Gmail signature from Settings > Signature when available. Defaults to true. | |
| user_google_email | Yes | The user's Google email address. Required for authentication. | |
| forward_message_id | No | Set to a Gmail message ID to forward that message instead of composing a new one. The original subject, body, and (optionally) attachments are carried over; 'body' becomes an optional note prepended to the forward. | |
| include_forwarded_attachments | No | When forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only stating readOnlyHint=false and destructiveHint=false, the description carries the important behavioral burden and does it well. It explicitly discloses that the tool sends immediately, cannot schedule delivery, and must never be represented as having scheduled a message. It also explains forward-mode quoting and attachment carry-over, going well 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?
The description is long but front-loaded with the core function, then moves to forward semantics, then to the scheduling warning. Each block earns its place, though the scheduling section repeats the core point several times and could be tightened. Overall it is appropriately detailed for an 18-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 18 parameters, a 100%-described schema, an output schema, and rich sibling context, the description is complete. It covers all three sending modes, Send As aliases, the critical scheduling limitation, and the recommended draft alternative. Nothing an agent needs to correctly select and invoke the 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 meaningful mode-level semantics beyond the schema: how forward_message_id changes the meaning of body and subject, and that threading/reply/signature options are ignored in forward mode. This exceeds baseline, though individual parameter details are already well documented 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?
The description opens with a specific verb and resource: 'Sends an email using the user's Gmail account.' It then enumerates the supported modes (new, reply, forward), attachments, and Send As aliases. This clearly distinguishes it from the sibling send_message (a chat-message sender) and draft_gmail_message (a draft-only tool).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context and alternatives: forward behavior via forward_message_id, why schedule-send is impossible, and an explicit recommendation to use draft_gmail_message for 'prepare now, deliver later.' It also warns when reply/signature options do not apply, so an agent knows not to pass them in forward mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageSend MessageADestructive
Sends a message to a Google Chat space, or edits a message already sent there.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | Yes | ||
| thread_key | No | Reply in a thread by app-defined key (creates thread if not found). | |
| thread_name | No | Reply in an existing thread by its resource name (e.g. spaces/X/threads/Y). | |
| message_name | No | Edit this message in place instead of sending a new one (e.g. spaces/X/messages/Y, as returned by send_message or get_messages). Must be a message of space_id. Only the text is replaced, and only the author can edit their own message. | |
| message_text | Yes | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool is non-read-only and destructive, so the safety profile is covered. The description adds that it can mutate by sending or editing, but does not disclose side effects, permission requirements, or rate limits. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence with no filler. It front-loads the action and resource, and the edit behavior is included without bloating the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description plus schema cover send, edit, thread options, and author restrictions. An output schema exists, so return-value details are unnecessary. Only missing explicit alternative routing, but the tool is still fully invocable with the provided information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover half the parameters (thread_key, thread_name, message_name), including the edit-in-place semantics. The tool description itself adds no parameter-level detail, and the required params (user_google_email, space_id, message_text) are self-evident but undocumented. With 50% schema coverage, a mid score 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 action ('Sends a message... or edits a message already sent there') with a clear resource (Google Chat space). It distinguishes the tool from email-sending siblings like send_gmail_message and is unambiguous about its dual send/edit nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use this when you need to send or edit a Google Chat message. However, there is no explicit guidance about when not to use it, nor does it reference sibling tools like get_messages, search_messages, or create_reaction for alternative operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_drive_file_permissionsSet Drive File PermissionsADestructive
Sets file-level sharing settings and controls link sharing for a Google Drive file or folder.
This is a high-level tool for the most common permission changes. Use this to toggle "anyone with the link" access or configure file-level sharing behavior. For managing individual user/group permissions, use share_drive_file or update_drive_permission instead.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | The ID of the file or folder. Required. | |
| link_sharing | No | Control "anyone with the link" access for the file. - "off": Disable "anyone with the link" access for this file. - "reader": Anyone with the link can view. - "commenter": Anyone with the link can comment. - "writer": Anyone with the link can edit. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| writers_can_share | No | Whether editors can change permissions and share. If False, only the owner can share. Defaults to None (no change). | |
| copy_requires_writer_permission | No | Whether viewers and commenters are prevented from copying, printing, or downloading. Defaults to None (no change). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false, so the risk profile is covered without description support. The description adds that the tool mutates link-sharing and file-level settings, but it does not disclose consequences such as revoking anonymous access when link sharing is turned off or changes taking effect immediately. This is adequate but not 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?
Four short, front-loaded sentences, each earning its place: primary purpose, high-level positioning, when-to-use, and when-not-to with routing. There is no repetition or filler, and the structure naturally separates what the tool does from how to choose it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the annotations are rich, so the description need not explain return values or safety profiles. The main gap is the unresolved user_google_email requirement, which directly threatens correct invocation given the tool's stated link-sharing purpose; the routing to sibling tools absent from the list is a secondary but real gap. Overall adequate for a well-schema'd tool, but not 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% and each parameter (link_sharing, writers_can_share, copy_requires_writer_permission) has a detailed description, so the schema carries the heavy lifting. The description adds high-level framing that most parameters are optional toggles, but it leaves the required user_google_email unexplained — its role conflicts with the link-sharing positioning, and neither the description nor the schema reconciles this.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Sets file-level sharing settings and controls link sharing for a Google Drive file or folder" provides a specific verb, resource, and scope, making the tool's function immediately clear. The second paragraph reinforces purpose by positioning it as a high-level tool for common permission changes and explicitly excluding granular user/group permission management, distinguishing it from read-oriented siblings like get_drive_file_permissions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 explicit when-to-use guidance ("toggle 'anyone with the link' access or configure file-level sharing behavior") and an explicit exclusion ("For managing individual user/group permissions, use share_drive_file or update_drive_permission instead"). However, those named alternatives are absent from the sibling-tools list (which instead contains manage_drive_access), and the required user_google_email parameter blurs the stated boundary between this tool and individual-user permission tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_publish_settingsSet Publish SettingsB
Updates the publish settings of a form.
| Name | Required | Description | Default |
|---|---|---|---|
| form_id | Yes | The ID of the form to update publish settings for. | |
| is_published | No | Whether the form is published and visible to responders. Defaults to True. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| is_accepting_responses | No | Whether the form accepts responses. Only takes effect when the form is published. Defaults to True. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal a mutating operation (readOnlyHint=false) and non-destructive behavior (destructiveHint=false), so the description does not need to restate that. However, it adds no behavioral context beyond the single word 'Updates'—it does not explain immediate side effects, whether unpublishing affects existing responders, or what the output represents.
Agents need to know what a tool does to the 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 one short, front-loaded sentence with no filler or redundant content. It is concise without sacrificing clarity at the surface level.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward mutation tool with complete parameter schema coverage, annotations, and an output schema, the description is nearly sufficient. It lacks usage guidance and behavioral specifics, but those are partially offset by the rich structured metadata surrounding the 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 each parameter already has a clear description and defaults. The tool description adds no additional parameter semantics, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Updates') and resource ('publish settings of a form'), making the tool's core purpose immediately understandable. It is not a tautology, though it could more strongly differentiate itself from siblings like batch_update_form or create_form by naming the specific publish-related fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives such as batch_update_form or create_form. There are no prerequisites, exclusions, or conditions for choosing this tool over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_google_authStart Google AuthA
Manually initiate Google OAuth authentication flow.
NOTE: This is a legacy OAuth 2.0 tool and is disabled when OAuth 2.1 is enabled. The authentication system automatically handles credential checks and prompts for authentication when needed. Only use this tool if:
You need to re-authenticate with different credentials
You want to proactively authenticate before using other tools
The automatic authentication flow failed and you need to retry
In most cases, simply try calling the Google Workspace tool you need - it will automatically handle authentication if required.
| Name | Required | Description | Default |
|---|---|---|---|
| service_name | Yes | ||
| user_google_email | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the minimal annotations, the description discloses that this is a legacy OAuth 2.0 tool, disabled when OAuth 2.1 is enabled, and that authentication is normally handled automatically by the system. It also explains the manual tool's role in re-authentication, proactive auth, and retry scenarios, which is 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?
The description is well-structured: a clear opening statement, a critical legacy note, a numbered list of use cases, and a closing recommendation. Every sentence carries distinct information without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description thoroughly covers purpose, usage conditions, alternatives, and legacy/automatic behavior, and the output schema can handle return-value documentation. However, it is not fully self-contained because it leaves parameter semantics unexplained, which is a meaningful gap for an agent deciding what to pass as service_name.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% parameter description coverage, and the description does not compensate by explaining either parameter. It never names service_name or user_google_email, nor does it clarify expected formats, allowed values, or how to choose the service. The phrase 'different credentials' only weakly hints at user_google_email, leaving the agent to guess at 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?
The description clearly states the tool's purpose: 'Manually initiate Google OAuth authentication flow.' It identifies the specific action and resource, and distinguishes itself from the long sibling list by being the explicit authentication entry point for Google Workspace tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly lists when to use the tool with three concrete conditions and directly advises that in most cases the agent should simply call the needed Google Workspace tool instead. It also covers the failure/retry scenario, making the when-to-use and when-not-to-use guidance unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_drive_fileUpdate Drive FileADestructive
Updates metadata, properties, and/or content of a Google Drive file.
Providing one of content, file_path, or file_url replaces the file's
content in place, preserving the existing file ID, sharing, comments, and links.
For native Google Docs/Sheets/Slides the source is uploaded with its source MIME
type so the Drive API applies the same format conversion as import_to_google_doc
(markdown headings, tables, bold, etc.). For any other file (.md, .txt, .pdf, ...)
there is nothing to convert, so the bytes are written back as-is under the file's
own MIME type. Metadata and content can be updated in a single call.
mode='append'/'prepend' splice content onto the file's existing text
server-side, so only the new text has to be supplied — no need to send the whole
file back to rewrite it.
Drive shortcuts are handled according to the kind of update: supported resource-local metadata changes (rename, move, trash, star, description, and custom properties) apply to the supplied shortcut, while content replacement follows the shortcut and updates its target. To avoid applying metadata to the wrong resource, a shortcut call cannot combine content with resource-local metadata. Update the shortcut metadata and target content in separate calls.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | How to apply the new content — 'replace' (default), 'append', or 'prepend'. Append/prepend require 'content' and a UTF-8 text file such as .md or .txt; a newline is inserted at the seam if neither side has one. For native Google Docs use insert_doc_elements, modify_doc_text, or find_and_replace_doc, which edit in place instead of rewriting the file. | replace |
| name | No | New name for the file. | |
| content | No | New text content for text-based formats (markdown, TXT, HTML). | |
| file_id | Yes | The ID of the file to update. Required. | |
| starred | No | Whether to star/unstar the file. | |
| trashed | No | Whether to move file to/from trash. | |
| file_url | No | Remote http(s) URL to fetch new content from. | |
| file_path | No | Local file path for binary formats (DOCX, ODT). Supports file:// URLs. | |
| mime_type | No | New MIME type (note: changing type may require content upload). For a shortcut ID, this must accompany content and applies to the resolved target. | |
| properties | No | Custom key-value properties for the file. | |
| add_parents | No | Comma-separated folder IDs to add as parents. | |
| description | No | New description for the file. | |
| source_format | No | Source format hint for conversion (md, markdown, docx, txt, html, rtf, odt). Auto-detected when omitted, and ignored for non-Google files, which are uploaded without conversion. Provide at most one of content/file_path/file_url. | |
| remove_parents | No | Comma-separated folder IDs to remove from parents. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| writers_can_share | No | Whether editors can share the file. Pass the target ID directly; this cannot be changed on a shortcut resource. | |
| copy_requires_writer_permission | No | Whether copying requires writer permission. Pass the target ID directly; this cannot be changed on a shortcut resource. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, readOnlyHint=false), the description discloses important behaviors: replacement happens in place while preserving file ID, sharing, comments, and links; source MIME conversion applies for native formats; append/prepend splice server-side; and shortcut updates route content to the target while metadata applies locally. This is rich behavioral context that materially shapes how an agent should invoke the 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?
The description is long but dense and well-organized into focused paragraphs: core behavior, conversion semantics, append/prepend behavior, and shortcut handling. Almost every sentence adds operational value, though a few points such as 'there is nothing to convert' are slightly explanatory rather 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?
For a high-complexity tool with 17 parameters, destructive behavior, shortcut edge cases, and format-conversion nuances, the description covers the critical decision points an agent needs. An output schema exists, so return-value documentation is not required here. The combination of rich annotations, full schema coverage, and this description makes the tool fully navigable.
Complex tools with many parameters or behaviors need more documentation. Simple 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 each parameter individually. The description adds cross-parameter meaning that the schema does not: 'content', 'file_path', and 'file_url' are mutually exclusive for content replacement, metadata and content can be updated in one call, and shortcut-specific restrictions on combining content with resource-local metadata. This justifies a score above 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?
The description opens with a specific verb-resource pair: 'Updates metadata, properties, and/or content of a Google Drive file.' It further distinguishes content replacement from metadata updates and explains how native Google formats are converted, which separates this tool from siblings like import_to_google_doc and modify_doc_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?
The description explicitly names alternatives: for native Google Docs append/prepend it directs agents to insert_doc_elements, modify_doc_text, or find_and_replace_doc, and it references import_to_google_doc for conversion behavior. It also states when not to combine operations, as with shortcuts, making the when-to-use guidance unusually concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_paragraph_styleUpdate Paragraph StyleC
Apply paragraph-level formatting, heading styles, and/or list formatting to a range in a Google Doc.
This tool can apply named heading styles (H1-H6) for semantic document structure, create bulleted or numbered lists with nested indentation, and customize paragraph properties like alignment, spacing, and indentation. All operations can be applied in a single call.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional document tab ID to target | |
| alignment | No | Text alignment - 'START' (left), 'CENTER', 'END' (right), or 'JUSTIFIED' | |
| direction | No | Paragraph direction - 'LEFT_TO_RIGHT' or 'RIGHT_TO_LEFT' | |
| end_index | Yes | End position (exclusive) - should cover the entire paragraph | |
| list_type | No | Create a list from existing paragraphs ('UNORDERED' for bullets, 'ORDERED' for numbers, 'CHECKBOX' for checklists), or 'NONE' to remove existing list formatting from the range. Use 'NONE' when text inserted after a list has inherited its bullets: setting named_style_type or heading_level does not clear list membership, only 'NONE' does. | |
| indent_end | No | Right/end indent in points | |
| segment_id | No | Optional header/footer/footnote segment ID to target | |
| border_dash | No | Border dash style ('SOLID', 'DOT', or 'DASH'; defaults to 'SOLID') | |
| document_id | Yes | Document ID to modify | |
| space_above | No | Space above paragraph in points (e.g., 12 for one line) | |
| space_below | No | Space below paragraph in points | |
| start_index | Yes | Start position using Docs API indices from inspect_doc_structure. For the main body, 0 is also accepted as an alias for the first writable position. | |
| border_color | No | Border color (#RRGGBB; defaults to black) | |
| border_edges | No | Paragraph border edges to update ('top', 'bottom', 'left', 'right', or 'between'); omit to update all four outer edges | |
| border_width | No | Border width in points (defaults to 1) | |
| indent_start | No | Left/start indent in points | |
| line_spacing | No | Line spacing multiplier (1.0 = single, 1.5 = 1.5x, 2.0 = double) | |
| spacing_mode | No | 'NEVER_COLLAPSE' or 'COLLAPSE_LISTS' | |
| bullet_preset | No | Optional explicit Google Docs bullet preset | |
| heading_level | No | Heading level 0-6 (0 = NORMAL_TEXT, 1 = H1, 2 = H2, etc.) Use for semantic document structure | |
| shading_color | No | Paragraph shading/background color (#RRGGBB) | |
| border_padding | No | Border padding in points (defaults to 4) | |
| keep_with_next | No | Keep the paragraph with the next paragraph | |
| named_style_type | No | Direct named style type - 'NORMAL_TEXT', 'TITLE', 'SUBTITLE', 'HEADING_1' through 'HEADING_6'. Mutually exclusive with heading_level. | |
| indent_first_line | No | First line indent in points (e.g., 36 for 0.5 inch) | |
| page_break_before | No | Start the paragraph on a new page | |
| user_google_email | Yes | User's Google email address | |
| list_nesting_level | No | Nesting level for lists (0-8, where 0 is top level, default is 0) Use higher levels for nested/indented list items | |
| keep_lines_together | No | Keep all lines of the paragraph together | |
| avoid_widow_and_orphan | No | Avoid widows/orphans for the paragraph |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutation (readOnlyHint false) and not idempotent. The description adds no behavioral detail beyond that—it does not mention whether existing formatting is overwritten or merged, or any side effects. It simply states 'apply', which is consistent with annotations but adds no extra transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with the main purpose stated first and a brief list of capabilities. It is efficient and front-loaded, though it could be slightly more structured by separating the capabilities from the general 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?
Given the tool's complexity (30 parameters, mutation, output schema exists), the description is adequate but sparse. It doesn't mention prerequisites like needing indices from inspect_doc_structure, nor does it differentiate between heading_level and named_style_type. The parameter schemas cover details, but the overall usage context is thin.
Complex tools with many parameters or behaviors need more documentation. Simple 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 parameter already has a detailed description. The tool description does not add any parameter-specific meaning 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?
The description clearly states the verb (apply) and resource (paragraph-level formatting to a range in Google Doc), and enumerates specific capabilities (heading styles, lists, alignment, spacing, indentation). It is specific enough to distinguish from text modification tools like modify_doc_text, though it does not explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as batch_update_doc or insert_doc_elements. It only mentions that all operations can be applied in a single call, which is a minor efficiency note but not usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_script_contentUpdate Script ContentADestructive
Update or create files in a script project.
By default this merges the supplied files into the existing project by file
name, leaving other files untouched. Set merge=False to replace the entire
project: any existing file omitted from files is permanently deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | File objects with name, type, and source to create or update | |
| merge | No | When True (default), overlay these files onto the current project. When False, replace the full project file set; omitted files are deleted. | |
| script_id | Yes | The script project ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite destructiveHint already being true, the description adds crucial behavioral detail: with merge=False, 'any existing file omitted from files is permanently deleted.' This tells the agent exactly what gets destroyed and emphasizes permanence, going beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded. The first sentence states the core purpose, and the second sentence explains the key behavioral distinction. 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?
Given the output schema exists and all parameters are documented in the input schema, the description covers the essential behavioral context: creation/update, merge mode, and destructive replacement mode. Nothing critical is missing for an agent 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, but the description adds value by explaining that files are merged 'by file name' and that other files remain untouched. It also clarifies the permanent deletion consequence of merge=False, which deepens the meaning of both `files` and `merge`.
Input schemas describe structure but not intent. Descriptions should explain 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: 'Update or create files in a script project.' This clearly identifies the tool's object of action and distinguishes it from siblings like get_script_content or create_script_project. The merge/replace detail further clarifies its 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?
The description gives clear usage context for the two modes: default merge behavior versus merge=False for full replacement. It does not explicitly name sibling alternatives such as create_script_project or get_script_content, but the intended use case is evident from the wording.
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.
1 tool update
v1.26.1- Changed
run_script_function1 field changed- added
Input schema / properties / deployment_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional API Executable deployment ID. When supplied,\nskips the automatic deployment lookup. When omitted, the versioned\nAPI Executable deployment with the highest version number is used." +}
14 tool updates
v1.26.0- Changed
batch_update_doc1 field changed- changed
Input schema / properties / operations / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "end_of_segment": { - "default": false, - "description": "Append to the end of the targeted body/segment instead of using index.", - "type": "boolean" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "text": { - "description": "Text to insert.", - "type": "string" - }, - "type": { - "const": "insert_text", - "type": "string" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_index": { - "type": "integer" - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "delete_text", - "type": "string" - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_index": { - "type": "integer" - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "text": { - "description": "Replacement text.", - "type": "string" - }, - "type": { - "const": "replace_text", - "type": "string" - } - }, - "required": [ - "type", - "start_index", - "end_index", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "background_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "baseline_offset": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "bold": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "clear_link": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "end_index": { - "type": "integer" - }, - "font_family": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "font_size": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "font_weight": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "italic": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "link_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "small_caps": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "start_index": { - "type": "integer" - }, - "strikethrough": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "text_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "type": { - "const": "format_text", - "type": "string" - }, - "underline": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "alignment": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "avoid_widow_and_orphan": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "border_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "border_dash": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "border_edges": { - "anyOf": [ - { - "items": { - "enum": [ - "top", - "bottom", - "left", - "right", - "between" - ], - "type": "string" - }, - "minItems": 1, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Paragraph border edges to update; omit to update top, bottom, left, and right." - }, - "border_padding": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "border_width": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "direction": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "end_index": { - "type": "integer" - }, - "heading_level": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "indent_end": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "indent_first_line": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "indent_start": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "keep_lines_together": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "keep_with_next": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "line_spacing": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "named_style_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_break_before": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "shading_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "space_above": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "space_below": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "spacing_mode": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "update_paragraph_style", - "type": "string" - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "background_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "border_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "border_edges": { - "anyOf": [ - { - "items": { - "enum": [ - "top", - "bottom", - "left", - "right" - ], - "type": "string" - }, - "minItems": 1, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Table-cell border edges to update; omit to update all four edges." - }, - "border_width": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "column_index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "column_span": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "content_alignment": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "padding_bottom": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "padding_left": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "padding_right": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "padding_top": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "row_index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "row_span": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "update_table_cell_style", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "columns": { - "type": "integer" - }, - "end_of_segment": { - "default": false, - "description": "Append to the end of the targeted body/segment instead of using index.", - "type": "boolean" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "rows": { - "type": "integer" - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "insert_table", - "type": "string" - } - }, - "required": [ - "type", - "rows", - "columns" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "insert_below": { - "default": true, - "type": "boolean" - }, - "row_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "insert_table_row", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "row_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "delete_table_row", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_index": { - "type": "integer" - }, - "insert_right": { - "default": true, - "type": "boolean" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "insert_table_column", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "column_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "delete_table_column", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "column_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_index": { - "type": "integer" - }, - "column_span": { - "type": "integer" - }, - "row_index": { - "type": "integer" - }, - "row_span": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "merge_table_cells", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_index", - "column_index", - "row_span", - "column_span" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_index": { - "type": "integer" - }, - "column_span": { - "type": "integer" - }, - "row_index": { - "type": "integer" - }, - "row_span": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "unmerge_table_cells", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_index", - "column_index", - "row_span", - "column_span" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_indices": { - "items": { - "type": "integer" - }, - "type": "array" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "update_table_column_properties", - "type": "string" - }, - "width": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "width_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type", - "table_start_index", - "column_indices" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "min_row_height": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Minimum row height in points." - }, - "row_indices": { - "description": "Zero-based row indices to style, e.g. [0] for the header row.", - "items": { - "type": "integer" - }, - "type": "array" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "update_table_row_style", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_indices" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "pinned_header_rows_count": { - "description": "Number of leading rows to pin as a repeating header on each page. 0 unpins all rows. Use this dedicated request because the 'tableHeader' value reported in TableRowStyle cannot be set through UpdateTableRowStyleRequest.", - "minimum": 0, - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "pin_table_header_rows", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "pinned_header_rows_count" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_of_segment": { - "default": false, - "description": "Append to the end of the body instead of using index.", - "type": "boolean" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "insert_page_break", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_of_segment": { - "default": false, - "description": "Append to the end of the body instead of using index.", - "type": "boolean" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "section_type": { - "default": "NEXT_PAGE", - "enum": [ - "CONTINUOUS", - "NEXT_PAGE" - ], - "type": "string" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "insert_section_break", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "find_text": { - "type": "string" - }, - "match_case": { - "default": false, - "type": "boolean" - }, - "replace_text": { - "type": "string" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "find_replace", - "type": "string" - } - }, - "required": [ - "type", - "find_text", - "replace_text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bullet_preset": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "end_index": { - "type": "integer" - }, - "list_type": { - "default": "UNORDERED", - "enum": [ - "UNORDERED", - "ORDERED", - "CHECKBOX", - "NONE" - ], - "type": "string" - }, - "nesting_level": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "paragraph_start_indices": { - "anyOf": [ - { - "items": { - "type": "integer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "create_bullet_list", - "type": "string" - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "create_named_range", - "type": "string" - } - }, - "required": [ - "type", - "name", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "named_range_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "named_range_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "text": { - "type": "string" - }, - "type": { - "const": "replace_named_range_content", - "type": "string" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "named_range_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "named_range_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "delete_named_range", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "background_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "document_mode": { - "anyOf": [ - { - "enum": [ - "PAGES", - "PAGELESS" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "flip_page_orientation": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_bottom": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_footer": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_header": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_left": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_right": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_top": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_height": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_number_start": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_width": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "update_document_style", - "type": "string" - }, - "use_even_page_header_footer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "use_first_page_header_footer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_count": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "column_separator_style": { - "anyOf": [ - { - "enum": [ - "NONE", - "BETWEEN_EACH_COLUMN" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "column_spacing": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "content_direction": { - "anyOf": [ - { - "enum": [ - "LEFT_TO_RIGHT", - "RIGHT_TO_LEFT" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "end_index": { - "type": "integer" - }, - "flip_page_orientation": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_bottom": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_footer": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_header": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_left": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_right": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_top": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_number_start": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "update_section_style", - "type": "string" - }, - "use_first_page_header_footer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "header_footer_type": { - "default": "DEFAULT", - "description": "Header/footer type to create.", - "enum": [ - "DEFAULT", - "FIRST_PAGE_ONLY", - "EVEN_PAGE" - ], - "type": "string" - }, - "section_break_index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional section break index for section-scoped layouts." - }, - "section_type": { - "description": "Which section to create.", - "enum": [ - "header", - "footer" - ], - "type": "string" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "create_header_footer", - "type": "string" - } - }, - "required": [ - "type", - "section_type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_of_segment": { - "default": false, - "description": "Append to the end of the targeted body/segment instead of using index.", - "type": "boolean" - }, - "height": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "image_uri": { - "description": "Image URL or resolvable image URI.", - "type": "string" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "insert_image", - "type": "string" - }, - "width": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type", - "image_uri" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "index": { - "type": "integer" - }, - "parent_tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "title": { - "type": "string" - }, - "type": { - "const": "insert_doc_tab", - "type": "string" - } - }, - "required": [ - "type", - "title", - "index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "tab_id": { - "type": "string" - }, - "type": { - "const": "delete_doc_tab", - "type": "string" - } - }, - "required": [ - "type", - "tab_id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "tab_id": { - "type": "string" - }, - "title": { - "type": "string" - }, - "type": { - "const": "update_doc_tab", - "type": "string" - } - }, - "required": [ - "type", - "tab_id", - "title" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "after_heading": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert immediately after the heading paragraph with this exact text, resolved to an index at execution time. Errors when it matches zero or more than one heading." + }, + "anchor_position": { + "default": "after", + "description": "Which side of anchor_text to insert on. Defaults to 'after'.", + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "anchor_text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert relative to this literal text, which must occur exactly once within a single paragraph. Use anchor_position to pick which side." + }, + "before_heading": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading." + }, + "end_of_segment": { + "default": false, + "description": "Append to the end of the targeted body/segment instead of using index.", + "type": "boolean" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "text": { + "description": "Text to insert.", + "type": "string" + }, + "type": { + "const": "insert_text", + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_index": { + "type": "integer" + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "delete_text", + "type": "string" + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_index": { + "type": "integer" + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "text": { + "description": "Replacement text.", + "type": "string" + }, + "type": { + "const": "replace_text", + "type": "string" + } + }, + "required": [ + "type", + "start_index", + "end_index", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "background_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "baseline_offset": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "bold": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "clear_link": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "end_index": { + "type": "integer" + }, + "font_family": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "font_size": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "font_weight": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "italic": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "link_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "small_caps": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "start_index": { + "type": "integer" + }, + "strikethrough": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "text_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "type": { + "const": "format_text", + "type": "string" + }, + "underline": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "alignment": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "avoid_widow_and_orphan": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_dash": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_edges": { + "anyOf": [ + { + "items": { + "enum": [ + "top", + "bottom", + "left", + "right", + "between" + ], + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Paragraph border edges to update; omit to update top, bottom, left, and right." + }, + "border_padding": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "direction": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "end_index": { + "type": "integer" + }, + "heading_level": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "indent_end": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "indent_first_line": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "indent_start": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "keep_lines_together": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "keep_with_next": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "line_spacing": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "named_style_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_break_before": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "shading_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "space_above": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "space_below": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "spacing_mode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "update_paragraph_style", + "type": "string" + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "background_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_edges": { + "anyOf": [ + { + "items": { + "enum": [ + "top", + "bottom", + "left", + "right" + ], + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Table-cell border edges to update; omit to update all four edges." + }, + "border_width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "column_index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "column_span": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "content_alignment": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "padding_bottom": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "padding_left": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "padding_right": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "padding_top": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "row_index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "row_span": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "update_table_cell_style", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "after_heading": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert immediately after the heading paragraph with this exact text, resolved to an index at execution time. Errors when it matches zero or more than one heading." + }, + "anchor_position": { + "default": "after", + "description": "Which side of anchor_text to insert on. Defaults to 'after'.", + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "anchor_text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert relative to this literal text, which must occur exactly once within a single paragraph. Use anchor_position to pick which side." + }, + "before_heading": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading." + }, + "columns": { + "type": "integer" + }, + "end_of_segment": { + "default": false, + "description": "Append to the end of the targeted body/segment instead of using index.", + "type": "boolean" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "rows": { + "type": "integer" + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "insert_table", + "type": "string" + } + }, + "required": [ + "type", + "rows", + "columns" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "insert_below": { + "default": true, + "type": "boolean" + }, + "row_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "insert_table_row", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "row_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "delete_table_row", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_index": { + "type": "integer" + }, + "insert_right": { + "default": true, + "type": "boolean" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "insert_table_column", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "column_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "delete_table_column", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "column_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_index": { + "type": "integer" + }, + "column_span": { + "type": "integer" + }, + "row_index": { + "type": "integer" + }, + "row_span": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "merge_table_cells", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_index", + "column_index", + "row_span", + "column_span" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_index": { + "type": "integer" + }, + "column_span": { + "type": "integer" + }, + "row_index": { + "type": "integer" + }, + "row_span": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "unmerge_table_cells", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_index", + "column_index", + "row_span", + "column_span" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_indices": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "update_table_column_properties", + "type": "string" + }, + "width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "width_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type", + "table_start_index", + "column_indices" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "min_row_height": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Minimum row height in points." + }, + "row_indices": { + "description": "Zero-based row indices to style, e.g. [0] for the header row.", + "items": { + "type": "integer" + }, + "type": "array" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "update_table_row_style", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_indices" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "pinned_header_rows_count": { + "description": "Number of leading rows to pin as a repeating header on each page. 0 unpins all rows. Use this dedicated request because the 'tableHeader' value reported in TableRowStyle cannot be set through UpdateTableRowStyleRequest.", + "minimum": 0, + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "pin_table_header_rows", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "pinned_header_rows_count" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "after_heading": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert immediately after the heading paragraph with this exact text, resolved to an index at execution time. Errors when it matches zero or more than one heading." + }, + "anchor_position": { + "default": "after", + "description": "Which side of anchor_text to insert on. Defaults to 'after'.", + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "anchor_text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert relative to this literal text, which must occur exactly once within a single paragraph. Use anchor_position to pick which side." + }, + "before_heading": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading." + }, + "end_of_segment": { + "default": false, + "description": "Append to the end of the targeted body/segment instead of using index.", + "type": "boolean" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "insert_page_break", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "after_heading": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert immediately after the heading paragraph with this exact text, resolved to an index at execution time. Errors when it matches zero or more than one heading." + }, + "anchor_position": { + "default": "after", + "description": "Which side of anchor_text to insert on. Defaults to 'after'.", + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "anchor_text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert relative to this literal text, which must occur exactly once within a single paragraph. Use anchor_position to pick which side." + }, + "before_heading": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading." + }, + "end_of_segment": { + "default": false, + "description": "Append to the end of the targeted body/segment instead of using index.", + "type": "boolean" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "section_type": { + "default": "NEXT_PAGE", + "enum": [ + "CONTINUOUS", + "NEXT_PAGE" + ], + "type": "string" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "insert_section_break", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "find_text": { + "type": "string" + }, + "match_case": { + "default": false, + "type": "boolean" + }, + "replace_text": { + "type": "string" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "find_replace", + "type": "string" + } + }, + "required": [ + "type", + "find_text", + "replace_text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bullet_preset": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "end_index": { + "type": "integer" + }, + "list_type": { + "default": "UNORDERED", + "enum": [ + "UNORDERED", + "ORDERED", + "CHECKBOX", + "NONE" + ], + "type": "string" + }, + "nesting_level": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "paragraph_start_indices": { + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "create_bullet_list", + "type": "string" + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "create_named_range", + "type": "string" + } + }, + "required": [ + "type", + "name", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "named_range_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "named_range_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "text": { + "type": "string" + }, + "type": { + "const": "replace_named_range_content", + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "named_range_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "named_range_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "delete_named_range", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "background_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "document_mode": { + "anyOf": [ + { + "enum": [ + "PAGES", + "PAGELESS" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "flip_page_orientation": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_bottom": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_footer": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_header": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_left": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_right": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_top": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_height": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_number_start": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "update_document_style", + "type": "string" + }, + "use_even_page_header_footer": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "use_first_page_header_footer": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "column_separator_style": { + "anyOf": [ + { + "enum": [ + "NONE", + "BETWEEN_EACH_COLUMN" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "column_spacing": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "content_direction": { + "anyOf": [ + { + "enum": [ + "LEFT_TO_RIGHT", + "RIGHT_TO_LEFT" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "end_index": { + "type": "integer" + }, + "flip_page_orientation": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_bottom": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_footer": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_header": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_left": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_right": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_top": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_number_start": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "update_section_style", + "type": "string" + }, + "use_first_page_header_footer": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "header_footer_type": { + "default": "DEFAULT", + "description": "Header/footer type to create.", + "enum": [ + "DEFAULT", + "FIRST_PAGE_ONLY", + "EVEN_PAGE" + ], + "type": "string" + }, + "section_break_index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional section break index for section-scoped layouts." + }, + "section_type": { + "description": "Which section to create.", + "enum": [ + "header", + "footer" + ], + "type": "string" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "create_header_footer", + "type": "string" + } + }, + "required": [ + "type", + "section_type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "after_heading": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert immediately after the heading paragraph with this exact text, resolved to an index at execution time. Errors when it matches zero or more than one heading." + }, + "anchor_position": { + "default": "after", + "description": "Which side of anchor_text to insert on. Defaults to 'after'.", + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "anchor_text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert relative to this literal text, which must occur exactly once within a single paragraph. Use anchor_position to pick which side." + }, + "before_heading": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading." + }, + "end_of_segment": { + "default": false, + "description": "Append to the end of the targeted body/segment instead of using index.", + "type": "boolean" + }, + "height": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "image_uri": { + "description": "Image URL or resolvable image URI.", + "type": "string" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "insert_image", + "type": "string" + }, + "width": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type", + "image_uri" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "index": { + "type": "integer" + }, + "parent_tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "title": { + "type": "string" + }, + "type": { + "const": "insert_doc_tab", + "type": "string" + } + }, + "required": [ + "type", + "title", + "index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "tab_id": { + "type": "string" + }, + "type": { + "const": "delete_doc_tab", + "type": "string" + } + }, + "required": [ + "type", + "tab_id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "tab_id": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "const": "update_doc_tab", + "type": "string" + } + }, + "required": [ + "type", + "tab_id", + "title" + ], + "type": "object" + } +]
- Changed
get_doc_as_markdown1 field changed- added
Input schema / properties / tab_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional ID of a single tab to read (from inspect_doc_structure).\nWhen given, only that tab's content is rendered, without its child tabs\nand without a tab heading. When omitted, every tab is rendered." +}
- Changed
get_doc_content1 field changed- added
Input schema / properties / tab_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional ID of a single tab to read (from inspect_doc_structure).\nWhen given, only that tab's content is returned with no tab separator,\nso the content stays index-aligned with that tab. When omitted, every\ntab is returned separated by \"--- TAB: ... ---\" markers." +}
- Changed
get_events2 fields changed- changed
Input schema / properties / max_results / descriptionPrevious value: -"The maximum number of events to return. Defaults to 25. Ignored if event_id is provided."New value: +"The maximum number of events to return in one page. Defaults to 25. Ignored if event_id is provided." - added
Input schema / properties / page_tokenAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Token for the next page, taken from a previous response. When single_events=True, also pass the response's Pagination time_min as time_min, even if omitted on the first call. Keep all other query parameters unchanged. Ignored if event_id is provided." +}
- Changed
get_gmail_attachment_content1 field changed- added
Input schema / properties / attachment_indexAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Zero-based attachment position from\nthe message-content response. When the cap is enabled, this lets\nthe server safely resolve Gmail's refreshed attachment IDs against\ncurrent metadata before downloading." +}
- Changed
get_page1 field changed- added
Input schema / properties / include_geometryAdded value: +{ + "default": false, + "description": "Also report each element's placement - its\ntransform (translate, and scale/shear when not identity) and intrinsic\nsize, in raw EMU. Set this when adding elements to an existing deck:\nit is the only way to discover the deck's margins, gutters and content\nwidth, which Slides exposes nowhere else, and it reports the same terms\nbatch_update_presentation writes. Defaults to False to keep the\ndefault output's token cost unchanged.", + "type": "boolean" +}
- Changed
get_presentation1 field changed- added
Input schema / properties / include_geometryAdded value: +{ + "default": false, + "description": "Also list each slide's elements with their\nplacement - transform (translate, and scale/shear when not identity)\nand intrinsic size, in raw EMU. Set this when adding slides to an\nexisting deck so new elements can match its established margins and\ncontent width. Defaults to False.", + "type": "boolean" +}
- Changed
inspect_doc_structure1 field changed- added
Input schema / properties / preview_charsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": 100, + "description": "Maximum characters of paragraph, header and footer text\npreview. Pass 0 or None for the full text, needed to locate a token inside a\nparagraph longer than the default 100 characters." +}
- Changed
list_calendars2 fields changed- added
Input schema / properties / max_resultsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maximum calendars to return in one page. Omit to use the API default." +} - added
Input schema / properties / page_tokenAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Token for the next page, taken from a previous response." +}
- Changed
manage_event1 field changed- changed
Input schema / properties / attachments / descriptionPrevious value: -"List of Google Drive file URLs or IDs to attach."New value: +"List of Google Drive file URLs or IDs to attach.\nOn action=\"update\" this replaces the event's existing attachments rather than\nappending to them, matching the Calendar API's patch semantics."
- Changed
manage_gmail_label3 fields changed- added
Input schema / properties / background_colorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Label background color as a hex string, e.g. \"#fb4c2f\". Set together with text_color; Gmail requires both. Gmail accepts only its own palette, and an unsupported value is rejected before the request. Colors apply to user labels, not system labels." +} - added
Input schema / properties / clear_colorAdded value: +{ + "default": false, + "description": "On update, remove the label's current color. Cannot be combined with background_color or text_color.", + "type": "boolean" +} - added
Input schema / properties / text_colorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Label text color as a hex string, e.g. \"#ffffff\". Set together with background_color. Same palette. On update, omitting both keeps the label's current color." +}
- Added
manage_sheet_tab - Changed
send_message1 field changed- added
Input schema / properties / message_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Edit this message in place instead of sending a new one\n(e.g. spaces/X/messages/Y, as returned by send_message or get_messages).\nMust be a message of space_id. Only the text is replaced, and only the\nauthor can edit their own message." +}
- Changed
update_paragraph_style1 field changed- changed
Input schema / properties / list_type / descriptionPrevious value: -"Create a list from existing paragraphs ('UNORDERED' for bullets, 'ORDERED' for numbers, 'CHECKBOX' for checklists)"New value: +"Create a list from existing paragraphs ('UNORDERED' for bullets, 'ORDERED' for numbers, 'CHECKBOX' for checklists), or 'NONE' to remove existing list formatting from the range. Use 'NONE' when text inserted after a list has inherited its bullets: setting named_style_type or heading_level does not clear list membership, only 'NONE' does."
12 tool updates
v1.25.2- Changed
batch_modify_gmail_message_labels3 fields changed- removed
Input schema / properties / add_label_ids / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / remove_label_ids / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / verifyAdded value: +{ + "default": true, + "description": "Read the messages back and report per-id outcomes. Costs\none extra (batched) read per id. Set False for very large sweeps\nwhere that cost matters and an unverified result is acceptable.", + "type": "boolean" +}
- Changed
create_drive_file1 field changed- added
Input schema / properties / base64_sha256Added value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks." +}
- Changed
draft_gmail_message4 fields changed- changed
Input schema / properties / from_email / descriptionPrevious value: -"Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email."New value: +"Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the account's default Send As address, falling back to the authenticated user's email when Gmail returns no usable Send-As entry or settings access is not authorized." - changed
Input schema / properties / in_reply_to / descriptionPrevious value: -"Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')."New value: +"Optional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id." - changed
Input schema / properties / references / descriptionPrevious value: -"Optional chain of Message-IDs for proper threading."New value: +"Optional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target." - changed
Input schema / properties / thread_id / descriptionPrevious value: -"Optional Gmail thread ID to reply within."New value: +"Optional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID."
- Changed
get_events3 fields changed- changed
Input schema / properties / detailed / descriptionPrevious value: -"Whether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also report the parent series ID needed to edit the whole series, and events that are not ordinary confirmed meetings report their event type (outOfOffice, workingLocation, focusTime) and status. Defaults to False."New value: +"Whether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also report the parent series ID needed to edit the whole series; recurring masters report their raw RFC5545 recurrence rules; and events that are not ordinary confirmed meetings report their event type (outOfOffice, workingLocation, focusTime) and status. Defaults to False." - added
Input schema / properties / single_eventsAdded value: +{ + "default": true, + "description": "Whether to expand recurring series into individual instances. Defaults to True for backwards compatibility. Set to False with detailed=True to retrieve recurring master events and their exact RFC5545 recurrence rules instead of inferring cadence from expanded instances.", + "type": "boolean" +} - changed
Input schema / properties / time_min / descriptionPrevious value: -"The start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time. Ignored if event_id is provided."New value: +"The start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time when single_events=True. It is omitted from unexpanded queries so recurring masters that began in the past but still have future occurrences remain discoverable. Ignored if event_id is provided."
- Changed
import_to_google_doc2 fields changed- added
Input schema / properties / base64_contentAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Standard base64-encoded bytes for a binary source such as DOCX or ODT." +} - added
Input schema / properties / base64_sha256Added value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks." +}
- Changed
import_to_google_sheets2 fields changed- added
Input schema / properties / base64_contentAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Standard base64-encoded bytes for an XLSX, XLS, or ODS source." +} - added
Input schema / properties / base64_sha256Added value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks." +}
- Changed
import_to_google_slides2 fields changed- added
Input schema / properties / base64_contentAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Standard base64-encoded bytes for a PPTX or ODP source." +} - added
Input schema / properties / base64_sha256Added value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks." +}
- Changed
list_gmail_labels3 fields changed- added
Input schema / properties / compactAdded value: +{ + "default": false, + "description": "Return minimal JSON {\"count\", \"labels\": [{\"id\", \"name\"}]}\nsorted by name, instead of the formatted text list. For callers\nthat parse the result, e.g. a label cache refresh.", + "type": "boolean" +} - added
Input schema / properties / include_systemAdded value: +{ + "default": true, + "description": "Include Gmail system labels (INBOX, SENT, ...).\nSet False to return user labels only.", + "type": "boolean" +} - added
Input schema / properties / prefixAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Return only labels whose name starts with this\nexact (case-sensitive) string. users.labels.list accepts no filter,\nso the full list is fetched and narrowed here: this shrinks what the\ncaller receives, not the API call." +}
- Changed
manage_event3 fields changed- added
Input schema / properties / end_timezoneAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "IANA timezone for the end boundary only,\noverriding timezone. See start_timezone." +} - added
Input schema / properties / start_timezoneAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "IANA timezone for the start boundary only,\noverriding timezone. Use for events whose two ends sit in different zones -\na flight departing 13:45 \"Asia/Jerusalem\" and landing 17:50\n\"Europe/Amsterdam\" is one event authored in two zones. Passing a single\ntimezone for such an event silently rewrites one end's wall-clock." +} - changed
Input schema / properties / timezone / descriptionPrevious value: -"Timezone (e.g., \"America/New_York\")."New value: +"IANA timezone applied to both boundaries (e.g.,\n\"America/New_York\"). Overridden per boundary by start_timezone/end_timezone."
- Changed
modify_gmail_message_labels2 fields changed- removed
Input schema / properties / add_label_ids / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / remove_label_ids / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]
- Changed
send_gmail_message3 fields changed- changed
Input schema / properties / in_reply_to / descriptionPrevious value: -"Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')."New value: +"Optional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id." - changed
Input schema / properties / references / descriptionPrevious value: -"Optional chain of Message-IDs for proper threading."New value: +"Optional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target." - changed
Input schema / properties / thread_id / descriptionPrevious value: -"Optional Gmail thread ID to reply within."New value: +"Optional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID."
- Changed
update_drive_file3 fields changed- changed
Input schema / properties / copy_requires_writer_permission / descriptionPrevious value: -"Whether copying requires writer permission."New value: +"Whether copying requires writer\npermission. Pass the target ID directly; this cannot be changed on a\nshortcut resource." - changed
Input schema / properties / mime_type / descriptionPrevious value: -"New MIME type (note: changing type may require content upload)."New value: +"New MIME type (note: changing type may require\ncontent upload). For a shortcut ID, this must accompany content and applies\nto the resolved target." - changed
Input schema / properties / writers_can_share / descriptionPrevious value: -"Whether editors can share the file."New value: +"Whether editors can share the file. Pass the\ntarget ID directly; this cannot be changed on a shortcut resource."
8 tool updates
v1.24.0- Changed
batch_update_doc1 field changed- changed
Input schema / properties / operations / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "end_of_segment": { - "default": false, - "description": "Append to the end of the targeted body/segment instead of using index.", - "type": "boolean" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "text": { - "description": "Text to insert.", - "type": "string" - }, - "type": { - "const": "insert_text", - "type": "string" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_index": { - "type": "integer" - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "delete_text", - "type": "string" - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_index": { - "type": "integer" - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "text": { - "description": "Replacement text.", - "type": "string" - }, - "type": { - "const": "replace_text", - "type": "string" - } - }, - "required": [ - "type", - "start_index", - "end_index", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "background_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "baseline_offset": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "bold": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "clear_link": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "end_index": { - "type": "integer" - }, - "font_family": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "font_size": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "font_weight": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "italic": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "link_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "small_caps": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "start_index": { - "type": "integer" - }, - "strikethrough": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "text_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "type": { - "const": "format_text", - "type": "string" - }, - "underline": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "alignment": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "avoid_widow_and_orphan": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "direction": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "end_index": { - "type": "integer" - }, - "heading_level": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "indent_end": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "indent_first_line": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "indent_start": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "keep_lines_together": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "keep_with_next": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "line_spacing": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "named_style_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_break_before": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "shading_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "space_above": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "space_below": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "spacing_mode": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "update_paragraph_style", - "type": "string" - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "background_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "border_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "border_width": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "column_index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "column_span": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "content_alignment": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "padding_bottom": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "padding_left": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "padding_right": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "padding_top": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "row_index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "row_span": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "update_table_cell_style", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "columns": { - "type": "integer" - }, - "end_of_segment": { - "default": false, - "description": "Append to the end of the targeted body/segment instead of using index.", - "type": "boolean" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "rows": { - "type": "integer" - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "insert_table", - "type": "string" - } - }, - "required": [ - "type", - "rows", - "columns" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "insert_below": { - "default": true, - "type": "boolean" - }, - "row_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "insert_table_row", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "row_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "delete_table_row", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_index": { - "type": "integer" - }, - "insert_right": { - "default": true, - "type": "boolean" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "insert_table_column", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "column_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "delete_table_column", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "column_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_index": { - "type": "integer" - }, - "column_span": { - "type": "integer" - }, - "row_index": { - "type": "integer" - }, - "row_span": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "merge_table_cells", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_index", - "column_index", - "row_span", - "column_span" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_index": { - "type": "integer" - }, - "column_span": { - "type": "integer" - }, - "row_index": { - "type": "integer" - }, - "row_span": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "unmerge_table_cells", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_index", - "column_index", - "row_span", - "column_span" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_indices": { - "items": { - "type": "integer" - }, - "type": "array" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "update_table_column_properties", - "type": "string" - }, - "width": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "width_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type", - "table_start_index", - "column_indices" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "min_row_height": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Minimum row height in points." - }, - "row_indices": { - "description": "Zero-based row indices to style, e.g. [0] for the header row.", - "items": { - "type": "integer" - }, - "type": "array" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "update_table_row_style", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_indices" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "pinned_header_rows_count": { - "description": "Number of leading rows to pin as a repeating header on each page. 0 unpins all rows. Use this dedicated request because the 'tableHeader' value reported in TableRowStyle cannot be set through UpdateTableRowStyleRequest.", - "minimum": 0, - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "pin_table_header_rows", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "pinned_header_rows_count" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_of_segment": { - "default": false, - "description": "Append to the end of the body instead of using index.", - "type": "boolean" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "insert_page_break", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_of_segment": { - "default": false, - "description": "Append to the end of the body instead of using index.", - "type": "boolean" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "section_type": { - "default": "NEXT_PAGE", - "enum": [ - "CONTINUOUS", - "NEXT_PAGE" - ], - "type": "string" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "insert_section_break", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "find_text": { - "type": "string" - }, - "match_case": { - "default": false, - "type": "boolean" - }, - "replace_text": { - "type": "string" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "find_replace", - "type": "string" - } - }, - "required": [ - "type", - "find_text", - "replace_text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bullet_preset": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "end_index": { - "type": "integer" - }, - "list_type": { - "default": "UNORDERED", - "enum": [ - "UNORDERED", - "ORDERED", - "CHECKBOX", - "NONE" - ], - "type": "string" - }, - "nesting_level": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "paragraph_start_indices": { - "anyOf": [ - { - "items": { - "type": "integer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "create_bullet_list", - "type": "string" - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "create_named_range", - "type": "string" - } - }, - "required": [ - "type", - "name", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "named_range_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "named_range_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "text": { - "type": "string" - }, - "type": { - "const": "replace_named_range_content", - "type": "string" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "named_range_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "named_range_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "delete_named_range", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "background_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "document_mode": { - "anyOf": [ - { - "enum": [ - "PAGES", - "PAGELESS" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "flip_page_orientation": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_bottom": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_footer": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_header": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_left": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_right": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_top": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_height": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_number_start": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_width": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "update_document_style", - "type": "string" - }, - "use_even_page_header_footer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "use_first_page_header_footer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_count": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "column_separator_style": { - "anyOf": [ - { - "enum": [ - "NONE", - "BETWEEN_EACH_COLUMN" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "column_spacing": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "content_direction": { - "anyOf": [ - { - "enum": [ - "LEFT_TO_RIGHT", - "RIGHT_TO_LEFT" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "end_index": { - "type": "integer" - }, - "flip_page_orientation": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_bottom": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_footer": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_header": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_left": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_right": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_top": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_number_start": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "update_section_style", - "type": "string" - }, - "use_first_page_header_footer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "header_footer_type": { - "default": "DEFAULT", - "description": "Header/footer type to create.", - "enum": [ - "DEFAULT", - "FIRST_PAGE_ONLY", - "EVEN_PAGE" - ], - "type": "string" - }, - "section_break_index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional section break index for section-scoped layouts." - }, - "section_type": { - "description": "Which section to create.", - "enum": [ - "header", - "footer" - ], - "type": "string" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "create_header_footer", - "type": "string" - } - }, - "required": [ - "type", - "section_type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_of_segment": { - "default": false, - "description": "Append to the end of the targeted body/segment instead of using index.", - "type": "boolean" - }, - "height": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "image_uri": { - "description": "Image URL or resolvable image URI.", - "type": "string" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "insert_image", - "type": "string" - }, - "width": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type", - "image_uri" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "index": { - "type": "integer" - }, - "parent_tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "title": { - "type": "string" - }, - "type": { - "const": "insert_doc_tab", - "type": "string" - } - }, - "required": [ - "type", - "title", - "index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "tab_id": { - "type": "string" - }, - "type": { - "const": "delete_doc_tab", - "type": "string" - } - }, - "required": [ - "type", - "tab_id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "tab_id": { - "type": "string" - }, - "title": { - "type": "string" - }, - "type": { - "const": "update_doc_tab", - "type": "string" - } - }, - "required": [ - "type", - "tab_id", - "title" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "end_of_segment": { + "default": false, + "description": "Append to the end of the targeted body/segment instead of using index.", + "type": "boolean" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "text": { + "description": "Text to insert.", + "type": "string" + }, + "type": { + "const": "insert_text", + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_index": { + "type": "integer" + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "delete_text", + "type": "string" + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_index": { + "type": "integer" + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "text": { + "description": "Replacement text.", + "type": "string" + }, + "type": { + "const": "replace_text", + "type": "string" + } + }, + "required": [ + "type", + "start_index", + "end_index", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "background_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "baseline_offset": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "bold": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "clear_link": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "end_index": { + "type": "integer" + }, + "font_family": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "font_size": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "font_weight": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "italic": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "link_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "small_caps": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "start_index": { + "type": "integer" + }, + "strikethrough": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "text_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "type": { + "const": "format_text", + "type": "string" + }, + "underline": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "alignment": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "avoid_widow_and_orphan": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_dash": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_edges": { + "anyOf": [ + { + "items": { + "enum": [ + "top", + "bottom", + "left", + "right", + "between" + ], + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Paragraph border edges to update; omit to update top, bottom, left, and right." + }, + "border_padding": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "direction": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "end_index": { + "type": "integer" + }, + "heading_level": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "indent_end": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "indent_first_line": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "indent_start": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "keep_lines_together": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "keep_with_next": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "line_spacing": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "named_style_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_break_before": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "shading_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "space_above": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "space_below": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "spacing_mode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "update_paragraph_style", + "type": "string" + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "background_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_edges": { + "anyOf": [ + { + "items": { + "enum": [ + "top", + "bottom", + "left", + "right" + ], + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Table-cell border edges to update; omit to update all four edges." + }, + "border_width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "column_index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "column_span": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "content_alignment": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "padding_bottom": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "padding_left": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "padding_right": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "padding_top": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "row_index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "row_span": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "update_table_cell_style", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "columns": { + "type": "integer" + }, + "end_of_segment": { + "default": false, + "description": "Append to the end of the targeted body/segment instead of using index.", + "type": "boolean" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "rows": { + "type": "integer" + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "insert_table", + "type": "string" + } + }, + "required": [ + "type", + "rows", + "columns" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "insert_below": { + "default": true, + "type": "boolean" + }, + "row_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "insert_table_row", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "row_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "delete_table_row", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_index": { + "type": "integer" + }, + "insert_right": { + "default": true, + "type": "boolean" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "insert_table_column", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "column_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "delete_table_column", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "column_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_index": { + "type": "integer" + }, + "column_span": { + "type": "integer" + }, + "row_index": { + "type": "integer" + }, + "row_span": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "merge_table_cells", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_index", + "column_index", + "row_span", + "column_span" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_index": { + "type": "integer" + }, + "column_span": { + "type": "integer" + }, + "row_index": { + "type": "integer" + }, + "row_span": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "unmerge_table_cells", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_index", + "column_index", + "row_span", + "column_span" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_indices": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "update_table_column_properties", + "type": "string" + }, + "width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "width_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type", + "table_start_index", + "column_indices" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "min_row_height": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Minimum row height in points." + }, + "row_indices": { + "description": "Zero-based row indices to style, e.g. [0] for the header row.", + "items": { + "type": "integer" + }, + "type": "array" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "update_table_row_style", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_indices" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "pinned_header_rows_count": { + "description": "Number of leading rows to pin as a repeating header on each page. 0 unpins all rows. Use this dedicated request because the 'tableHeader' value reported in TableRowStyle cannot be set through UpdateTableRowStyleRequest.", + "minimum": 0, + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "pin_table_header_rows", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "pinned_header_rows_count" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_of_segment": { + "default": false, + "description": "Append to the end of the body instead of using index.", + "type": "boolean" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "insert_page_break", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_of_segment": { + "default": false, + "description": "Append to the end of the body instead of using index.", + "type": "boolean" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "section_type": { + "default": "NEXT_PAGE", + "enum": [ + "CONTINUOUS", + "NEXT_PAGE" + ], + "type": "string" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "insert_section_break", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "find_text": { + "type": "string" + }, + "match_case": { + "default": false, + "type": "boolean" + }, + "replace_text": { + "type": "string" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "find_replace", + "type": "string" + } + }, + "required": [ + "type", + "find_text", + "replace_text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bullet_preset": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "end_index": { + "type": "integer" + }, + "list_type": { + "default": "UNORDERED", + "enum": [ + "UNORDERED", + "ORDERED", + "CHECKBOX", + "NONE" + ], + "type": "string" + }, + "nesting_level": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "paragraph_start_indices": { + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "create_bullet_list", + "type": "string" + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "create_named_range", + "type": "string" + } + }, + "required": [ + "type", + "name", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "named_range_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "named_range_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "text": { + "type": "string" + }, + "type": { + "const": "replace_named_range_content", + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "named_range_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "named_range_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "delete_named_range", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "background_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "document_mode": { + "anyOf": [ + { + "enum": [ + "PAGES", + "PAGELESS" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "flip_page_orientation": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_bottom": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_footer": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_header": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_left": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_right": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_top": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_height": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_number_start": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "update_document_style", + "type": "string" + }, + "use_even_page_header_footer": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "use_first_page_header_footer": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "column_separator_style": { + "anyOf": [ + { + "enum": [ + "NONE", + "BETWEEN_EACH_COLUMN" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "column_spacing": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "content_direction": { + "anyOf": [ + { + "enum": [ + "LEFT_TO_RIGHT", + "RIGHT_TO_LEFT" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "end_index": { + "type": "integer" + }, + "flip_page_orientation": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_bottom": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_footer": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_header": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_left": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_right": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_top": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_number_start": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "update_section_style", + "type": "string" + }, + "use_first_page_header_footer": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "header_footer_type": { + "default": "DEFAULT", + "description": "Header/footer type to create.", + "enum": [ + "DEFAULT", + "FIRST_PAGE_ONLY", + "EVEN_PAGE" + ], + "type": "string" + }, + "section_break_index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional section break index for section-scoped layouts." + }, + "section_type": { + "description": "Which section to create.", + "enum": [ + "header", + "footer" + ], + "type": "string" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "create_header_footer", + "type": "string" + } + }, + "required": [ + "type", + "section_type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_of_segment": { + "default": false, + "description": "Append to the end of the targeted body/segment instead of using index.", + "type": "boolean" + }, + "height": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "image_uri": { + "description": "Image URL or resolvable image URI.", + "type": "string" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "insert_image", + "type": "string" + }, + "width": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type", + "image_uri" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "index": { + "type": "integer" + }, + "parent_tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "title": { + "type": "string" + }, + "type": { + "const": "insert_doc_tab", + "type": "string" + } + }, + "required": [ + "type", + "title", + "index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "tab_id": { + "type": "string" + }, + "type": { + "const": "delete_doc_tab", + "type": "string" + } + }, + "required": [ + "type", + "tab_id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "tab_id": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "const": "update_doc_tab", + "type": "string" + } + }, + "required": [ + "type", + "tab_id", + "title" + ], + "type": "object" + } +]
- Changed
draft_gmail_message1 field changed- changed
Input schema / properties / quote_original / descriptionPrevious value: -"Whether to include the original message as a quoted reply. Requires thread_id. Defaults to false."New value: +"Whether to include the original message as a quoted reply. Only has an effect when thread_id is provided. Defaults to false."
- Changed
get_presentation1 field changed- added
Input schema / properties / include_speaker_notesAdded value: +{ + "default": false, + "description": "Also report each slide's speaker (presenter)\nnotes and the object ID of the shape holding them. Pass True when you\nneed to read or edit notes: that shape ID is the only valid target for\ninsertText/deleteText on notes, and batch_update_presentation writes\nnotes by deleting the shape's existing text and inserting new text.\nDefaults to False.", + "type": "boolean" +}
- Changed
modify_doc_text1 field changed- changed
Input schema / properties / font_size / typePrevious value: -"integer"New value: +"number"
- Changed
search_gmail_messages1 field changed- added
Input schema / properties / include_headersAdded value: +{ + "default": false, + "description": "If True, also fetch each message's metadata and include\nSubject, From, and Date per result. Costs one metadata get per result,\ngrouped into HTTP batches of up to 10, plus retries for transient failures.\nDefaults to False (output unchanged from prior versions).", + "type": "boolean" +}
- Changed
send_gmail_message7 fields changed- added
Input schema / properties / quote_originalAdded value: +{ + "default": false, + "description": "Whether to include the message being replied to as a quoted original. Only has an effect when thread_id is provided. Defaults to false.", + "type": "boolean" +} - added
Input schema / properties / reply_allAdded value: +{ + "default": false, + "description": "Whether to derive reply-all recipients from the thread: To = the sender being replied to, Cc = the other participants, excluding the authenticated account and from_email. Requires thread_id. Explicit to/cc win; when cc is omitted the sender being replied to is added to the derived Cc if they are not already in To. Defaults to false.", + "type": "boolean" +} - added
Input schema / properties / to / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / to / defaultAdded value: +null - changed
Input schema / properties / to / descriptionPrevious value: -"Recipient email address."New value: +"Recipient email address. Optional when replying with reply_all=True, which derives it from the thread." - removed
Input schema / properties / to / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "user_google_email", - "to" -]New value: +[ + "user_google_email" +]
- Changed
update_drive_file2 fields changed- added
Input schema / properties / modeAdded value: +{ + "default": "replace", + "description": "How to apply the new content — 'replace' (default), 'append', or\n'prepend'. Append/prepend require 'content' and a UTF-8 text file such as\n.md or .txt; a newline is inserted at the seam if neither side has one.\nFor native Google Docs use insert_doc_elements, modify_doc_text, or\nfind_and_replace_doc, which edit in place instead of rewriting the file.", + "type": "string" +} - changed
Input schema / properties / source_format / descriptionPrevious value: -"Source format hint for conversion\n(md, markdown, docx, txt, html, rtf, odt). Auto-detected when omitted.\nProvide at most one of content/file_path/file_url."New value: +"Source format hint for conversion\n(md, markdown, docx, txt, html, rtf, odt). Auto-detected when omitted, and\nignored for non-Google files, which are uploaded without conversion.\nProvide at most one of content/file_path/file_url."
- Changed
update_paragraph_style5 fields changed- added
Input schema / properties / border_colorAdded value: +{ + "default": null, + "description": "Border color (#RRGGBB; defaults to black)", + "type": "string" +} - added
Input schema / properties / border_dashAdded value: +{ + "default": null, + "description": "Border dash style ('SOLID', 'DOT', or 'DASH'; defaults to 'SOLID')", + "type": "string" +} - added
Input schema / properties / border_edgesAdded value: +{ + "default": null, + "description": "Paragraph border edges to update ('top', 'bottom', 'left',\n 'right', or 'between'); omit to update all four outer edges", + "items": { + "enum": [ + "top", + "bottom", + "left", + "right", + "between" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / border_paddingAdded value: +{ + "default": null, + "description": "Border padding in points (defaults to 4)", + "type": "number" +} - added
Input schema / properties / border_widthAdded value: +{ + "default": null, + "description": "Border width in points (defaults to 1)", + "type": "number" +}
125 tool updates
v1.0.1- Added
append_table_rows - Added
batch_modify_gmail_message_labels - Added
batch_update_doc - Added
batch_update_form - Added
batch_update_presentation - Added
check_drive_file_public_access - Added
copy_drive_file - Added
create_calendar - Changed
create_doc11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / content / descriptionAdded value: +"Optional initial plain text content to insert" - removed
Input schema / properties / content / titleRemoved value: -"Content" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / title / descriptionAdded value: +"Title of the new document" - removed
Input schema / properties / title / titleRemoved value: -"Title" - added
Input schema / properties / user_google_email / descriptionAdded value: +"User's Google email address" - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "title" -]New value: +[ + "user_google_email", + "title" +] - removed
Input schema / titleRemoved value: -"create_docArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
create_drive_file - Added
create_drive_folder - Removed
create_event - Changed
create_form13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / description / descriptionAdded value: +"The description of the form." - removed
Input schema / properties / description / titleRemoved value: -"Description" - added
Input schema / properties / document_title / descriptionAdded value: +"The document title (shown in browser tab)." - removed
Input schema / properties / document_title / titleRemoved value: -"Document Title" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / title / descriptionAdded value: +"The title of the form." - removed
Input schema / properties / title / titleRemoved value: -"Title" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "title" -]New value: +[ + "user_google_email", + "title" +] - removed
Input schema / titleRemoved value: -"create_formArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
create_presentation - Added
create_reaction - Added
create_script_project - Changed
create_sheet13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / insert_sheet_indexAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / sheet_name / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / sheet_name / defaultAdded value: +null - removed
Input schema / properties / sheet_name / titleRemoved value: -"Sheet Name" - removed
Input schema / properties / sheet_name / typeRemoved value: -"string" - added
Input schema / properties / source_sheet_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / spreadsheet_id / titleRemoved value: -"Spreadsheet Id" - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "spreadsheet_id", - "sheet_name" -]New value: +[ + "user_google_email", + "spreadsheet_id" +] - removed
Input schema / titleRemoved value: -"create_sheetArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
create_spreadsheet11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / sheet_names / descriptionAdded value: +"List of sheet names to create. If not provided, creates one sheet with default name." - removed
Input schema / properties / sheet_names / titleRemoved value: -"Sheet Names" - added
Input schema / properties / title / descriptionAdded value: +"The title of the new spreadsheet. Required." - removed
Input schema / properties / title / titleRemoved value: -"Title" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "title" -]New value: +[ + "user_google_email", + "title" +] - removed
Input schema / titleRemoved value: -"create_spreadsheetArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
create_table_with_data - Added
create_version - Added
debug_docs_runtime_info - Added
debug_table_structure - Removed
delete_event - Added
delete_script_project - Added
download_chat_attachment - Changed
draft_gmail_message21 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / attachmentsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional list of attachments. Each can have: 'url' (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR 'path' (file path, auto-encodes), OR 'content' (standard base64, not urlsafe) + 'filename'. Optional 'mime_type'. Optional 'content_id' (string) makes the attachment inline-rendered: it lands in a multipart/related part with `Content-ID: <content_id>` and `Content-Disposition: inline`, and the HTML body can reference it via `<img src=\"cid:<content_id>\">` (RFC 2392). Without `content_id` the attachment is a regular multipart/mixed attachment." +} - added
Input schema / properties / bccAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional BCC email address." +} - removed
Input schema / properties / body / titleRemoved value: -"Body" - added
Input schema / properties / body_formatAdded value: +{ + "default": "plain", + "description": "Email body format. Use 'plain' for plaintext or 'html' for HTML content.", + "enum": [ + "plain", + "html" + ], + "type": "string" +} - added
Input schema / properties / ccAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional CC email address." +} - added
Input schema / properties / from_emailAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email." +} - added
Input schema / properties / from_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'." +} - added
Input schema / properties / in_reply_toAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')." +} - added
Input schema / properties / include_signatureAdded value: +{ + "default": true, + "description": "Whether to append the Gmail signature from Settings > Signature when available. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / quote_originalAdded value: +{ + "default": false, + "description": "Whether to include the original message as a quoted reply. Requires thread_id. Defaults to false.", + "type": "boolean" +} - added
Input schema / properties / referencesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional chain of Message-IDs for proper threading." +} - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - added
Input schema / properties / thread_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional Gmail thread ID to reply within." +} - removed
Input schema / properties / to / titleRemoved value: -"To" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required for authentication." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "subject", - "body" -]New value: +[ + "user_google_email", + "subject", + "body" +] - removed
Input schema / titleRemoved value: -"draft_gmail_messageArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
export_doc_to_pdf - Added
find_and_replace_doc - Added
format_sheet_range - Added
generate_trigger_code - Added
get_contact - Added
get_contact_group - Added
get_doc_as_markdown - Changed
get_doc_content11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / docs_serviceRemoved value: -{ - "title": "docs_service", - "type": "string" -} - added
Input schema / properties / document_id / descriptionAdded value: +"ID of the Google Doc (or full URL)" - removed
Input schema / properties / document_id / titleRemoved value: -"Document Id" - removed
Input schema / properties / drive_serviceRemoved value: -{ - "title": "drive_service", - "type": "string" -} - added
Input schema / properties / suggestions_view_modeAdded value: +{ + "default": "DEFAULT_FOR_CURRENT_ACCESS", + "description": "How to render suggestions in the returned content:\n- \"DEFAULT_FOR_CURRENT_ACCESS\": Default based on user's access level\n- \"SUGGESTIONS_INLINE\": Suggested changes appear inline in the document\n- \"PREVIEW_SUGGESTIONS_ACCEPTED\": Preview as if all suggestions were accepted\n- \"PREVIEW_WITHOUT_SUGGESTIONS\": Preview as if all suggestions were rejected", + "type": "string" +} - added
Input schema / properties / user_google_email / descriptionAdded value: +"User's Google email address" - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "drive_service", - "docs_service", - "user_google_email", - "document_id" -]New value: +[ + "user_google_email", + "document_id" +] - removed
Input schema / titleRemoved value: -"get_doc_contentArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
get_drive_file_content9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / file_id / descriptionAdded value: +"Drive file ID." - removed
Input schema / properties / file_id / titleRemoved value: -"File Id" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user’s Google email address." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "file_id" -]New value: +[ + "user_google_email", + "file_id" +] - removed
Input schema / titleRemoved value: -"get_drive_file_contentArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
get_drive_file_download_url - Added
get_drive_file_permissions - Added
get_drive_shareable_link - Changed
get_events19 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / calendar_id / descriptionAdded value: +"The ID of the calendar to query. Use 'primary' for the user's primary calendar. Defaults to 'primary'. Calendar IDs can be obtained using `list_calendars`." - removed
Input schema / properties / calendar_id / titleRemoved value: -"Calendar Id" - added
Input schema / properties / detailedAdded value: +{ + "default": false, + "description": "Whether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also report the parent series ID needed to edit the whole series, and events that are not ordinary confirmed meetings report their event type (outOfOffice, workingLocation, focusTime) and status. Defaults to False.", + "type": "boolean" +} - added
Input schema / properties / event_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The ID of a specific event to retrieve. If provided, retrieves only this event and ignores time filtering parameters." +} - added
Input schema / properties / include_attachmentsAdded value: +{ + "default": false, + "description": "Whether to include attachment information in detailed event output. When True, shows attachment details (fileId, fileUrl, mimeType, title) for events that have attachments. Only applies when detailed=True. Set this to True when you need to view or access files that have been attached to calendar events, such as meeting documents, presentations, or other shared files. Defaults to False.", + "type": "boolean" +} - added
Input schema / properties / max_results / descriptionAdded value: +"The maximum number of events to return. Defaults to 25. Ignored if event_id is provided." - removed
Input schema / properties / max_results / titleRemoved value: -"Max Results" - added
Input schema / properties / queryAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "A keyword to search for within event fields (summary, description, location). Ignored if event_id is provided." +} - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / time_max / descriptionAdded value: +"The end of the time range (exclusive) in RFC3339 format. If omitted, events starting from `time_min` onwards are considered (up to `max_results`). Ignored if event_id is provided." - removed
Input schema / properties / time_max / titleRemoved value: -"Time Max" - added
Input schema / properties / time_min / descriptionAdded value: +"The start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time. Ignored if event_id is provided." - removed
Input schema / properties / time_min / titleRemoved value: -"Time Min" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"get_eventsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
get_form9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / form_id / descriptionAdded value: +"The ID of the form to retrieve." - removed
Input schema / properties / form_id / titleRemoved value: -"Form Id" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "form_id" -]New value: +[ + "user_google_email", + "form_id" +] - removed
Input schema / titleRemoved value: -"get_formArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
get_form_response11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / form_id / descriptionAdded value: +"The ID of the form." - removed
Input schema / properties / form_id / titleRemoved value: -"Form Id" - added
Input schema / properties / response_id / descriptionAdded value: +"The ID of the response to retrieve." - removed
Input schema / properties / response_id / titleRemoved value: -"Response Id" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "form_id", - "response_id" -]New value: +[ + "user_google_email", + "form_id", + "response_id" +] - removed
Input schema / titleRemoved value: -"get_form_responseArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
get_gmail_attachment_content - Changed
get_gmail_message_content11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / body_formatAdded value: +{ + "default": "text", + "description": "Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches the full raw MIME message and returns the base64url-decoded content.", + "enum": [ + "text", + "html", + "raw" + ], + "type": "string" +} - added
Input schema / properties / fullAdded value: +{ + "default": false, + "description": "When True, return the COMPLETE untruncated message: saved to local storage and referenced by download URL/file path instead of the body text, or inlined in the response when the server has no file storage (stateless mode). Use for messages large enough to hit the truncation limit, or when byte-exact fidelity is needed (pair with body_format='raw' for a .eml export).", + "type": "boolean" +} - added
Input schema / properties / message_id / descriptionAdded value: +"The unique ID of the Gmail message to retrieve." - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "message_id", - "user_google_email" -]New value: +[ + "message_id", + "user_google_email" +] - removed
Input schema / titleRemoved value: -"get_gmail_message_contentArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
get_gmail_messages_content_batch12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / body_formatAdded value: +{ + "default": "text", + "description": "Body output format (only applies when format='full'). 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches the full raw MIME message and returns the base64url-decoded content.", + "enum": [ + "text", + "html", + "raw" + ], + "type": "string" +} - added
Input schema / properties / format / descriptionAdded value: +"Message format. \"full\" includes body, \"metadata\" only headers." - removed
Input schema / properties / format / titleRemoved value: -"Format" - added
Input schema / properties / message_ids / descriptionAdded value: +"List of Gmail message IDs to retrieve (max 25 per batch)." - removed
Input schema / properties / message_ids / titleRemoved value: -"Message Ids" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "message_ids", - "user_google_email" -]New value: +[ + "message_ids", + "user_google_email" +] - removed
Input schema / titleRemoved value: -"get_gmail_messages_content_batchArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
get_gmail_thread_content11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / body_formatAdded value: +{ + "default": "text", + "description": "Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches each message's full raw MIME content and returns the base64url-decoded body.", + "enum": [ + "text", + "html", + "raw" + ], + "type": "string" +} - added
Input schema / properties / include_analysisAdded value: +{ + "default": false, + "description": "When True, the return value is a dict with both the formatted thread content AND structured ownership analysis (last sender, ball-in-court verdict, per-sender message counts, participants). Defaults to False, in which case the existing string return shape is preserved.", + "type": "boolean" +} - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / thread_id / descriptionAdded value: +"The unique ID of the Gmail thread to retrieve." - removed
Input schema / properties / thread_id / titleRemoved value: -"Thread Id" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "thread_id", - "user_google_email" -]New value: +[ + "thread_id", + "user_google_email" +] - removed
Input schema / titleRemoved value: -"get_gmail_thread_contentArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } + ] + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
get_gmail_threads_content_batch - Changed
get_messages10 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / message_filterAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional filter string using the Chat API filter syntax.\n Supports createTime and thread.name.\n Examples:\n 'createTime > \"2026-03-18T00:00:00-03:00\"'\n 'createTime > \"2026-03-18T00:00:00-03:00\" AND createTime < \"2026-03-19T00:00:00-03:00\"'\n 'thread.name = spaces/X/threads/Y'" +} - removed
Input schema / properties / order_by / titleRemoved value: -"Order By" - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - removed
Input schema / properties / space_id / titleRemoved value: -"Space Id" - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "space_id" -]New value: +[ + "user_google_email", + "space_id" +] - removed
Input schema / titleRemoved value: -"get_messagesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
get_page - Added
get_page_thumbnail - Added
get_presentation - Added
get_script_content - Added
get_script_metrics - Added
get_script_project - Added
get_search_engine_info - Changed
get_spreadsheet_info9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"The ID of the spreadsheet to get info for. Required." - removed
Input schema / properties / spreadsheet_id / titleRemoved value: -"Spreadsheet Id" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "spreadsheet_id" -]New value: +[ + "user_google_email", + "spreadsheet_id" +] - removed
Input schema / titleRemoved value: -"get_spreadsheet_infoArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
get_task - Added
get_task_list - Added
get_version - Added
import_to_google_doc - Added
import_to_google_sheets - Added
import_to_google_slides - Added
insert_doc_elements - Added
insert_doc_image - Added
inspect_doc_structure - Changed
list_calendars7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"list_calendarsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
list_contact_groups - Added
list_contacts - Added
list_deployments - Changed
list_docs_in_folder8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / folder_id / titleRemoved value: -"Folder Id" - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"list_docs_in_folderArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
list_document_comments - Added
list_drive_items - Changed
list_form_responses13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / form_id / descriptionAdded value: +"The ID of the form." - removed
Input schema / properties / form_id / titleRemoved value: -"Form Id" - added
Input schema / properties / page_size / descriptionAdded value: +"Maximum number of responses to return. Defaults to 10." - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - added
Input schema / properties / page_token / descriptionAdded value: +"Token for retrieving next page of results." - removed
Input schema / properties / page_token / titleRemoved value: -"Page Token" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "form_id" -]New value: +[ + "user_google_email", + "form_id" +] - removed
Input schema / titleRemoved value: -"list_form_responsesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
list_gmail_filters - Changed
list_gmail_labels7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"list_gmail_labelsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
list_presentation_comments - Added
list_script_processes - Added
list_script_projects - Added
list_sheet_tables - Changed
list_spaces8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - removed
Input schema / properties / space_type / titleRemoved value: -"Space Type" - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"list_spacesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
list_spreadsheet_comments - Changed
list_spreadsheets9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of spreadsheets to return. Defaults to 25." - removed
Input schema / properties / max_results / titleRemoved value: -"Max Results" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"list_spreadsheetsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
list_task_lists - Added
list_tasks - Added
list_versions - Added
manage_conditional_formatting - Added
manage_contact - Added
manage_contact_group - Added
manage_contacts_batch - Added
manage_deployment - Added
manage_doc_tab - Added
manage_document_comment - Added
manage_drive_access - Added
manage_event - Added
manage_focus_time - Added
manage_gmail_filter - Changed
manage_gmail_label17 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / action / descriptionAdded value: +"Action to perform on the label." - removed
Input schema / properties / action / titleRemoved value: -"Action" - added
Input schema / properties / label_id / descriptionAdded value: +"Label ID. Required for update and delete operations." - removed
Input schema / properties / label_id / titleRemoved value: -"Label Id" - added
Input schema / properties / label_list_visibility / descriptionAdded value: +"Whether the label is shown in the label list." - removed
Input schema / properties / label_list_visibility / titleRemoved value: -"Label List Visibility" - added
Input schema / properties / message_list_visibility / descriptionAdded value: +"Whether the label is shown in the message list." - removed
Input schema / properties / message_list_visibility / titleRemoved value: -"Message List Visibility" - added
Input schema / properties / name / descriptionAdded value: +"Label name. Required for create, optional for update." - removed
Input schema / properties / name / titleRemoved value: -"Name" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "action" -]New value: +[ + "user_google_email", + "action" +] - removed
Input schema / titleRemoved value: -"manage_gmail_labelArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
manage_out_of_office - Added
manage_presentation_comment - Added
manage_spreadsheet_comment - Added
manage_task - Added
manage_task_list - Added
modify_doc_text - Removed
modify_event - Changed
modify_gmail_message_labels17 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / add_label_ids / descriptionAdded value: +"List of label IDs to add to the message." - added
Input schema / properties / add_label_ids / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / add_label_ids / titleRemoved value: -"Add Label Ids" - added
Input schema / properties / add_label_ids / typeAdded value: +"array" - added
Input schema / properties / message_id / descriptionAdded value: +"The ID of the message to modify." - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - added
Input schema / properties / remove_label_ids / descriptionAdded value: +"List of label IDs to remove from the message." - added
Input schema / properties / remove_label_ids / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / remove_label_ids / titleRemoved value: -"Remove Label Ids" - added
Input schema / properties / remove_label_ids / typeAdded value: +"array" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "message_id" -]New value: +[ + "user_google_email", + "message_id" +] - removed
Input schema / titleRemoved value: -"modify_gmail_message_labelsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
modify_sheet_values18 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / clear_values / descriptionAdded value: +"If True, clears the range instead of writing values. Defaults to False." - removed
Input schema / properties / clear_values / titleRemoved value: -"Clear Values" - added
Input schema / properties / range_name / descriptionAdded value: +"The range to modify (e.g., \"Sheet1!A1:D10\", \"A1:D10\"). Required." - removed
Input schema / properties / range_name / titleRemoved value: -"Range Name" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"The ID of the spreadsheet. Required." - removed
Input schema / properties / spreadsheet_id / titleRemoved value: -"Spreadsheet Id" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - added
Input schema / properties / value_input_option / descriptionAdded value: +"How to interpret input values (\"RAW\" or \"USER_ENTERED\"). Defaults to \"USER_ENTERED\"." - removed
Input schema / properties / value_input_option / titleRemoved value: -"Value Input Option" - changed
Input schema / properties / values / anyOfPrevious value: -[ - { - "items": { - "items": { - "type": "string" - }, - "type": "array" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "items": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / values / descriptionAdded value: +"2D array of values to write/update. Can be a JSON string or Python list. Required unless clear_values=True." - removed
Input schema / properties / values / titleRemoved value: -"Values" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "spreadsheet_id", - "range_name" -]New value: +[ + "user_google_email", + "spreadsheet_id", + "range_name" +] - removed
Input schema / titleRemoved value: -"modify_sheet_valuesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
move_sheet_rows - Added
query_freebusy - Changed
read_sheet_values14 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / include_formulasAdded value: +{ + "default": false, + "description": "If True, also fetch raw formula strings for cells that\ncontain formulas. Useful for identifying cross-sheet references before writing\nback to a range. Defaults to False to avoid an extra API request.", + "type": "boolean" +} - added
Input schema / properties / include_hyperlinksAdded value: +{ + "default": false, + "description": "If True, also fetch hyperlink metadata for the range.\nDefaults to False to avoid expensive includeGridData requests.", + "type": "boolean" +} - added
Input schema / properties / include_notesAdded value: +{ + "default": false, + "description": "If True, also fetch cell notes for the range.\nDefaults to False to avoid expensive includeGridData requests.", + "type": "boolean" +} - added
Input schema / properties / range_name / descriptionAdded value: +"The range to read (e.g., \"Sheet1!A1:D10\", \"A1:D10\").\nDefaults to \"A1:Z1000\". Open-ended or oversized ranges are clamped to\nat most 1000 rows before the Sheets API request to bound memory use." - removed
Input schema / properties / range_name / titleRemoved value: -"Range Name" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"The ID of the spreadsheet. Required." - removed
Input schema / properties / spreadsheet_id / titleRemoved value: -"Spreadsheet Id" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "spreadsheet_id" -]New value: +[ + "user_google_email", + "spreadsheet_id" +] - removed
Input schema / titleRemoved value: -"read_sheet_valuesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
resize_sheet_dimensions - Added
run_script_function - Added
search_contacts - Added
search_custom - Changed
search_docs8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "query" -]New value: +[ + "user_google_email", + "query" +] - removed
Input schema / titleRemoved value: -"search_docsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
search_drive_files22 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / corpora / descriptionAdded value: +"Bodies of items to query (e.g., 'user', 'domain', 'drive', 'allDrives').\n If 'drive_id' is specified and 'corpora' is None, it defaults to 'drive'.\n Otherwise, Drive API default behavior applies. Prefer 'user' or 'drive' over 'allDrives' for efficiency." - removed
Input schema / properties / corpora / titleRemoved value: -"Corpora" - added
Input schema / properties / detailedAdded value: +{ + "default": true, + "description": "Whether to include size, modified time, and link in results. Defaults to True.", + "type": "boolean" +} - added
Input schema / properties / drive_id / descriptionAdded value: +"ID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`." - removed
Input schema / properties / drive_id / titleRemoved value: -"Drive Id" - added
Input schema / properties / file_typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Restrict results to a specific file type. Accepts a friendly\n name ('folder', 'document'/'doc', 'spreadsheet'/'sheet',\n 'presentation'/'slides', 'form', 'drawing', 'pdf', 'shortcut',\n 'script', 'site', 'jam'/'jamboard') or any raw MIME type\n string (e.g. 'application/pdf'). Defaults to None (all types)." +} - added
Input schema / properties / include_items_from_all_drives / descriptionAdded value: +"Whether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`." - removed
Input schema / properties / include_items_from_all_drives / titleRemoved value: -"Include Items From All Drives" - added
Input schema / properties / include_trashedAdded value: +{ + "default": false, + "description": "Whether to include files in the trash. Defaults to False, matching\n the Drive web UI and `list_drive_items`. Ignored when `query` already\n contains its own `trashed` clause (`=` or `!=`), which always wins.", + "type": "boolean" +} - added
Input schema / properties / order_byAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Sort order. Comma-separated list of sort keys with optional 'desc' modifier.\n Valid keys: 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime',\n 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime',\n 'starred', 'viewedByMeTime'. Example: 'modifiedTime desc' or 'folder,modifiedTime desc,name'.\n Defaults to None (Drive API default ordering)." +} - added
Input schema / properties / page_size / descriptionAdded value: +"The maximum number of files to return. Defaults to 10." - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - added
Input schema / properties / page_tokenAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Page token from a previous response's nextPageToken to retrieve the next page of results." +} - added
Input schema / properties / query / descriptionAdded value: +"The search query string. Supports Google Drive search operators.\n NOTE: Owner-based queries ('user@example.com' in owners) DO NOT WORK in Shared Drives\n because files are owned by the shared drive itself, not individual users.\n For recent files by a specific user in Shared Drives, search by modifiedTime\n and use order_by='modifiedTime desc' instead." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "query" -]New value: +[ + "user_google_email", + "query" +] - removed
Input schema / titleRemoved value: -"search_drive_filesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
search_gmail_messages12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / page_size / descriptionAdded value: +"The maximum number of messages to return. Defaults to 10." - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - added
Input schema / properties / page_tokenAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Token for retrieving the next page of results. Use the next_page_token from a previous response." +} - added
Input schema / properties / query / descriptionAdded value: +"The search query. Supports standard Gmail search operators." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "query", - "user_google_email" -]New value: +[ + "query", + "user_google_email" +] - removed
Input schema / titleRemoved value: -"search_gmail_messagesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
search_messages17 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / max_spacesAdded value: +{ + "default": 10, + "description": "Maximum number of spaces to search when space_id is not provided (default 10).", + "type": "integer" +} - added
Input schema / properties / page_size / descriptionAdded value: +"Maximum number of messages to return per space." - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - added
Input schema / properties / query / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / defaultAdded value: +null - added
Input schema / properties / query / descriptionAdded value: +"Optional text to search for. If omitted, only time_filter is applied." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / query / typeRemoved value: -"string" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / space_id / descriptionAdded value: +"Optional space to restrict the search to." - removed
Input schema / properties / space_id / titleRemoved value: -"Space Id" - added
Input schema / properties / time_filterAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional filter using Chat API createTime syntax.\n Examples:\n 'createTime > \"2026-03-18T00:00:00-03:00\"'\n 'createTime > \"2026-03-18T00:00:00-03:00\" AND createTime < \"2026-03-19T00:00:00-03:00\"'" +} - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "query" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"search_messagesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
send_gmail_message30 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / attachmentsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional list of attachments. Each can have: \"url\" (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR \"path\" (file path, auto-encodes), OR \"content\" (standard base64, not urlsafe) + \"filename\". Optional \"mime_type\". Optional \"content_id\" (string) makes the attachment inline-rendered: it lands in a multipart/related part with `Content-ID: <content_id>` and `Content-Disposition: inline`, and the HTML body can reference it via `<img src=\"cid:<content_id>\">` (RFC 2392). Without `content_id` the attachment is a regular multipart/mixed attachment. Example: [{\"url\": \"https://host/attachments/abc-123\", \"filename\": \"report.pdf\"}]" +} - added
Input schema / properties / bccAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional BCC email address." +} - added
Input schema / properties / body / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / body / defaultAdded value: +null - changed
Input schema / properties / body / descriptionPrevious value: -"Email body (plain text)."New value: +"Email body content (plain text or HTML). Required when sending. When forwarding, this is an optional note prepended above the quoted original." - removed
Input schema / properties / body / titleRemoved value: -"Body" - removed
Input schema / properties / body / typeRemoved value: -"string" - added
Input schema / properties / body_formatAdded value: +{ + "default": "plain", + "description": "Format of the body content (and of the prepended note when forwarding). Use 'plain' for plaintext or 'html' for HTML content.", + "enum": [ + "plain", + "html" + ], + "type": "string" +} - added
Input schema / properties / ccAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional CC email address." +} - added
Input schema / properties / forward_message_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Set to a Gmail message ID to forward that message instead of composing a new one. The original subject, body, and (optionally) attachments are carried over; 'body' becomes an optional note prepended to the forward." +} - added
Input schema / properties / from_emailAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email." +} - added
Input schema / properties / from_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'." +} - added
Input schema / properties / in_reply_toAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')." +} - added
Input schema / properties / include_forwarded_attachmentsAdded value: +{ + "default": true, + "description": "When forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set.", + "type": "boolean" +} - added
Input schema / properties / include_signatureAdded value: +{ + "default": true, + "description": "Whether to append the Gmail signature from Settings > Signature when available. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / referencesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional chain of Message-IDs for proper threading." +} - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / subject / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / subject / defaultAdded value: +null - changed
Input schema / properties / subject / descriptionPrevious value: -"Email subject."New value: +"Email subject. Required when sending; optional when forwarding (defaults to 'Fwd: <original subject>')." - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - removed
Input schema / properties / subject / typeRemoved value: -"string" - added
Input schema / properties / thread_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional Gmail thread ID to reply within." +} - removed
Input schema / properties / to / titleRemoved value: -"To" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required for authentication." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "to", - "subject", - "body" -]New value: +[ + "user_google_email", + "to" +] - removed
Input schema / titleRemoved value: -"send_gmail_messageArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
send_message11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / message_text / titleRemoved value: -"Message Text" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - removed
Input schema / properties / space_id / titleRemoved value: -"Space Id" - added
Input schema / properties / thread_key / descriptionAdded value: +"Reply in a thread by app-defined key (creates thread if not found)." - removed
Input schema / properties / thread_key / titleRemoved value: -"Thread Key" - added
Input schema / properties / thread_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Reply in an existing thread by its resource name (e.g. spaces/X/threads/Y)." +} - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "space_id", - "message_text" -]New value: +[ + "user_google_email", + "space_id", + "message_text" +] - removed
Input schema / titleRemoved value: -"send_messageArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
set_drive_file_permissions - Changed
set_publish_settings13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / form_id / descriptionAdded value: +"The ID of the form to update publish settings for." - removed
Input schema / properties / form_id / titleRemoved value: -"Form Id" - added
Input schema / properties / is_accepting_responsesAdded value: +{ + "default": true, + "description": "Whether the form accepts responses. Only takes effect when the form is published. Defaults to True.", + "type": "boolean" +} - added
Input schema / properties / is_publishedAdded value: +{ + "default": true, + "description": "Whether the form is published and visible to responders. Defaults to True.", + "type": "boolean" +} - removed
Input schema / properties / publish_as_templateRemoved value: -{ - "default": false, - "title": "Publish As Template", - "type": "boolean" -} - removed
Input schema / properties / require_authenticationRemoved value: -{ - "default": false, - "title": "Require Authentication", - "type": "boolean" -} - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "form_id" -]New value: +[ + "user_google_email", + "form_id" +] - removed
Input schema / titleRemoved value: -"set_publish_settingsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
start_google_auth8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / mcp_session_idRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Mcp Session Id" -} - removed
Input schema / properties / service_name / titleRemoved value: -"Service Name" - added
Input schema / properties / user_google_email / defaultAdded value: +null - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "user_google_email", - "service_name" -]New value: +[ + "service_name" +] - removed
Input schema / titleRemoved value: -"start_google_authArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
update_doc_headers_footers - Added
update_drive_file - Added
update_paragraph_style - Added
update_script_content
36 tool updates
v1.0.0- First observed
create_doc - First observed
create_event - First observed
create_form - First observed
create_sheet - First observed
create_spreadsheet - First observed
delete_event - First observed
draft_gmail_message - First observed
get_doc_content - First observed
get_drive_file_content - First observed
get_events - First observed
get_form - First observed
get_form_response - First observed
get_gmail_message_content - First observed
get_gmail_messages_content_batch - First observed
get_gmail_thread_content - First observed
get_messages - First observed
get_spreadsheet_info - First observed
list_calendars - First observed
list_docs_in_folder - First observed
list_form_responses - First observed
list_gmail_labels - First observed
list_spaces - First observed
list_spreadsheets - First observed
manage_gmail_label - First observed
modify_event - First observed
modify_gmail_message_labels - First observed
modify_sheet_values - First observed
read_sheet_values - First observed
search_docs - First observed
search_drive_files - First observed
search_gmail_messages - First observed
search_messages - First observed
send_gmail_message - First observed
send_message - First observed
set_publish_settings - First observed
start_google_auth
TDQS
Scored across 123 tools
Tools are mostly grouped by service with distinct resource-action names, but there is overlap: get_drive_file_content vs get_doc_content, batch_update_doc and modify_doc_text both insert/modify doc content, and manage_contact vs manage_contacts_batch have ambiguous boundaries. However, many tools have clear scopes and extensive descriptions that help differentiate.
Most tools follow a consistent verb_noun pattern (e.g., list_gmail_labels, create_drive_folder, send_gmail_message), with some deviations like get_gmail_messages_content_batch and manage_contacts_batch. The mixed use of service prefixes (gmail_, drive_, sheet_, doc_) is consistent within each service domain, resulting in an overall predictable naming scheme.
With 123 tools, this is an extremely large surface area covering 9 Google services. Even though each service might individually justify several tools, the cumulative count is excessive and will overwhelm agents with choice, making efficient tool selection difficult.
The server covers CRUD and lifecycle operations across Gmail, Drive, Docs, Sheets, Calendar, Chat, Forms, Slides, Apps Script, and Contacts. Minor gaps exist (e.g., no direct scheduled send, no slide editing tools, some form/response management limited), but the breadth of coverage is strong for the multi-service scope.
Maintenance
Related MCP Connectors
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
Streamable HTTP MCP server for Google Calendar and Sheets with OAuth login.
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for Google Workspace APIs - Docs, Sheets, Drive, Gmail, and Calendar. Enables reading, creating, and editing Google Docs and Sheets, managing comments, reading emails, and viewing calendar events.3418 npm17MIT
- AlicenseBqualityDmaintenanceProduction-ready MCP server for Google Workspace providing broad coverage across Gmail, Drive, Calendar, Docs, Sheets, and more, with safe-by-default write operations and markdown-to-Google-Docs support.100MIT
- FlicenseBqualityDmaintenanceMCP server providing full access to Google Workspace services (Gmail, Drive, Calendar, Docs, Sheets, Slides, Forms, Tasks, Contacts) using OAuth authentication.1001-
- AlicenseBqualityBmaintenanceComprehensive Google Workspace MCP server with Gmail, Drive, Calendar, and Contacts integration.2612 npmMIT