Skip to main content
Glama
Google Workspace MCP Server - Control Gmail, Calendar, Docs, Sheets, Slides, Chat, Forms & Drive

Google Workspace MCP Server - Control Gmail, Calendar, Docs, Sheets, Slides, Chat, Forms & Drive

Google Workspace MCP Server

License: MIT Python 3.10+ PyPI PyPI Downloads MCP Toplist Website

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 fastest, 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.


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

Quick Start

Google Cloud setup, credentials, and client connection with screenshots

Full Documentation

Every tool, parameter, and auth mode

Advanced Deployment

Reverse proxy & nginx config, origin validation, credential store backends (GCS/CMEK), trusted-gateway identity, and the complete environment variable reference

Client Setup Guides

Claude Desktop/web Connectors, ChatGPT Developer Mode, and more

FAQ & Troubleshooting

Enabling Google APIs, 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 if ALLOWED_FILE_DIRS is broadened

Full dependency tree in pyproject.toml, pinned in uv.lock.

For Legal & Procurement

This project is MIT licensed —

  • 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 in a project with the Google APIs enabled for the services you plan to use. The docs have one-click enable links for every API plus a single gcloud services enable command that covers them all, and the quick start guide walks through the whole setup in about five minutes.

Agentic OAuth clients: this server only calls Google's REST APIs, so your OAuth client does not need Google's "Use this client for an AI-powered agent" setting. If your organization wants agent traffic labeled for admin controls, create a separate client with that setting enabled; it can't be changed on an existing client after November 12, 2026.

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 calendar

OAuth 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 core

Tool 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-workspace

ChatGPT - 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=5

Install 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:

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.

Production tuning is all environment variables; the names below link to their reference entries.

  • Google API requests: WORKSPACE_MCP_GOOGLE_API_WORKERS, WORKSPACE_MCP_GOOGLE_API_TIMEOUT_SECONDS

  • External OAuth token validation: WORKSPACE_MCP_TOKEN_VALIDATION_WORKERS, WORKSPACE_MCP_TOKEN_VALIDATION_CACHE_TTL

  • Memory ceilings: WORKSPACE_MCP_MAX_FILE_BYTES, WORKSPACE_MCP_STATELESS_INLINE_MAX_BYTES, WORKSPACE_MCP_MAX_OFFICE_XML_BYTES

  • Text returned per call: get_drive_file_content returns long content a page at a time by default, so a long file does not fill the model's context. WORKSPACE_MCP_MAX_CONTENT_CHARS sets the page size (default 40000; 0 returns whole content by default). Each page ends with a note giving the offset to read on from. This is only the default: a client can always pass full_content=true to get the whole file in one call. Text being read page by page is kept in memory for ten minutes so later pages are not downloaded again, within WORKSPACE_MCP_PAGED_CONTENT_CACHE_BYTES per process (default 33554432, 32 MiB; 0 keeps nothing).

  • Sessions and health probes: WORKSPACE_MCP_SESSION_IDLE_TIMEOUT, WORKSPACE_MCP_READINESS_TIMEOUT_SECONDS

  • DNS-rebinding protection: WORKSPACE_MCP_ALLOWED_HOSTS, a comma-separated list of hostnames without ports (for example workspace-mcp,10.0.0.5). When set, requests whose Host is not loopback, listed, or the host of WORKSPACE_EXTERNAL_URL or an allowed origin get 403, so include every name clients and health probes use. Unset, any Host is accepted.

  • Hosted servers without access to the caller's disk: WORKSPACE_MCP_DISABLE_LOCAL_FILES With local files disabled, create_drive_file, update_drive_file and the import tools offer return_upload_url: the caller PUTs the bytes to the returned URL. If the file sits in a cloud-mirrored folder (Drive for desktop), copy it to a local directory first, since mirrored paths can stall mid-upload.

  • OAuth 2.1 token refresh and lifetimes: see .env.oauth21

  • OAuth 2.1 consent screen: WORKSPACE_MCP_OAUTH_PROXY_REQUIRE_CONSENT=remember shows the OAuth proxy's consent screen once per browser for each MCP client instead of on every authorization; cross-site navigations are still prompted. The default, always, prompts every time. Any other value fails startup.

For downloads, horizontally scaled or scale-to-zero HTTP deployments (Cloud Run, Kubernetes) can stage attachments in Google Cloud Storage instead of instance-local disk, whose /attachments/{id} URL may reach a different instance. Install the gcs extra and set WORKSPACE_MCP_FILES_GCS_BUCKET to a bucket name; objects are written under WORKSPACE_MCP_FILES_GCS_PREFIX (default attachments) and handed out as V4 signed URLs valid for one hour, which the client fetches straight from GCS. This also lets stateless mode return download URLs instead of inline files. stdio ignores the setting, since its client reads the local file path directly. The runtime service account needs object read and write access on the bucket — roles/storage.objectUser, or roles/storage.objectCreator plus roles/storage.objectViewer — and, without an exported private key, roles/iam.serviceAccountTokenCreator on itself so URLs can be signed through IAM. Read access is not optional: a signed URL carries the signer's authority, so without storage.objects.get the upload and the signing both succeed while the client's download fails with 403. Objects are not deleted by the server, so add a bucket lifecycle rule that removes them after a few hours.

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_DIRS only 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          # test

Single-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: MCP Badge

Available Tools

119 tools
append_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.

NameRequiredDescriptionDefault
valuesYes2D array of values to append. Each inner list is one row. Can be a JSON string or Python list. Required.
table_idYesThe ID of the table to append to (get from list_sheet_tables). Required.
spreadsheet_idYesThe ID of the spreadsheet. Required.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 LabelsA
Destructive

Adds or removes labels on many Gmail messages, or on every message of whole conversations via thread_ids.

message_ids are sent in one users.messages.batchModify call (Gmail accepts up to 1000 ids per call). That endpoint returns no per-message result and silently ignores ids it does not recognise, so by default the messages are read back afterwards to report which ids actually changed.

thread_ids are modified one at a time with users.threads.modify, e.g. archive a conversation with remove_label_ids=["INBOX"] or mark it read with remove_label_ids=["UNREAD"]. Each thread reports its own outcome. message_ids and thread_ids can be combined; at least one is required, as is at least one of add_label_ids or remove_label_ids.

NameRequiredDescriptionDefault
verifyNoRead message_ids back and report per-id outcomes, at the cost of one extra read per id (batched 25 at a time). Set False for very large sweeps where an unverified result is acceptable. Has no effect on thread_ids, which always report per thread.
thread_idsNoThread (conversation) IDs to modify.
message_idsNoMessage IDs to modify.
add_label_idsNoLabel IDs to add.
remove_label_idsNoLabel IDs to remove.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavior beyond the annotations: batchModify returns no per-message result, silently ignores unrecognized ids, and defaults to read-back verification with a stated cost. It also explains that thread_ids use a different endpoint and report per-thread outcomes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and information-dense, with each paragraph serving a clear purpose. It is somewhat long, but the examples and endpoint distinctions earn their space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive batch mutation with full schema descriptions, annotations, and an output schema, the description is complete. It covers the critical endpoint quirks, verification behavior, and parameter interaction needed to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameters are already documented, but the description adds important semantics: the 1000-id batch limit, per-thread processing, and the requirement that at least one of message_ids or thread_ids and one of add_label_ids or remove_label_ids be supplied. It does not explain every parameter in detail, but it meaningfully supplements the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: adding or removing labels on many Gmail messages or whole conversations. The batch scope is clear through 'many' and thread-level handling, though it never names the singular sibling modify_gmail_message_labels as the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly distinguishes message_ids versus thread_ids and gives concrete examples such as archiving with remove_label_ids=["INBOX"]. It also states the minimum requirements, but does not explicitly say when to prefer the singular modify_gmail_message_labels tool.

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 DocA
Destructive

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.

NameRequiredDescriptionDefault
operationsYesList of operation dicts. Each operation MUST have a 'type' field. All operations accept an optional 'tab_id' to target a specific tab.
document_idYesID of the document to update
user_google_emailYesUser's Google email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered. The description adds the valuable 'atomic' property and index-avoidance advice, but omits key batch semantics an agent needs: whether operations apply sequentially, whether indices are computed against the original or mutated document, and what happens on partial failure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is stated in the first sentence, then routing, then a clearly labelled two-phase workflow. It is longer than typical but front-loaded and the length is justified by the tool's complexity; the header separators aid scanning rather than adding noise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an extremely complex 29-variant operation tool, the description covers the dominant usage pattern (append-only document building), defers header/footer work to a sibling, and avoids duplicating return values since an output schema exists. Only minor gaps (non-append index sourcing via inspect_doc_structure) remain, and those are documented in the schema's segment_id/anchor params.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and all 29 operation variants are documented in the schema, so the baseline is met by structured data alone. The description nonetheless adds real meaning over the schema by showing a literal example operations array and explaining the end_of_segment=true pattern that avoids index math.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Executes multiple low-level document operations in a single atomic batch update') and immediately distinguishes itself from the sibling update_doc_headers_footers by naming the case where the sibling should be preferred instead.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: normal header/footer text goes to update_doc_headers_footers, while create_header_footer here is reserved for 'advanced section-break layouts'. It also supplies a concrete phased workflow for the primary use case (building documents), so when-to-use is unambiguous.

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 FormA
Destructive

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.

NameRequiredDescriptionDefault
form_idYesThe ID of the form to update.
requestsYesList 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_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 PresentationC
Destructive

Apply batch updates to a Google Slides presentation.

NameRequiredDescriptionDefault
requestsYesList of update requests to apply.
presentation_idYesThe ID of the presentation to update.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 AccessA
Read-onlyIdempotent

Searches for a file by name and checks if it has public link sharing enabled.

NameRequiredDescriptionDefault
drive_idNoID 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_nameYesThe name of the file to check.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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 that it searches by name and checks public sharing, but does not disclose edge cases like behavior when the file is not found, whether it returns a boolean, or how it handles files in shared drives without drive_id (the schema partially addresses this). 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, tightly written sentence that states the action and the check. No wasted words, and the purpose is front-loaded. This is exemplary conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, has a clear description, full schema documentation, and an output schema (not shown but indicated). The description covers the essential purpose, and the schema fills in parameter details. Given the sibling ambiguity, a note about when to choose this over get_drive_file_permissions would improve completeness, but as is it is sufficient for a straightforward check tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents all three parameters, including the drive_id scoping behavior. The description adds no extra parameter 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: it searches for a file by name and checks if public link sharing is enabled. This clearly distinguishes it from sibling tools like search_drive_files (which just searches) or get_drive_file_permissions (which fetches all permissions). It is unambiguous about the tool's core function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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_drive_file_permissions or get_drive_shareable_link. It does not mention any conditions or prerequisites, leaving the agent to infer that this is the right tool for a simple public-access check. Given the large sibling list with overlapping permission-related tools, explicit differentiation would help.

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.

NameRequiredDescriptionDefault
file_idYesThe ID of the file to copy. Required.
new_nameNoNew name for the copied file. If not provided, uses "Copy of [original name]".
copy_commentsNoCopy open comments and suggestions (Docs/Sheets/Slides only). Defaults to False.
parent_folder_idNoThe ID of the folder where the copy should be created. Defaults to 'root' (My Drive).root
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds that formatting and content are preserved in the copy, which is useful, but omits behaviors an agent would want: whether sharing permissions carry over to the copy, that comments are not copied by default, and that each invocation produces a new file (reinforcing non-idempotency).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action. There is mild redundancy between "Creates a copy of an existing Google Drive file" and "This tool copies the template document," but nothing extraneous enough to impede scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the mutation profile. However, for a 5-parameter write tool that creates a new artifact, the description says nothing about permission inheritance, storage/quota impact, or destination folder handling, leaving an agent to infer the side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including copy_comments, parent_folder_id and new_name is already documented. The description only echoes the optional new-name behavior and says nothing about parent folder placement or the Docs/Sheets/Slides limitation on comment copying, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Creates a copy of an existing Google Drive file") and clarifies the copy preserves formatting and content. It never distinguishes itself from nearby siblings such as create_drive_file or import_to_google_doc, so an agent cannot rule those out from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"This tool copies the template document to a new location" implies the intended use case (duplicating an existing template or document), but there is no explicit when-to-use guidance, no stated prerequisites, and no named alternative such as create_drive_file for authoring from scratch.

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.

NameRequiredDescriptionDefault
summaryYesThe title/name of the new calendar.
timezoneNoIANA timezone for the calendar (e.g. 'America/New_York').
descriptionNoAn optional description for the calendar.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation nature is known. The description adds the 'secondary' scoping constraint, which is useful behavioral context, but it does not disclose side effects, permission requirements, or output characteristics beyond what annotations and the 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single six-word sentence that is front-loaded and contains zero filler. Every word adds meaning, making it an ideal example of conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (4 params, 2 required), the schema fully documents parameters, and an output schema exists, so the return value is covered. The description plus structured data is sufficient for correct invocation. A slight gap is the lack of guidance on when the 'secondary' distinction matters, but this is not critical for a straightforward create operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, so all four parameters are already fully described. The description itself adds no parameter-specific meaning, so the baseline score of 3 is appropriate—it neither helps nor hurts beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 secondary Google Calendar'). The term 'secondary' differentiates it from tools that manage the primary calendar or list calendars, so an agent can distinguish it from siblings without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 like list_calendars or manage_event. No prerequisites, exclusions, or sibling comparisons are provided, leaving the agent to infer usage solely from the tool name and description.

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.

content is inserted as plain text (Markdown is not rendered); use import_to_google_doc to create a doc from Markdown.

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.

NameRequiredDescriptionDefault
titleYesTitle of the new document
contentNoOptional initial plain text content to insert
folder_idNoThe ID of the parent folder. Defaults to 'root'. For shared drives, this must be a folder ID within the shared drive.root
user_google_emailYesUser's Google email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), and the description adds non-obvious behavioral facts: content lands as plain text with no Markdown rendering, and a fresh doc has body starting at index 1 with total length 2.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in one sentence, followed by tightly grouped guidance on content semantics, index conventions, and the follow-up tool sequence. No filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema is present so return values need no explanation, and the description covers creation semantics, the one surprising input behavior, and the follow-up path for rich documents — everything an agent needs to call this correctly and continue afterward.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all four parameters; the description nonetheless adds real meaning for 'content' by stating it is inserted as plain text and that Markdown requires a different tool. folder_id and user_google_email semantics are left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence gives a precise verb and resource ('Creates a new Google Doc') plus the optional-content scope, and the second sentence names the sibling it is not (import_to_google_doc) with the condition that selects it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes away from this tool to import_to_google_doc for Markdown input, and lays out a concrete post-creation workflow: batch_update_doc with end_of_segment=true to append, then inspect_doc_structure before applying formatting.

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. Where local file access is disabled it can instead return an upload URL for the caller to PUT file bytes to. 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.

NameRequiredDescriptionDefault
contentNoIf provided, the content to write to the file.
fileUrlNoIf provided, fetches the file content from this URL. Supports http:// and https://; file:// only where local file access is enabled. Where it is disabled, files on the caller's machine go through an upload URL instead (see the upload-URL parameter, if offered).
file_nameYesThe name for the new file.
folder_idNoThe ID of the parent folder. Defaults to 'root'. For shared drives, this must be a folder ID within the shared drive.root
mime_typeNoThe MIME type of the file. Defaults to 'text/plain'; required with return_upload_url.
base64_sha256NoExpected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks.
base64_contentNoStandard base64-encoded file bytes.
content_mime_typeNoMIME type for base64_content uploads.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the write profile (readOnlyHint=false, destructiveHint=false, non-idempotent, open world), so the bar is lower. The description still adds substantive behavior the annotations cannot convey: the three accepted content sources, the upload-URL mode used when local file access is disabled, and the important guarantee that bytes are stored verbatim rather than converted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the core action, each carrying distinct information: what it creates, what inputs it takes, the no-local-access fallback, and the conversion boundary. Slightly dense with edge-case detail but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With nine parameters, an output schema present, and full schema coverage, the description supplies the parts structured fields cannot: the input-mode choice and the conversion boundary. It omits size limits, default sharing/permission behavior, and explicit mention of the required identity/folder parameters, but those are adequately covered by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 selection guidance for the mutually exclusive content parameters by enumerating text content, inline base64, and fileUrl as alternative input modes — something the schema documents individually but never frames as a choice. It does not explain mime_type/base64_sha256 behavior beyond what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Creates a new file in Google Drive') plus the shared-drive scope, and explicitly demarcates itself from the import_to_google_* siblings by declaring it stores bytes without conversion. An agent can distinguish it from update_drive_file or copy_drive_file without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit routing rule: use the matching import_to_google_* tool when Google-native conversion is wanted. It also explains the upload-URL fallback path when local file access is disabled, which is a real when-to-use condition. It does not discuss create-vs-update or folder-creation prerequisites, so it stops short of full when/when-not coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_drive_folderCreate Drive FolderA

Creates a new folder in Google Drive, supporting creation within shared drives.

NameRequiredDescriptionDefault
folder_nameYesThe name for the new folder.
parent_folder_idNoThe ID of the parent folder. Defaults to 'root'. For shared drives, use a folder ID within that shared drive.root
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
titleYesThe title of the form.
descriptionNoThe description of the form.
document_titleNoThe document title (shown in browser tab).
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is a non-read-only, non-idempotent operation, and the description reinforces that by saying it creates a new form. That adds a small amount of context beyond the annotations, but the description does not disclose side effects, authorization requirements, or response behavior. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no filler. It is slightly awkward due to the 'provided form message in the request' phrasing, but it remains short and front-loads the primary action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schemaahan, full schema coverage, and annotations, so the description does not need to document return values or safety. However, the vague reference to 'form message' and the lack of usage guidance leave some ambiguity about how the request supplies the title and when this tool is appropriate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameters are already fully documented in the schema. The description mentions the title but adds no meaning beyond the schema descriptions. It does not clarify how 'description' or 'document_title' are used or how user_google_email affects execution.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'Create a new form'. It is semantically distinct from sibling tools like get_form, batch_update_form, and set_publish_settings. However, the phrase 'using the title given in the provided form message in the request' is somewhat vague and could be interpreted ambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 alternatives, nor any conditions or exclusions. The only hint is the verb 'Create', which implies it is for creating a new form rather than retrieving or updating one, but this 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.

create_presentationCreate PresentationB

Create a new Google Slides presentation.

NameRequiredDescriptionDefault
titleNoThe title for the new presentation. Defaults to "Untitled Presentation".Untitled Presentation
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
message_idYesThe message resource name (e.g. spaces/X/messages/Y).
emoji_unicodeYesThe emoji character to react with (e.g. 👍).
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_sheetCreate SheetC

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).

NameRequiredDescriptionDefault
sheet_nameNo
spreadsheet_idYes
source_sheet_nameNo
user_google_emailYes
insert_sheet_indexNo

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal that this is a mutating, non-destructive, non-idempotent operation. The description adds the dual create-vs-duplicate behavior, but it does not disclose what happens on duplicate, name conflicts, copying scope, or required authorization context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening clause is short and front-loaded, but the inline signature is redundant with the input schema and adds clutter. The description is not overly long, yet not every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With five parameters and zero parameter descriptions in the schema, a single functional line is insufficient. The mode-selection logic between sheet_name and source_sheet_name is absent, so an agent could invoke the tool with conflicting or misunderstood options.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 parameters. It only restates the Python-style signature, which largely duplicates the input schema's types and defaults, and gives no actual meaning for fields like source_sheet_name or insert_sheet_index.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action ('Creates a new sheet or duplicates an existing sheet') and the resource, so an agent can tell what the tool does. However, it does not differentiate from close siblings such as manage_sheet_tab or create_spreadsheet, 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.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no guidance about when to use this tool versus related tools like manage_sheet_tab, create_spreadsheet, or copy_drive_file. It states what the tool does but not the conditions that should lead an agent to select it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_spreadsheetCreate SpreadsheetC

Creates a new Google Spreadsheet.

NameRequiredDescriptionDefault
titleYesThe title of the new spreadsheet. Required.
folder_idNoThe ID of the parent folder. Defaults to 'root'. For shared drives, this must be a folder ID within the shared drive.root
sheet_namesNoList of sheet names to create. If not provided, creates one sheet with default name.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description only restates the creation action and adds no behavioral context beyond the annotations. It does not disclose where the spreadsheet is created by default, authentication or permission requirements, or resulting runtime behavior. This is not a contradiction, but it adds no value beyond the structured signals.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, short sentence with no redundancy. However, it is under-specified: it essentially repeats the tool name and does not structure any key decision-relevant facts such as defaults or related tool choices.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given four parameters, two required fields, an output schema, and a large sibling tool set, a one-sentence description is insufficient. It lacks usage boundaries against create_sheet/import_to_google_sheets and does not explain behavior beyond 'create', leaving the agent under-informed for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides 100% parameter coverage with descriptions, including required user_google_email and title, the default for folder_id, and the behavior of sheet_names. The description itself adds no parameter information, but the high schema coverage justifies a baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action and resource: 'Creates a new Google Spreadsheet.' This is not a tautology and conveys the core operation accurately. However, it does not explicitly differentiate from sibling tools like create_sheet or import_to_google_sheets, so it lacks sibling distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 create_sheet, import_to_google_sheets, or create_drive_file. An agent must infer the right choice from the tool name rather than from explicit usage guidance.

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

NameRequiredDescriptionDefault
indexYesDocument position (MANDATORY: get from inspect_doc_structure 'total_length')
tab_idNoOptional tab ID to create the table in a specific tab
table_dataYes2D list of strings - EXACT format: [["col1", "col2"], ["row1col1", "row1col2"]]
document_idYesID of the document to update
header_rowsNoNumber 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_headersNoWhether to make first row bold (default: true)
user_google_emailYesUser's Google email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only false and non-destructive, so the description need not restate that. It adds real behavioral constraints: the index must come from inspect_doc_structure, rows must be uniform, and debug_table_structure should be used after creation to verify. It does not explain failure modes, but the bar is lower because annotations cover the safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and uses numbered sections, but it is repetitive: the CRITICAL index requirement is stated three times, and the workflow repeats the data-format details already in the schema. It earns its place mostly, but could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is very complete for an agent: it supplies the mandatory upstream call, the index source, data format rules, and post-creation verification via debug_table_structure. It stops short of discussing output/return shape or failure handling, but the presence of an output schema reduces that burden.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining the exact 2D array shape, the no-None rule, uniform column counts, and the mandatory relationship between index and inspect_doc_structure.total_length.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names the exact operation ('Creates a table and populates it with data') and highlights the one-call atomicity. This distinguishes it from append_table_rows and insert_doc_elements in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a mandatory step-by-step workflow: call inspect_doc_structure first, derive the index from total_length, then call this function. It lacks explicit when-not-to-use or alternative tool routing, but the precondition and order are unambiguous.

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 StructureA
Read-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 fill existing cells with modify_doc_text at their insertion_index

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:

  1. After creating table → Use this to verify structure

  2. Before populating → Use this to plan your data format

  3. After population fails → Use this to see what went wrong

  4. When debugging → Compare your data array to actual table structure

NameRequiredDescriptionDefault
tab_idNoOptional ID of the tab containing the table (from inspect_doc_structure). If not provided, inspects the first tab.
document_idYesID of the document to inspect
table_indexNoWhich table to debug (0 = first table, 1 = second table, etc.)
user_google_emailYesUser's Google email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already establish that this is a read-only, idempotent, non-destructive inspection tool, so the description does not need to restate safety. The description adds useful behavioral detail by explaining exactly what the output reveals, including dimensions, cell coordinates, current content, insertion indices, and table boundaries.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and organized into clear sections, but it is substantially longer than needed for a simple read-only debug tool. The all-caps emphasis and overlapping sections such as 'USE THIS IMMEDIATELY WHEN' and 'WORKFLOW INTEGRATION' add repetition without much additional useful guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 is complete enough to call the tool correctly and interpret its results. The main remaining gap is that it does not explicitly compare itself with inspect_doc_structure or clarify table_index behavior for documents with multiple tables.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter meanings are already fully documented. The description does not add parameter-level guidance such as how table_index interacts with multiple tables or when tab_id is required; it only contextualizes insertion_index as an output concept.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: debug table structure, and repeatedly scopes it to inspecting table dimensions, cell positions, content, and insertion indices. This clearly distinguishes it from broader sibling tools like inspect_doc_structure and from related mutation tools like 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit triggering conditions, such as when table population puts data in wrong cells or when a 'table not found' error occurs, plus a workflow for verification before and after population. It does not explicitly state when not to use it or name a better alternative for overlapping structure inspection.

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).

NameRequiredDescriptionDefault
message_idYesThe message resource name (e.g. spaces/X/messages/Y).
attachment_indexNoZero-based index of the attachment to download (default 0).
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 new, reply, and forward drafts with optional attachments. Supports Gmail's "Send As" feature to draft from configured alias addresses.

To save a forward as a draft for review, 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, subject is optional, and threading, reply, and signature options do not apply.

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.

NameRequiredDescriptionDefault
ccNoOptional CC email address.
toNoOptional recipient email address.
bccNoOptional BCC email address.
bodyNoEmail body. Required unless forwarding, where it becomes an optional note prepended above the quoted original.
subjectNoEmail subject. Required for a new draft. Optional when replying with thread_id (inherits the parent message's subject, adding 'Re:' only if absent) or when forwarding (then defaults to 'Fwd: <original subject>').
directionNoBase text direction of the body. 'auto' (default) takes it from the first strong character (a right-to-left script gives 'rtl', anything else 'ltr'); 'ltr'/'rtl' force it. On a forward it orients the note.auto
from_nameNoOptional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'.
reply_allNoWhether 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_idNoOptional 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_emailNoOptional '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.
referencesNoOptional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target.
attachmentsNoOptional 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_formatNoEmail body format. Use 'plain' for plaintext or 'html' for HTML content. With 'html', write real markup; an entity-escaped body ('&lt;div&gt;') is rejected.plain
in_reply_toNoOptional 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_originalNoWhether to include the original message as a quoted reply. Only has an effect when thread_id is provided. Defaults to false.
include_signatureNoWhether to append the Gmail signature from Settings > Signature when available. Defaults to true.
user_google_emailYesThe user's Google email address. Required for authentication.
forward_message_idNoSet to a Gmail message ID to save a forward of that message as a draft for review. The original subject, body, and (optionally) attachments are carried over; 'body' becomes an optional note prepended to the forward.
include_forwarded_attachmentsNoWhen forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (non-read-only, non-destructive, non-idempotent, open-world), the description discloses forward-mode semantics — body becomes a prepended note, subject is optional, threading/reply/signature options do not apply — and the hard API limitation on scheduled send. It does not mention that repeated calls create duplicate drafts (relevant given idempotentHint=false), which is the one behavioral gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and modes, then mode-specific rules, then the scheduling constraint; no filler sentences. The scheduling paragraph runs long and restates the limitation three ways, which costs a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 19-parameter mutation tool with annotations and an output schema, the description covers the mode-dependent behavior an agent cannot infer from the schema alone. Minor omissions (duplicate-on-retry behavior, relative priority of thread_id vs in_reply_to) remain but the schema carries those details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 genuinely new meaning: the interaction rules for forward mode (what body and subject become, which options become inert) that no single parameter description states in those terms.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

First sentence states a specific verb+resource ('Creates a draft email in the user's Gmail account') and the next sentences enumerate the modes (new, reply, forward, alias 'Send As'). An agent can immediately distinguish this from the sibling send_gmail_message, which delivers mail rather than saving a draft.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: use forward_message_id to save a forward for review, use draft_gmail_message when scheduling time delivery, then send_gmail_message (or users.drafts.send) at the chosen time, or let the user schedule in the UI. It also names an exclusion ('SCHEDULED SEND IS NOT AVAILABLE') and warns against claiming scheduling succeeded.

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.

NameRequiredDescriptionDefault
folder_idNoDrive folder ID to save PDF in (optional - if not provided, saves in root)
document_idYesID of the Google Doc to export
pdf_filenameNoName for the PDF file (optional - if not provided, uses original name + "_PDF")
user_google_emailYesUser's Google email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 DocA
Destructive

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.

NameRequiredDescriptionDefault
tab_idNoOptional ID of the tab to target
find_textYesText to search for
match_caseNoWhether to match case exactly
document_idYesID of the document to update
replace_textYesText to replace with
user_google_emailYesUser's Google email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal mutation/destructiveness; the description adds behavioral context by explaining this is a no-index, targeted-replacement operation and frames it as the 'safest' update path because it avoids index errors. It could have explicitly said the edit is applied directly/irreversibly, but the destructiveHint is already present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main point is front-loaded in the first sentence and the usage scenarios are scannable bullets. It is still slightly redundant, repeating the no-indexes idea three times ('No index calculation required', 'does not require knowing any indices', 'without risk of index errors').

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with an output schema, the description covers what it does, when to use it, and which sibling to reach for when building documents from scratch. It does not elaborate on tab_id/match_case semantics, but the schema already describes those and the use cases suffice.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 fully documented and the description carries no per-parameter burden. The 'No index calculation required' note is a useful high-level hint, but it does not add meaning to any specific parameter beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Finds and replaces text throughout a Google Doc') and immediately adds a distinguishing constraint ('No index calculation required'). The listed use cases make the tool's scope concrete and separate it from sibling tools like modify_doc_text or batch_update_doc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly enumerates three when-to-use scenarios and provides an alternative path for document construction ('consider inserting text with unique placeholders via batch_update_doc'). This gives an agent both inclusion and exclusion guidance.

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 RangeB
Destructive

Applies formatting to a range: colors, number formats, text wrapping, alignment, text styling, cell merging/unmerging, borders, and dropdown lists.

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.

NameRequiredDescriptionDefault
boldNoWhether to apply bold formatting.
italicNoWhether to apply italic formatting.
bordersNoWhich borders to draw, comma-separated: all, outer, inner, top, bottom, left, right, inner_horizontal, inner_vertical (e.g., "outer" or "bottom,inner_horizontal"). "none" removes every border in the range.
font_sizeNoFont size in points.
merge_typeNoMERGE_ALL (default), MERGE_COLUMNS, or MERGE_ROWS. Setting it implies merge_cells=True.
range_nameYesA1-style range (optionally with sheet name). Required.
text_colorNoHex text color (e.g., "#000000").
merge_cellsNoTrue merges the range, False unmerges it. Merging keeps only the top-left value of each merged group.
border_colorNoHex border color (default black). Requires borders.
border_styleNoSOLID (default), SOLID_MEDIUM, SOLID_THICK, DASHED, DOTTED, or DOUBLE. Requires borders.
wrap_strategyNoText wrap strategy - WRAP (wrap text within cell), CLIP (clip text at cell boundary), or OVERFLOW_CELL (allow text to overflow into adjacent empty cells).
clear_dropdownNoRemove all data validation from the range: dropdowns, but also checkboxes and other validation rules.
spreadsheet_idYesThe ID of the spreadsheet. Required.
dropdown_strictNoWith dropdown_values: reject other input (default True) or only show a warning (False).
dropdown_valuesNoTurns every cell in the range into a dropdown offering these values (e.g., ["open", "done"]).
background_colorNoHex background color (e.g., "#FFEECC").
user_google_emailYesThe user's Google email address. Required.
number_format_typeNoSheets number format type (e.g., "DATE").
vertical_alignmentNoVertical text alignment - TOP, MIDDLE, or BOTTOM.
horizontal_alignmentNoHorizontal text alignment - LEFT, CENTER, or RIGHT.
number_format_patternNoCustom pattern for the number format.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, openWorldHint=true and idempotentHint=false, so the description can add the promotion of the default-sheet fallback and hex/format conventions. However, it never warns that this mutation is destructive (merging discards values, clearing dropdowns removes checkboxes and other validation) and never explains the non-idempotent character, which are exactly the disclosures an agent needs for a format-write tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight paragraphs, front-loaded with the operation and its capability scope, followed by format conventions. No filler, though the hex-format sentence is largely redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 21 parameters, destructive annotations and an output schema, the description covers the overall operation and conventions well enough to call the tool. It is still incomplete on the risk side: nothing tells the agent that merges drop data or that clear_dropdown also strips checkboxes and other validation rules, which are the consequences most likely to cause harm.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the schema already documents every one of the 21 parameters in detail. The description adds almost nothing beyond the schema: its hex-color and number-format-type notes restate what the parameter descriptions already say, and only the 'first sheet is used' fallback for range_name is genuinely new.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb (Applies formatting) and enumerates the resource and the formatting categories (colors, number formats, wrapping, alignment, styling, merging, borders, dropdowns). It is clear what the tool does, but it never mentions how it differs from nearby siblings such as manage_conditional_formatting or modify_sheet_values, so an agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the enumerated capability list; there is no explicit when-to-use or when-not-to-use statement and no named alternative. The one scoping rule given ('If no sheet name is provided, the first sheet is used') is helpful but is a behavior, not a selection guideline.

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 CodeA
Read-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. To list or remove existing triggers without opening the editor, use manage_script_trigger (action="list" / action="delete") instead.

NameRequiredDescriptionDefault
scheduleNoSchedule 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_typeYesType 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_nameYesThe function to run when trigger fires (e.g., "sendDailyReport")

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly and idempotent behavior. The description adds crucial context beyond those hints: this tool does not create triggers directly, it only generates the code the user must run inside Apps Script. This effectively communicates that calling the tool has no trigger-creation side effect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose. The API limitation and sibling routing each earn their place without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, its API constraint, the generation behavior, and the appropriate sibling for list/delete operations. With detailed schema coverage and a present output schema, nothing essential is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% parameter description coverage, including allowed values for trigger_type and schedule semantics. The description itself does not add parameter-level meaning beyond what the schema already provides, so the baseline score applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Generates Apps Script code for creating triggers.' This clearly distinguishes the tool from direct trigger management and from manage_script_trigger, which is called out by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains the constraint that triggers cannot be created via the Apps Script API and must be created from within Apps Script itself. It then names the sibling alternative for listing/removing triggers, giving clear when-to-use versus 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.

get_contactGet ContactA
Read-onlyIdempotent

Get detailed information about a specific contact.

NameRequiredDescriptionDefault
contact_idYesThe contact ID (e.g., "c1234567890" or full resource name "people/c1234567890").
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 GroupA
Read-onlyIdempotent

Get details of a specific contact group including its members.

NameRequiredDescriptionDefault
group_idYesThe contact group ID.
max_membersNoMaximum number of members to return (default: 100, max: 1000).
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 MarkdownA
Read-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.

NameRequiredDescriptionDefault
tab_idNoOptional 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, and comments are listed as document-wide. When omitted, every tab is rendered. Pass "" to read every tab of a URL that carries ?tab=. This filters output only: the whole document is still fetched.
document_idYesID of the Google Doc (or full URL). When a full URL is provided and it contains a ?tab= query parameter, that tab is used automatically unless tab_id is also specified (explicit tab_id takes precedence).
comment_modeNoHow 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 includedinline
include_colorsNoFollow text that has an explicit RGB foreground color with "[color: #rrggbb]" (default: False). Theme colors are not shown.
include_commentsNoWhether to include comments (default: True)
include_resolvedNoWhether to include resolved comments (default: False)
user_google_emailYesUser's Google email address
suggestions_view_modeNoHow 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 rejectedDEFAULT_FOR_CURRENT_ACCESS

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive behavior, so the description needn't restate safety. It adds real value instead: the specific formatting preserved (headings, lists with nesting, tables), the default-on comment inclusion, and that anchor text is retained for context. It stops short of discussing large-document behavior or output size, which would matter for an 8-parameter reader.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then the sibling differentiation, then comment behavior — a sensible order with no filler sentences. There is mild redundancy between 'optional comment context' in the first line and the later 'When comments are included (the default)' paragraph, but nothing that costs an agent comprehension.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return values, and annotations cover the safety profile. It adequately covers the three things an agent would otherwise have to guess: formatting fidelity, comment default behavior, and contrast with get_doc_content. Minor gaps around very large docs or tab-scoped reads (left to the schema) keep it from a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 detailed description, so the schema carries the semantic load. The description adds only a light note that comments are included by default, which the schema's include_comments default already conveys. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Reads a Google Doc and returns it as clean Markdown') and immediately names the sibling it differs from, get_doc_content, along with the precise difference (plain text vs. preserved formatting). An agent can distinguish it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent between this tool and get_doc_content based on whether formatting matters, which is the key selection decision. It does not address other plausible siblings such as inspect_doc_structure or get_drive_file_content, so the guidance is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_doc_contentGet Doc ContentA
Read-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.

By default, native Google Docs 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.

Set preserve_context=True for readable link destinations, internal targets, smart-chip values, table boundaries, headers, footers, footnotes, and object context exposed by the Docs API. This output is plain text, not Markdown, and its offsets must not be used as document editing indices. Comments, revision history, exact visual layout, and chip details hidden by the API are not included. Use get_doc_as_markdown for formatting or comments.

NameRequiredDescriptionDefault
tab_idNoOptional 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 default output stays index-aligned with that tab. When omitted, every tab is returned with "--- TAB: ... ---" markers. Pass "" to read every tab of a URL that carries ?tab=. This filters output only: the whole document is still fetched.
document_idYesID of the Google Doc or Drive file (or full URL). A Docs URL's ?tab= selects that tab unless tab_id is also specified.
preserve_contextNoInclude readable semantic annotations for native Docs. Defaults to False to retain index alignment. Office extraction is unaffected. With tab_id, only the selected tab is rendered.
user_google_emailYesUser's Google email address
suggestions_view_modeNoHow 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 rejectedDEFAULT_FOR_CURRENT_ACCESS

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld, yet the description goes well beyond them: index alignment guarantees, U+FFFC placeholder conventions, body offset of 1, the n+1 mapping, and the caveat that alignment breaks at the first table or tab header. It also states what is excluded (comments, revision history, exact visual layout, hidden chip details).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and mode split, then the index-alignment contract, then the sibling pointer. It is dense and longer than typical, but nearly every sentence carries operational information; the offset arithmetic paragraph is verbose relative to its value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter read tool with an output schema, the description covers the non-obvious risks an agent needs: which extraction path applies, the index-offset contract required for follow-up edits, and what content is unavailable. Nothing essential to correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline would be 3, but the description adds genuine meaning for preserve_context (readable link targets and object context at the cost of index alignment) and for how returned offsets map to document indices usable by format_text/delete_text. tab_id and suggestions_view_mode are left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Retrieves content of a Google Doc or a Drive file identified by document_id') and splits the two retrieval paths (Docs API vs Drive download/extract). It also explicitly routes formatting/comment use cases to get_doc_as_markdown, so the agent can separate it from the nearest sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit guidance on when to set preserve_context=True and when to prefer get_doc_as_markdown, plus the caveat that offsets from preserve_context output must not be used for editing. It does not distinguish itself from the sibling get_drive_file_content for the '.docx in Drive' case, which is the one remaining routing ambiguity.

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 ContentA
Read-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 (PNG, JPEG, GIF, WebP) → returned as MCP image content after the metadata header. SVG → returned as its markup; raster images it embeds as base64 are attached as image content, numbered to match their place in the markup. BMP and TIFF → base64 text, or a download hint when over the default page size. • Any other file → downloaded; tries UTF-8 decode, else notes binary.

NameRequiredDescriptionDefault
offsetNoCharacter offset to read on from after a truncated result.
file_idYesDrive file ID.
full_contentNoReturn all content from offset onward in one call instead of a page of the default size.
user_google_emailYesThe user’s Google email address.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, open-world, so safety is covered; the description goes further with genuinely useful behavior: export vs. unzip-and-parse vs. pypdf extraction, image returned as MCP image content, SVG base64 sub-images numbered to markup, and explicit fallbacks ('download hint') when extraction or page size fails. It does not mention error/failure modes (not found, permission denied) or what happens when full_content exceeds limits, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in sentence one, then a scannable bullet list keyed by file type. Every bullet carries a distinct, non-redundant fact. Slight deduction for length and for awkward line-wrapped continuations inside the bullets.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with an output schema, rich annotations, and fully documented parameters, the description covers the one thing structured fields cannot: which file types are convertible and what the agent actually gets back for each. Missing error/auth details are minor given the annotation and output-schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already carries offset, full_content, file_id and user_google_email semantics; baseline 3 applies. The description adds only indirect context via the repeated notion of 'default page size' and 'download hint', which hints at pagination but gives no guidance on choosing offset vs. full_content.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence gives a specific verb and resource ('Retrieves the content of a specific Google Drive file by ID') plus a scope note about shared drives. The type-by-type breakdown makes the tool's remit unmistakable. It loses a point for never naming the adjacent siblings (get_doc_content, get_doc_as_markdown, get_drive_file_download_url) that an agent must choose between for Docs or link-style access.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the bullet list signals this tool spans Docs/Sheets/Slides/Office/PDF/images, letting an agent infer it can be used generically. There is no explicit statement of when to prefer this over get_doc_content, get_doc_as_markdown, or get_drive_file_download_url, and no prerequisites are stated beyond the email parameter. Adequate but leaves real routing ambiguity in a very crowded file/doc toolset.

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 URLA
Read-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). In stateless mode (no file storage), returns the file itself as an embedded resource, up to WORKSPACE_MCP_STATELESS_INLINE_MAX_BYTES (default 10 MiB, and never more than WORKSPACE_MCP_MAX_FILE_BYTES when that is set).

For Google native files (Docs, Sheets, Slides, Drawings), 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'

  • Google Drawings -> PNG (default), or PDF, JPG or SVG if export_format='pdf', 'jpg' or 'svg'

For other files, downloads the original file format.

NameRequiredDescriptionDefault
file_idYesThe Google Drive file ID to download.
export_formatNoOptional export format for Google native files. Options: 'pdf', 'docx', 'xlsx', 'csv', 'pptx', 'png', 'jpg', 'svg'. If not specified, uses sensible defaults (PDF for Docs/Slides, XLSX for Sheets, PNG for Drawings). For Sheets: supports 'csv', 'pdf', or 'xlsx' (default).
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral detail beyond the annotations: stdio saves to local disk, HTTP returns a temporary URL valid for 1 hour, stateless mode embeds the file up to configured byte limits, and Google native files are exported to specific formats. These are important operational traits an agent would not infer from the schema or annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite covering multiple deployment modes and export mappings, the description is well structured and front-loaded with the core operation. The mode-specific return behavior and export-format bullets each earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 values need not be exhaustively explained, yet the description still covers the key return modes. It also explains size limits and Google native export behavior, making the definition complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents the three parameters. The description adds useful semantic detail for export_format by mapping Google Docs, Sheets, Slides, and Drawings to their supported formats and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: downloading a Google Drive file and returning either a local path, temporary URL, or embedded resource. It clearly describes the operation, but it does not differentiate itself from sibling tools such as 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context for when the behavior changes by deployment mode and by Google native file type, including export format behavior. It does not explicitly say when to prefer this tool over sibling download/content/link 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.

get_drive_file_permissionsGet Drive File PermissionsA
Read-onlyIdempotent

Gets detailed metadata about a Google Drive file including sharing permissions, parent folder IDs, ownership, and lifecycle timestamps.

NameRequiredDescriptionDefault
file_idYesThe ID of the file to check permissions for.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 EventsA
Read-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.

NameRequiredDescriptionDefault
queryNoA keyword to search for within event fields (summary, description, location). Ignored if event_id is provided.
detailedNoWhether 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. Custom reminders (an empty list means none), non-default visibility and transparency are reported too; events using the calendar's default reminders omit the Reminders line. Defaults to False.
event_idNoThe ID of a specific event to retrieve. If provided, retrieves only this event and ignores time filtering parameters.
time_maxNoThe 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_minNoThe 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_tokenNoToken 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_idNoThe 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_resultsNoThe maximum number of events to return in one page. Defaults to 25. Ignored if event_id is provided.
single_eventsNoWhether 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_emailYesThe user's Google email address. Required.
include_attachmentsNoWhether 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

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnlyHint, idempotentHint and destructiveHint, so the safety profile is covered. The description adds little beyond restating the read modes; pagination behavior, default time_min handling and recurring-expansion semantics are all disclosed in the schema, not here.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the primary action and then the alternate modes. No filler, though the second sentence is somewhat redundant with the first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 11 fully documented parameters, an output schema, and read-only annotations, the description only needs to orient the agent to the modes, which it does. Nothing critical is missing, though a note on pagination or recurring-instance behavior would round it out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description calls out the optional query param for keyword search but adds no format details, defaults or precedence rules beyond what each parameter description already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (retrieves) and resource (events from a Google Calendar) and enumerates the three access modes: single by ID, range by time, keyword query. It does not explicitly contrast with siblings like manage_event or query_freebusy, 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Describes the modes of use (event_id vs time range vs query), which implicitly tells the agent how to pick parameters, but never says when to prefer this over manage_event or query_freebusy, and gives no exclusions or prerequisites beyond the email.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_formGet FormC
Read-onlyIdempotent

Get a form.

NameRequiredDescriptionDefault
form_idYesThe ID of the form to retrieve.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

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.

Conciseness2/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 ResponseB
Read-onlyIdempotent

Get one response from the form.

NameRequiredDescriptionDefault
form_idYesThe ID of the form.
response_idYesThe ID of the response to retrieve.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
message_idYesThe ID of the Gmail message containing the attachment.
attachment_idYesThe ID of the attachment to download.
return_base64NoWhen 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_indexNoZero-based attachment position from the message-content response. Lets the server resolve Gmail's refreshed attachment IDs against current metadata before every download, selecting the current attachment ID, filename and MIME type.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false), and the description adds real value beyond them: mode-dependent return behavior (stdio file path vs HTTP temp URL valid for 1 hour) and the side effect of re-fetching message metadata. It clarifies the otherwise-surprising readOnlyHint=false by explaining it writes to disk.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded sentences with zero filler. The core action comes first, followed by mode-specific return behavior. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, yet the description helpfully covers mode-dependent outputs. It is complete enough for correct invocation given 100% schema coverage and annotations; only user-facing routing guidance is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents all five parameters, making 3 the baseline. The description does not reference return_base64 or attachment_index directly, so it adds no meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Downloads an email attachment and saves it to local disk'), which is unambiguous. It does not, however, differentiate itself from close siblings such as get_gmail_message_content or download_chat_attachment, so an agent still has to infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use vs alternative guidance and no exclusions. An agent is not told when to prefer this over reading the full message body or when attachment_index resolution is required, leaving routing to inference.

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 ContentA
Read-onlyIdempotent

Retrieves the full content (subject, sender, recipients, body) of a specific Gmail message.

Set page_offset=0 to read the complete rendered body, excluding attachments and attached messages, as JSON pages of at most page_size characters. Follow next_offset until complete=true, passing body_sha256 as expected_sha256 and keeping body_format and include_links unchanged.

Bodies are returned inline and truncated at 20,000 characters. Set full=True to get the complete, untruncated message instead: it is exported to storage 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 without GCS staging have no storage, so there full=True returns the untruncated body inline; with GCS staging configured it returns a signed download URL like any other HTTP deployment.

NameRequiredDescriptionDefault
fullNoWhen True, return the COMPLETE untruncated message: saved to storage and referenced by download URL/file path instead of the body text. In stateless mode without GCS staging, the body is returned inline; with GCS staging, a signed download URL is returned. 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).
formatNoMessage format. "full" (default) includes the body and attachments, "metadata" only headers.full
page_sizeNoMaximum body characters per page, between 1 and 20,000.
message_idYesThe unique ID of the Gmail message to retrieve.
body_formatNoBody 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
page_offsetNoCharacter offset in the complete rendered body. Start at 0 and follow next_offset.
include_linksNoWhen True, append a LINKS section listing the http(s) URLs from the HTML body that the text output omits. Only applies to body_format='text'.
expected_sha256NoOptional previous body_sha256; rejects changed content.
include_headersNoWhen False, omit the Subject/From/To/Date header summary (attached messages' too), and with full=True name the export after the message ID. Requires format='full'; body_format='raw' is only allowed when the raw message is exported to a file.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive, and open-world behavior, but the description adds substantial context: attachments and attached messages are excluded, bodies are truncated at 20,000 characters, paging uses offsets and hash validation, and full=True switches to storage with either a short-lived download URL or file path depending on deployment. It also discloses the stateless-without-GCS fallback where full=True returns the body inline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then covers paging, truncation, and full-export behavior. Its length is justified by the tool's stateful paging and deployment-dependent export modes, though some of the truncation and full=True behavior is repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, 10 parameters, rich annotations, and output schema, the description is complete enough: it explains paging, truncation, full-message export, storage/download-URL behavior, and stateless deployment behavior. Return values themselves are left to the output schema, so no essential context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so individual parameter meanings are already well documented in the schema. The description still adds value by explaining cross-parameter workflow: start page_offset at 0, follow next_offset until complete, pass body_sha256 as expected_sha256, and keep body_format and include_links unchanged across pages.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: retrieving full content of a specific Gmail message, including subject, sender, recipients, and body. The purpose is clear, but the description does not explicitly differentiate this tool from siblings such as get_gmail_messages_content_batch, get_gmail_thread_content, get_gmail_attachment_content, or search_gmail_messages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides operational usage guidance for paging via page_offset/next_offset and for full=True when the message is large or byte-exact fidelity is needed. However, it does not explicitly say when to use this tool versus sibling tools for batches, threads, attachments, or search, so tool-selection guidance remains 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 BatchA
Read-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.

NameRequiredDescriptionDefault
formatNoMessage format. "full" includes body, "metadata" only headers.full
body_formatNoBody 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_idsYesList of Gmail message IDs to retrieve; fetched in batches of 25.
include_linksNoWhen True, append a LINKS section listing the http(s) URLs from the HTML body that the text output omits. Only applies to body_format='text'.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safe read-only, open-world, idempotent, non-destructive behavior. The description adds a meaningful operational constraint: batches are capped at 25 messages to prevent SSL connection exhaustion, which is useful behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loads the tool's purpose, and follows with the batch-size constraint. Every sentence contributes useful information with no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations, complete input schema, and presence of an output schema, the description supplies enough context for correct invocation. It covers the batch purpose and the 25-message limit, though it does not discuss error handling or partial-failure behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters, including format, body_format, include_links, message_ids, and user_google_email, are already documented in the schema. The description adds only the batch-size context and does not need to carry parameter semantics here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: retrieving content of multiple Gmail messages in a single batch request. It clearly signals batch scope, distinguishing it from single-message retrieval, but it does not explicitly name or contrast with sibling tools such as get_gmail_message_content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The word 'multiple' and the batch framing imply this tool is for fetching several messages at once, rather than single-message or thread retrieval. However, there is no explicit when-to-use guidance, exclusions, or named alternatives.

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 ContentA
Read-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.

NameRequiredDescriptionDefault
thread_idYesThe unique ID of the Gmail thread to retrieve.
body_formatNoBody 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_linksNoWhen True, append a LINKS section listing the http(s) URLs from the HTML body that the text output omits. Only applies to body_format='text'.
include_analysisNoWhen 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_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so safety is covered. The description adds genuinely non-redundant behavior: enabling include_analysis changes the return type to a dict with ownership analysis, which matters for callers writing downstream code. It does not cover pagination or size limits on large threads, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action, and the optional capability follows. The second sentence is slightly verbose ('without re-parsing the formatted string or making a second tool call') but it does convey the practical payoff, so nothing is wasted outright.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, rich annotations, and 100% schema coverage, the description only needs to convey purpose and the conditional return-shape behavior, which it does. Residual gaps (large-thread behavior, attachment handling) are minor for a read-only fetch tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters including the body_format enum and include_links are fully documented structurally. The description only restates the include_analysis outcome already present in the schema, adding little beyond baseline; a 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Retrieves the complete content of a Gmail conversation thread, including all messages'), which implicitly separates it from single-message siblings like get_gmail_message_content. However, it never names a sibling or asserts the distinction, so differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The mention of getting ownership analysis 'without... making a second tool call' hints at when the include_analysis option is worth enabling. But there is no explicit guidance on when to use this thread tool versus get_gmail_message_content or get_gmail_threads_content_batch, which are both plausible alternatives in the sibling list.

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 BatchA
Read-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.

NameRequiredDescriptionDefault
thread_idsYesA list of Gmail thread IDs to retrieve. The function will automatically batch requests in chunks of 25.
body_formatNoBody 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_linksNoWhen True, append a LINKS section listing the http(s) URLs from the HTML body that the text output omits. Only applies to body_format='text'.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as a read-only, idempotent, non-destructive, open-world operation. The description adds useful operational context by noting the 25-thread batch limit and the reason for it: avoiding SSL connection exhaustion. It does not describe return shape, but an output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tight sentences with no wasted language. The batch purpose is front-loaded, followed immediately by the important operational limit.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is sufficient for calling the tool correctly given rich annotations, 100% schema coverage, and an output schema. Its main gap is contextual routing: it does not explicitly distinguish this batch thread reader from single-thread or batch-message siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters such as body_format, include_links, and user_google_email are already fully documented. The description only reinforces the thread_ids batching behavior and the 25-thread limit, so it adds some value but not much beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it retrieves content for multiple Gmail threads in one batch request. It clearly implies a batch-oriented variant of thread retrieval, though it does not explicitly name the single-thread sibling get_gmail_thread_content or other message-search alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The batching language implies this tool is for retrieving multiple thread contents efficiently, and the 25-thread limit gives a practical usage boundary. However, it does not explicitly say when to choose this over get_gmail_thread_content, get_gmail_messages_content_batch, or search_gmail_messages, nor does it state exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_messagesGet MessagesC
Read-onlyIdempotent

Retrieves messages from a Google Chat space.

NameRequiredDescriptionDefault
order_byNocreateTime desc
space_idYes
page_sizeNo
message_filterNoOptional 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_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds only the space-scope context and does not disclose pagination, filtering, ordering, or the role of user_google_email, 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one direct sentence with no filler, and the main action is front-loaded. It is under-specified for the tool's complexity, but its structure is concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter tool with a required user_google_email and a sibling search_messages tool, this description is too thin. It lacks parameter semantics and usage guidance, though the output schema and annotations cover return values and safety.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at only 20%, the description needed to compensate for the undocumented parameters such as user_google_email, space_id, order_by, and page_size. It does not mention any of them and adds no meaning beyond the schema property names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the operation (Retrieves messages) and the resource scope (from a Google Chat space), which separates it from the Gmail message tools. It does not explicitly distinguish it from the sibling search_messages tool, so it falls just short of a top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use get_messages versus search_messages, nor any context about when this tool is the right choice. No preconditions, 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_pageGet PageC
Read-onlyIdempotent

Get details about a specific page (slide) in a presentation.

NameRequiredDescriptionDefault
rawNoReturn the complete Slides API Page resource as JSON instead of the summary. Nothing is filtered. Use when the summary does not carry a field you need. Overrides the other flags.
include_stylesNoAlso report text styling: per paragraph (alignment, indents, spacing, bullets) and per run of uniform style (font family, weight, size, bold/italic, color), each with a short excerpt; plus placeholder linkage, autofit, fill and outline for shapes (fill=none / outline=none when explicitly not rendered), and the text styling of every table cell. Only explicitly set values appear; anything else is inherited from the placeholder named in the output. Use for proofing: font consistency, color use, alignment.
page_object_idYesThe object ID of the page/slide to retrieve.
presentation_idYesThe ID of the presentation.
include_geometryNoAlso 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. Tables also report column widths, row heights and cell text.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so safety is covered structurally. The description adds nothing behavioral: it does not mention that output shape varies dramatically with raw/include_styles/include_geometry, nor the token-cost implications of those flags. With full annotation coverage the bar is lower, but a bare restatement earns only a 2.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero padding, and the '(slide)' clarification is the one piece of information it needs to convey. It is efficient, though its brevity is close to under-specification rather than true conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and the input schema is fully documented. Still, for a tool sitting next to get_presentation and get_page_thumbnail, the lack of any routing or prerequisite context leaves a real gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the flag parameters (raw, include_styles, include_geometry) have detailed, high-quality docs, so the schema does the heavy lifting. The description adds no parameter meaning beyond that, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get details about a specific page (slide)') and clarifies that 'page' means a slide, which is genuinely useful terminology mapping. However, it never distinguishes itself from siblings like get_presentation or get_page_thumbnail, so an agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance and no mention of alternatives. An agent cannot tell from the description whether to call this, get_presentation, or get_page_thumbnail for a given need, nor that it requires an existing page_object_id from another call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_presentationGet PresentationC
Read-onlyIdempotent

Get details about a Google Slides presentation.

NameRequiredDescriptionDefault
rawNoReturn the complete Slides API Presentation resource as JSON (slides, layouts, masters, notes, every element and style) instead of the summary. Nothing is filtered, so it can be large; prefer get_page with raw=True for a single slide. Overrides the other flags.
include_stylesNoAlso list each slide's elements with text styling (see get_page). Defaults to False.
presentation_idYesThe ID of the presentation to retrieve.
include_geometryNoAlso 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_emailYesThe user's Google email address. Required.
include_speaker_notesNoAlso 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

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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 no behavioral context of its own — it does not mention that a summary is returned by default, that raw=True returns the full unfiltered resource, or anything about payload size.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with no waste and a clear lead verb. However, its extreme brevity means important scoping information is absent rather than merely condensed, so it is minimal rather than optimally structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and annotations cover the safety profile, and 100% schema coverage documents every flag, so the agent can still call the tool correctly. The description nevertheless omits the tool's default summary-vs-raw behavior and its relationship to get_page, leaving a modest gap for a six-parameter read tool with several output-shaping flags.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all six parameters (raw, include_styles, include_geometry, include_speaker_notes, presentation_id, user_google_email) are already fully documented in the schema, including cross-tool hints. The description adds nothing beyond the schema, which is the expected baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb+resource: retrieving details of a Google Slides presentation. It does not differentiate itself from siblings such as get_page (single slide), create_presentation, or batch_update_presentation, leaving the agent to infer the boundary from context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance, no alternatives, and no prerequisites. Some routing hints exist (e.g. 'prefer get_page with raw=True for a single slide') but they live in the schema's parameter descriptions, not the tool description, so the description itself contributes nothing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_script_activityGet Script ActivityA
Read-onlyIdempotent

Read execution activity for scripts: recent processes or aggregate metrics.

NameRequiredDescriptionDefault
actionYesOne of "processes", "metrics".
page_sizeNoNumber of results for processes (default: 50).
script_idNoThe script project ID (required for metrics; optional for processes).
user_google_emailYesUser's email address
metrics_granularityNoGranularity for metrics - "DAILY" or "WEEKLY".DAILY

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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 dual-mode behavior (processes vs. metrics) which is useful, but it does not disclose details like pagination behavior or authentication requirements. The description is consistent with annotations and adds some value 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that immediately conveys the tool's purpose and the two key modes. There is no unnecessary verbosity, 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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high schema coverage, presence of an output schema, and annotations that establish safety, the description is nearly complete. It lacks only minor context such as explicit clarification that script_id is required for metrics (though the schema covers this). The tool is a read-only operation with clear modes, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, so all five parameters are documented in the schema itself. The description does not add any additional semantic detail beyond what the schema provides. Baseline 3 is appropriate when the schema carries the explanatory burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Read' and the resource 'execution activity for scripts', and further specifies two modes: 'recent processes' and 'aggregate metrics'. This distinguishes it from sibling tools like get_script_project or run_script_function, which serve different purposes. The 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for reading execution activity but does not explicitly state when to use this tool versus alternatives or provide any exclusion criteria. The context is clear enough for an agent to infer, but there is no explicit guidance on selection.

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 ProjectA
Read-onlyIdempotent

Read Apps Script projects and their source files.

NameRequiredDescriptionDefault
actionYesOne of "list", "get".
file_nameNoOptional source file name for get.
page_sizeNoNumber of results per page for list (default: 50).
script_idNoThe script project ID (required for get).
page_tokenNoPagination token for list (optional).
user_google_emailYesUser's email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety: readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description simply restates the read nature and adds the 'source files' scope, but it does not add contextual behavior such as mode differences (list vs get) or pagination; this is acceptable because annotations carry the safety burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence that states the core operation without filler. Every word contributes to selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 100% schema coverage, robust annotations, and presence of an output schema, the description is largely sufficient. It is brief but would benefit from explicitly noting the list-versus-get action modes or pointing to manage_script_content for edits; still, it provides enough context to select correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including action, script_id, file_name, page_size, and page_token is already documented. The description adds no parameter-level meaning beyond the schema, which meets the high-coverage baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Read' with a clear resource scope, 'Apps Script projects and their source files.' This directly differentiates it from sibling tools like manage_script_project, get_script_version, and get_script_activity, which concern different resources or operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The read-oriented wording implies it should be used when an agent needs to inspect Apps Script projects or files, but the description offers no explicit when-to-use/when-not-to-use guidance or named alternatives such as manage_script_content or get_script_activity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_script_versionGet Script VersionC
Read-onlyIdempotent

List or retrieve immutable version snapshots of a script project.

NameRequiredDescriptionDefault
actionYes
script_idYes
version_numberNo
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description earns credit for adding the word 'immutable', which signals that versions cannot be altered, but it says nothing about pagination, response shape, or how action changes behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with no filler and the resource front-loaded. It is on the terse side for a four-parameter tool, but nothing in it is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 0% schema coverage, a required free-form action parameter, and no output explanation needed (an output schema exists), the description is the only source of guidance on how to drive this tool — and it omits both action values and the conditional role of version_number. Inadequate for the tool's actual call surface.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and all four parameters are undocumented in the schema. The description gestures at an action concept ('list or retrieve') but never enumerates valid action values, and never explains that version_number is only meaningful for the retrieve case while script_id and user_google_email are always required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb pair (list/retrieve) and resource (immutable version snapshots of a script project), which is materially clearer than the bare tool name. However, it does not distinguish this read tool from the sibling manage_script_version, nor does it explain how 'list' vs 'retrieve' map to the required action parameter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus manage_script_version, get_script_project, or list_script_deployments, all of which sit adjacent in the toolset. The reader is left to infer that this is the read-only counterpart of manage_script_version.

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 InfoB
Read-onlyIdempotent

Retrieves metadata about a Programmable Search Engine.

NameRequiredDescriptionDefault
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 InfoA
Read-onlyIdempotent

Gets information about a specific spreadsheet including its sheets.

NameRequiredDescriptionDefault
spreadsheet_idYesThe ID of the spreadsheet to get info for. Required.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 TaskB
Read-onlyIdempotent

Get details of a specific task.

NameRequiredDescriptionDefault
task_idYesThe ID of the task to retrieve.
task_list_idYesThe ID of the task list containing the task.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 ListB
Read-onlyIdempotent

Get details of a specific task list.

NameRequiredDescriptionDefault
task_list_idYesThe ID of the task list to retrieve.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

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. On a local server a file on disk can also be passed by path (preferred for batch operations, so callers do not need to load full file contents into their context).

NameRequiredDescriptionDefault
contentNoText content for text-based formats. Use only for short snippets or content already in memory.
file_urlNoRemote URL to fetch the file from (http/https).
file_nameYesThe name for the new Google Doc; the extension is dropped from the title. Without 'source_format', its extension also sets the format of 'content' or 'base64_content' (e.g. 'Notes.md' so Markdown tables are not imported as plain text).
file_pathNoLocal 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_idNoThe ID of the parent folder. Defaults to 'root'.root
base64_sha256NoExpected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks.
source_formatNoSource format hint ('md', 'markdown', 'docx', 'txt', 'html', 'rtf', 'odt'). Auto-detected from file_name extension if not provided.
base64_contentNoStandard base64-encoded bytes for a binary source such as DOCX or ODT.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already declaring openWorldHint=true and idempotentHint=false, the description still adds real behavioral context: the conversion is performed by Drive, formatting (headings, lists, bold, italic) is preserved, and path-based reads may load the file into memory and hit size/time limits. It does not state that every call creates a new Doc (duplicate titles) or anything about auth, which would have pushed this to a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with one sentence stating purpose and supported formats, followed by two supporting paragraphs on conversion and input methods. Slight redundancy: 'into Google Docs format with automatic conversion' is immediately restated by 'Google Drive automatically converts the source file to native Google Docs format.'

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation tool with an output schema, full schema coverage and annotations in place, the description covers formats, conversion fidelity and the two input channels. Remaining gaps (duplicate-title creation, default folder behavior, permission/scope needs) are minor but non-trivial for a create operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 content, file_path, base64_content, source_format, file_name, folder_id and base64_sha256 in detail. The description restates the base64/path distinction but adds no syntax, precedence rules, or format-hint semantics beyond what the schema provides — baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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 ('Imports a file ... into Google Docs format with automatic conversion') and enumerates the supported source formats, which is concrete. It does not, however, distinguish the tool from close siblings such as create_doc (which presumably also mints a Doc) or import_to_google_sheets/import_to_google_slides, so an agent must infer the routing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is useful guidance on input modes: base64_content for binary sources, and a disk path 'preferred for batch operations, so callers do not need to load full file contents into their context.' But there is no explicit when-to-use/when-not-to-use statement and no named alternative (e.g. create_doc for plain text authoring), so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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. On a local server a file on disk can also be passed by path (preferred for batch operations, so callers do not need to load full file contents into their context).

NameRequiredDescriptionDefault
contentNoText content for text-based formats (CSV, TSV). Use only for short snippets or content already in memory.
file_urlNoRemote URL to fetch the spreadsheet from (http/https).
file_nameYesThe name for the new Google Sheets spreadsheet; the extension is dropped from the title. Without 'source_format', its extension also sets the format of 'content' or 'base64_content' (e.g. 'Data.csv').
file_pathNoLocal 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_idNoThe ID of the parent folder. Defaults to 'root'.root
base64_sha256NoExpected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks.
source_formatNoSource format hint ('xlsx', 'xls', 'ods', 'csv', 'tsv'). Auto-detected from file_name extension if not provided.
base64_contentNoStandard base64-encoded bytes for an XLSX, XLS, or ODS source.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, openWorld=true, idempotent=false, destructive=false, so the safety profile is covered. The description adds context annotations don't carry: conversion is automatic via Google Drive, rows/columns/sheets/values are preserved, and integrity can be checked with a SHA-256 of the decoded base64. It stops short of covering permissions or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and supported formats, then narrows to input-channel details. A parenthetical aside about context loading is slightly conversational but still informative, so it is efficiently sized without waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With nine fully documented parameters and an output schema present, the description needn't explain return values. It covers format handling and the main input channels; only the relationship to adjacent spreadsheet-creation tools is left to inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema baseline is 3. The description still adds value by ranking the input channels — base64_content for binary sources, file_path preferred for batch operations so callers avoid loading file contents into context — which gives an agent selection logic the schema doesn't state.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — imports a spreadsheet in listed formats into native Google Sheets format — and enumerates the supported formats (XLSX, XLS, ODS, CSV, TSV), which distinguishes it from siblings like create_spreadsheet or import_to_google_doc. It never explicitly contrasts itself with those siblings, so it lands 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful routing guidance among input methods (base64_content for binary, file_path on a local server and preferred for batch work), which is real usage context. However, it never says when to use this tool rather than create_spreadsheet, or when not to use it, so tool-level usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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. On a local server a file on disk can also be passed by path (preferred for batch operations, so callers do not need to load full file contents into their context).

NameRequiredDescriptionDefault
file_urlNoRemote URL to fetch the presentation from (http/https).
file_nameYesThe name for the new Google Slides presentation; the extension is dropped from the title. Without 'source_format', its extension also sets the format of 'base64_content' (e.g. 'Deck.pptx').
file_pathNoLocal 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_idNoThe ID of the parent folder. Defaults to 'root'.root
base64_sha256NoExpected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks.
source_formatNoSource format hint ('pptx', 'ppt', 'odp'). Auto-detected from file_name extension if not provided.
base64_contentNoStandard base64-encoded bytes for a PPTX or ODP source.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that Drive performs automatic conversion preserving slides, layouts, text, and images. It also notes that local file paths are preferred for batch operations to avoid loading full contents into caller context. It does not explicitly discuss duplicate behavior or non-idempotency, but the annotations already mark the tool as non-idempotent and 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and reasonably concise, first stating the import behavior and then adding source-method guidance. There is minor redundancy between 'with automatic conversion' and 'automatically converts', but no significant wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema, complete parameter descriptions, and annotations covering mutation and openness, the description gives enough context to invoke the tool correctly. It is slightly incomplete only in not routing the agent among similar import/create siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 in detail. The description adds useful high-level context about base64_content and file_path usage, but it does not add meaning beyond the schema for the remaining parameters such as file_url, folder_id, or base64_sha256.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: importing PPTX, PPT, or ODP presentations into native Google Slides format with automatic conversion. This clearly distinguishes it from creation and spreadsheet/doc import siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains source input methods such as base64_content and local file_path, with file_path preferred for batch operations. However, it does not explicitly say when to use this tool versus siblings like create_presentation or import_to_google_doc, nor when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

insert_doc_elementsInsert Doc ElementsC

Inserts structural elements like tables, lists, or page breaks into a Google Doc.

NameRequiredDescriptionDefault
rowsNoNumber of rows for table (required for table)
textNoInitial text content for list items
indexYesPosition to insert element (0-based)
columnsNoNumber of columns for table (required for table)
list_typeNoType of list ("UNORDERED", "ORDERED") (required for list)
document_idYesID of the document to update
element_typeYesType of element to insert ("table", "list", "page_break")
user_google_emailYesUser's Google email address

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
indexYesPosition to insert image (0-based)
widthNoImage width in points (optional)
heightNoImage height in points (optional)
document_idYesID of the document to update
image_sourceYesDrive file ID or public image URL
user_google_emailYesUser's Google email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 StructureA
Read-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. If the body ends with an empty paragraph, that paragraph's range has end == total_length; truncation may omit that range.

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).

NameRequiredDescriptionDefault
tab_idNoOptional ID of the tab to inspect. If not provided, inspects main document.
detailedNoWhether to return detailed structure information
document_idYesID of the document to inspect
preview_charsNoMaximum 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_emailYesUser's Google email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, yet the description still adds real behavior: truncation caps (empty_paragraph_ranges capped at 100), the truncated flag, the end == total_length edge case, and the UTF-16 offset caveat for emoji. It does not cover auth or performance considerations, but for a read-only inspector this is substantial 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose before mechanics, and the sectioned layout (USE THIS FOR / OUTPUT / WORKFLOW) is scannable. It is long, and the Step 1-4 table insertion walkthrough is padded ('Call this function', 'Note the total_length value'), but almost every block carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-param inspection tool with an output schema, the description covers the ambiguity that matters: where paragraph statistics live in each mode, how to derive sub-paragraph offsets, and the safety constraint on insertion indices. An agent can call it correctly from this alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so 3 is the baseline. The description earns extra by explaining the consequence of preview_chars=0 (untruncated text needed to locate a token) and by tying detailed=true to the statistics location and element indices, which the schema does not say.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (inspect document structure) and immediately distinguishes itself from content-reading siblings by framing the job as 'finding safe insertion points'. The 'USE THIS FOR' list makes the resource scope concrete (indices, tables, tabs, statistics).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use list plus named alternatives: ordinary header/footer text goes to update_doc_headers_footers, this tool is only for low-level segment IDs. The table workflow even mandates ordering ('ALWAYS call this BEFORE creating tables').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_calendarsList CalendarsA
Read-onlyIdempotent

Retrieves a list of calendars accessible to the authenticated user.

NameRequiredDescriptionDefault
page_tokenNoToken for the next page, taken from a previous response.
max_resultsNoMaximum calendars to return in one page. Omit to use the API default.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare read-only, idempotent, and non-destructive behavior, and the description confirms this with 'Retrieves'. It adds the useful scoping detail that results are limited to calendars accessible to the authenticated user, but it does not provide richer behavioral context such as pagination behavior or response limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the verb and object with no filler or redundant restatement of the title. Every word carries meaningful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 full schema coverage, strong annotations, and an output schema, the description covers everything needed for correct invocation. It does not need to explain return values or parameter details because those are supplied by structured context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema adequately documents user_google_email, page_token, and max_results. The description adds no additional parameter-level meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete verb-resource pair, 'Retrieves a list of calendars', and scopes the result to the authenticated user, which makes it distinct from calendar mutation tools like create_calendar. It does not explicitly name or differentiate a sibling, so it falls slightly short of the top rating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: call this when a list of calendars a user can access is needed, rather than when creating or managing calendar data. There is no explicit statement about when to prefer it over siblings such as get_events or create_calendar, so the agent must infer the selection context.

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 GroupsB
Read-onlyIdempotent

List contact groups (labels) for the user.

NameRequiredDescriptionDefault
page_sizeNoMaximum number of groups to return (default: 100, max: 1000).
page_tokenNoToken for pagination.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint=true, idempotentHint=true, openWorldHint=true, destructiveHint=false) fully carry the safety and behavioral profile, and the description does not contradict them. The description adds no behavioral context of its own — no pagination consequences, rate limits, or auth requirements — but for a simple read-only list operation, the annotations lower the bar and adequately cover what matters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, seven words, with zero filler. The useful '(labels)' clarification is included without bloat. The description is appropriately minimal for a simple list operation and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, read-only, idempotent list tool with a comprehensive output schema, 100% parameter coverage, and full safety annotations, the minimal description is largely sufficient for an agent to invoke it correctly. The only notable gap is the absence of sibling differentiation, which an agent must infer from the tool name.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (page_size, page_token, user_google_email) already have descriptions, including default and max values for page_size. The description adds only 'for the user,' which loosely maps to user_google_email but provides no new meaning. Baseline 3 applies given high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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 ('contact groups'), with the parenthetical '(labels)' clarifying Google Contacts terminology — a genuinely useful disambiguation. It is clearly distinct from siblings like list_contacts by resource type, but it does not explicitly name or differentiate any sibling, 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.

Usage Guidelines2/5

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. With closely related siblings such as list_contacts, get_contact_group, and search_contacts, an agent gets no basis for choosing among them. Usage is only implied by the tool's name and the minimal 'for the user' scope.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_contactsList ContactsA
Read-onlyIdempotent

List contacts for the authenticated user, optionally as a full or incremental sync.

NameRequiredDescriptionDefault
page_sizeNoMaximum number of contacts to return (default: 100, max: 1000).
page_tokenNoToken for pagination. Keep all other arguments unchanged when following it.
sort_orderNoSort order: "LAST_MODIFIED_ASCENDING", "LAST_MODIFIED_DESCENDING", "FIRST_NAME_ASCENDING", or "LAST_NAME_ASCENDING". Not supported when syncing.
sync_tokenNoList only changes since the sync that returned this token, marking deleted contacts. The last page returns a new sync token.
user_google_emailYesThe user's Google email address. Required.
request_sync_tokenNoStart a full sync. The last page returns a sync token.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a read-only, idempotent, non-destructive, open-world operation. The description adds the authenticated-user scope and sync-mode behavior, but does not add further operational context such as pagination expectations or sync semantics beyond what the schema provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted words. It states the resource, scope, and optional sync capability efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich schema, output schema, and annotations, the description is largely complete for correct invocation. The main missing piece is sibling differentiation, especially versus search_contacts and get_contact.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all six parameters are already documented in the schema. The description's only extra semantic signal is that full or incremental sync is optional, which is also covered by the sync_token and request_sync_token schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: list contacts for the authenticated user. It is clear about scope and sync capability, but it does not distinguish this tool from siblings such as search_contacts or get_contact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'optionally as a full or incremental sync' implies a sync use case, but the description gives no explicit when-to-use guidance, exclusions, or alternatives such as search_contacts for filtering.

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 FolderC
Read-onlyIdempotent

Lists Google Docs within a specific Drive folder.

NameRequiredDescriptionDefault
folder_idNoID of the Drive folder to list. Defaults to 'root'.root
page_sizeNoMaximum number of documents to return. Defaults to 100.
page_tokenNoPage token from a previous response's nextPageToken to retrieve the next page of results.
user_google_emailYesThe user's Google email address.

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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 nothing beyond that - no note on pagination behavior, result ordering, or folder-resolution caveats - so it contributes little 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. It is appropriately sized, though its brevity borders on under-specification given the crowded sibling set.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and annotations cover safety. However, for a tool sitting among list_drive_items, search_drive_files, and search_docs, the description omits the disambiguation an agent needs to select it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with folder_id, page_size, and page_token all documented inline, so the baseline is 3. The description's mention of 'a specific Drive folder' merely restates the folder_id parameter without adding format or semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Lists') and resource ('Google Docs') plus the scoping constraint ('within a specific Drive folder'). It is clear what the tool does, but it offers no differentiation from close siblings such as list_drive_items, search_drive_files, or search_docs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 like list_drive_items (which lists all Drive items) or search_drive_files/search_docs. The agent must infer the choice from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_document_commentsList Document CommentsA
Read-onlyIdempotent

List all comments from a Google Document (optional max_comments to limit results).

NameRequiredDescriptionDefault
document_idYes
max_commentsNo
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), lowering the burden on the description. The description adds useful behavioral context that comments are listed in full by default and can be limited with max_comments, but it does not disclose ordering, pagination, or authorization requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with a useful parenthetical. There is no filler, repetition of schema fields, or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple listing tool with rich annotations and an output schema, the description is mostly adequate. However, with zero schema descriptions and a required user_google_email that is not mentioned at all, the description is not fully self-contained and relies on an inferred convention.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 schema's silence. It clarifies max_comments ('to limit results') and implicitly ties document_id to the Google Document, but it completely leaves the required user_google_email parameter unexplained. This is a significant gap for a required parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb ('List') and resource ('all comments from a Google Document'), making the tool's purpose immediately obvious. It also distinguishes itself from the sibling 'manage_document_comment' and from comment-listing tools for other products.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly conveys this is the tool for retrieving comments rather than creating or modifying them. It does not explicitly name alternatives or when-not-to-use scenarios, but the context is clear enough for an agent to select it for a read-only listing task.

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 ItemsA
Read-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.

NameRequiredDescriptionDefault
queryNoShared drive query used only when resource_type="shared_drives", e.g. "name contains 'Engineering'".
corporaNoCorpus to query ('user', 'drive', 'allDrives'). If `drive_id` is set and `corpora` is None, 'drive' is used. If None and no `drive_id`, 'allDrives' is used when `include_items_from_all_drives` is True.
detailedNoWhether to include size, modified time, and link in results. Defaults to True.
drive_idNoID of the shared drive. If provided, the listing is scoped to this drive.
order_byNoSort 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_typeNoRestrict 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_idNoThe 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_sizeNoThe maximum number of items to return. Defaults to 100.
page_tokenNoPage token from a previous response's nextPageToken to retrieve the next page of results.
resource_typeNoWhat to list. Use "items" for folder contents or "shared_drives" for shared drive containers. Defaults to "items".items
user_google_emailYesThe user's Google email address. Required.
include_organizersNoWhen 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_drivesNoWhether items from all accessible shared drives should be included if `drive_id` is not set. Defaults to True.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, open-world, non-destructive behavior, so the safety profile is fully covered. The description adds scope-dependent behavior (what is listed when drive_id is absent), which is useful, but that logic largely restates the schema's corpora/include_items_from_all_drives descriptions and omits anything about pagination or result volume.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each front-loading the condition (drive_id specified / not specified / resource_type) before its consequence, with no filler. Slight overlap with schema parameter text keeps it from being maximally tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter, mode-switching list tool with an output schema already present, the description covers the main branching logic an agent needs. Return-value shape is correctly left to the output schema; pagination is only implied via the schema's page_token.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline would be 3; the description goes beyond it by explaining cross-parameter semantics that per-field docs cannot convey – folder_id is relative to drive_id, and drive_id itself can serve as folder_id for the drive root. That interaction is the key thing an agent must get right when composing a call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Lists) and a precise resource scope (files/folders or shared drive containers), and explicitly covers the two listing modes. An agent can distinguish it from siblings like search_drive_files (search) or list_docs_in_folder (Docs only) without reading the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear conditional guidance: use drive_id to scope to a shared drive, omit it to span My Drive plus accessible shared drives, and set resource_type="shared_drives" to enumerate drive containers. It does not, however, name sibling alternatives such as search_drive_files for query-based lookup, so routing relies on inference.

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 ResponsesA
Read-onlyIdempotent

List a form's responses.

NameRequiredDescriptionDefault
form_idYesThe ID of the form.
page_sizeNoMaximum number of responses to return. Defaults to 10.
page_tokenNoToken for retrieving next page of results.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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 no behavioral context beyond what the annotations provide, such as pagination behavior or output characteristics, 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, short sentence that is easy to parse and front-loads the core purpose. It is appropriately concise, though it largely restates the title and could have used the spare space to add usage or behavioral guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The input schema documents all required and optional parameters clearly, the output schema exists, and annotations cover the read-only, idempotent, non-destructive nature of the tool. The description is minimal but sufficient for an agent to select and invoke this tool correctly, though slightly more context about pagination or response shape would improve it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 meaningful description. The tool description itself adds no extra parameter semantics, but with full schema coverage 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.

Purpose4/5

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 a form's responses." It is unambiguous about what operation is performed, though it does not explicitly differentiate itself from the sibling get_form_response beyond the plural 'responses'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: call this when you want the responses submitted to a Google Form. It provides no explicit when-not-to-use guidance or alternatives, such as pointing to get_form_response for a single response, so the guidance is functional but minimal.

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 FiltersA
Read-onlyIdempotent

Lists all Gmail filters configured in the user's mailbox.

NameRequiredDescriptionDefault
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 LabelsB
Read-onlyIdempotent

Lists labels in the user's Gmail account.

NameRequiredDescriptionDefault
prefixNoReturn 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.
compactNoReturn 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_systemNoInclude Gmail system labels (INBOX, SENT, ...). Set False to return user labels only.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds no behavioral traits beyond what annotations already provide. It does not mention auth requirements, rate limits, or that the operation is non-destructive (though annotations already cover safety). The description is effectively a tautology of the tool name, adding no new behavioral insight.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence with no wasted words. It is appropriately sized for the simple read-only operation, and the essential information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simple read-only nature, the rich parameter descriptions, the existing output schema, and the safety annotations, the description is adequate for an agent to invoke it correctly. An output schema exists, so the description does not need to explain return values. It lacks nothing critical for a basic list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 contains no parameter information, but the schema provides thorough explanations for all four parameters, including the 'prefix' behavior of narrowing client-side rather than server-side. The description adds no extra parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Lists') and resource ('labels in the user's Gmail account'). It clearly distinguishes from siblings such as manage_gmail_label (create/update/delete) and list_gmail_filters (filters, not labels). An agent can immediately understand what the tool does and which sibling it is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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. It does not mention that manage_gmail_label should be used for label creation/modification, nor does it note any preconditions or exclusions. There is no explicit or implicit usage context beyond the bare action.

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 CommentsA
Read-onlyIdempotent

List all comments from a Google Presentation (optional max_comments to limit results).

NameRequiredDescriptionDefault
max_commentsNo
presentation_idYes
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description does not need to restate safety. It adds the useful fact that all comments are returned unless max_comments is provided, but it does not disclose ordering, pagination, or any other behavioral nuance.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every phrase adds information: the action, resource, scope, and optional limiting parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 an output schema cover most invocation needs. Still, the complete absence of parameter documentation in a 0%-coverage schema leaves an important gap for an agent trying to construct a valid call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 by documenting parameters. It only explains max_comments; user_google_email and presentation_id are left entirely to inference, with no guidance on expected format (e.g., full URL vs. file ID).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 ('all comments from a Google Presentation'), making the operation unmistakable. It also distinguishes itself from sibling tools like list_document_comments and list_spreadsheet_comments by naming the Google Presentation resource explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is clearly implied: retrieve comments for a presentation, with an optional limit. However, there is no explicit guidance on when not to use this tool or when to prefer related tools such as manage_presentation_comment for mutation workflows.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_script_deploymentsList Script DeploymentsC
Read-onlyIdempotent

List deployments for an Apps Script project.

NameRequiredDescriptionDefault
script_idYes
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds no additional behavioral context such as whether archived deployments are included, authentication requirements, or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single clear sentence with no filler and the action is front-loaded. It is concise, though slightly under-specified for a tool whose schema lacks parameter descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with 0% schema description coverage, the one-line description leaves too much unstated. The agent must infer what user_google_email means and when this tool is preferable to sibling deployment/script management tools, despite the rich annotations and output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not explain script_id or user_google_email. 'Apps Script project' weakly implies script_id's role, but the description does not compensate for the undocumented parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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 ('deployments for an Apps Script project'), making the operation clear. It doesn't explicitly distinguish itself from sibling 'manage_deployment', but the read/list framing is enough to separate them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 manage_deployment, get_script_project, or get_script_version. The description only restates the action without providing 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_sheet_tablesList Sheet TablesA
Read-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.

NameRequiredDescriptionDefault
spreadsheet_idYesThe ID of the spreadsheet. Required.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SpacesB
Read-onlyIdempotent

Lists Google Chat spaces (rooms and direct messages) accessible to the user.

NameRequiredDescriptionDefault
page_sizeNo
space_typeNoall
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds the useful 'accessible to the user' scope constraint, but is silent on pagination behavior despite a page_size default of 100 (no mention of page tokens or how many results come back).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no wasted words; scope and access constraint come first. It is appropriately tight, though the brevity leaves the noted gaps rather than using a second short sentence to close them.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and annotations cover the safety profile, so return format needn't be spelled out. However, for a paginated, filterable listing tool with zero schema descriptions, the description should at least indicate pagination and the space_type options; those omissions are meaningful gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so all three parameters rely on the description, which explains none of them explicitly. The phrase 'rooms and direct messages' hints at the space_type values and 'accessible to the user' hints at user_google_email, but page_size and the accepted space_type strings remain undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (lists) and resource (Google Chat spaces), and clarifies the scope by defining spaces as 'rooms and direct messages' plus the accessibility constraint. It is distinguishable from chat siblings like get_messages or search_messages, though it does not explicitly contrast with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer this is a discovery tool to enumerate spaces before calling get_messages or send_message, but the description never states when to use it or what alternatives exist for finding a space (e.g., search).

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 CommentsA
Read-onlyIdempotent

List all comments from a Google Spreadsheet (optional max_comments to limit results).

NameRequiredDescriptionDefault
max_commentsNo
spreadsheet_idYes
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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 optional max_comments limit, but does not disclose ordering, pagination, or default behavior when the parameter is omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that is front-loaded with the core action and then states the optional parameter. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema and strong annotations, the description covers the essential listing behavior, but it is incomplete for confident invocation because required parameter semantics are not explained and no usage guidance or edge-case behavior is provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description only clarifies max_comments. It does not explain the meaning or format of user_google_email or spreadsheet_id, leaving two required parameters to be inferred from their names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('List all comments') and resource ('from a Google Spreadsheet'), plus an optional limiting parameter. This clearly differentiates it from siblings like list_document_comments and manage_spreadsheet_comment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The resource mention implies this tool is for spreadsheet comments, but the description does not explicitly state when to choose it over alternatives such as list_document_comments or manage_spreadsheet_comment. Usage is inferred from the resource type rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_spreadsheetsList SpreadsheetsB
Read-onlyIdempotent

Lists spreadsheets from Google Drive that the user has access to.

NameRequiredDescriptionDefault
corporaNoCorpus to search ('user', 'domain', 'drive', 'allDrives'). Defaults to 'drive' when drive_id is set, otherwise 'allDrives'.
drive_idNoShared drive ID to search.
page_tokenNoPage token from a previous response's nextPageToken to retrieve the next page of results.
max_resultsNoMaximum number of spreadsheets to return. Defaults to 25.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered by structured data. The description adds only the 'user has access to' scoping note; it says nothing about pagination behavior, result caps, or how Drive permissions affect what is returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with no filler, and the resource is front-loaded. It is efficient, though its brevity comes at the cost of the guidance a listing tool with five parameters arguably warrants.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations carrying the safety profile, the description does not need to explain return values. Still, for a Drive-listing tool with a rich sibling set, the absence of any routing or scope detail (shared drives, corpora) leaves a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema documents every parameter including corpora, drive_id, page_token, max_results, and user_google_email with defaults and enum-like values. The description adds no parameter meaning beyond that, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (Lists) and resource (spreadsheets from Google Drive), plus a scope qualifier ('that the user has access to'). However, it does nothing to distinguish itself from near-siblings like list_drive_items, search_drive_files, or list_docs_in_folder, so an agent must infer the boundary from names alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus alternatives such as search_drive_files (query-based discovery) or list_drive_items (general Drive listing). The agent gets no exclusions, prerequisites, or selection criteria.

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 ListsA
Read-onlyIdempotent

List all task lists for the user.

NameRequiredDescriptionDefault
page_tokenNoToken for pagination.
max_resultsNoMaximum number of task lists to return (default: 1000, max: 1000).
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is read-only, idempotent, and non-destructive. The description adds minor scope context ('all task lists for the user') but does not disclose pagination behavior, authentication requirements, or any other operational traits 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler or redundant wording. It communicates the action and object efficiently while leaving operational details to the schema and annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 is sufficient when combined with full schema parameter docs and supporting annotations. The output schema exists, so return values are not the description's responsibility, and no critical operational context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each parameter already documented inline. The description adds no additional meaning about page_token, max_results, or user_google_email, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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' and 'for the user'). This clearly distinguishes it from siblings like list_tasks (which lists tasks inside lists) and get_task_list (which retrieves a single list), 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.

Usage Guidelines2/5

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 get_task_list, list_tasks, or manage_task_list. The agent must rely entirely on sibling names and context to decide, since no exclusions or conditions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tasksList TasksA
Read-onlyIdempotent

List all tasks in a specific task list.

NameRequiredDescriptionDefault
due_maxNoUpper bound for due date (RFC 3339 timestamp).
due_minNoLower bound for due date (RFC 3339 timestamp).
page_tokenNoToken for pagination.
max_resultsNoMaximum number of tasks to return. (default: 20, max: 10000).
show_hiddenNoWhether to include hidden tasks (default: False).
updated_minNoLower bound for last modification time (RFC 3339 timestamp).
show_deletedNoWhether to include deleted tasks (default: False).
task_list_idYesThe ID of the task list to retrieve tasks from.
completed_maxNoUpper bound for completion date (RFC 3339 timestamp).
completed_minNoLower bound for completion date (RFC 3339 timestamp).
show_assignedNoWhether to include assigned tasks (default: False).
show_completedNoWhether 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_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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 well covered. The description adds only the scoping constraint of a specific task list and does not disclose additional behavioral details 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with no wasted words. It front-loads the core operation and resource, and all parameter-level detail is appropriately delegated to the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The input schema is fully self-documenting across 13 parameters, an output schema exists, and annotations cover safety and side effects. The description is sufficiently complete for correct invocation; the only missing piece is routing guidance, which is already penalized under usage_guidelines.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with every parameter (due_min, due_max, page_token, show_hidden, etc.) already documented in the input schema. The tool description adds no parameter-specific semantics, 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a clear verb ('List') and resource ('tasks'), and scopes the action to 'a specific task list', which differentiates it from related tools like list_task_lists and get_task. It is clear and accurate, though it does not explicitly name any sibling alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 get_task, list_task_lists, or manage_task. The one-line description implies a read/list use case, but it offers no explicit context, exclusions, or decision criteria.

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 FormattingA
Destructive

Manages conditional formatting rules on a Google Sheet. Supports adding, updating, and deleting conditional formatting rules via a single tool.

NameRequiredDescriptionDefault
actionYesThe operation to perform. Must be one of "add", "update", or "delete".
range_nameNoA1-style range (optionally with sheet name). Required for "add". Optional for "update" (preserves existing ranges if omitted). Not used for "delete".
rule_indexNo0-based index of the rule. For "add", optionally specifies insertion position. Required for "update" and "delete".
sheet_nameNoSheet name to locate the rule when range_name is omitted. Defaults to the first sheet. Used by "update" and "delete".
text_colorNoHex text color to apply when condition matches. Used by "add" and "update".
condition_typeNoSheets condition type (e.g., NUMBER_GREATER, TEXT_CONTAINS, DATE_BEFORE, CUSTOM_FORMULA). Required for "add". Optional for "update" (preserves existing type if omitted).
spreadsheet_idYesThe ID of the spreadsheet. Required.
gradient_pointsNoList (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_colorNoHex background color to apply when condition matches. Used by "add" and "update".
condition_valuesNoValues for the condition; accepts a list or a JSON string representing a list. Depends on condition_type. Used by "add" and "update".
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation risk is known. The description adds value by clarifying that a single tool handles add/update/delete, and the schema notes that 'update' preserves existing ranges/types if omitted. However, it does not disclose side effects like whether deleting a rule is irreversible or whether adding a rule can affect existing rules.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the tool's purpose and lists the supported operations. It is appropriately sized for a tool with a rich schema, though it could add a brief usage hint without becoming verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (11 params, 3 actions, gradient vs boolean rules), the description plus the fully documented schema covers the essential information. The output schema exists, so return values need not be described. A small gap is the lack of guidance on choosing between gradient and boolean rule parameters, but the schema's note that gradient ignores boolean parameters partially covers this.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 11 parameters in detail. The description itself adds no parameter-level meaning beyond what the schema provides, which meets the baseline for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Manages') and resource ('conditional formatting rules on a Google Sheet') and explicitly lists the three supported operations (adding, updating, deleting). This clearly distinguishes it from sibling tools like format_sheet_range or modify_sheet_values, which handle other aspects of sheet formatting.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by naming the three operations, and the schema provides per-action parameter requirements (e.g., range_name required for 'add', rule_index required for 'update'/'delete'). However, it does not explicitly state when to prefer this tool over alternatives like format_sheet_range, nor does it mention exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_contactManage ContactB
Destructive

Create, update, or delete a contact. Consolidated tool replacing create_contact, update_contact, and delete_contact.

NameRequiredDescriptionDefault
urlsNoList of URL dicts {value, type?}. Supported types: homepage, blog, profile, work, ftp, reservations, other, etc.
emailNo[DEPRECATED] Email address. Use emails=[{"address":..., "type":"other"}].
notesNoAdditional notes (for create/update).
phoneNo[DEPRECATED] Single phone number. Use phones=[{"number":..., "type":"mobile"}].
actionYesThe action to perform: "create", "update", or "delete".
emailsNoList of email dicts {address, type?}.
phonesNoList 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".
addressNoStreet address, replacing any existing addresses. "" clears them (for create/update).
birthdayNoBirthday as 'YYYY-MM-DD', 'MM-DD' (no year), or 'clear'/'' to remove.
job_titleNo[DEPRECATED] Job title. Use organizations=[{"title":...}].
nicknamesNoList 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.
relationsNoList of relation dicts {person, type?}. Supported types: spouse, child, parent, friend, manager, assistant, etc.
urls_modeNoHow to update urls on "update": "merge" (default), "replace", or "remove". merge dedups by normalized URL (lowercased, trailing slash stripped).merge
contact_idNoThe contact ID. Required for "update" and "delete" actions.
given_nameNoFirst name (for create/update).
emails_modeNoHow to update emails on "update": "merge" (default), "replace", or "remove".merge
family_nameNoLast name (for create/update).
phones_modeNoHow 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
organizationNo[DEPRECATED] Company name. Use organizations=[{"name":...}].
user_definedNoList of custom field dicts {key, value}. Useful for structured data like account numbers, IDs, or custom dates.
organizationsNoList of org dicts {name?, title?, department?, jobDescription?, type?}.
nicknames_modeNoHow to update nicknames on "update": "merge" (default), "replace", or "remove".merge
relations_modeNoHow to update relations on "update": "merge" (default), "replace", or "remove".merge
user_defined_modeNoHow to update custom fields on "update": "merge" (default), "replace", or "remove". merge overrides value on matching key; new keys appended.merge
user_google_emailYesThe user's Google email address. Required.
organizations_modeNoHow to update orgs on "update": "merge" (default), "replace", or "remove".merge

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already disclose the key safety profile: non-read-only, destructive, open-world, and non-idempotent. The description adds almost no behavioral context beyond those annotations, such as permanence of delete, permission needs, or update-mode effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loaded with the supported operations. The second sentence is useful for agents that may know the older tool names, and there is no wasted wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is complex, but the schema is richly described, annotations cover the destructive behavior, and an output schema exists. The description is therefore complete enough for correct invocation, though it could add a brief note about single-contact scope versus batch operations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 the 26 parameters, including modes, deprecated fields, action values, and contact_id requirements. The description adds no 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and the exact supported operations: create, update, or delete a contact. It also explains that it consolidates three older tools. It does not differentiate from current siblings such as manage_contacts_batch, 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the create/update/delete operations and the action parameter, but the description does not say when to choose this tool over manage_contacts_batch or other contact-related siblings. It also gives no prerequisites or exclusions.

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 GroupA
Destructive

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.

NameRequiredDescriptionDefault
nameNoThe group name. Required for "create" and "update" actions.
actionYesThe action to perform: "create", "update", "delete", or "modify_members".
group_idNoThe contact group ID. Required for "update", "delete", and "modify_members" actions.
add_contact_idsNoContact IDs to add (for "modify_members").
delete_contactsNoIf True and action is "delete", also delete contacts in the group (default: False).
user_google_emailYesThe user's Google email address. Required.
remove_contact_idsNoContact IDs to remove (for "modify_members").

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this is a mutating tool. The description adds value by enumerating the four distinct operations (create, update, delete, modify_members) and noting the delete_contacts parameter behavior. It doesn't contradict annotations and provides useful context about the consolidated nature of 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. The first sentence states the full scope of operations, and the second sentence names the legacy tools it replaces. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a consolidated CRUD tool: it lists all operations, names the replaced tools, and the schema covers all parameters with 100% coverage. The output schema exists, so return values are documented elsewhere. Minor gap: it doesn't mention prerequisites like needing an existing group for update/delete, but the schema's required fields partially cover this.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 7 parameters thoroughly. The description adds a high-level summary of what the tool does but doesn't add parameter-level detail beyond the schema. Baseline 3 is appropriate since the schema carries the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create, update, delete a contact group, or modify its members.' It also explicitly names the four legacy tools it replaces, which distinguishes it from siblings like manage_contact and list_contact_groups. This is a clear, consolidated tool definition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that this is a consolidated tool replacing four specific tools, which tells the agent when to use it instead of those alternatives. However, it doesn't explicitly state when not to use it or mention alternatives like manage_contact for individual contact operations. The context is clear but exclusions are not exhaustive.

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 BatchB
Destructive

Batch create, update, or delete contacts. Consolidated tool replacing batch_create_contacts, batch_update_contacts, and batch_delete_contacts.

NameRequiredDescriptionDefault
fieldNoFor "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.
actionYesThe action to perform: "create", "update", or "delete".
updatesNoList of update dicts for "update" action. Each dict must contain contact_id and may contain the same fields as contacts.
contactsNoList of contact dicts for "create" action. Each dict may contain: given_name, family_name, phones, emails, organizations, nicknames, urls, user_defined, relations, notes, address, birthday. Deprecated: phone, email, organization, job_title.
contact_idsNoList of contact IDs for "delete" action.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered externally. The description adds nothing behavioral beyond that: no statement that delete is permanent, no disclosure of partial-failure/atomicity semantics for a batch, no rate-limit or quota context. The only added information is the deprecation note about predecessor tool names.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the verb/resource and followed by the consolidation note. No filler. It is efficiently written, though the brevity is partly under-specification rather than pure economy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 6 parameters, three mutually exclusive payload arrays, and a destructive write surface, an agent still needs the description to clarify action-to-payload mapping and delete irreversibility. An output schema exists so return values needn't be explained, and annotations cover the read/write profile, which keeps this from being lower. Adequate but with clear gaps for a destructive batch tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including a detailed rationale on the required `field` parameter (single field per batch to avoid union updateMask data loss), so the schema carries the parameter burden. The description itself says nothing about which parameter belongs to which action, so it neither compensates nor detracts. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses a specific verb set (create/update/delete) on a specific resource (contacts) with the 'batch' scope qualifier, which separates it from sibling single-record tools like manage_contact, get_contact, and search_contacts. The mention of the three tools it replaces reinforces the batch identity. It stops short of naming a live sibling as the alternative route, so it lands at 4 rather than 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The three supported actions are enumerated, so the agent can infer that this is for doing one of those operations across many contacts. But there is no explicit when-to-use versus manage_contact (single contact) or list_contacts/search_contacts, and no note that exactly one of contacts/updates/contact_ids is required per action beyond what the schema implies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_deploymentManage DeploymentB
Destructive

Create, update, or delete Apps Script deployments.

NameRequiredDescriptionDefault
actionYesAction to perform - "create", "update", or "delete"
script_idYesThe script project ID
descriptionNoDeployment description (required for create; optional for update when version_number is supplied)
deployment_idNoThe deployment ID (required for update and delete)
version_numberNoVersion number to point the deployment at (for update only). Required to roll a deployment forward to a newly created script version.
user_google_emailYesUser's email address
version_descriptionNoOptional version description (for create only)

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered. The description adds no behavioral traits beyond what's in the schema: 'create, update, delete' simply mirrors the action parameter values. It fails to mention irreversibility of deletes, permission requirements, or dependency on existing deployments/versions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with zero filler. It efficiently communicates the core purpose without unnecessary details, making it easy for an agent to quickly grasp the tool's function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters, 3 required, and a destructive operation, the description is too sparse. It omits the deployment lifecycle context (e.g., creating a deployment typically requires a version, updating requires an existing deployment_id) and provides no guidance on how the parameters interact. The output schema covers return values, but the operational context is largely missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the parameter descriptions are detailed (e.g., deployment_id required for update/delete, description required for create). The tool description adds no additional parameter semantics, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's actions (create, update, delete) on a specific resource (Apps Script deployments). It distinguishes itself from siblings like list_script_deployments (read-only) and manage_script_version (version management) by directly naming the deployment resource and mutation verbs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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. It does not mention list_script_deployments for viewing deployments or manage_script_version for handling versions, leaving the agent to infer usage from the sibling names alone. There is no explicit when-to-use or when-not-to-use context.

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 TabB
Destructive

Manage document tabs: create, rename, delete, or populate from Markdown.

NameRequiredDescriptionDefault
indexNoPosition index for new tab, 0-based among siblings (required for create)
titleNoTab title (required for create; used by rename)
actionYesAction to perform - "create", "rename", "delete", or "populate_from_markdown"
tab_idNoTab ID (required for rename, delete, populate_from_markdown; use inspect_doc_structure to find IDs)
document_idYesID of the document
markdown_textNoMarkdown source to render (populate_from_markdown only)
parent_tab_idNoOptional parent tab ID to nest under (create only)
replace_existingNoClear tab body before inserting markdown (default True)
user_google_emailYesUser's Google email address

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false. The description lists destructive actions (delete) and creation, consistent with annotations, but adds no further behavioral context such as consequences of populate_from_markdown on existing content 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with no fluff, listing actions in a readable list. It is concise but borders on being a mere restatement of the title and action enum.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 9 parameters and 4 distinct actions, the description is too sparse. It does not explain when each action applies, how actions relate to required parameters, or how to obtain tab_id (though the schema hints at inspect_doc_structure). It relies entirely on the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 parameter-level information beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (document tabs) and enumerates four operations (create, rename, delete, populate from Markdown). It does not explicitly name a sibling tool, but the word 'document' makes it distinguishable from manage_sheet_tab.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like manage_sheet_tab or inspect_doc_structure. It does not mention prerequisites, exclusions, or scenarios for each action.

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 CommentC
Destructive

Manage comments on a Google Document.

NameRequiredDescriptionDefault
actionYes
comment_idNo
document_idYes
comment_contentNo
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this is a mutating operation. However, the description adds no context about what 'manage' entails, which actions are supported, or what gets destroyed when destructive actions are invoked.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence, so it is concise and front-loaded, but it provides almost no structured detail. It avoids waste but also fails to earn its place by conveying meaningful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. However, for a mutating tool with five parameters, an undefined action string, and destructive annotations, the description is far too incomplete to guide correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description says nothing about any of the five parameters. The critical 'action' parameter has no enum and no explanation, leaving the agent unable to determine valid actions or how comment_id and comment_content are used.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (comments on a Google Document) but uses the vague verb 'Manage', which could mean create, edit, delete, or resolve. It does not distinguish this tool from the sibling list_document_comments, which handles the read-only listing case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 list_document_comments or other comment-related tools. The description also omits any prerequisites or conditions under which the tool should be selected.

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 AccessB
Destructive

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.

NameRequiredDescriptionDefault
roleNoPermission role -- 'reader', 'commenter', or 'writer'. Used by "grant" (defaults to 'reader') and "update".
actionYesThe 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_idYesThe ID of the file or folder. Required.
recipientsNoList 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_typeNoType of sharing -- 'user', 'group', 'domain', or 'anyone'. Used by "grant". Defaults to 'user'.user
share_withNoEmail address (user/group), domain name (domain), or omit for 'anyone'. Used by "grant".
email_messageNoCustom notification email message. Used by "grant" and "grant_batch".
permission_idNoThe permission ID to modify or remove. Required for "update" and "revoke" actions.
expiration_timeNoExpiration in RFC 3339 format (e.g., "2025-01-15T00:00:00Z"). Used by "grant" and "update".
new_owner_emailNoEmail of the new owner. Required for "transfer_owner".
send_notificationNoWhether to send notification emails. Defaults to True. Used by "grant" and "grant_batch".
user_google_emailYesThe user's Google email address. Required.
allow_file_discoveryNoFor 'domain'/'anyone' shares, whether the file appears in search. Used by "grant".
move_to_new_owners_rootNoMove file to the new owner's My Drive root. Defaults to False. Used by "transfer_owner".

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already carry destructiveHint=true and readOnlyHint=false, and the description adds the concrete destructive operations (revoke, transfer ownership). It does not disclose additional behavioral context such as notification emails being sent by default or ownership transfer 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with the main purpose front-loaded. 'Consolidated' and 'single entry point' are somewhat redundant, but the description remains economical and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema and output schema are rich, so the description does not need to repeat machinery. However, for a 14-parameter tool with five distinct actions, the description could better orient the agent on action-specific required fields and potential side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 no parameter-level meaning beyond the schema, such as action-to-parameter dependencies or defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies a resource (Google Drive file and folder access permissions) and specific actions (grant, batch-grant, update, revoke, transfer ownership). It is more than a tautology, though it does not explicitly distinguish itself from the similarly-scoped sibling set_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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Consolidated tool' and 'all through a single entry point' implies this is the go-to for Drive permission operations. However, it gives no explicit when-to-use or when-not-to-use guidance, and it names no alternatives despite the existence of overlapping sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_eventManage EventC
Destructive

Manages calendar events. Supports creating, updating, deleting, and RSVP.

NameRequiredDescriptionDefault
actionYesAction to perform - "create", "update", "delete", or "rsvp".
summaryNoEvent title (required for create).
color_idNoEvent color, by name or ID: lavender (1), sage (2), grape (3), flamingo (4), banana (5), tangerine (6), peacock (7), graphite (8), blueberry (9), basil (10), tomato (11).
end_timeNoEnd time (required for create). An RFC3339 UTC offset identifies the exact instant and is preserved. Without an offset, supply end_timezone or timezone. All-day end dates are exclusive.
event_idNoEvent ID (required for update and delete).
locationNoEvent location.
responseNoRSVP response — "accepted", "declined", "tentative", or "needsAction" (rsvp action only).
timezoneNoIANA timezone applied to both boundaries (e.g., "America/New_York"). Converts offset-bearing timestamps without changing their instant; interprets offset-free timestamps as local times in this zone. Overridden per boundary by start_timezone/end_timezone.
attendeesNoAttendee email addresses, attendee objects (e.g. {"email": ..., "responseStatus": "accepted"}), or a mix of both.
remindersNoCustom reminder objects.
recurrenceNoRFC5545 recurrence rules for a recurring event, e.g. ["RRULE:FREQ=WEEKLY;COUNT=10"].
start_timeNoStart time (required for create). An RFC3339 UTC offset identifies the exact instant and is preserved. Without an offset, supply start_timezone or timezone. For a local wall-clock time, omit the offset and pass the zone so Google resolves daylight saving; a wrong offset moves the event. Date-only values create all-day events.
visibilityNo"default", "public", "private", or "confidential".
attachmentsNoList 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_idNoCalendar ID (default: 'primary').primary
descriptionNoEvent description.
end_timezoneNoIANA timezone for the end boundary only, overriding timezone. See start_timezone.
rsvp_commentNoOptional message to include with the RSVP response (rsvp action only).
send_updatesNoNotification behavior for create, update, delete, and rsvp — "all" (default), "externalOnly", or "none".
transparencyNo"opaque" (busy) or "transparent" (free).
conference_idNoOptional provider-side conference/meeting ID.
conference_uriNoJoin URL for the third-party conference (e.g. "https://zoom.us/j/123456789"). Required when conference_provider is set.
start_timezoneNoIANA 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. Explicit timestamp offsets always preserve the instant, even when the zone differs.
add_google_meetNoWhether to add/remove native Google Meet.
conference_dataNoRaw 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_modifyNoWhether attendees can modify.
user_google_emailYesThe user's Google email address. Required.
this_and_followingNoUpdate only. With event_id set to a recurring instance ID, applies the change to that instance and every later one by ending the original series before it and starting a new series there; earlier instances are kept. Updating the series ID instead changes every instance, and moving its start or recurrence drops past instances that no longer match. Defaults to False.
conference_passcodeNoOptional passcode for the third-party conference.
conference_providerNoHigher-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_remindersNoWhether to use default reminders.
guests_can_invite_othersNoWhether attendees can invite others.
guests_can_see_other_guestsNoWhether attendees can see other guests.

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and openWorldHint=true; the description adds nothing about what delete destroys, whether updates replace or patch fields, or that send_updates defaults to notifying all attendees. For a multi-action write tool with a destructive operation, the silence on side effects and reversibility is a real gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler, so it is concise. However, the limited space is spent restating the tool name rather than front-loading actionable constraints such as action-conditional requirements.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This one tool multiplexes four operations across 33 parameters, with an output schema and annotations present, yet the description never maps parameters to actions or warns about the destructive and notification side effects. An agent could call it, but not confidently for anything beyond create.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so per-parameter meaning is fully documented there and the baseline is 3. The description contributes no additional parameter guidance, e.g., which parameters are required or ignored for each action.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (calendar events) and enumerates the four supported operations, but leads with the vague verb "Manages". It never distinguishes this tool from the sibling read tool get_events, leaving the agent to infer that this one is for writes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description lists the actions available but gives no guidance on when to choose this tool over get_events for retrieval, or what state must exist before update/delete/rsvp. Nothing is said about prerequisites such as needing an existing event_id or the fact that the action is the routing key for the other 31 parameters.

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 TimeA
Destructive

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.

NameRequiredDescriptionDefault
actionYesAction to perform - "create", "list", "update", or "delete".
summaryNoDisplay text on the calendar. Defaults to "Focus Time".
end_timeNoEnd 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_idNoEvent ID. Required for "update" and "delete" actions.
time_maxNoFor "list" action: end of time range.
time_minNoFor "list" action: start of time range. Defaults to current time. Recurring series are expanded into individual instances in the requested range.
timezoneNoTimezone for the event (e.g., "America/New_York", "Europe/London"). Required when using date-only values or dateTime values without an explicit UTC offset.
page_tokenNoFor "list" action: token for the next page, taken from a previous response. Also pass the response's Pagination time_min as time_min, even if omitted on the first call. Keep all other query parameters unchanged.
recurrenceNoRFC5545 recurrence rules for a recurring Focus Time series, e.g. ["RRULE:FREQ=WEEKLY;COUNT=10"].
start_timeNoStart 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_idNoCalendar 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_statusNoGoogle Chat status during the focus time. Supports "doNotDisturb" (default) and "available".
descriptionNoEvent description. Useful for adding context about what the focus time is for.
max_resultsNoFor "list" action: maximum events to return in one page. Defaults to 10.
decline_messageNoMessage included when auto-declining invitations.
auto_decline_modeNoHow to handle conflicting invitations. One of: "declineAllConflictingInvitations" (default), "declineOnlyNewConflictingInvitations", "declineNone".
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=true, so the safety profile is covered. The description adds genuine behavioral context beyond that: these events auto-decline conflicting invitations and default the user's chat status to Do Not Disturb — side effects on the user's calendar and Chat presence that no structured field announces. It stops short of warning what a delete action destroys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero filler, front-loaded on the resource and then its distinguishing behavior. For a 17-parameter, four-action, destructive tool it is on the thin side, but nothing is redundant or buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained. However, a destructive multi-action tool with 17 parameters deserves at least action-level framing and a pointer to manage_event for ordinary events, and neither is present. Adequate but with clear gaps for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across 17 parameters, so the schema carries the parameter burden and baseline is 3. The description adds only lightly, implying the defaults that auto_decline_mode and chat_status control ("by default, set the user's chat status to Do Not Disturb") and confirming auto-decline behavior, but gives no per-action parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Manages Focus Time events on Google Calendar") and immediately differentiates the resource from ordinary events by describing its special auto-decline and DND behavior. It never names the siblings it must be distinguished from (manage_event, manage_out_of_office), so an agent still has to infer that general events belong elsewhere.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains what a Focus Time event is and why a user would want one, which implies the usage context. But it gives no when-to-use/when-not-to-use guidance relative to manage_event or manage_out_of_office, and it never mentions the create/list/update/delete action modes the tool actually exposes. Usage is inferred 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_gmail_filterManage Gmail FilterA
Destructive

Manages Gmail filters: create, delete, update, and apply to existing mail.

  • update: Gmail has no filter update API, so the filter is recreated (new one first, then the old one is deleted) and its ID changes. A passed criteria or filter_action replaces that whole object; omit one to keep the old filter's.

  • apply: runs a filter's label actions on mail ALREADY in the mailbox (Gmail filters only act on new mail). Only matching messages change, not whole conversations as in the web UI. Use filter_id, or criteria + filter_action for an ad-hoc run. Forwarding is never applied. Use dry_run=true first to see the search query and the match count. Needs the gmail.modify scope in addition to gmail.settings.basic.

NameRequiredDescriptionDefault
actionYes"create", "delete", "update" or "apply".
dry_runNoapply only: count matches without changing anything.
criteriaNoFilter criteria object (required for create; optional for update/apply).
filter_idNoID of the filter (required for delete and update; optional for apply).
max_messagesNoapply only: safety cap on messages changed (default 5000).
filter_actionNoFilter action object (required for create; optional for update/apply). Named 'filter_action' to avoid shadowing the 'action' parameter.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing that update deletes and recreates the filter (changing its ID), that criteria/filter_action replace whole objects, that apply affects only matching messages rather than whole conversations, that forwarding is never applied, and that gmail.modify scope is required in addition to gmail.settings.basic. These are exactly the destructive, non-idempotent behaviors the annotations hint at but do not explain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose in one sentence and then uses tight, well-scoped bullets for the two nuanced actions. Every sentence carries decision-relevant information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, multi-action tool with nested objects and an output schema, the description supplies the non-obvious operational details (ID change on update, apply scope, dry_run, extra OAuth scope) an agent needs. Return-value details are correctly left to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains replacement semantics for criteria/filter_action during update and how to use filter_id vs. criteria + filter_action for an ad-hoc apply. It does not expand on max_messages or the non-apply actions, keeping it from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Manages Gmail filters') and enumerates all four operations (create, delete, update, apply), letting an agent distinguish it from read-only siblings like list_gmail_filters 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational context: update recreates because Gmail has no update API, apply is for mail already in the mailbox, and dry_run should be used first. It does not explicitly name sibling alternatives or state when not to use this tool, so it falls 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.

manage_gmail_labelManage Gmail LabelA
Destructive

Manages Gmail labels: create, update, or delete labels.

NameRequiredDescriptionDefault
nameNoLabel name. Required for create, optional for update.
actionYesAction to perform on the label.
label_idNoLabel ID. Required for update and delete operations.
text_colorNoLabel 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_colorNoOn update, remove the label's current color. Cannot be combined with background_color or text_color.
background_colorNoLabel 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_emailYesThe user's Google email address. Required.
label_list_visibilityNoWhether the label is shown in the label list. Defaults to "labelShow" on create. On update, omitting it keeps the label's current setting.
message_list_visibilityNoWhether the label's messages are shown in the message list. Defaults to "show" on create. On update, omitting it keeps the label's current setting.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=false, so the description adds little behavioral context. It repeats the operation types already present in the action enum but does not disclose side effects (e.g., deleting a label removes it from messages) or constraints (e.g., color pairing requirements) that are not already in the schema. With annotations covering the safety profile, the description's added value is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the resource and operations. It contains no filler and every word contributes to understanding the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is minimal, but the schema and annotations collectively cover the details: all parameters are described, destructive behavior is annotated, and an output schema exists. The description lacks explicit guidance on when not to use it, but given the richness of structured data, it is adequate though not exemplary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the parameter descriptions are exceptionally detailed (e.g., background_color explains the Gmail palette restriction and pairing requirement). The tool description adds no parameter information beyond what the schema provides. According to the rubric, a baseline of 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('manages') and resource ('Gmail labels'), and explicitly enumerates the three operations (create, update, delete). This clearly distinguishes it from siblings like list_gmail_labels (which lists) and manage_gmail_filter (which manages filters). It is not a tautology and conveys the tool's core function unambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage – an agent can infer it is for creating/updating/deleting labels, not for listing them. However, it does not explicitly mention when not to use this tool or point to alternatives (e.g., 'to list labels, use list_gmail_labels'). The guidance is implied rather than explicit, so it falls short of a 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_named_rangeManage Named RangeA
Destructive

Manages the lifecycle of named ranges in a Google Sheet: list, create, update, or delete.

NameRequiredDescriptionDefault
nameNoName for the named range (required for "create"; optional identifier for "update"/"delete").
actionYesThe operation to perform: "list", "create", "update", or "delete". Required.
new_nameNoNew name for the named range (used with action="update").
new_rangeNoNew A1-style range for the named range (used with action="update").
range_nameNoTarget cell or range in A1 notation (e.g., "Sheet1!A1:D10", "A1:B5") (required for "create").
named_range_idNoThe ID of the named range (optional identifier for "update"/"delete").
spreadsheet_idYesThe ID of the spreadsheet. Required.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool as mutating and destructive (readOnlyHint=false, destructiveHint=true), and the description's mention of delete is consistent. However, the description adds no further behavioral context such as irreversibility, permission requirements, or potential side effects on formulas or references.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence that front-loads the resource and verb, then efficiently enumerates the supported operations. There is no filler or redundant restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an eight-parameter, four-action tool, the description leaves action-specific parameter orchestration entirely to the schema. While the schema and output schema cover much of the needed detail, the description does not clarify identifier selection for update/delete or call out any action-specific constraints, making it incomplete for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each parameter already has a meaningful explanation tying it to specific actions. The description itself adds no parameter-level detail, and a remaining ambiguity is that both name and named_range_id are described as optional identifiers for update/delete without clarifying precedence.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource, 'manages the lifecycle of named ranges in a Google Sheet,' and explicitly lists the four operations: list, create, update, or delete. This clearly distinguishes it from sibling sheet tools like read_sheet_values or manage_sheet_tab.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool by naming named ranges as the resource, but it provides no explicit when-to-use guidance, prerequisites, or alternatives. An agent can infer the context, but there are no exclusions or comparisons to related sheet management tools.

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 OfficeA
Destructive

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.

NameRequiredDescriptionDefault
actionYesAction to perform - "create", "list", "update", or "delete".
summaryNoDisplay text on the calendar. Defaults to "Out of Office".
end_timeNoEnd 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_idNoEvent ID. Required for "update" and "delete" actions.
time_maxNoFor "list" action: end of time range.
time_minNoFor "list" action: start of time range. Defaults to current time. Recurring series are expanded into individual instances in the requested range.
timezoneNoTimezone for the event (e.g., "America/New_York", "Europe/London"). Required when using date-only values or dateTime values without an explicit UTC offset.
page_tokenNoFor "list" action: token for the next page, taken from a previous response. Also pass the response's Pagination time_min as time_min, even if omitted on the first call. Keep all other query parameters unchanged.
recurrenceNoRFC5545 recurrence rules for a recurring Out of Office series, e.g. ["RRULE:FREQ=WEEKLY;COUNT=10"].
start_timeNoStart 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_idNoCalendar 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_resultsNoFor "list" action: maximum events to return in one page. Defaults to 10.
decline_messageNoMessage included when auto-declining invitations.
auto_decline_modeNoHow to handle conflicting invitations. One of: "declineAllConflictingInvitations" (default), "declineOnlyNewConflictingInvitations", "declineNone".
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and openWorldHint=true, so the description earns credit for adding genuinely new behavior: OOO events auto-decline invitations and propagate a status across Google Workspace. It stops short of stating that deletes/updates are irreversible or what permissions are needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two front-loaded sentences with zero filler. The distinguishing behavior comes immediately after the purpose statement rather than being buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, annotations covering safety, and exhaustive parameter documentation, the description covers what an agent needs to know conceptually. The one gap is that it never signals this single tool multiplexes four CRUD actions, though the required 'action' parameter makes that discoverable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, including per-action requirements, defaults, timezone rules and pagination mechanics, so the description does not need to restate parameters. It adds nothing beyond the schema, which puts it at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Manages Out of Office events on Google Calendar') and immediately explains what makes them a distinct resource type: auto-declining invitations and Workspace-wide status. This implicitly separates it from manage_event, but no sibling is named, so an agent must infer the routing themselves.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the nature of the resource; there is no explicit guidance on when to pick this over manage_event for a regular calendar event, nor exclusions for users without OOO support. The agent can guess when it's appropriate but gets no stated decision rule.

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 CommentC
Destructive

Manage comments on a Google Presentation.

NameRequiredDescriptionDefault
actionYes
comment_idNo
comment_contentNo
presentation_idYes
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the danger profile is known from structure. The description adds nothing on top: it does not say which actions are destructive, whether deletions are reversible, or what permissions the user_google_email must hold.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single short sentence, so there is no padding, but its brevity reflects under-specification rather than disciplined editing. Nothing is front-loaded beyond the barest restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists, the input side is unusable: a required "action" parameter with zero documented values alongside a 0% coverage schema. For a destructive, non-idempotent mutation tool, the description is fundamentally incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and there are five parameters, including a required free-form "action" string with no enum. The description supplies no meaning for action, comment_id, or comment_content, so an agent cannot determine valid values or how parameters relate to one another.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The name and description combine a verb ("manage") with a resource (comments on a Google Presentation), which is enough to distinguish it from manage_document_comment and manage_spreadsheet_comment. However "manage" is a catch-all that leaves the actual operations (create/edit/delete/resolve) unspecified, so the purpose is only implied.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 versus list_presentation_comments, which sits right next to it in the sibling list. Nothing indicates whether this tool creates, edits, deletes, or resolves comments, or what preconditions must hold.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_script_contentManage Script ContentA
Destructive

Update the source files of an Apps Script project.

NameRequiredDescriptionDefault
filesNoFile objects with name, type, and source to create or update (required for update).
mergeNoWhen True (default), overlay `files` onto the current project. When False, replace the full project file set (update only).
actionYes"update".
script_idYesThe script project ID.
user_google_emailYesUser's email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already communicate that this is mutating and destructive (readOnlyHint=false, destructiveHint=true), so the description is consistent with them. It adds no extra behavioral context such as overwriting/deleting files when merge=false, though the schema's merge parameter documents that behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single direct sentence that opens with the action verb and has no filler or repetition. Given that parameter details are carried by the schema, this brevity is appropriate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With full schema coverage, a rich merge parameter description, output schema, and annotations covering destructiveness, the short description is mostly sufficient for correct selection and invocation. It could be even stronger by explicitly contrasting with related script-management tools, but that is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 parameters, including the merge overwrite semantics. The description's generic 'source files' wording adds little beyond what the file-object description already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Update') and a concrete resource ('source files of an Apps Script project'), so an agent can tell this is for modifying script content rather than metadata. The resource wording also distinguishes it from script-management siblings such as manage_script_project and get_script_project.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states the context for use: call this when source files of an Apps Script project need to be updated. It does not name alternatives or state when not to use it, so it stops just short of explicit routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_script_projectManage Script ProjectC
Destructive

Create or delete an Apps Script project.

NameRequiredDescriptionDefault
titleNo
actionYes
parent_idNo
script_idNo
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, openWorldHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds nothing beyond that: no mention of whether deletion is recoverable, what permissions are needed, or what side effects attach to each action — meaningful gaps for a destructive, non-idempotent tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single sentence is front-loaded and free of waste, but its brevity comes from under-specification rather than discipline — there is essentially one clause of content for a five-parameter destructive tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained. However, with two required parameters, an untyped 'action' discriminator, and a destructive hint, the definition omits the action vocabulary and per-action parameter requirements that an agent needs to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across five parameters with no enums, so the description carries the full burden. It names no parameter at all; only weak inference links 'create' to title/parent_id and 'delete' to script_id, and valid values for action remain completely undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb pair and resource ('Create or delete an Apps Script project'), which usefully narrows the vague 'manage' in the name to two operations. It does not explain how the two behaviors relate or how they are selected, and gives no differentiation against close siblings like get_script_project or manage_script_content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 versus get_script_project or the other script-management siblings, and no indication of which parameter set corresponds to create versus delete. The agent must infer everything from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_script_triggerManage Script TriggerA
Destructive

List or delete the current user's installable triggers on a script project.

The Apps Script REST API has no triggers resource, so in dev_mode both actions provision (or refresh) a small helper file and run it via the Execution API - the only way to inspect or change trigger state without opening the editor. Neither action is read-only: the helper file may be written into the project on first use. To create a trigger, use generate_trigger_code to produce the setup code, add it with manage_script_content, then run it with run_script_function.

NameRequiredDescriptionDefault
actionYesOne of "list", "delete".
dev_modeNoRun against the latest saved code (default; project owner only) vs. the deployed version. False requires the helper to already exist in the deployed version.
script_idYesThe script project ID.
trigger_idNoUnique ID of a specific trigger to delete (delete only).
deployment_idNoOptional API Executable deployment ID. When omitted, the highest versioned API Executable deployment is used.
handler_functionNoDelete all triggers calling this function name (delete only).
user_google_emailYesUser's email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that both actions are not read-only and may write a helper file into the project, which goes beyond the annotations (destructiveHint=true) by specifying the exact side effect. It also explains the mechanism (helper file via Execution API), giving agents critical awareness of state changes even for a 'list' action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then provides necessary context about the mechanism and creation alternative. Each sentence serves a purpose, though the middle paragraph could be tightened slightly; still, it's well-structured and not redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, output schema, annotations), the description covers the key behavioral quirks (helper file, non-read-only nature) and routes creation appropriately. It doesn't explicitly detail return values, but an output schema exists, and the schema covers parameter requirements. Slightly more could be said about error cases or deployment specifics, but overall it's complete for an agent to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter already has a clear description (e.g., action, dev_mode, trigger_id). The description adds general context about dev_mode behavior but doesn't add per-parameter meaning beyond what the schema provides. Baseline 3 is appropriate for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb+resource: 'List or delete the current user's installable triggers on a script project.' It distinguishes from siblings by explicitly naming the creation path via generate_trigger_code, manage_script_content, and run_script_function, so an agent can tell this tool handles list/delete only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly directs when not to use this tool: 'To create a trigger, use generate_trigger_code ... then run it with run_script_function.' This provides clear alternative routing and explains the dev_mode provisioning mechanism, leaving no ambiguity about when to invoke this tool versus its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_script_versionManage Script VersionA

Create immutable version snapshots of a script project.

Versions capture a snapshot of the current script code; once created they cannot be modified.

NameRequiredDescriptionDefault
actionYes"create".
script_idYesThe script project ID.
descriptionNoOptional description for the new version (create only).
user_google_emailYesUser's email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is a non-read, non-idempotent, non-destructive operation. The description adds useful behavioral context by stating versions are immutable and cannot be modified after creation. However, it does not disclose output behavior, error conditions, or any side effects beyond version creation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with no filler. The primary action is front-loaded, and the immutability caveat is placed in a separate clarifying sentence. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the schema coverage, output schema presence, and annotations, the description is largely sufficient for a simple create-version tool. It clearly states what is captured and the immutability constraint. Minor missing context includes when to prefer this over related version/script management tools, but this is more of a usage guideline gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 adds no additional parameter-level meaning beyond confirming that the action is 'create,' which matches the schema's action description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'Create immutable version snapshots of a script project.' It also clarifies the core behavior—capturing a snapshot of current script code—and distinguishes itself from read-oriented siblings like get_script_version.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 alternatives such as get_script_version, manage_script_content, or manage_script_project. The description implies a create operation but does not state exclusions or conditions that would route an agent to the correct sibling.

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 TabA
Destructive

Manages an existing sheet tab: rename, delete, hide, unhide, reorder, or style (tab color and gridlines).

Use create_sheet to add a tab, and resize_sheet_dimensions for row and column level changes. This tool operates on the tab itself.

NameRequiredDescriptionDefault
actionYesOne of "rename", "delete", "hide", "unhide", "reorder", "style"
new_nameNoNew title, required for action="rename"
new_indexNoNew zero-based position, required for action="reorder"
tab_colorNoFor action="style": hex tab color (#RRGGBB), or "none" to remove it
sheet_nameYesTitle of the existing tab to act on
show_gridlinesNoFor action="style": show (True) or hide (False) the sheet's gridlines
spreadsheet_idYesID of the spreadsheet
user_google_emailYesUser's Google email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare destructiveHint=true, openWorldHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is structured. The description adds scope by saying it operates on the tab itself, but it does not explain what delete destroys, whether actions are reversible, or what permissions are required.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core operation list and followed by focused sibling disambiguation. Every sentence carries useful routing or scope information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, output schema, and annotations, the description is mostly complete for selecting and invoking the tool. The main remaining gap is action-specific behavioral detail around destructive deletes and permission constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents the action enum and conditional requirements such as new_name for rename and new_index for reorder. The description names the actions but does not add parameter-level semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource (an existing sheet tab) and enumerates the supported operations: rename, delete, hide, unhide, reorder, and style. It clearly distinguishes this tool from create_sheet and resize_sheet_dimensions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes the agent to create_sheet for adding tabs and resize_sheet_dimensions for row/column changes, while clarifying that this tool operates on the tab itself. It lacks only edge-case exclusions, such as when specific actions may be invalid.

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 CommentC
Destructive

Manage comments on a Google Spreadsheet.

NameRequiredDescriptionDefault
cellNo
actionYes
comment_idNo
spreadsheet_idYes
comment_contentNo
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose destructiveHint=true, openWorldHint=true, and idempotentHint=false, so the safety profile is partly covered. However, the description adds nothing beyond the title — it does not say which actions are destructive, whether deletes are permanent, or what authentication setup is needed for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single sentence is short but not concise in the useful sense — it is under-specified rather than economical. There is no front-loaded actionable detail for an agent to act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter destructive mutation tool with 0% schema coverage, the description is drastically incomplete. It fails to enumerate the actions (likely add/update/delete/resolve), the required parameter pairings, or any behavioral context beyond what the annotations already state.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% with 6 parameters (action, cell, comment_id, comment_content, spreadsheet_id, user_google_email) and no enums. The description provides zero compensation: it never explains valid 'action' values, which parameters pair with which action, or what 'cell' format is expected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb 'manage' is vague and does not specify whether this creates, edits, deletes, or resolves comments, so an agent cannot predict the concrete operation. It does at least identify the resource (spreadsheet comments) and implicitly contrasts with the sibling list_spreadsheet_comments by signaling a mutating operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 list_spreadsheet_comments or manage_document_comment/manage_presentation_comment. No prerequisites, no mention of the required 'action' semantics, and no exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_taskManage TaskA
Destructive

Manage tasks: create, update, delete, or move tasks within task lists.

NameRequiredDescriptionDefault
dueNoDue date in RFC 3339 format (e.g., "2024-12-31T23:59:59Z"). Used by "create" and "update" actions.
notesNoNotes/description for the task. Used by "create" and "update" actions.
titleNoThe title of the task. Required for "create", optional for "update".
actionYesThe action to perform. Must be one of: "create", "update", "delete", "move".
parentNoParent task ID (for subtasks). Used by "create" and "move" actions.
statusNoTask status ("needsAction" or "completed"). Used by "update" action.
task_idNoThe ID of the task. Required for "update", "delete", and "move" actions.
previousNoPrevious sibling task ID (for positioning). Used by "create" and "move" actions.
task_list_idYesThe ID of the task list. Required for all actions.
user_google_emailYesThe user's Google email address. Required.
destination_task_listNoDestination task list ID (for moving between lists). Used by "move" action.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the bar for extra disclosure is lower. The description adds the operation set, but most of that detail is also in the schema's action parameter. It does not disclose additional consequences (e.g., whether delete is permanent, how move affects position), though annotations mitigate the safety gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one efficient sentence, front-loading the resource and all key operations. It wastes no words and is easy to scan, making it highly usable for an agent quickly assessing the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is complex (11 parameters, 4 action modes), but the schema is exhaustive and an output schema exists. The description provides the high-level operation overview while the schema and annotations supply detailed constraints, so nothing critical is missing for invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 meaning beyond the schema; each parameter is already thoroughly documented with per-action usage notes (e.g., 'Used by "create" and "update"'). No additional semantic value is contributed by the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the resource ('tasks') and enumerates four concrete actions ('create, update, delete, or move tasks within task lists'), which clearly distinguishes it from siblings like 'list_tasks' or 'get_task'. It goes beyond a generic verb by naming the specific operations, making the tool's scope immediately obvious.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly conveys the tool is for mutating tasks (create/update/delete/move), implying it should be used over read-only alternatives such as 'list_tasks' and 'get_task'. It does not explicitly name those alternatives or say when not to use this tool, so it falls short of a 5, but the action list provides clear usage context.

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 ListB
Destructive

Manage task lists: create, update, delete, or clear completed tasks.

NameRequiredDescriptionDefault
titleNoThe title for the task list. Required for "create" and "update" actions.
actionYesThe action to perform. Must be one of: "create", "update", "delete", "clear_completed".
task_list_idNoThe ID of the task list. Required for "update", "delete", and "clear_completed" actions.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the agent knows this is a mutating, potentially destructive operation. The description adds the specific actions, including 'clear completed tasks,' which implies destructive behavior. However, it doesn't disclose details like whether delete is permanent, whether clear_completed is irreversible, or any side effects. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the verb and resource, then lists the four actions compactly. It earns its place with no filler. It could be slightly more structured (e.g., separating the action list), but it's efficient and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 values are covered elsewhere. The description plus schema covers the four actions and their required parameters. However, it lacks guidance on edge cases like what happens when title is provided for delete/clear_completed, or whether update requires both title and task_list_id. Given the tool's moderate complexity and the presence of annotations and output schema, the description is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters, including which are required for which actions. The description adds no additional parameter-level meaning beyond the action list, which is already in the schema's enum-like description. Baseline 3 is correct when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb ('Manage') and resource ('task lists') and enumerates the four actions: create, update, delete, or clear completed tasks. It distinguishes itself from sibling tools like list_task_lists, list_tasks, and manage_task by focusing on the task list level rather than individual tasks. However, it doesn't explicitly name a sibling or contrast itself, so it's clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by listing the actions, and the schema's required parameters and per-action requirements provide some guidance. However, there is no explicit statement about when to use this tool versus alternatives like manage_task or list_task_lists, and no mention of prerequisites (e.g., needing an existing task list ID for update/delete/clear_completed). The context is adequate but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_doc_textModify Doc TextA
Destructive

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.

HEADING MODE: Pass heading instead of start_index to edit the body below a heading, up to the next heading of equal or shallower level. text is rendered as Markdown and replaces that body; end_of_segment=true appends instead. Formatting parameters without text format the whole body.

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".

NameRequiredDescriptionDefault
boldNoWhether to make text bold (True/False/None to leave unchanged)
textNoNew text to insert or replace with (optional - can format existing text without changing it). Rendered as Markdown when heading is set.
italicNoWhether to make text italic (True/False/None to leave unchanged)
tab_idNoOptional document tab ID to target (required with heading when the doc has multiple tabs)
headingNoText of a body heading (case-insensitive, must match exactly one) whose section to edit instead of start_index/end_index
link_urlNoHyperlink URL (http/https)
end_indexNoEnd position for text replacement/formatting (if not provided with text, text is inserted)
font_sizeNoFont size in points
underlineNoWhether to underline text (True/False/None to leave unchanged)
clear_linkNoRemove hyperlink from the target range
segment_idNoOptional header/footer/footnote segment ID to target
small_capsNoWhether to apply small caps
text_colorNoForeground text color (#RRGGBB)
document_idYesID of the document to update
font_familyNoFont family name (e.g., "Arial", "Times New Roman")
font_weightNoFont weight (100-900 in steps of 100; requires font_family)
start_indexNoStart 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. Required unless heading is set.
heading_levelNoOptional 1-6 heading level to narrow the heading match
strikethroughNoWhether to strike through text (True/False/None to leave unchanged)
end_of_segmentNoInsert text at the end of the targeted segment instead of start_index
baseline_offsetNoOne of NONE, SUPERSCRIPT, SUBSCRIPT
background_colorNoBackground/highlight color (#RRGGBB)
user_google_emailYesUser's Google email address

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses meaningful behavior beyond the annotations: heading mode replaces the matched heading body, end_of_segment appends instead, text is Markdown-rendered in heading mode, and formatting parameters without text format the whole body. The annotations already cover the destructive/write nature, but the description adds little about permissions, reversibility, or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core operation and then organized into targeted mode-specific guidance, making it easy for an agent to scan. It is appropriately sized for a 23-parameter tool, though a few sentences could be slightly tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, destructive document mutation tool with 23 parameters and an output schema, the description covers the main editing modes and a significant segment_id pitfall. It is largely complete, though it leaves some edge-case interactions unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 cross-parameter semantics: heading replaces start_index, segment_id should only be passed with a real ID from inspect_doc_structure, and end_of_segment avoids index calculation. It does not explain every formatting parameter, but those 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it modifies text in a Google Doc, including insert/replace operations and formatting in one call. It also distinguishes the heading-based editing mode and names update_doc_headers_footers as the preferred alternative for header/footer text, so an agent can separate it from key siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit operational guidance: use end_of_segment to append without index math, use heading mode instead of start_index to edit a heading section, and prefer update_doc_headers_footers for ordinary header/footer edits. It does not fully position the tool against all other document-mutation siblings such as find_and_replace_doc or batch_update_doc, which keeps it from a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_gmail_message_labelsModify Gmail Message LabelsA
Destructive

Adds or removes labels from a Gmail message. To archive an email, remove the INBOX label. To delete an email, add the TRASH label.

NameRequiredDescriptionDefault
message_idYesThe ID of the message to modify.
add_label_idsNoList of label IDs to add to the message.
remove_label_idsNoList of label IDs to remove from the message.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ValuesB
Destructive

Modifies values in a specific range of a Google Sheet - can write, update, or clear values, or insert Smart Chips (Drive files/folders or People).

NameRequiredDescriptionDefault
chipsNoSmart chip(s) to insert instead of values: - A single URL or email string for a single cell (e.g., "https://drive.google.com/drive/folders/123", "user@example.com"). - A list of URLs or emails for a single cell (multiple chips) or across cells (e.g., ["https://...", "https://..."]). - A 2D list of URLs/emails matching a grid range. For a single-row or single-column range, each inner list is instead the chips for one cell (e.g., [["a@x.com", "b@x.com"]] puts both chips in the first cell of "A1:C1"). - A dict or list of dicts with explicit properties (e.g., {"type": "drive", "uri": "..."}, {"type": "person", "email": "..."}). - A JSON-encoded string representing any of the above formats.
valuesNo2D array of values to write/update. Can be a JSON string or Python list. Required unless clear_values=True or chips is provided.
chip_typeNoExplicit chip type if passing raw strings in chips: "drive" (default for URLs/IDs) or "person" (default for emails).
range_nameYesThe range to modify (e.g., "Sheet1!A1:D10", "A1:D10"). Required.
clear_valuesNoIf True, clears the range instead of writing values. Defaults to False.
spreadsheet_idYesThe ID of the spreadsheet. Required.
user_google_emailYesThe user's Google email address. Required.
value_input_optionNoHow to interpret input values ("RAW" or "USER_ENTERED"). Defaults to "USER_ENTERED".USER_ENTERED

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, covering the safety profile. The description usefully adds that the tool can clear values or insert Smart Chips, but does not state that writes overwrite existing range content, what permissions are required, or how value_input_option affects results. Adds modest context on top of annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence covering the operation set; appropriately sized with no filler. The comma/em-dash chain is slightly run-on but every clause carries meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and the input schema is fully documented, so return and parameter details are covered elsewhere. What is missing is the mutation context an agent needs — when to choose this over append_table_rows and what happens to existing values — leaving the definition minimally adequate for an 8-parameter destructive write tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 8 parameters, including chips format examples and value_input_option. The description adds nothing about parameters beyond what is in 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (modifies) and resource (values in a range of a Google Sheet) and enumerates the supported operations (write, update, clear, insert Smart Chips). It distinguishes itself implicitly from read-only siblings like read_sheet_values, but never explicitly names which sibling to prefer over append_table_rows or format_sheet_range.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says what the tool can do but gives no when-to-use guidance, no prerequisites, and no alternatives (e.g. append_table_rows for adding rows, format_sheet_range for styling). The agent must infer selection from the capability list alone.

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 RowsA
Destructive

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).

NameRequiredDescriptionDefault
end_rowYesLast row to move (1-based, inclusive). Required.
start_rowYesFirst row to move (1-based, inclusive). Required.
source_sheetYesName of the sheet to move rows from. Required.
spreadsheet_idYesThe ID of the spreadsheet. Required.
destination_sheetYesName of the sheet to move rows to. Required.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 FreebusyB
Read-onlyIdempotent

Returns free/busy information for a set of calendars.

NameRequiredDescriptionDefault
time_maxYesThe end of the interval for the query in RFC3339 format (e.g., '2024-05-12T18:00:00Z' or '2024-05-12').
time_minYesThe start of the interval for the query in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12').
calendar_idsNoList 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_emailYesThe user's Google email address. Required.
group_expansion_maxNoMaximum 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_maxNoMaximum number of calendars for which FreeBusy information is to be provided. Optional. Maximum value is 50.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already fully cover the behavioral profile (readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false), so the description has a low bar to clear. It adds no behavioral context beyond the annotations, such as group expansion error behavior or primary-calendar fallback, but it does not contradict them either.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single declarative sentence with the verb front-loaded and zero filler. Every word earns its place, and the description is appropriately minimal given that the schema and annotations carry the operational detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema explains return values, the schema documents all parameters with high coverage, and annotations cover the safety profile. The main gap is the absence of usage-selection guidance distinguishing this from get_events and list_calendars, which matters for a calendar tool with 6 parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: every one of the 6 parameters has a substantive description, including RFC3339 format examples (time_min/time_max), defaults (calendar_ids), and max bounds (group_expansion_max=100, calendar_expansion_max=50). Per the baseline rule, a 3 is appropriate; the tool description itself adds no parameter detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Returns') and resource ('free/busy information for a set of calendars'), which is unambiguous about what the tool does. The concept of free/busy is distinct from sibling calendar tools like get_events or list_calendars, so an agent can differentiate it, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to choose query_freebusy over alternatives like get_events or list_calendars, and no exclusions or prerequisites are stated. An agent must infer the selection criteria purely from the resource name.

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 ValuesB
Read-onlyIdempotent

Reads values from a specific range in a Google Sheet, one line per row: the sheet row number, then the row's cells separated by tabs.

NameRequiredDescriptionDefault
range_nameNoThe 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_notesNoIf True, also fetch cell notes for the range. Defaults to False to avoid expensive includeGridData requests.
spreadsheet_idYesThe ID of the spreadsheet. Required.
include_formulasNoIf 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_emailYesThe user's Google email address. Required.
include_hyperlinksNoIf True, also fetch hyperlink metadata for the range. Defaults to False to avoid expensive includeGridData requests.
include_smart_chipsNoIf True, also fetch smart chips metadata (Drive files/folders and People chips) for the range. Defaults to False to avoid expensive includeGridData requests.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds the output shape (row number, tab-separated cells) which is genuinely useful context beyond annotations, but says nothing about the optional include_* flags or the 1000-row clamping behavior described in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero waste; the output-format detail is the one non-obvious bit and it is included up front.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists and parameter coverage is complete, so the description needn't re-explain returns. However, given 7 parameters and a crowded spreadsheet sibling set, it could have clarified scope and routing without redundant detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all seven parameters including the include_notes/formulas/hyperlinks/smart_chips flags and the range default are fully documented in the schema. The description adds no parameter meaning, which is the baseline case when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: reads values from a specific range in a Google Sheet. Clear to an agent what it does, though it never distinguishes itself from nearby siblings such as get_spreadsheet_info or list_sheet_tables.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no prerequisites, and no mention of alternatives. The agent must infer from the name alone that this is the read path versus modify_sheet_values for writes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_page_to_imageRender Page to ImageB
Read-onlyIdempotent

Render a slide (or any page, including notes pages) to an image and return it as image content, for looking at a slide's layout and visuals.

NameRequiredDescriptionDefault
sizeNoImage width. One of "SMALL" (200px), "MEDIUM" (800px), "LARGE" (1600px) or "WIDTH2000_PX" (2000px). Defaults to "MEDIUM". Start at MEDIUM: it reads titles and body text. Use LARGE for small text such as tables, chart labels and footnotes. WIDTH2000_PX rarely reads more than LARGE. SMALL shows layout only; its text is unreadable. Token cost and the resolution the model sees depend on the model: Claude models with high-resolution vision read MEDIUM at ~460 image tokens, LARGE at ~1,850 and WIDTH2000_PX at ~2,900, while other models may downscale LARGE and WIDTH2000_PX and count tokens differently.MEDIUM
page_object_idYesThe object ID of the page/slide to render.
presentation_idYesThe ID of the presentation.
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, openWorld. The description adds that the return is image content, which is useful, but nothing beyond that such as whether notes pages render differently or any pagination/size caveats (those live in the schema).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no waste. It could be marginally sharper by naming the sibling it complements, but structure is clean.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained, and the operation is a simple read. However, an agent choosing between get_page and render_page_to_image still lacks explicit differentiation, leaving a small routing gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the size parameter is documented in unusually rich detail in the schema itself. The description adds no parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (render) and resource (slide/page), plus the concrete side effect of returning image content. It does not explicitly differentiate from the closely named sibling get_page, so it lands 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for looking at a slide's layout and visuals' implies the use case, but there is no explicit when-to-use-vs-get_page routing or exclusion guidance. Usage is inferred rather than stated.

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 DimensionsA
Destructive

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.

Every row number and column letter refers to the sheet as it was before the call, even when one call both inserts and deletes. Deletes are applied before inserts, and an insert position inside a deleted span lands where that span was.

NameRequiredDescriptionDefault
hide_rowsNoList of 1-based row numbers to hide. Example: [3, 4].
row_sizesNoDict mapping 1-based row numbers to pixel heights. Example: {"1": 40, "3": 60}. Can be a JSON string or Python dict.
sheet_nameNoSheet name to target. Defaults to the first sheet if not provided.
delete_rowsNoList of 1-based row numbers to delete. Example: [5, 6]. Best for non-contiguous rows.
insert_rowsNoNumber of rows to insert.
unhide_rowsNoList of 1-based row numbers to unhide. Example: [3, 4].
column_sizesNoDict mapping column letters to pixel widths. Example: {"A": 200, "C": 300}. Can be a JSON string or Python dict.
hide_columnsNoList of column letters to hide. Example: ["C", "D"].
delete_columnsNoList of column letters to delete. Example: ["E", "F"].
insert_columnsNoNumber of columns to insert.
insert_rows_atNo1-based row number to insert before. Appends to the end of the sheet if omitted.
spreadsheet_idYesThe ID of the spreadsheet. Required.
unhide_columnsNoList of column letters to unhide. Example: ["C", "D"].
auto_resize_rowsNoList of 1-based row numbers to auto-resize to fit content. Example: [1, 2].
delete_row_rangeNoContiguous 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_countNoNumber of rows to freeze from the top. Use 0 to unfreeze all rows.
insert_columns_atNoColumn letter to insert before (e.g. "C"). Appends to the end if omitted.
user_google_emailYesThe user's Google email address. Required.
auto_resize_columnsNoList of column letters to auto-resize to fit content. Example: ["A", "B"].
frozen_column_countNoNumber of columns to freeze from the left. Use 0 to unfreeze all columns.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so safety is covered structurally. The description adds genuinely non-obvious behavioral semantics: all row/column references resolve against the pre-call sheet state, deletes apply before inserts, and an insert position inside a deleted span lands where that span was. It does not discuss permission requirements or reversibility, but with annotations present this is a strong addition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight paragraphs: the first front-loads the operation scope, the second carries the one piece of non-obvious behavior that matters. Every sentence earns its place and nothing is repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 20 parameters, an output schema present, and full annotation coverage, the description supplies the purpose and the ordering semantics an agent needs to call it correctly. It could add a note on whether multiple dimension operations may be combined in one call, but overall it is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 goes beyond the schema by defining cross-parameter semantics — reference resolution against the pre-call sheet, delete-before-insert ordering, and the fate of inserts inside deleted spans — which the per-parameter schema text does not express. That earns above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (sheet-level dimension properties) and enumerates concrete operations: resize, auto-resize, freeze, hide/unhide, insert/delete rows and columns. This makes clear the tool is broader than its 'resize' name suggests, distinguishing it from siblings like format_sheet_range and move_sheet_rows. It stops short of explicitly naming a sibling to route away from, so 4 rather than 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit statement of when to use this tool versus format_sheet_range, manage_sheet_tab, or move_sheet_rows. The operation names imply usage, and parameter descriptions contain local guidance ('best for non-contiguous rows', 'more efficient than delete_rows for large contiguous ranges'), but tool-level when/when-not guidance is absent.

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 FunctionC
Destructive

Executes a function in a deployed script.

NameRequiredDescriptionDefault
dev_modeNoWhether to run latest code vs deployed version
script_idYesThe script project ID
parametersNoOptional list of parameters to pass
deployment_idNoOptional 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_nameYesName of function to execute
user_google_emailYesUser's email address

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds only 'deployed script,' which hints at deployment but does not explain potential side effects, that it runs with the user's credentials, or that it may modify external state. It provides minimal value beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, which is efficient and front-loaded. It is appropriately concise for stating the core action, though it omits valuable context. The brevity does not hinder readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool that executes arbitrary code with 6 parameters, the description is severely under-specified. It does not explain how to obtain script_id, the meaning of parameters, error handling, or safety warnings. While an output schema exists, the description fails to provide the operational context needed for safe and correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with descriptive parameter definitions. The description adds no additional meaning to any parameters, so it relies entirely on the schema. The baseline of 3 is appropriate since the schema carries the semantic burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Executes a function in a deployed script.' It identifies a specific verb and resource, making the core purpose unambiguous. However, it does not explicitly distinguish itself from sibling tools like manage_script_content or generate_trigger_code, though the action is inherently distinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It does not mention prerequisites such as having a deployment ID, authentication requirements, or when to set dev_mode. The agent must infer usage context from the schema alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_contactsSearch ContactsB
Read-onlyIdempotent

Search contacts by name, email, phone number, or other fields.

NameRequiredDescriptionDefault
queryYesSearch query string (searches names, emails, phone numbers).
page_sizeNoMaximum number of results to return (default: 30, max: 30).
user_google_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 CustomA
Read-onlyIdempotent

Performs a search using Google Custom Search JSON API.

NameRequiredDescriptionDefault
qYesThe search query. Required.
numNoNumber of results to return (1-10). Defaults to 10.
safeNoSafe search level. Defaults to "off".off
sitesNoList of sites/domains to restrict search to (e.g., ["example.com", "docs.example.com"]). When provided, results are limited to these sites.
startNoThe index of the first result to return (1-based). Defaults to 1.
countryNoCountry code for results (e.g., "countryUS").
languageNoLanguage code for results (e.g., "lang_en").
file_typeNoFilter by file type (e.g., "pdf", "doc").
search_typeNoSearch for images if set to "image".
site_searchNoRestrict search to a specific site/domain.
date_restrictNoRestrict results by date (e.g., "d5" for past 5 days, "m3" for past 3 months).
user_google_emailYesThe user's Google email address. Required.
site_search_filterNoExclude ("e") or include ("i") site_search results.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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 main safety profile. The description adds no behavioral detail beyond what annotations provide, but it also 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no wasted words. It is front-loaded with the core purpose and does not repeat information already present in the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 13 parameters, the one-sentence description provides minimal orientation and omits practical context such as quota/auth requirements or the need for a configured Custom Search Engine. The rich schema and output schema compensate partially, but the description could be more helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema documents all 13 parameters with descriptions and defaults. The 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Performs a search') and a specific resource ('Google Custom Search JSON API'), which clearly identifies this as a web/custom search tool. It is distinct from sibling search tools like search_gmail_messages, search_drive_files, and search_docs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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. With many sibling search tools available, an agent receives no explicit or implicit cue about when to choose Google Custom Search over Gmail, Drive, or Docs searches.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_docsSearch DocsB
Read-onlyIdempotent

Searches for Google Docs by name using Drive API (mimeType filter).

NameRequiredDescriptionDefault
queryYesText to search for in document names.
corporaNoCorpus to search ('user', 'domain', 'drive', 'allDrives'). Defaults to 'drive' when drive_id is set, otherwise 'allDrives'.
drive_idNoOptional shared drive ID to search.
page_sizeNoMaximum number of documents to return. Defaults to 10.
page_tokenNoPage token from a previous response's nextPageToken to retrieve the next page of results.
user_google_emailYesThe user's Google email address.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds the mechanism (Drive API mimeType filter) but says nothing about pagination behavior or result limits beyond what the schema states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler; the resource and scope appear immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With rich annotations and an output schema, the safety and return-value burdens are lifted, but the description still omits sibling differentiation and pagination context, leaving the agent to infer when this tool beats search_drive_files.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 corpora defaults and page_size. The description adds no parameter-level detail, which is the expected baseline when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Searches) and resource (Google Docs) with a scope qualifier (by name), and the mimeType filter note clarifies it targets Docs specifically. It does not, however, explicitly distinguish itself from the sibling search_drive_files, which also searches Drive.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance and no mention of alternatives such as search_drive_files or list_docs_in_folder. The agent must infer the selection criteria entirely from 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.

search_drive_filesSearch Drive FilesB
Read-onlyIdempotent

Searches for files and folders within a user's Google Drive, including shared drives.

NameRequiredDescriptionDefault
queryYesThe 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.
corporaNoBodies of items to query (e.g., 'user', 'domain', 'drive', 'allDrives'). If 'drive_id' is specified and 'corpora' is None, it defaults to 'drive'. Otherwise it defaults to 'allDrives' when `include_items_from_all_drives` is True. Pass 'user' to search only My Drive and files shared with the user.
detailedNoWhether to include size, modified time, and link in results. Defaults to True.
drive_idNoID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`.
order_byNoSort 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_typeNoRestrict 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_sizeNoThe maximum number of files to return. Defaults to 10.
page_tokenNoPage token from a previous response's nextPageToken to retrieve the next page of results.
include_trashedNoWhether 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_emailYesThe user's Google email address. Required.
include_items_from_all_drivesNoWhether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds only the shared-drive scope note; pagination behavior, corpora resolution, and query-operator quirks live entirely in the schema, so the description adds limited behavioral value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; every word earns its place. It is arguably under-specified for an 11-parameter tool, which keeps it just short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema, 100% parameter coverage, and complete annotations, the structured fields carry most of the burden, so the terse description is workable. Still, the lack of sibling differentiation and usage routing leaves a real gap for an agent choosing among the Drive tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 11 parameters (including corpora defaults, order_by keys, and file_type mapping) are documented in the schema itself. The description contributes nothing about parameters, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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 Google Drive), and adds the shared-drive scope. However, it never distinguishes itself from the sibling list_drive_items, which also enumerates Drive contents, so an agent cannot tell them apart from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus list_drive_items or get_drive_file_content. The description implies a search-oriented use case but provides no conditions, exclusions, or prerequisites to route the agent.

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 MessagesA
Read-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.

NameRequiredDescriptionDefault
queryYesThe search query. Supports standard Gmail search operators. Results include drafts unless the query excludes them (e.g. in:sent or -in:drafts).
page_sizeNoThe maximum number of messages to return. Defaults to 10.
page_tokenNoToken for retrieving the next page of results. Use the next_page_token from a previous response.
include_headersNoIf True, also fetch each message's metadata and include Subject, From, Date and label IDs (e.g. DRAFT, SENT) 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_emailYesThe user's Google email address. Required.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and non-destructive behavior, so the safety profile is fully covered. The description adds that results include Message IDs, Thread IDs and web interface links, plus pagination support, but these largely restate what the output schema and the page_token schema entry already say. No disclosure of rate limits, quota costs, or result ordering.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the core action front-loaded and no filler. The opening sentence earns its place; the pagination sentence is somewhat redundant with the schema but is cheap and oriented toward a practical workflow concern.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, rich annotations, and 100% schema description coverage, the description is complete enough to invoke correctly: it names the account parameter implicitly, the query, and the return shape. Missing only explicit routing guidance to the content-fetch siblings, which is a minor gap given the tool set.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters including the include_headers cost note and Gmail operator support are fully documented in the schema. The description's only parameter reference (page_token pagination) adds nothing beyond the schema's own explanation. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Searches messages in a user's Gmail account based on a query') and clarifies the output is IDs plus web links, which implicitly separates it from content-fetching siblings like get_gmail_message_content and get_gmail_thread_content. It stops short of explicitly naming a sibling it is not, so it stays at 4 rather than 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: returning IDs and verification links signals this is a discovery step before reading content with the get_*_gmail_* tools, and the mention of page_token implies multi-page retrieval. There is no explicit 'use this instead of X when Y' or any exclusion beyond what the schema carries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_messagesSearch MessagesA
Read-onlyIdempotent

Searches for messages in Google Chat spaces by text content and/or time range.

NameRequiredDescriptionDefault
queryNoOptional text to search for. If omitted, only time_filter is applied.
space_idNoOptional space to restrict the search to.
page_sizeNoMaximum number of messages to return per space.
max_spacesNoMaximum number of spaces to search when space_id is not provided (default 10).
time_filterNoOptional 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_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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 the search-scope context (by content and/or time range) but does not disclose multi-space search behavior, pagination limits, or the role of the required user_google_email. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that names the action, resource, and key filtering dimensions with no filler. Every part 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.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description plus annotations and schema are mostly sufficient for a read-only search tool, and an output schema exists so return values need no explanation. However, the required user_google_email parameter is undocumented in both the schema and the description, and the multi-space search semantics are not mentioned. A slightly richer description would improve agent confidence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 83%, so the schema carries most parameter documentation. The description adds a high-level mapping to query and time_filter but doesn't add meaning to user_google_email, space_id, page_size, or max_spaces. Baseline of 3 is appropriate given high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Searches'), the resource ('messages in Google Chat spaces'), and the filtering dimensions ('text content and/or time range'). It does not explicitly distinguish itself from sibling tools like get_messages, 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is for searching rather than listing or sending Chat messages, but it provides no explicit when-to-use guidance, no exclusions, and no reference to alternative sibling tools such as get_messages. Usage context is present only by implication.

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
Destructive

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.

NameRequiredDescriptionDefault
ccNoOptional CC email address.
toNoRecipient email address. Optional when replying with reply_all=True, which derives it from the thread.
bccNoOptional BCC email address.
bodyNoEmail body content (plain text or HTML). Required when sending. When forwarding, this is an optional note prepended above the quoted original.
subjectNoEmail subject. Required for a new message. Optional when replying with thread_id (inherits the parent message's subject, adding 'Re:' only if absent) or when forwarding (defaults to 'Fwd: <original subject>').
directionNoBase text direction of the body. 'auto' (default) takes it from the first strong character (a right-to-left script gives 'rtl', anything else 'ltr'); 'ltr'/'rtl' force it. On a forward it orients the note.auto
from_nameNoOptional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'.
reply_allNoWhether 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_idNoOptional 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_emailNoOptional '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.
referencesNoOptional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target.
attachmentsNoOptional 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_formatNoFormat of the body content (and of the prepended note when forwarding). Use 'plain' for plaintext or 'html' for HTML content. With 'html', write real markup; an entity-escaped body ('&lt;div&gt;') is rejected.plain
in_reply_toNoOptional 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_originalNoWhether to include the message being replied to as a quoted original. Only has an effect when thread_id is provided. Defaults to false.
include_signatureNoWhether to append the Gmail signature from Settings > Signature when available. Defaults to true.
user_google_emailYesThe user's Google email address. Required for authentication.
forward_message_idNoSet 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_attachmentsNoWhen forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-readOnly, destructive, non-idempotent, and open-world behavior, but the description adds critical operational context beyond those hints: the message is sent immediately and cannot be scheduled, the agent must never claim a message was scheduled, and forwarding changes which reply/thread/signature options are meaningful. It also notes Send As alias prerequisites and attachment content_id behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The content is front-loaded with the core send action and structured into clear paragraphs for forwarding and scheduling constraints. It is somewhat long and repeats the scheduling limitation in several forms, but most of that detail is justified for a 19-parameter tool with a destructive immediate-send behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, rich input schema, annotations, and existing output schema, the description supplies the missing behavioral and mode-selection context an agent needs. It covers new sends, replies, forwards, aliases, attachments, and the critical scheduling limitation without needing to explain return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameter-level details are already largely documented. The description still adds useful cross-parameter semantics, especially that forwarding makes subject optional and renders threading, reply, and signature options inapplicable, and that body becomes a prepended note in forward mode.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it sends an email using the user's Gmail account, and it enumerates supported modes (new email, reply, forward, attachments, Send As). This makes it immediately distinguishable from read/search siblings and from draft_gmail_message, which is explicitly named as the scheduling alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit: it explains when to use send_gmail_message for immediate delivery, when to use draft_gmail_message for prepare-now-deliver-later workflows, and that scheduling cannot be accomplished by this tool or the Gmail REST API. It also gives mode-specific guidance for forwarding, including which options do not apply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_messageSend MessageA
Destructive

Sends a message to a Google Chat space, or edits a message already sent there.

NameRequiredDescriptionDefault
space_idYes
thread_keyNoReply in a thread by app-defined key (creates thread if not found).
thread_nameNoReply in an existing thread by its resource name (e.g. spaces/X/threads/Y).
message_nameNoEdit 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_textYes
user_google_emailYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation behavior is known. The description adds the dual send/edit behavior but does not disclose auth needs, rate limits, or consequences beyond the edit operation. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single 15-word sentence with the action verb front-loaded. It covers both send and edit modes with no filler or redundant detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter mutation tool with only 50% schema coverage, the description leaves important semantics to inference—especially user_google_email and how the edit mode is triggered via message_name. The output schema and annotations help, but the description alone is not fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%, with required parameters space_id, message_text, and user_google_email left undocumented. The description only loosely implies space_id and message_text via 'Sends a message to a Google Chat space' and says nothing about user_google_email or message_name, failing to compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Sends a message to a Google Chat space, or edits a message already sent there.' It clearly separates this tool from sibling readers like get_messages/search_messages and from Gmail's send_gmail_message, since it explicitly scopes 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when the tool should be used (sending or editing Chat messages) but does not explicitly name alternatives or state when not to use it. An agent must infer the contrast with sibling read/search tools from the wording rather than receiving direct guidance.

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 PermissionsA
Destructive

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.

NameRequiredDescriptionDefault
file_idYesThe ID of the file or folder. Required.
link_sharingNoControl "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_emailYesThe user's Google email address. Required.
writers_can_shareNoWhether editors can change permissions and share. If False, only the owner can share. Defaults to None (no change).
copy_requires_writer_permissionNoWhether viewers and commenters are prevented from copying, printing, or downloading. Defaults to None (no change).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description does not need to restate that this mutates state. It adds useful scope (file/folder link sharing, not individual grants), but it does not disclose consequences such as making a file public or private, what happens to existing permissions, or whether owner-level privileges are required.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, with the core action front-loaded and every sentence contributing either purpose or usage routing. There is no fluff, repetition of the schema, or unnecessary qualification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich schema, output schema, and annotations, the description covers purpose, scope, and routing well. The main remaining gaps are that the required user_google_email is not framed in context and there is no prerequisite note about ownership for destructive sharing changes; overall this is above minimum but not exhaustive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 description reinforces the 'link sharing' and 'file-level' context but does not add per-parameter meaning beyond the schema; notably, the role of the required user_google_email is not clarified as acting user versus permission target.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The lead sentence names a specific action ('Sets...'), a specific resource ('file-level sharing settings and ... link sharing'), and the target ('Google Drive file or folder'). It also explicitly separates this from individual user/group permission management, so an agent can tell it apart from nearby permission tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use this tool for toggling link sharing and file-level settings, and directs user/group permission changes to share_drive_file or update_drive_permission instead. However, those named alternatives do not appear in the provided sibling-tool list, while the similar-sounding manage_drive_access does, so the routing is somewhat less actionable than it could be.

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.

NameRequiredDescriptionDefault
form_idYesThe ID of the form to update publish settings for.
is_publishedNoWhether the form is published and visible to responders. Defaults to True.
user_google_emailYesThe user's Google email address. Required.
is_accepting_responsesNoWhether the form accepts responses. Only takes effect when the form is published. Defaults to True.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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:

  1. You need to re-authenticate with different credentials

  2. You want to proactively authenticate before using other tools

  3. 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.

NameRequiredDescriptionDefault
service_nameYes
user_google_emailNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_doc_headers_footersUpdate Doc Headers FootersA
Destructive

Safely creates or updates header/footer text in a Google Doc.

This is the default tool for header/footer content. Do NOT use batch_update_doc with create_header_footer just to set header/footer text; that low-level operation is only for advanced section-break workflows and can fail when the default header/footer already exists.

This tool handles both creation and update in one call:

  • If the header/footer does not exist, it is automatically created first.

  • If the header/footer already exists, its content is replaced.

You do NOT need to create a header/footer separately before calling this tool. Simply call it with the desired content and it will work whether the header/footer exists or not.

NameRequiredDescriptionDefault
contentYesText content for the header/footer
document_idYesID of the document to update
section_typeYesType of section to create or update ("header" or "footer")
user_google_emailYesUser's Google email address
header_footer_typeNoType of header/footer ("DEFAULT", "FIRST_PAGE_ONLY", "EVEN_PAGE")DEFAULT

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (destructiveHint=true, readOnlyHint=false), the description discloses rich behavioral detail: automatic creation when absent, content replacement when present, and the failure mode of the low-level alternative. The phrase 'its content is replaced' explicitly states what gets destroyed, and the reassurance that no separate creation step is needed adds prerequisite context the annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and 'default tool' designation, followed by a targeted warning about the sibling alternative and a bulleted breakdown of behavior. Every sentence earns its place; the bullets and closing reassurance are compact and scannable rather than redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a moderate 5-param tool with a full output schema, safety-relevant annotations, and a large sibling list, the description covers the decision-relevant aspects completely: when to use, when not to use, what happens on both existence paths, and that no prerequisite steps are required. The one ambiguity (which header/footer_type is affected) is already resolved by the schema's parameter descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 marginally reinforces parameter meaning by referring to 'content' as 'desired content' and 'header/footer text,' but it does not add format, syntax, or domain details beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb+resource combination: 'creates or updates header/footer text in a Google Doc.' The description further differentiates from its nearest sibling by explicitly naming batch_update_doc as the wrong tool for this job, so an agent can disambiguate 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly declares 'This is the default tool for header/footer content' and gives a clear exclusion: 'Do NOT use batch_update_doc with create_header_footer just to set header/footer text.' It also explains the condition that selects the alternative (advanced section-break workflows) and why it fails for the common case, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_drive_fileUpdate Drive FileA
Destructive

Updates metadata, properties, and/or content of a Google Drive file.

Providing new content (inline as content, fetched from file_url, or on a local server read from a file path) 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.

NameRequiredDescriptionDefault
modeNoHow 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
nameNoNew name for the file.
contentNoNew text content for text-based formats (markdown, TXT, HTML).
file_idYesThe ID of the file to update. Required.
starredNoWhether to star/unstar the file.
trashedNoWhether to move file to/from trash.
file_urlNoRemote http(s) URL to fetch new content from.
file_pathNoLocal file path for binary formats (DOCX, ODT). Supports file:// URLs.
mime_typeNoNew MIME type (note: changing type may require content upload). For a shortcut ID, this must accompany content and applies to the resolved target.
propertiesNoCustom key-value properties for the file.
add_parentsNoComma-separated folder IDs to add as parents.
descriptionNoNew description for the file.
source_formatNoSource 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 content source.
remove_parentsNoComma-separated folder IDs to remove from parents.
user_google_emailYesThe user's Google email address. Required.
writers_can_shareNoWhether editors can share the file. Pass the target ID directly; this cannot be changed on a shortcut resource.
copy_requires_writer_permissionNoWhether copying requires writer permission. Pass the target ID directly; this cannot be changed on a shortcut resource.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even with annotations already signaling destructive=true, the description adds substantial behavior beyond those flags: content replacement preserves file ID, sharing, comments, and links; native Google files are converted via the same mechanism as import_to_google_doc; append/prepend operate server-side; and shortcut semantics are explained in detail, including the prohibition on mixing content replacement with resource-local metadata.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but earns its length: it front-loads the core purpose and then addresses complex behaviors (conversion, append/prepend, shortcuts) in focused paragraphs. It is dense rather than padded, though slightly more structure or explicit headings could help scannability for a 17-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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, the description covers all major behavioral dimensions an agent needs: content replacement semantics, MIME conversion behavior, append/prepend mechanics, shortcut handling, and the one-call metadata-plus-content capability. The output schema and detailed input schema already cover return values and individual parameters, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 cross-parameter meaning that the schema alone does not: it groups content sources (content, file_url, file_path) into one coherent behavior, explains what append/prepend do to the file, and clarifies which parameters apply to shortcut targets versus the shortcut resource itself. This goes beyond individual property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Updates metadata, properties, and/or content of a Google Drive file.' It then distinguishes several distinct behaviors (in-place replacement preserving ID, native-format conversion, append/prepend, shortcut handling), so an agent can clearly separate this from siblings like create_drive_file, copy_drive_file, and import_to_google_doc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when this tool is appropriate, such as replacing content in place while preserving IDs, and when to use one-call metadata-plus-content updates. It also routes native Google Docs edits to sibling tools like insert_doc_elements, modify_doc_text, and find_and_replace_doc via the mode parameter, though that routing lives in the schema rather than the main description.

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.

NameRequiredDescriptionDefault
tab_idNoOptional document tab ID to target
alignmentNoText alignment - 'START' (left), 'CENTER', 'END' (right), or 'JUSTIFIED'
directionNoParagraph direction - 'LEFT_TO_RIGHT' or 'RIGHT_TO_LEFT'
end_indexYesEnd position (exclusive) - should cover the entire paragraph
list_typeNoCreate 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_endNoRight/end indent in points
segment_idNoOptional header/footer/footnote segment ID to target
border_dashNoBorder dash style ('SOLID', 'DOT', or 'DASH'; defaults to 'SOLID')
document_idYesDocument ID to modify
space_aboveNoSpace above paragraph in points (e.g., 12 for one line)
space_belowNoSpace below paragraph in points
start_indexYesStart 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_colorNoBorder color (#RRGGBB; defaults to black)
border_edgesNoParagraph border edges to update ('top', 'bottom', 'left', 'right', or 'between'); omit to update all four outer edges
border_widthNoBorder width in points (defaults to 1)
indent_startNoLeft/start indent in points
line_spacingNoLine spacing multiplier (1.0 = single, 1.5 = 1.5x, 2.0 = double)
spacing_modeNo'NEVER_COLLAPSE' or 'COLLAPSE_LISTS'
bullet_presetNoOptional explicit Google Docs bullet preset
heading_levelNoHeading level 0-6 (0 = NORMAL_TEXT, 1 = H1, 2 = H2, etc.) Use for semantic document structure
shading_colorNoParagraph shading/background color (#RRGGBB)
border_paddingNoBorder padding in points (defaults to 4)
keep_with_nextNoKeep the paragraph with the next paragraph
named_style_typeNoDirect named style type - 'NORMAL_TEXT', 'TITLE', 'SUBTITLE', 'HEADING_1' through 'HEADING_6'. Mutually exclusive with heading_level.
indent_first_lineNoFirst line indent in points (e.g., 36 for 0.5 inch)
page_break_beforeNoStart the paragraph on a new page
user_google_emailYesUser's Google email address
list_nesting_levelNoNesting level for lists (0-8, where 0 is top level, default is 0) Use higher levels for nested/indented list items
keep_lines_togetherNoKeep all lines of the paragraph together
avoid_widow_and_orphanNoAvoid widows/orphans for the paragraph

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv2.3.0
    • Changedget_drive_file_content2 fields changed
      • addedInput schema / properties / full_content
        Added value: +{
        +  "default": false,
        +  "description": "Return all content from offset onward in one call\ninstead of a page of the default size.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Character offset to read on from after a truncated result.",
        +  "type": "integer"
        +}
    • Changedget_drive_file_download_url1 field changed
      • changedInput schema / properties / export_format / description
        Previous value: -"Optional export format for Google native files.\n          Options: 'pdf', 'docx', 'xlsx', 'csv', 'pptx'.\n          If not specified, uses sensible defaults (PDF for Docs/Slides, XLSX for Sheets).\n          For Sheets: supports 'csv', 'pdf', or 'xlsx' (default)."New value: +"Optional export format for Google native files.\n          Options: 'pdf', 'docx', 'xlsx', 'csv', 'pptx', 'png', 'jpg', 'svg'.\n          If not specified, uses sensible defaults (PDF for Docs/Slides, XLSX for Sheets,\n          PNG for Drawings).\n          For Sheets: supports 'csv', 'pdf', or 'xlsx' (default)."
    • Changedget_events1 field changed
      • changedInput schema / properties / detailed / description
        Previous 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."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. Custom reminders (an empty list means none), non-default visibility and transparency are reported too; events using the calendar's default reminders omit the Reminders line. Defaults to False."
    • Changedget_gmail_message_content3 fields changed
      • addedInput schema / properties / expected_sha256
        Added value: +{
        +  "default": null,
        +  "description": "Optional previous body_sha256; rejects changed content.",
        +  "type": "string"
        +}
      • addedInput schema / properties / page_offset
        Added value: +{
        +  "default": null,
        +  "description": "Character offset in the complete rendered body. Start at 0 and follow next_offset.",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / page_size
        Added value: +{
        +  "default": 20000,
        +  "description": "Maximum body characters per page, between 1 and 20,000.",
        +  "maximum": 20000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
  2. 2 tool updatesv2.2.1
    • Changedbatch_update_doc1 field changed
      • changedInput schema / properties / operations / items / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "after_heading": {
        -        "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.",
        -        "type": "string"
        -      },
        -      "anchor_position": {
        -        "default": "after",
        -        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        -        "enum": [
        -          "before",
        -          "after"
        -        ],
        -        "type": "string"
        -      },
        -      "anchor_text": {
        -        "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.",
        -        "type": "string"
        -      },
        -      "before_heading": {
        -        "default": null,
        -        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        -        "type": "string"
        -      },
        -      "end_of_segment": {
        -        "default": false,
        -        "description": "Append to the end of the targeted body/segment instead of using index.",
        -        "type": "boolean"
        -      },
        -      "index": {
        -        "default": null,
        -        "description": "Insertion index. Omit when end_of_segment=true.",
        -        "type": "integer"
        -      },
        -      "segment_id": {
        -        "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'.",
        -        "type": "string"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Text to insert.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "insert_text"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "segment_id": {
        -        "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'.",
        -        "type": "string"
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "delete_text"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "start_index",
        -      "end_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "segment_id": {
        -        "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'.",
        -        "type": "string"
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Replacement text.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "replace_text"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "start_index",
        -      "end_index",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "background_color": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "baseline_offset": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "bold": {
        -        "default": null,
        -        "type": "boolean"
        -      },
        -      "clear_link": {
        -        "default": null,
        -        "type": "boolean"
        -      },
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "font_family": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "font_size": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "font_weight": {
        -        "default": null,
        -        "type": "integer"
        -      },
        -      "italic": {
        -        "default": null,
        -        "type": "boolean"
        -      },
        -      "link_url": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "segment_id": {
        -        "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'.",
        -        "type": "string"
        -      },
        -      "small_caps": {
        -        "default": null,
        -        "type": "boolean"
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "strikethrough": {
        -        "default": null,
        -        "type": "boolean"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "text_color": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "format_text"
        -        ],
        -        "type": "string"
        -      },
        -      "underline": {
        -        "default": null,
        -        "type": "boolean"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "start_index",
        -      "end_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "alignment": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "avoid_widow_and_orphan": {
        -        "default": null,
        -        "type": "boolean"
        -      },
        -      "border_color": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "border_dash": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "border_edges": {
        -        "default": null,
        -        "description": "Paragraph border edges to update; omit to update top, bottom, left, and right.",
        -        "items": {
        -          "enum": [
        -            "top",
        -            "bottom",
        -            "left",
        -            "right",
        -            "between"
        -          ],
        -          "type": "string"
        -        },
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "border_padding": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "border_width": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "direction": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "heading_level": {
        -        "default": null,
        -        "type": "integer"
        -      },
        -      "indent_end": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "indent_first_line": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "indent_start": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "keep_lines_together": {
        -        "default": null,
        -        "type": "boolean"
        -      },
        -      "keep_with_next": {
        -        "default": null,
        -        "type": "boolean"
        -      },
        -      "line_spacing": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "named_style_type": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "page_break_before": {
        -        "default": null,
        -        "type": "boolean"
        -      },
        -      "segment_id": {
        -        "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'.",
        -        "type": "string"
        -      },
        -      "shading_color": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "space_above": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "space_below": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "spacing_mode": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "update_paragraph_style"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "start_index",
        -      "end_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "background_color": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "border_color": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "border_edges": {
        -        "default": null,
        -        "description": "Table-cell border edges to update; omit to update all four edges.",
        -        "items": {
        -          "enum": [
        -            "top",
        -            "bottom",
        -            "left",
        -            "right"
        -          ],
        -          "type": "string"
        -        },
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "border_width": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "column_index": {
        -        "default": null,
        -        "type": "integer"
        -      },
        -      "column_span": {
        -        "default": null,
        -        "type": "integer"
        -      },
        -      "content_alignment": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "padding_bottom": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "padding_left": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "padding_right": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "padding_top": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "row_index": {
        -        "default": null,
        -        "type": "integer"
        -      },
        -      "row_span": {
        -        "default": null,
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "enum": [
        -          "update_table_cell_style"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "after_heading": {
        -        "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.",
        -        "type": "string"
        -      },
        -      "anchor_position": {
        -        "default": "after",
        -        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        -        "enum": [
        -          "before",
        -          "after"
        -        ],
        -        "type": "string"
        -      },
        -      "anchor_text": {
        -        "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.",
        -        "type": "string"
        -      },
        -      "before_heading": {
        -        "default": null,
        -        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        -        "type": "string"
        -      },
        -      "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": {
        -        "default": null,
        -        "description": "Insertion index. Omit when end_of_segment=true.",
        -        "type": "integer"
        -      },
        -      "rows": {
        -        "type": "integer"
        -      },
        -      "segment_id": {
        -        "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'.",
        -        "type": "string"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "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": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "enum": [
        -          "insert_table_row"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "row_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "row_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "enum": [
        -          "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": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "enum": [
        -          "insert_table_column"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "column_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "column_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "enum": [
        -          "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": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "enum": [
        -          "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": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "enum": [
        -          "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": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "enum": [
        -          "update_table_column_properties"
        -        ],
        -        "type": "string"
        -      },
        -      "width": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "width_type": {
        -        "default": null,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "column_indices"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "min_row_height": {
        -        "default": null,
        -        "description": "Minimum row height in points.",
        -        "type": "number"
        -      },
        -      "row_indices": {
        -        "description": "Zero-based row indices to style, e.g. [0] for the header row.",
        -        "items": {
        -          "type": "integer"
        -        },
        -        "type": "array"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "enum": [
        -          "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": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "enum": [
        -          "pin_table_header_rows"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "pinned_header_rows_count"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "after_heading": {
        -        "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.",
        -        "type": "string"
        -      },
        -      "anchor_position": {
        -        "default": "after",
        -        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        -        "enum": [
        -          "before",
        -          "after"
        -        ],
        -        "type": "string"
        -      },
        -      "anchor_text": {
        -        "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.",
        -        "type": "string"
        -      },
        -      "before_heading": {
        -        "default": null,
        -        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        -        "type": "string"
        -      },
        -      "end_of_segment": {
        -        "default": false,
        -        "description": "Append to the end of the targeted body/segment instead of using index.",
        -        "type": "boolean"
        -      },
        -      "index": {
        -        "default": null,
        -        "description": "Insertion index. Omit when end_of_segment=true.",
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "insert_page_break"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "after_heading": {
        -        "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.",
        -        "type": "string"
        -      },
        -      "anchor_position": {
        -        "default": "after",
        -        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        -        "enum": [
        -          "before",
        -          "after"
        -        ],
        -        "type": "string"
        -      },
        -      "anchor_text": {
        -        "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.",
        -        "type": "string"
        -      },
        -      "before_heading": {
        -        "default": null,
        -        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        -        "type": "string"
        -      },
        -      "end_of_segment": {
        -        "default": false,
        -        "description": "Append to the end of the targeted body/segment instead of using index.",
        -        "type": "boolean"
        -      },
        -      "index": {
        -        "default": null,
        -        "description": "Insertion index. Omit when end_of_segment=true.",
        -        "type": "integer"
        -      },
        -      "section_type": {
        -        "default": "NEXT_PAGE",
        -        "enum": [
        -          "CONTINUOUS",
        -          "NEXT_PAGE"
        -        ],
        -        "type": "string"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "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": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "find_replace"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "find_text",
        -      "replace_text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "bullet_preset": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "list_type": {
        -        "default": "UNORDERED",
        -        "enum": [
        -          "UNORDERED",
        -          "ORDERED",
        -          "CHECKBOX",
        -          "NONE"
        -        ],
        -        "type": "string"
        -      },
        -      "nesting_level": {
        -        "default": null,
        -        "type": "integer"
        -      },
        -      "paragraph_start_indices": {
        -        "default": null,
        -        "items": {
        -          "type": "integer"
        -        },
        -        "type": "array"
        -      },
        -      "segment_id": {
        -        "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'.",
        -        "type": "string"
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "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": {
        -        "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'.",
        -        "type": "string"
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "create_named_range"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "name",
        -      "start_index",
        -      "end_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "named_range_id": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "named_range_name": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "text": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "replace_named_range_content"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "named_range_id": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "named_range_name": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "delete_named_range"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "background_color": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "document_mode": {
        -        "default": null,
        -        "enum": [
        -          "PAGES",
        -          "PAGELESS"
        -        ],
        -        "type": "string"
        -      },
        -      "flip_page_orientation": {
        -        "default": null,
        -        "type": "boolean"
        -      },
        -      "margin_bottom": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "margin_footer": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "margin_header": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "margin_left": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "margin_right": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "margin_top": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "page_height": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "page_number_start": {
        -        "default": null,
        -        "type": "integer"
        -      },
        -      "page_width": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "update_document_style"
        -        ],
        -        "type": "string"
        -      },
        -      "use_even_page_header_footer": {
        -        "default": null,
        -        "type": "boolean"
        -      },
        -      "use_first_page_header_footer": {
        -        "default": null,
        -        "type": "boolean"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "column_count": {
        -        "default": null,
        -        "type": "integer"
        -      },
        -      "column_separator_style": {
        -        "default": null,
        -        "enum": [
        -          "NONE",
        -          "BETWEEN_EACH_COLUMN"
        -        ],
        -        "type": "string"
        -      },
        -      "column_spacing": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "content_direction": {
        -        "default": null,
        -        "enum": [
        -          "LEFT_TO_RIGHT",
        -          "RIGHT_TO_LEFT"
        -        ],
        -        "type": "string"
        -      },
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "flip_page_orientation": {
        -        "default": null,
        -        "type": "boolean"
        -      },
        -      "margin_bottom": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "margin_footer": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "margin_header": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "margin_left": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "margin_right": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "margin_top": {
        -        "default": null,
        -        "type": "number"
        -      },
        -      "page_number_start": {
        -        "default": null,
        -        "type": "integer"
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "update_section_style"
        -        ],
        -        "type": "string"
        -      },
        -      "use_first_page_header_footer": {
        -        "default": null,
        -        "type": "boolean"
        -      }
        -    },
        -    "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": {
        -        "default": null,
        -        "description": "Optional section break index for section-scoped layouts.",
        -        "type": "integer"
        -      },
        -      "section_type": {
        -        "description": "Which section to create.",
        -        "enum": [
        -          "header",
        -          "footer"
        -        ],
        -        "type": "string"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "create_header_footer"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "section_type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "after_heading": {
        -        "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.",
        -        "type": "string"
        -      },
        -      "anchor_position": {
        -        "default": "after",
        -        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        -        "enum": [
        -          "before",
        -          "after"
        -        ],
        -        "type": "string"
        -      },
        -      "anchor_text": {
        -        "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.",
        -        "type": "string"
        -      },
        -      "before_heading": {
        -        "default": null,
        -        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        -        "type": "string"
        -      },
        -      "end_of_segment": {
        -        "default": false,
        -        "description": "Append to the end of the targeted body/segment instead of using index.",
        -        "type": "boolean"
        -      },
        -      "height": {
        -        "default": null,
        -        "type": "integer"
        -      },
        -      "image_uri": {
        -        "description": "Image URL or resolvable image URI.",
        -        "type": "string"
        -      },
        -      "index": {
        -        "default": null,
        -        "description": "Insertion index. Omit when end_of_segment=true.",
        -        "type": "integer"
        -      },
        -      "segment_id": {
        -        "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'.",
        -        "type": "string"
        -      },
        -      "tab_id": {
        -        "default": null,
        -        "description": "Optional document tab ID to target.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "insert_image"
        -        ],
        -        "type": "string"
        -      },
        -      "width": {
        -        "default": null,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "image_uri"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "index": {
        -        "type": "integer"
        -      },
        -      "parent_tab_id": {
        -        "default": null,
        -        "type": "string"
        -      },
        -      "title": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "insert_doc_tab"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "title",
        -      "index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "tab_id": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "delete_doc_tab"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "tab_id"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "tab_id": {
        -        "type": "string"
        -      },
        -      "title": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "update_doc_tab"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "tab_id",
        -      "title"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "after_heading": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "anchor_position": {
        +        "default": "after",
        +        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        +        "enum": [
        +          "before",
        +          "after"
        +        ],
        +        "type": "string"
        +      },
        +      "anchor_text": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "before_heading": {
        +        "default": null,
        +        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        +        "type": "string"
        +      },
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the targeted body/segment instead of using index.",
        +        "type": "boolean"
        +      },
        +      "index": {
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true.",
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Text to insert.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_text"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "delete_text"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Replacement text.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "replace_text"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "background_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "baseline_offset": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "bold": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "clear_link": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "font_family": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "font_size": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "font_weight": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "italic": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "link_url": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "small_caps": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "strikethrough": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "text_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "format_text"
        +        ],
        +        "type": "string"
        +      },
        +      "underline": {
        +        "default": null,
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alignment": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "avoid_widow_and_orphan": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "border_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "border_dash": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "border_edges": {
        +        "default": null,
        +        "description": "Paragraph border edges to update; omit to update top, bottom, left, and right.",
        +        "items": {
        +          "enum": [
        +            "top",
        +            "bottom",
        +            "left",
        +            "right",
        +            "between"
        +          ],
        +          "type": "string"
        +        },
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "border_padding": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "border_width": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "direction": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "heading_level": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "indent_end": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "indent_first_line": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "indent_start": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "keep_lines_together": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "keep_with_next": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "line_spacing": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "named_style_type": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "page_break_before": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "shading_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "space_above": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "space_below": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "spacing_mode": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "update_paragraph_style"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "background_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "border_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "border_edges": {
        +        "default": null,
        +        "description": "Table-cell border edges to update; omit to update all four edges.",
        +        "items": {
        +          "enum": [
        +            "top",
        +            "bottom",
        +            "left",
        +            "right"
        +          ],
        +          "type": "string"
        +        },
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "border_width": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "column_index": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "column_span": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "content_alignment": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "padding_bottom": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "padding_left": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "padding_right": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "padding_top": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "row_index": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "row_span": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "update_table_cell_style"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "after_heading": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "anchor_position": {
        +        "default": "after",
        +        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        +        "enum": [
        +          "before",
        +          "after"
        +        ],
        +        "type": "string"
        +      },
        +      "anchor_text": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "before_heading": {
        +        "default": null,
        +        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        +        "type": "string"
        +      },
        +      "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": {
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true.",
        +        "type": "integer"
        +      },
        +      "rows": {
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_table_row"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "row_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "row_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_table_column"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "column_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "column_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "update_table_column_properties"
        +        ],
        +        "type": "string"
        +      },
        +      "width": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "width_type": {
        +        "default": null,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "column_indices"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "min_row_height": {
        +        "default": null,
        +        "description": "Minimum row height in points.",
        +        "type": "number"
        +      },
        +      "row_indices": {
        +        "description": "Zero-based row indices to style, e.g. [0] for the header row.",
        +        "items": {
        +          "type": "integer"
        +        },
        +        "type": "array"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "pin_table_header_rows"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "pinned_header_rows_count"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "after_heading": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "anchor_position": {
        +        "default": "after",
        +        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        +        "enum": [
        +          "before",
        +          "after"
        +        ],
        +        "type": "string"
        +      },
        +      "anchor_text": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "before_heading": {
        +        "default": null,
        +        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        +        "type": "string"
        +      },
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the targeted body/segment instead of using index.",
        +        "type": "boolean"
        +      },
        +      "index": {
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true.",
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_page_break"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "after_heading": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "anchor_position": {
        +        "default": "after",
        +        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        +        "enum": [
        +          "before",
        +          "after"
        +        ],
        +        "type": "string"
        +      },
        +      "anchor_text": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "before_heading": {
        +        "default": null,
        +        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        +        "type": "string"
        +      },
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the targeted body/segment instead of using index.",
        +        "type": "boolean"
        +      },
        +      "index": {
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true.",
        +        "type": "integer"
        +      },
        +      "section_type": {
        +        "default": "NEXT_PAGE",
        +        "enum": [
        +          "CONTINUOUS",
        +          "NEXT_PAGE"
        +        ],
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "find_replace"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "find_text",
        +      "replace_text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "bullet_preset": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "list_type": {
        +        "default": "UNORDERED",
        +        "enum": [
        +          "UNORDERED",
        +          "ORDERED",
        +          "CHECKBOX",
        +          "NONE"
        +        ],
        +        "type": "string"
        +      },
        +      "nesting_level": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "paragraph_start_indices": {
        +        "default": null,
        +        "items": {
        +          "type": "integer"
        +        },
        +        "type": "array"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "create_named_range"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "name",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "named_range_id": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "named_range_name": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "text": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "replace_named_range_content"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "named_range_id": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "named_range_name": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "delete_named_range"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "background_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "document_mode": {
        +        "default": null,
        +        "enum": [
        +          "PAGES",
        +          "PAGELESS"
        +        ],
        +        "type": "string"
        +      },
        +      "flip_page_orientation": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "margin_bottom": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_footer": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_header": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_left": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_right": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_top": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "page_height": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "page_number_start": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "page_width": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "update_document_style"
        +        ],
        +        "type": "string"
        +      },
        +      "use_even_page_header_footer": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "use_first_page_header_footer": {
        +        "default": null,
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "column_count": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "column_separator_style": {
        +        "default": null,
        +        "enum": [
        +          "NONE",
        +          "BETWEEN_EACH_COLUMN"
        +        ],
        +        "type": "string"
        +      },
        +      "column_spacing": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "content_direction": {
        +        "default": null,
        +        "enum": [
        +          "LEFT_TO_RIGHT",
        +          "RIGHT_TO_LEFT"
        +        ],
        +        "type": "string"
        +      },
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "flip_page_orientation": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "margin_bottom": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_footer": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_header": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_left": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_right": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_top": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "page_number_start": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "update_section_style"
        +        ],
        +        "type": "string"
        +      },
        +      "use_first_page_header_footer": {
        +        "default": null,
        +        "type": "boolean"
        +      }
        +    },
        +    "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": {
        +        "default": null,
        +        "description": "Optional section break index for section-scoped layouts.",
        +        "type": "integer"
        +      },
        +      "section_type": {
        +        "description": "Which section to create.",
        +        "enum": [
        +          "header",
        +          "footer"
        +        ],
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "create_header_footer"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "section_type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "after_heading": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "anchor_position": {
        +        "default": "after",
        +        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        +        "enum": [
        +          "before",
        +          "after"
        +        ],
        +        "type": "string"
        +      },
        +      "anchor_text": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "before_heading": {
        +        "default": null,
        +        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        +        "type": "string"
        +      },
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the targeted body/segment instead of using index.",
        +        "type": "boolean"
        +      },
        +      "height": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "image_uri": {
        +        "description": "Image URL or resolvable image URI.",
        +        "type": "string"
        +      },
        +      "index": {
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true.",
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_image"
        +        ],
        +        "type": "string"
        +      },
        +      "width": {
        +        "default": null,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "image_uri"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "after_heading": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "anchor_position": {
        +        "default": "after",
        +        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        +        "enum": [
        +          "before",
        +          "after"
        +        ],
        +        "type": "string"
        +      },
        +      "anchor_text": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "before_heading": {
        +        "default": null,
        +        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        +        "type": "string"
        +      },
        +      "email": {
        +        "description": "Email of the person to @mention as a smart chip.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the targeted body/segment instead of using index.",
        +        "type": "boolean"
        +      },
        +      "index": {
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true.",
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_person"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "email"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "index": {
        +        "type": "integer"
        +      },
        +      "parent_tab_id": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_doc_tab"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "title",
        +      "index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "tab_id": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "delete_doc_tab"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "tab_id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "tab_id": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "update_doc_tab"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "tab_id",
        +      "title"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedmanage_event1 field changed
      • addedInput schema / properties / this_and_following
        Added value: +{
        +  "default": false,
        +  "description": "Update only. With event_id set to a recurring instance ID,\napplies the change to that instance and every later one by ending the original\nseries before it and starting a new series there; earlier instances are kept.\nUpdating the series ID instead changes every instance, and moving its start or\nrecurrence drops past instances that no longer match. Defaults to False.",
        +  "type": "boolean"
        +}
  3. 29 tool updatesv2.2.0
    • Changedbatch_modify_gmail_message_labels7 fields changed
      • changedInput schema / properties / add_label_ids / description
        Previous value: -"List of label IDs to add to the messages."New value: +"Label IDs to add."
      • addedInput schema / properties / message_ids / default
        Added value: +null
      • changedInput schema / properties / message_ids / description
        Previous value: -"A list of message IDs to modify."New value: +"Message IDs to modify."
      • changedInput schema / properties / remove_label_ids / description
        Previous value: -"List of label IDs to remove from the messages."New value: +"Label IDs to remove."
      • addedInput schema / properties / thread_ids
        Added value: +{
        +  "default": null,
        +  "description": "Thread (conversation) IDs to modify.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / verify / description
        Previous value: -"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."New value: +"Read message_ids back and report per-id outcomes, at the\ncost of one extra read per id (batched 25 at a time). Set False for\nvery large sweeps where an unverified result is acceptable. Has no\neffect on thread_ids, which always report per thread."
      • changedInput schema / required
        Previous value: -[
        -  "user_google_email",
        -  "message_ids"
        -]New value: +[
        +  "user_google_email"
        +]
    • Changedcopy_drive_file1 field changed
      • addedInput schema / properties / copy_comments
        Added value: +{
        +  "default": false,
        +  "description": "Copy open comments and suggestions (Docs/Sheets/Slides only). Defaults to False.",
        +  "type": "boolean"
        +}
    • Changedcreate_drive_file1 field changed
      • changedInput schema / properties / fileUrl / description
        Previous value: -"If provided, fetches the file content from this URL. Supports file://, http://, and https:// protocols."New value: +"If provided, fetches the file content from this URL. Supports http:// and https://; file:// only where local file access is enabled. Where it is disabled, files on the caller's machine go through an upload URL instead (see the upload-URL parameter, if offered)."
    • Removeddebug_docs_runtime_info
    • Changeddebug_table_structure1 field changed
      • addedInput schema / properties / tab_id
        Added value: +{
        +  "default": null,
        +  "description": "Optional ID of the tab containing the table (from inspect_doc_structure).\nIf not provided, inspects the first tab.",
        +  "type": "string"
        +}
    • Changeddraft_gmail_message10 fields changed
      • addedInput schema / properties / body / default
        Added value: +null
      • changedInput schema / properties / body / description
        Previous value: -"Email body (plain text)."New value: +"Email body. Required unless forwarding, where it becomes an optional note prepended above the quoted original."
      • changedInput schema / properties / body_format / description
        Previous value: -"Email body format. Use 'plain' for plaintext or 'html' for HTML content."New value: +"Email body format. Use 'plain' for plaintext or 'html' for HTML content. With 'html', write real markup; an entity-escaped body ('&lt;div&gt;') is rejected."
      • addedInput schema / properties / direction
        Added value: +{
        +  "default": "auto",
        +  "description": "Base text direction of the body. 'auto' (default) takes it from the first strong character (a right-to-left script gives 'rtl', anything else 'ltr'); 'ltr'/'rtl' force it. On a forward it orients the note.",
        +  "enum": [
        +    "auto",
        +    "ltr",
        +    "rtl"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / forward_message_id
        Added value: +{
        +  "default": null,
        +  "description": "Set to a Gmail message ID to save a forward of that message as a draft for review. The original subject, body, and (optionally) attachments are carried over; 'body' becomes an optional note prepended to the forward.",
        +  "type": "string"
        +}
      • addedInput schema / properties / include_forwarded_attachments
        Added value: +{
        +  "default": true,
        +  "description": "When forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / reply_all
        Added 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"
        +}
      • addedInput schema / properties / subject / default
        Added value: +null
      • changedInput schema / properties / subject / description
        Previous value: -"Email subject."New value: +"Email subject. Required for a new draft. Optional when replying with thread_id (inherits the parent message's subject, adding 'Re:' only if absent) or when forwarding (then defaults to 'Fwd: <original subject>')."
      • changedInput schema / required
        Previous value: -[
        -  "user_google_email",
        -  "subject",
        -  "body"
        -]New value: +[
        +  "user_google_email"
        +]
    • Changedformat_sheet_range8 fields changed
      • addedInput schema / properties / border_color
        Added value: +{
        +  "default": null,
        +  "description": "Hex border color (default black). Requires\nborders.",
        +  "type": "string"
        +}
      • addedInput schema / properties / border_style
        Added value: +{
        +  "default": null,
        +  "description": "SOLID (default), SOLID_MEDIUM, SOLID_THICK,\nDASHED, DOTTED, or DOUBLE. Requires borders.",
        +  "type": "string"
        +}
      • addedInput schema / properties / borders
        Added value: +{
        +  "default": null,
        +  "description": "Which borders to draw, comma-separated: all,\nouter, inner, top, bottom, left, right, inner_horizontal,\ninner_vertical (e.g., \"outer\" or \"bottom,inner_horizontal\").\n\"none\" removes every border in the range.",
        +  "type": "string"
        +}
      • addedInput schema / properties / clear_dropdown
        Added value: +{
        +  "default": null,
        +  "description": "Remove all data validation from the\nrange: dropdowns, but also checkboxes and other validation rules.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / dropdown_strict
        Added value: +{
        +  "default": null,
        +  "description": "With dropdown_values: reject other\ninput (default True) or only show a warning (False).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / dropdown_values
        Added value: +{
        +  "default": null,
        +  "description": "Turns every cell in the range into\na dropdown offering these values (e.g., [\"open\", \"done\"]).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / merge_cells
        Added value: +{
        +  "default": null,
        +  "description": "True merges the range, False unmerges it.\nMerging keeps only the top-left value of each merged group.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / merge_type
        Added value: +{
        +  "default": null,
        +  "description": "MERGE_ALL (default), MERGE_COLUMNS, or\nMERGE_ROWS. Setting it implies merge_cells=True.",
        +  "type": "string"
        +}
    • Changedget_doc_as_markdown3 fields changed
      • changedInput schema / properties / document_id / description
        Previous value: -"ID of the Google Doc (or full URL)"New value: +"ID of the Google Doc (or full URL). When a full URL is provided\nand it contains a ?tab= query parameter, that tab is used automatically\nunless tab_id is also specified (explicit tab_id takes precedence)."
      • addedInput schema / properties / include_colors
        Added value: +{
        +  "default": false,
        +  "description": "Follow text that has an explicit RGB foreground color\nwith \"[color: #rrggbb]\" (default: False). Theme colors are not shown.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / tab_id / description
        Previous value: -"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."New value: +"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, and comments are listed as document-wide.\nWhen omitted, every tab is rendered. Pass \"\" to read every tab of a\nURL that carries ?tab=. This filters output only: the whole document\nis still fetched."
    • Changedget_doc_content2 fields changed
      • changedInput schema / properties / document_id / description
        Previous value: -"ID of the Google Doc (or full URL)"New value: +"ID of the Google Doc or Drive file (or full URL). A Docs\nURL's ?tab= selects that tab unless tab_id is also specified."
      • changedInput schema / properties / tab_id / description
        Previous value: -"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 default output stays index-aligned with that tab. When\nomitted, every tab is returned with \"--- TAB: ... ---\" markers."New value: +"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 default output stays index-aligned with that tab. When\nomitted, every tab is returned with \"--- TAB: ... ---\" markers.\nPass \"\" to read every tab of a URL that carries ?tab=. This\nfilters output only: the whole document is still fetched."
    • Changedget_gmail_message_content3 fields changed
      • changedInput schema / properties / full / description
        Previous value: -"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)."New value: +"When True, return the COMPLETE untruncated message: saved to storage and referenced by download URL/file path instead of the body text. In stateless mode without GCS staging, the body is returned inline; with GCS staging, a signed download URL is returned. 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)."
      • addedInput schema / properties / include_headers
        Added value: +{
        +  "default": true,
        +  "description": "When False, omit the Subject/From/To/Date header\nsummary (attached messages' too), and with full=True name the export\nafter the message ID. Requires format='full'; body_format='raw' is only\nallowed when the raw message is exported to a file.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_links
        Added value: +{
        +  "default": false,
        +  "description": "When True, append a LINKS section listing the http(s) URLs from the HTML body that the text output omits. Only applies to body_format='text'.",
        +  "type": "boolean"
        +}
    • Changedget_gmail_messages_content_batch2 fields changed
      • addedInput schema / properties / include_links
        Added value: +{
        +  "default": false,
        +  "description": "When True, append a LINKS section listing the http(s) URLs from the HTML body that the text output omits. Only applies to body_format='text'.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / message_ids / description
        Previous value: -"List of Gmail message IDs to retrieve (max 25 per batch)."New value: +"List of Gmail message IDs to retrieve; fetched in batches of 25."
    • Changedget_gmail_thread_content1 field changed
      • addedInput schema / properties / include_links
        Added value: +{
        +  "default": false,
        +  "description": "When True, append a LINKS section listing the http(s) URLs from the HTML body that the text output omits. Only applies to body_format='text'.",
        +  "type": "boolean"
        +}
    • Changedget_gmail_threads_content_batch1 field changed
      • addedInput schema / properties / include_links
        Added value: +{
        +  "default": false,
        +  "description": "When True, append a LINKS section listing the http(s) URLs from the HTML body that the text output omits. Only applies to body_format='text'.",
        +  "type": "boolean"
        +}
    • Removedget_page_thumbnail
    • Changedimport_to_google_doc1 field changed
      • changedInput schema / properties / file_name / description
        Previous value: -"The name for the new Google Doc (extension will be ignored)."New value: +"The name for the new Google Doc; the extension is dropped from the title. Without 'source_format', its extension also sets the format of 'content' or 'base64_content' (e.g. 'Notes.md' so Markdown tables are not imported as plain text)."
    • Changedimport_to_google_sheets1 field changed
      • changedInput schema / properties / file_name / description
        Previous value: -"The name for the new Google Sheets spreadsheet (extension will be ignored)."New value: +"The name for the new Google Sheets spreadsheet; the extension is dropped from the title. Without 'source_format', its extension also sets the format of 'content' or 'base64_content' (e.g. 'Data.csv')."
    • Changedimport_to_google_slides1 field changed
      • changedInput schema / properties / file_name / description
        Previous value: -"The name for the new Google Slides presentation (extension will be ignored)."New value: +"The name for the new Google Slides presentation; the extension is dropped from the title. Without 'source_format', its extension also sets the format of 'base64_content' (e.g. 'Deck.pptx')."
    • Changedlist_contacts4 fields changed
      • changedInput schema / properties / page_token / description
        Previous value: -"Token for pagination."New value: +"Token for pagination. Keep all other arguments unchanged when following it."
      • addedInput schema / properties / request_sync_token
        Added value: +{
        +  "default": false,
        +  "description": "Start a full sync. The last page returns a sync token.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / sort_order / description
        Previous value: -"Sort order: \"LAST_MODIFIED_ASCENDING\", \"LAST_MODIFIED_DESCENDING\", \"FIRST_NAME_ASCENDING\", or \"LAST_NAME_ASCENDING\"."New value: +"Sort order: \"LAST_MODIFIED_ASCENDING\", \"LAST_MODIFIED_DESCENDING\", \"FIRST_NAME_ASCENDING\", or \"LAST_NAME_ASCENDING\". Not supported when syncing."
      • addedInput schema / properties / sync_token
        Added value: +{
        +  "default": null,
        +  "description": "List only changes since the sync that returned this token, marking deleted contacts. The last page returns a new sync token.",
        +  "type": "string"
        +}
    • Changedmanage_contact1 field changed
      • changedInput schema / properties / address / description
        Previous value: -"Street address (for create/update)."New value: +"Street address, replacing any existing addresses. \"\" clears them (for create/update)."
    • Changedmanage_contacts_batch2 fields changed
      • changedInput schema / properties / contacts / description
        Previous value: -"List of contact dicts for \"create\" action.\nEach dict may contain: given_name, family_name, phones, emails, organizations,\nnotes, address. Deprecated: phone, email, organization, job_title."New value: +"List of contact dicts for \"create\" action.\nEach dict may contain: given_name, family_name, phones, emails,\norganizations, nicknames, urls, user_defined, relations, notes, address,\nbirthday. Deprecated: phone, email, organization, job_title."
      • changedInput schema / properties / field / description
        Previous value: -"For \"update\" action — the single People API field to update across\nall contacts in this batch. Required. Must be one of: names, phoneNumbers,\nemailAddresses, organizations, nicknames, urls, userDefined, relations,\nbiographies, addresses, birthdays. Using a single field per batch call prevents\nunintentional data loss from a union updateMask overwriting unrelated fields."New value: +"For \"update\" action, the single People API field to update across\nall contacts in this batch. Required. Must be one of: names, phoneNumbers,\nemailAddresses, organizations, nicknames, urls, userDefined, relations,\nbiographies, addresses, birthdays. Using a single field per batch call prevents\nunintentional data loss from a union updateMask overwriting unrelated fields."
    • Changedmanage_event1 field changed
      • changedInput schema / properties / color_id / description
        Previous value: -"Event color ID (1-11, update only)."New value: +"Event color, by name or ID: lavender (1), sage (2),\ngrape (3), flamingo (4), banana (5), tangerine (6), peacock (7),\ngraphite (8), blueberry (9), basil (10), tomato (11)."
    • Changedmanage_focus_time2 fields changed
      • changedInput schema / properties / max_results / description
        Previous value: -"For \"list\" action: maximum events to return. Defaults to 10."New value: +"For \"list\" action: maximum events to return in one page. Defaults to 10."
      • addedInput schema / properties / page_token
        Added value: +{
        +  "default": null,
        +  "description": "For \"list\" action: token for the next page, taken from a previous response. Also pass the response's Pagination time_min as time_min, even if omitted on the first call. Keep all other query parameters unchanged.",
        +  "type": "string"
        +}
    • Changedmanage_out_of_office2 fields changed
      • changedInput schema / properties / max_results / description
        Previous value: -"For \"list\" action: maximum events to return. Defaults to 10."New value: +"For \"list\" action: maximum events to return in one page. Defaults to 10."
      • addedInput schema / properties / page_token
        Added value: +{
        +  "default": null,
        +  "description": "For \"list\" action: token for the next page, taken from a previous response. Also pass the response's Pagination time_min as time_min, even if omitted on the first call. Keep all other query parameters unchanged.",
        +  "type": "string"
        +}
    • Changedmanage_sheet_tab3 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"One of \"rename\", \"delete\", \"hide\", \"unhide\", \"reorder\""New value: +"One of \"rename\", \"delete\", \"hide\", \"unhide\", \"reorder\", \"style\""
      • addedInput schema / properties / show_gridlines
        Added value: +{
        +  "default": null,
        +  "description": "For action=\"style\": show (True) or hide (False) the\nsheet's gridlines",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / tab_color
        Added value: +{
        +  "default": null,
        +  "description": "For action=\"style\": hex tab color (#RRGGBB), or \"none\" to\nremove it",
        +  "type": "string"
        +}
    • Changedmanage_spreadsheet_comment1 field changed
      • addedInput schema / properties / cell
        Added value: +{
        +  "default": null,
        +  "type": "string"
        +}
    • Changedmodify_doc_text7 fields changed
      • addedInput schema / properties / heading
        Added value: +{
        +  "default": null,
        +  "description": "Text of a body heading (case-insensitive, must match exactly one) whose\nsection to edit instead of start_index/end_index",
        +  "type": "string"
        +}
      • addedInput schema / properties / heading_level
        Added value: +{
        +  "default": null,
        +  "description": "Optional 1-6 heading level to narrow the heading match",
        +  "type": "integer"
        +}
      • addedInput schema / properties / start_index / default
        Added value: +null
      • changedInput schema / properties / start_index / description
        Previous value: -"Start position for operation using Docs API indices from\ninspect_doc_structure. For the main body, 0 is also accepted as an\nalias for the first writable position."New value: +"Start position for operation using Docs API indices from\ninspect_doc_structure. For the main body, 0 is also accepted as an\nalias for the first writable position. Required unless heading is set."
      • changedInput schema / properties / tab_id / description
        Previous value: -"Optional document tab ID to target"New value: +"Optional document tab ID to target (required with heading when the doc has multiple tabs)"
      • changedInput schema / properties / text / description
        Previous value: -"New text to insert or replace with (optional - can format existing text without changing it)"New value: +"New text to insert or replace with (optional - can format existing text without changing it).\nRendered as Markdown when heading is set."
      • changedInput schema / required
        Previous value: -[
        -  "user_google_email",
        -  "document_id",
        -  "start_index"
        -]New value: +[
        +  "user_google_email",
        +  "document_id"
        +]
    • Addedrender_page_to_image
    • Changedsearch_gmail_messages2 fields changed
      • changedInput schema / properties / include_headers / description
        Previous value: -"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)."New value: +"If True, also fetch each message's metadata and include\nSubject, From, Date and label IDs (e.g. DRAFT, SENT) per result. Costs one\nmetadata get per result, grouped into HTTP batches of up to 10, plus retries\nfor transient failures.\nDefaults to False (output unchanged from prior versions)."
      • changedInput schema / properties / query / description
        Previous value: -"The search query. Supports standard Gmail search operators."New value: +"The search query. Supports standard Gmail search operators.\nResults include drafts unless the query excludes them (e.g. in:sent or -in:drafts)."
    • Changedsend_gmail_message3 fields changed
      • changedInput schema / properties / body_format / description
        Previous value: -"Format of the body content (and of the prepended note when forwarding). Use 'plain' for plaintext or 'html' for HTML content."New value: +"Format of the body content (and of the prepended note when forwarding). Use 'plain' for plaintext or 'html' for HTML content. With 'html', write real markup; an entity-escaped body ('&lt;div&gt;') is rejected."
      • addedInput schema / properties / direction
        Added value: +{
        +  "default": "auto",
        +  "description": "Base text direction of the body. 'auto' (default) takes it from the first strong character (a right-to-left script gives 'rtl', anything else 'ltr'); 'ltr'/'rtl' force it. On a forward it orients the note.",
        +  "enum": [
        +    "auto",
        +    "ltr",
        +    "rtl"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / subject / description
        Previous value: -"Email subject. Required when sending; optional when forwarding (defaults to 'Fwd: <original subject>')."New value: +"Email subject. Required for a new message. Optional when replying with thread_id (inherits the parent message's subject, adding 'Re:' only if absent) or when forwarding (defaults to 'Fwd: <original subject>')."
  4. 12 tool updatesv1.30.1
    • Changedget_gmail_attachment_content1 field changed
      • changedInput schema / properties / attachment_index / description
        Previous value: -"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."New value: +"Zero-based attachment position from\nthe message-content response. Lets the server resolve Gmail's\nrefreshed attachment IDs against current metadata before every\ndownload, selecting the current attachment ID, filename and MIME type."
    • Changedget_page3 fields changed
      • changedInput schema / properties / include_geometry / description
        Previous value: -"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."New value: +"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. Tables also report column\nwidths, row heights and cell text."
      • addedInput schema / properties / include_styles
        Added value: +{
        +  "default": false,
        +  "description": "Also report text styling: per paragraph\n(alignment, indents, spacing, bullets) and per run of uniform style\n(font family, weight, size, bold/italic, color), each with a short\nexcerpt; plus placeholder linkage, autofit, fill and outline for\nshapes (fill=none / outline=none when explicitly not rendered),\nand the text styling of every table cell. Only explicitly set\nvalues appear; anything else is inherited from the placeholder\nnamed in the output. Use for proofing: font consistency, color\nuse, alignment.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / raw
        Added value: +{
        +  "default": false,
        +  "description": "Return the complete Slides API Page resource as JSON instead\nof the summary. Nothing is filtered. Use when the summary does not\ncarry a field you need. Overrides the other flags.",
        +  "type": "boolean"
        +}
    • Changedget_page_thumbnail1 field changed
      • addedInput schema / properties / inline
        Added value: +{
        +  "default": false,
        +  "description": "Also return the rendered PNG itself as image content, so\na multimodal client can look at the slide without fetching the URL.\nThe URL is a short-lived googleusercontent link that sandboxed or\negress-restricted clients often cannot reach. If the image cannot\nbe fetched, the URL-only result is returned with a note saying so.\nDefaults to False.",
        +  "type": "boolean"
        +}
    • Changedget_presentation2 fields changed
      • addedInput schema / properties / include_styles
        Added value: +{
        +  "default": false,
        +  "description": "Also list each slide's elements with text styling\n(see get_page). Defaults to False.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / raw
        Added value: +{
        +  "default": false,
        +  "description": "Return the complete Slides API Presentation resource as JSON\n(slides, layouts, masters, notes, every element and style) instead\nof the summary. Nothing is filtered, so it can be large; prefer\nget_page with raw=True for a single slide. Overrides the other flags.",
        +  "type": "boolean"
        +}
    • Removedinsert_smart_chips
    • Changedlist_docs_in_folder4 fields changed
      • addedInput schema / properties / folder_id / description
        Added value: +"ID of the Drive folder to list. Defaults to 'root'."
      • addedInput schema / properties / page_size / description
        Added value: +"Maximum number of documents to return. Defaults to 100."
      • addedInput schema / properties / page_token
        Added value: +{
        +  "default": null,
        +  "description": "Page token from a previous response's nextPageToken to\nretrieve the next page of results.",
        +  "type": "string"
        +}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address."
    • Changedlist_drive_items1 field changed
      • changedInput schema / properties / corpora / description
        Previous value: -"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."New value: +"Corpus to query ('user', 'drive', 'allDrives'). If `drive_id` is set and `corpora` is None, 'drive' is used. If None and no `drive_id`, 'allDrives' is used when `include_items_from_all_drives` is True."
    • Changedlist_spreadsheets3 fields changed
      • addedInput schema / properties / corpora
        Added value: +{
        +  "default": null,
        +  "description": "Corpus to search ('user', 'domain', 'drive', 'allDrives').\nDefaults to 'drive' when drive_id is set, otherwise 'allDrives'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / drive_id
        Added value: +{
        +  "default": null,
        +  "description": "Shared drive ID to search.",
        +  "type": "string"
        +}
      • addedInput schema / properties / page_token
        Added value: +{
        +  "default": null,
        +  "description": "Page token from a previous response's nextPageToken to retrieve the next page of results.",
        +  "type": "string"
        +}
    • Changedmanage_gmail_filter6 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"Action to perform - \"create\" or \"delete\"."New value: +"\"create\", \"delete\", \"update\" or \"apply\"."
      • changedInput schema / properties / criteria / description
        Previous value: -"Filter criteria object (required for create)."New value: +"Filter criteria object (required for create; optional for update/apply)."
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": false,
        +  "description": "apply only: count matches without changing anything.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / filter_action / description
        Previous value: -"Filter action object (required for create). Named 'filter_action' to avoid shadowing the 'action' parameter."New value: +"Filter action object (required for create; optional for update/apply). Named 'filter_action' to avoid shadowing the 'action' parameter."
      • changedInput schema / properties / filter_id / description
        Previous value: -"ID of the filter to delete (required for delete)."New value: +"ID of the filter (required for delete and update; optional for apply)."
      • addedInput schema / properties / max_messages
        Added value: +{
        +  "default": 5000,
        +  "description": "apply only: safety cap on messages changed (default 5000).",
        +  "type": "integer"
        +}
    • Changedmodify_sheet_values3 fields changed
      • addedInput schema / properties / chip_type
        Added value: +{
        +  "default": null,
        +  "description": "Explicit chip type if passing raw strings in chips: \"drive\" (default for URLs/IDs) or \"person\" (default for emails).",
        +  "type": "string"
        +}
      • addedInput schema / properties / chips
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "items": {},
        +      "type": "array"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Smart chip(s) to insert instead of values:\n- A single URL or email string for a single cell (e.g., \"https://drive.google.com/drive/folders/123\", \"user@example.com\").\n- A list of URLs or emails for a single cell (multiple chips) or across cells (e.g., [\"https://...\", \"https://...\"]).\n- A 2D list of URLs/emails matching a grid range. For a single-row or single-column\n  range, each inner list is instead the chips for one cell (e.g., [[\"a@x.com\", \"b@x.com\"]]\n  puts both chips in the first cell of \"A1:C1\").\n- A dict or list of dicts with explicit properties (e.g., {\"type\": \"drive\", \"uri\": \"...\"}, {\"type\": \"person\", \"email\": \"...\"}).\n- A JSON-encoded string representing any of the above formats."
        +}
      • changedInput schema / properties / values / description
        Previous value: -"2D array of values to write/update. Can be a JSON string or Python list. Required unless clear_values=True."New value: +"2D array of values to write/update. Can be a JSON string or Python list. Required unless clear_values=True or chips is provided."
    • Changedsearch_docs6 fields changed
      • addedInput schema / properties / corpora
        Added value: +{
        +  "default": null,
        +  "description": "Corpus to search ('user', 'domain', 'drive', 'allDrives').\nDefaults to 'drive' when drive_id is set, otherwise 'allDrives'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / drive_id
        Added value: +{
        +  "default": null,
        +  "description": "Optional shared drive ID to search.",
        +  "type": "string"
        +}
      • addedInput schema / properties / page_size / description
        Added value: +"Maximum number of documents to return. Defaults to 10."
      • addedInput schema / properties / page_token
        Added value: +{
        +  "default": null,
        +  "description": "Page token from a previous response's nextPageToken to\nretrieve the next page of results.",
        +  "type": "string"
        +}
      • addedInput schema / properties / query / description
        Added value: +"Text to search for in document names."
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address."
    • Changedsearch_drive_files1 field changed
      • changedInput schema / properties / corpora / description
        Previous 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."New 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 it defaults to 'allDrives' when `include_items_from_all_drives` is True.\n                     Pass 'user' to search only My Drive and files shared with the user."
  5. 87 tool updatesv1.28.0
    • Changedbatch_update_doc1 field changed
      • changedInput schema / properties / operations / items / oneOf
        Previous 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"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "after_heading": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "anchor_position": {
        +        "default": "after",
        +        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        +        "enum": [
        +          "before",
        +          "after"
        +        ],
        +        "type": "string"
        +      },
        +      "anchor_text": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "before_heading": {
        +        "default": null,
        +        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        +        "type": "string"
        +      },
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the targeted body/segment instead of using index.",
        +        "type": "boolean"
        +      },
        +      "index": {
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true.",
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Text to insert.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_text"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "delete_text"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Replacement text.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "replace_text"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "background_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "baseline_offset": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "bold": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "clear_link": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "font_family": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "font_size": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "font_weight": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "italic": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "link_url": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "small_caps": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "strikethrough": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "text_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "format_text"
        +        ],
        +        "type": "string"
        +      },
        +      "underline": {
        +        "default": null,
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alignment": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "avoid_widow_and_orphan": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "border_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "border_dash": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "border_edges": {
        +        "default": null,
        +        "description": "Paragraph border edges to update; omit to update top, bottom, left, and right.",
        +        "items": {
        +          "enum": [
        +            "top",
        +            "bottom",
        +            "left",
        +            "right",
        +            "between"
        +          ],
        +          "type": "string"
        +        },
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "border_padding": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "border_width": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "direction": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "heading_level": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "indent_end": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "indent_first_line": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "indent_start": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "keep_lines_together": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "keep_with_next": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "line_spacing": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "named_style_type": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "page_break_before": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "shading_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "space_above": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "space_below": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "spacing_mode": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "update_paragraph_style"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "background_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "border_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "border_edges": {
        +        "default": null,
        +        "description": "Table-cell border edges to update; omit to update all four edges.",
        +        "items": {
        +          "enum": [
        +            "top",
        +            "bottom",
        +            "left",
        +            "right"
        +          ],
        +          "type": "string"
        +        },
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "border_width": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "column_index": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "column_span": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "content_alignment": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "padding_bottom": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "padding_left": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "padding_right": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "padding_top": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "row_index": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "row_span": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "update_table_cell_style"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "after_heading": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "anchor_position": {
        +        "default": "after",
        +        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        +        "enum": [
        +          "before",
        +          "after"
        +        ],
        +        "type": "string"
        +      },
        +      "anchor_text": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "before_heading": {
        +        "default": null,
        +        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        +        "type": "string"
        +      },
        +      "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": {
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true.",
        +        "type": "integer"
        +      },
        +      "rows": {
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_table_row"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "row_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "row_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_table_column"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "column_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "column_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "update_table_column_properties"
        +        ],
        +        "type": "string"
        +      },
        +      "width": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "width_type": {
        +        "default": null,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "column_indices"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "min_row_height": {
        +        "default": null,
        +        "description": "Minimum row height in points.",
        +        "type": "number"
        +      },
        +      "row_indices": {
        +        "description": "Zero-based row indices to style, e.g. [0] for the header row.",
        +        "items": {
        +          "type": "integer"
        +        },
        +        "type": "array"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "enum": [
        +          "pin_table_header_rows"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "pinned_header_rows_count"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "after_heading": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "anchor_position": {
        +        "default": "after",
        +        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        +        "enum": [
        +          "before",
        +          "after"
        +        ],
        +        "type": "string"
        +      },
        +      "anchor_text": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "before_heading": {
        +        "default": null,
        +        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        +        "type": "string"
        +      },
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the targeted body/segment instead of using index.",
        +        "type": "boolean"
        +      },
        +      "index": {
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true.",
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_page_break"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "after_heading": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "anchor_position": {
        +        "default": "after",
        +        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        +        "enum": [
        +          "before",
        +          "after"
        +        ],
        +        "type": "string"
        +      },
        +      "anchor_text": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "before_heading": {
        +        "default": null,
        +        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        +        "type": "string"
        +      },
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the targeted body/segment instead of using index.",
        +        "type": "boolean"
        +      },
        +      "index": {
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true.",
        +        "type": "integer"
        +      },
        +      "section_type": {
        +        "default": "NEXT_PAGE",
        +        "enum": [
        +          "CONTINUOUS",
        +          "NEXT_PAGE"
        +        ],
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "find_replace"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "find_text",
        +      "replace_text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "bullet_preset": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "list_type": {
        +        "default": "UNORDERED",
        +        "enum": [
        +          "UNORDERED",
        +          "ORDERED",
        +          "CHECKBOX",
        +          "NONE"
        +        ],
        +        "type": "string"
        +      },
        +      "nesting_level": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "paragraph_start_indices": {
        +        "default": null,
        +        "items": {
        +          "type": "integer"
        +        },
        +        "type": "array"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "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": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "create_named_range"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "name",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "named_range_id": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "named_range_name": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "text": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "replace_named_range_content"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "named_range_id": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "named_range_name": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "delete_named_range"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "background_color": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "document_mode": {
        +        "default": null,
        +        "enum": [
        +          "PAGES",
        +          "PAGELESS"
        +        ],
        +        "type": "string"
        +      },
        +      "flip_page_orientation": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "margin_bottom": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_footer": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_header": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_left": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_right": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_top": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "page_height": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "page_number_start": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "page_width": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "update_document_style"
        +        ],
        +        "type": "string"
        +      },
        +      "use_even_page_header_footer": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "use_first_page_header_footer": {
        +        "default": null,
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "column_count": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "column_separator_style": {
        +        "default": null,
        +        "enum": [
        +          "NONE",
        +          "BETWEEN_EACH_COLUMN"
        +        ],
        +        "type": "string"
        +      },
        +      "column_spacing": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "content_direction": {
        +        "default": null,
        +        "enum": [
        +          "LEFT_TO_RIGHT",
        +          "RIGHT_TO_LEFT"
        +        ],
        +        "type": "string"
        +      },
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "flip_page_orientation": {
        +        "default": null,
        +        "type": "boolean"
        +      },
        +      "margin_bottom": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_footer": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_header": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_left": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_right": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "margin_top": {
        +        "default": null,
        +        "type": "number"
        +      },
        +      "page_number_start": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "update_section_style"
        +        ],
        +        "type": "string"
        +      },
        +      "use_first_page_header_footer": {
        +        "default": null,
        +        "type": "boolean"
        +      }
        +    },
        +    "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": {
        +        "default": null,
        +        "description": "Optional section break index for section-scoped layouts.",
        +        "type": "integer"
        +      },
        +      "section_type": {
        +        "description": "Which section to create.",
        +        "enum": [
        +          "header",
        +          "footer"
        +        ],
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "create_header_footer"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "section_type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "after_heading": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "anchor_position": {
        +        "default": "after",
        +        "description": "Which side of anchor_text to insert on. Defaults to 'after'.",
        +        "enum": [
        +          "before",
        +          "after"
        +        ],
        +        "type": "string"
        +      },
        +      "anchor_text": {
        +        "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.",
        +        "type": "string"
        +      },
        +      "before_heading": {
        +        "default": null,
        +        "description": "Insert immediately before the heading paragraph with this exact text. Errors when it matches zero or more than one heading.",
        +        "type": "string"
        +      },
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the targeted body/segment instead of using index.",
        +        "type": "boolean"
        +      },
        +      "height": {
        +        "default": null,
        +        "type": "integer"
        +      },
        +      "image_uri": {
        +        "description": "Image URL or resolvable image URI.",
        +        "type": "string"
        +      },
        +      "index": {
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true.",
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "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'.",
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "default": null,
        +        "description": "Optional document tab ID to target.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_image"
        +        ],
        +        "type": "string"
        +      },
        +      "width": {
        +        "default": null,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "image_uri"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "index": {
        +        "type": "integer"
        +      },
        +      "parent_tab_id": {
        +        "default": null,
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "insert_doc_tab"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "title",
        +      "index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "tab_id": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "delete_doc_tab"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "tab_id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "tab_id": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "update_doc_tab"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "tab_id",
        +      "title"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcheck_drive_file_public_access2 fields changed
      • removedInput schema / properties / drive_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / drive_id / type
        Added value: +"string"
    • Changedcopy_drive_file2 fields changed
      • removedInput schema / properties / new_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / new_name / type
        Added value: +"string"
    • Changedcreate_calendar4 fields changed
      • removedInput schema / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / description / type
        Added value: +"string"
      • removedInput schema / properties / timezone / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / timezone / type
        Added value: +"string"
    • Changedcreate_doc1 field changed
      • addedInput schema / properties / folder_id
        Added value: +{
        +  "default": "root",
        +  "description": "The ID of the parent folder. Defaults to 'root'. For shared\ndrives, this must be a folder ID within the shared drive.",
        +  "type": "string"
        +}
    • Changedcreate_drive_file12 fields changed
      • removedInput schema / properties / base64_content / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / base64_content / type
        Added value: +"string"
      • removedInput schema / properties / base64_sha256 / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / base64_sha256 / type
        Added value: +"string"
      • removedInput schema / properties / content / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / content / type
        Added value: +"string"
      • removedInput schema / properties / content_mime_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / content_mime_type / type
        Added value: +"string"
      • removedInput schema / properties / fileUrl / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / fileUrl / type
        Added value: +"string"
      • changedInput schema / properties / mime_type / default
        Previous value: -"text/plain"New value: +null
      • changedInput schema / properties / mime_type / description
        Previous value: -"The MIME type of the file. Defaults to 'text/plain'."New value: +"The MIME type of the file. Defaults to 'text/plain'; required with return_upload_url."
    • Changedcreate_form4 fields changed
      • removedInput schema / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / description / type
        Added value: +"string"
      • removedInput schema / properties / document_title / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / document_title / type
        Added value: +"string"
    • Removedcreate_script_project
    • Changedcreate_sheet6 fields changed
      • removedInput schema / properties / insert_sheet_index / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / insert_sheet_index / type
        Added value: +"integer"
      • removedInput schema / properties / sheet_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / sheet_name / type
        Added value: +"string"
      • removedInput schema / properties / source_sheet_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / source_sheet_name / type
        Added value: +"string"
    • Changedcreate_spreadsheet4 fields changed
      • addedInput schema / properties / folder_id
        Added value: +{
        +  "default": "root",
        +  "description": "The ID of the parent folder. Defaults to 'root'. For shared\ndrives, this must be a folder ID within the shared drive.",
        +  "type": "string"
        +}
      • removedInput schema / properties / sheet_names / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / sheet_names / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / sheet_names / type
        Added value: +"array"
    • Changedcreate_table_with_data2 fields changed
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / tab_id / type
        Added value: +"string"
    • Removedcreate_version
    • Removeddelete_script_project
    • Changeddraft_gmail_message19 fields changed
      • removedInput schema / properties / attachments / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / attachments / items
        Added value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
      • addedInput schema / properties / attachments / type
        Added value: +"array"
      • removedInput schema / properties / bcc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / bcc / type
        Added value: +"string"
      • removedInput schema / properties / cc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / cc / type
        Added value: +"string"
      • removedInput schema / properties / from_email / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / from_email / type
        Added value: +"string"
      • removedInput schema / properties / from_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / from_name / type
        Added value: +"string"
      • removedInput schema / properties / in_reply_to / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / in_reply_to / type
        Added value: +"string"
      • removedInput schema / properties / references / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / references / type
        Added value: +"string"
      • removedInput schema / properties / thread_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / thread_id / type
        Added value: +"string"
      • removedInput schema / properties / to / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / to / type
        Added value: +"string"
    • Changedfind_and_replace_doc2 fields changed
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / tab_id / type
        Added value: +"string"
    • Changedformat_sheet_range20 fields changed
      • removedInput schema / properties / background_color / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / background_color / type
        Added value: +"string"
      • removedInput schema / properties / bold / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / bold / type
        Added value: +"boolean"
      • removedInput schema / properties / font_size / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / font_size / type
        Added value: +"integer"
      • removedInput schema / properties / horizontal_alignment / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / horizontal_alignment / type
        Added value: +"string"
      • removedInput schema / properties / italic / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / italic / type
        Added value: +"boolean"
      • removedInput schema / properties / number_format_pattern / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / number_format_pattern / type
        Added value: +"string"
      • removedInput schema / properties / number_format_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / number_format_type / type
        Added value: +"string"
      • removedInput schema / properties / text_color / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / text_color / type
        Added value: +"string"
      • removedInput schema / properties / vertical_alignment / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / vertical_alignment / type
        Added value: +"string"
      • removedInput schema / properties / wrap_strategy / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / wrap_strategy / type
        Added value: +"string"
    • Changedget_doc_as_markdown2 fields changed
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / tab_id / type
        Added value: +"string"
    • Changedget_doc_content2 fields changed
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / tab_id / type
        Added value: +"string"
    • Changedget_drive_file_download_url2 fields changed
      • removedInput schema / properties / export_format / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / export_format / type
        Added value: +"string"
    • Changedget_events10 fields changed
      • removedInput schema / properties / event_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / event_id / type
        Added value: +"string"
      • removedInput schema / properties / page_token / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / page_token / type
        Added value: +"string"
      • removedInput schema / properties / query / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / query / type
        Added value: +"string"
      • removedInput schema / properties / time_max / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / time_max / type
        Added value: +"string"
      • removedInput schema / properties / time_min / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / time_min / type
        Added value: +"string"
    • Changedget_gmail_attachment_content2 fields changed
      • removedInput schema / properties / attachment_index / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / attachment_index / type
        Added value: +"integer"
    • Changedget_gmail_message_content2 fields changed
      • changedInput schema / properties / body_format / description
        Previous value: -"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."New value: +"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."
      • addedInput schema / properties / format
        Added value: +{
        +  "default": "full",
        +  "description": "Message format. \"full\" (default) includes\nthe body and attachments, \"metadata\" only headers.",
        +  "enum": [
        +    "full",
        +    "metadata"
        +  ],
        +  "type": "string"
        +}
    • Changedget_messages2 fields changed
      • removedInput schema / properties / message_filter / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / message_filter / type
        Added value: +"string"
    • Addedget_script_activity
    • Removedget_script_content
    • Removedget_script_metrics
    • Changedget_script_project7 fields changed
      • addedInput schema / properties / action
        Added value: +{
        +  "description": "One of \"list\", \"get\".",
        +  "type": "string"
        +}
      • addedInput schema / properties / file_name
        Added value: +{
        +  "default": null,
        +  "description": "Optional source file name for get.",
        +  "type": "string"
        +}
      • addedInput schema / properties / page_size
        Added value: +{
        +  "default": 50,
        +  "description": "Number of results per page for list (default: 50).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / page_token
        Added value: +{
        +  "default": null,
        +  "description": "Pagination token for list (optional).",
        +  "type": "string"
        +}
      • addedInput schema / properties / script_id / default
        Added value: +null
      • changedInput schema / properties / script_id / description
        Previous value: -"The script project ID"New value: +"The script project ID (required for get)."
      • changedInput schema / required
        Previous value: -[
        -  "user_google_email",
        -  "script_id"
        -]New value: +[
        +  "user_google_email",
        +  "action"
        +]
    • Addedget_script_version
    • Removedget_version
    • Changedimport_to_google_doc12 fields changed
      • removedInput schema / properties / base64_content / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / base64_content / type
        Added value: +"string"
      • removedInput schema / properties / base64_sha256 / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / base64_sha256 / type
        Added value: +"string"
      • removedInput schema / properties / content / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / content / type
        Added value: +"string"
      • removedInput schema / properties / file_path / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / file_path / type
        Added value: +"string"
      • removedInput schema / properties / file_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / file_url / type
        Added value: +"string"
      • removedInput schema / properties / source_format / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / source_format / type
        Added value: +"string"
    • Changedimport_to_google_sheets12 fields changed
      • removedInput schema / properties / base64_content / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / base64_content / type
        Added value: +"string"
      • removedInput schema / properties / base64_sha256 / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / base64_sha256 / type
        Added value: +"string"
      • removedInput schema / properties / content / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / content / type
        Added value: +"string"
      • removedInput schema / properties / file_path / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / file_path / type
        Added value: +"string"
      • removedInput schema / properties / file_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / file_url / type
        Added value: +"string"
      • removedInput schema / properties / source_format / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / source_format / type
        Added value: +"string"
    • Changedimport_to_google_slides10 fields changed
      • removedInput schema / properties / base64_content / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / base64_content / type
        Added value: +"string"
      • removedInput schema / properties / base64_sha256 / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / base64_sha256 / type
        Added value: +"string"
      • removedInput schema / properties / file_path / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / file_path / type
        Added value: +"string"
      • removedInput schema / properties / file_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / file_url / type
        Added value: +"string"
      • removedInput schema / properties / source_format / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / source_format / type
        Added value: +"string"
    • Addedinsert_smart_chips
    • Changedinspect_doc_structure2 fields changed
      • removedInput schema / properties / preview_chars / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / preview_chars / type
        Added value: +"integer"
    • Changedlist_calendars4 fields changed
      • removedInput schema / properties / max_results / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / max_results / type
        Added value: +"integer"
      • removedInput schema / properties / page_token / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / page_token / type
        Added value: +"string"
    • Changedlist_contact_groups2 fields changed
      • removedInput schema / properties / page_token / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / page_token / type
        Added value: +"string"
    • Changedlist_contacts4 fields changed
      • removedInput schema / properties / page_token / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / page_token / type
        Added value: +"string"
      • removedInput schema / properties / sort_order / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / sort_order / type
        Added value: +"string"
    • Removedlist_deployments
    • Changedlist_document_comments2 fields changed
      • removedInput schema / properties / max_comments / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / max_comments / type
        Added value: +"integer"
    • Changedlist_drive_items12 fields changed
      • removedInput schema / properties / corpora / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / corpora / type
        Added value: +"string"
      • removedInput schema / properties / drive_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / drive_id / type
        Added value: +"string"
      • removedInput schema / properties / file_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / file_type / type
        Added value: +"string"
      • removedInput schema / properties / order_by / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / order_by / type
        Added value: +"string"
      • removedInput schema / properties / page_token / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / page_token / type
        Added value: +"string"
      • removedInput schema / properties / query / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / query / type
        Added value: +"string"
    • Changedlist_form_responses2 fields changed
      • removedInput schema / properties / page_token / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / page_token / type
        Added value: +"string"
    • Changedlist_gmail_labels2 fields changed
      • removedInput schema / properties / prefix / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / prefix / type
        Added value: +"string"
    • Changedlist_presentation_comments2 fields changed
      • removedInput schema / properties / max_comments / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / max_comments / type
        Added value: +"integer"
    • Addedlist_script_deployments
    • Removedlist_script_processes
    • Removedlist_script_projects
    • Changedlist_spreadsheet_comments2 fields changed
      • removedInput schema / properties / max_comments / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / max_comments / type
        Added value: +"integer"
    • Changedlist_task_lists2 fields changed
      • removedInput schema / properties / page_token / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / page_token / type
        Added value: +"string"
    • Changedlist_tasks12 fields changed
      • removedInput schema / properties / completed_max / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / completed_max / type
        Added value: +"string"
      • removedInput schema / properties / completed_min / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / completed_min / type
        Added value: +"string"
      • removedInput schema / properties / due_max / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / due_max / type
        Added value: +"string"
      • removedInput schema / properties / due_min / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / due_min / type
        Added value: +"string"
      • removedInput schema / properties / page_token / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / page_token / type
        Added value: +"string"
      • removedInput schema / properties / updated_min / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / updated_min / type
        Added value: +"string"
    • Removedlist_versions
    • Changedmanage_conditional_formatting14 fields changed
      • removedInput schema / properties / background_color / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / background_color / type
        Added value: +"string"
      • removedInput schema / properties / condition_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / condition_type / type
        Added value: +"string"
      • changedInput schema / properties / condition_values / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "number"
        -        }
        -      ]
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "integer"
        +        },
        +        {
        +          "type": "number"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / gradient_points / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  }
        +]
      • removedInput schema / properties / range_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / range_name / type
        Added value: +"string"
      • removedInput schema / properties / rule_index / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / rule_index / type
        Added value: +"integer"
      • removedInput schema / properties / sheet_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / sheet_name / type
        Added value: +"string"
      • removedInput schema / properties / text_color / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / text_color / type
        Added value: +"string"
    • Changedmanage_contact41 fields changed
      • removedInput schema / properties / address / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / address / type
        Added value: +"string"
      • removedInput schema / properties / birthday / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / birthday / type
        Added value: +"string"
      • removedInput schema / properties / contact_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / contact_id / type
        Added value: +"string"
      • removedInput schema / properties / email / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / email / type
        Added value: +"string"
      • removedInput schema / properties / emails / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": false,
        -      "description": "Typed input for an email entry.",
        -      "properties": {
        -        "address": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Email address value."
        -        },
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Email type such as work, home, or other."
        -        },
        -        "value": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Backward-compatible alias for the email address value."
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / emails / items
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Typed input for an email entry.",
        +  "properties": {
        +    "address": {
        +      "default": null,
        +      "description": "Email address value.",
        +      "type": "string"
        +    },
        +    "type": {
        +      "default": null,
        +      "description": "Email type such as work, home, or other.",
        +      "type": "string"
        +    },
        +    "value": {
        +      "default": null,
        +      "description": "Backward-compatible alias for the email address value.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / emails / type
        Added value: +"array"
      • removedInput schema / properties / family_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / family_name / type
        Added value: +"string"
      • removedInput schema / properties / given_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / given_name / type
        Added value: +"string"
      • removedInput schema / properties / job_title / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / job_title / type
        Added value: +"string"
      • removedInput schema / properties / nicknames / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": false,
        -      "description": "Typed input for a nickname entry.",
        -      "properties": {
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Nickname type such as default, alternate_name, maiden_name, initials, or other."
        -        },
        -        "value": {
        -          "description": "Nickname value. Used for bilingual contacts (e.g. Hebrew alternative form).",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "value"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / nicknames / items
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Typed input for a nickname entry.",
        +  "properties": {
        +    "type": {
        +      "default": null,
        +      "description": "Nickname type such as default, alternate_name, maiden_name, initials, or other.",
        +      "type": "string"
        +    },
        +    "value": {
        +      "description": "Nickname value. Used for bilingual contacts (e.g. Hebrew alternative form).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "value"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / nicknames / type
        Added value: +"array"
      • removedInput schema / properties / notes / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / notes / type
        Added value: +"string"
      • removedInput schema / properties / organization / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / organization / type
        Added value: +"string"
      • removedInput schema / properties / organizations / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": false,
        -      "description": "Typed input for an organization entry.",
        -      "properties": {
        -        "department": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Department name."
        -        },
        -        "jobDescription": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Optional organization job description."
        -        },
        -        "name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Organization name."
        -        },
        -        "title": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Job title."
        -        },
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Organization type such as work or school."
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / organizations / items
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Typed input for an organization entry.",
        +  "properties": {
        +    "department": {
        +      "default": null,
        +      "description": "Department name.",
        +      "type": "string"
        +    },
        +    "jobDescription": {
        +      "default": null,
        +      "description": "Optional organization job description.",
        +      "type": "string"
        +    },
        +    "name": {
        +      "default": null,
        +      "description": "Organization name.",
        +      "type": "string"
        +    },
        +    "title": {
        +      "default": null,
        +      "description": "Job title.",
        +      "type": "string"
        +    },
        +    "type": {
        +      "default": null,
        +      "description": "Organization type such as work or school.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / organizations / type
        Added value: +"array"
      • removedInput schema / properties / phone / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / phone / type
        Added value: +"string"
      • removedInput schema / properties / phones / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": false,
        -      "description": "Typed input for a phone entry.",
        -      "properties": {
        -        "number": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Phone number value."
        -        },
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Phone type such as mobile, work, home, or internal."
        -        },
        -        "value": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Backward-compatible alias for the phone number value."
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / phones / items
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Typed input for a phone entry.",
        +  "properties": {
        +    "number": {
        +      "default": null,
        +      "description": "Phone number value.",
        +      "type": "string"
        +    },
        +    "type": {
        +      "default": null,
        +      "description": "Phone type such as mobile, work, home, or internal.",
        +      "type": "string"
        +    },
        +    "value": {
        +      "default": null,
        +      "description": "Backward-compatible alias for the phone number value.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / phones / type
        Added value: +"array"
      • removedInput schema / properties / relations / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": false,
        -      "description": "Typed input for a relation entry (spouse, parent, child, etc.).",
        -      "properties": {
        -        "person": {
        -          "description": "The related person's name (matched against contact names by Google Assistant).",
        -          "type": "string"
        -        },
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Relation type: spouse, child, parent, father, mother, sister, brother, friend, manager, assistant, partner, sibling, domesticPartner, or custom."
        -        }
        -      },
        -      "required": [
        -        "person"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / relations / items
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Typed input for a relation entry (spouse, parent, child, etc.).",
        +  "properties": {
        +    "person": {
        +      "description": "The related person's name (matched against contact names by Google Assistant).",
        +      "type": "string"
        +    },
        +    "type": {
        +      "default": null,
        +      "description": "Relation type: spouse, child, parent, father, mother, sister, brother, friend, manager, assistant, partner, sibling, domesticPartner, or custom.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "person"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / relations / type
        Added value: +"array"
      • removedInput schema / properties / urls / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": false,
        -      "description": "Typed input for a URL entry.",
        -      "properties": {
        -        "type": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "URL type such as homepage, blog, profile, work, ftp, reservations, or other. Custom values allowed."
        -        },
        -        "value": {
        -          "description": "The URL value (e.g. https://example.com).",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "value"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / urls / items
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Typed input for a URL entry.",
        +  "properties": {
        +    "type": {
        +      "default": null,
        +      "description": "URL type such as homepage, blog, profile, work, ftp, reservations, or other. Custom values allowed.",
        +      "type": "string"
        +    },
        +    "value": {
        +      "description": "The URL value (e.g. https://example.com).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "value"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / urls / type
        Added value: +"array"
      • removedInput schema / properties / user_defined / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": false,
        -      "description": "Typed input for a userDefined custom field entry.",
        -      "properties": {
        -        "key": {
        -          "description": "Custom field key (e.g. 'ID', 'Hebrew Birthday', 'Account Number').",
        -          "type": "string"
        -        },
        -        "value": {
        -          "default": "",
        -          "description": "Custom field value. May be omitted when using remove mode (only the key is needed).",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "key"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / user_defined / items
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Typed input for a userDefined custom field entry.",
        +  "properties": {
        +    "key": {
        +      "description": "Custom field key (e.g. 'ID', 'Hebrew Birthday', 'Account Number').",
        +      "type": "string"
        +    },
        +    "value": {
        +      "default": "",
        +      "description": "Custom field value. May be omitted when using remove mode (only the key is needed).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "key"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / user_defined / type
        Added value: +"array"
    • Changedmanage_contact_group10 fields changed
      • removedInput schema / properties / add_contact_ids / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / add_contact_ids / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / add_contact_ids / type
        Added value: +"array"
      • removedInput schema / properties / group_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / group_id / type
        Added value: +"string"
      • removedInput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / name / type
        Added value: +"string"
      • removedInput schema / properties / remove_contact_ids / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / remove_contact_ids / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / remove_contact_ids / type
        Added value: +"array"
    • Changedmanage_contacts_batch12 fields changed
      • removedInput schema / properties / contact_ids / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / contact_ids / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / contact_ids / type
        Added value: +"array"
      • removedInput schema / properties / contacts / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": false,
        -      "description": "Typed batch-create input for a contact.",
        -      "properties": {
        -        "address": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "birthday": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Birthday as 'YYYY-MM-DD', 'MM-DD' (no year), or 'clear'/'' to remove."
        -        },
        -        "email": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "emails": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for an email entry.",
        -                "properties": {
        -                  "address": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Email address value."
        -                  },
        -                  "type": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Email type such as work, home, or other."
        -                  },
        -                  "value": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Backward-compatible alias for the email address value."
        -                  }
        -                },
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "family_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "given_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "job_title": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "nicknames": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for a nickname entry.",
        -                "properties": {
        -                  "type": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Nickname type such as default, alternate_name, maiden_name, initials, or other."
        -                  },
        -                  "value": {
        -                    "description": "Nickname value. Used for bilingual contacts (e.g. Hebrew alternative form).",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "value"
        -                ],
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "notes": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "organization": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "organizations": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for an organization entry.",
        -                "properties": {
        -                  "department": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Department name."
        -                  },
        -                  "jobDescription": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Optional organization job description."
        -                  },
        -                  "name": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Organization name."
        -                  },
        -                  "title": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Job title."
        -                  },
        -                  "type": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Organization type such as work or school."
        -                  }
        -                },
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "phone": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "phones": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for a phone entry.",
        -                "properties": {
        -                  "number": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Phone number value."
        -                  },
        -                  "type": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Phone type such as mobile, work, home, or internal."
        -                  },
        -                  "value": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Backward-compatible alias for the phone number value."
        -                  }
        -                },
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "relations": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for a relation entry (spouse, parent, child, etc.).",
        -                "properties": {
        -                  "person": {
        -                    "description": "The related person's name (matched against contact names by Google Assistant).",
        -                    "type": "string"
        -                  },
        -                  "type": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Relation type: spouse, child, parent, father, mother, sister, brother, friend, manager, assistant, partner, sibling, domesticPartner, or custom."
        -                  }
        -                },
        -                "required": [
        -                  "person"
        -                ],
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "urls": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for a URL entry.",
        -                "properties": {
        -                  "type": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "URL type such as homepage, blog, profile, work, ftp, reservations, or other. Custom values allowed."
        -                  },
        -                  "value": {
        -                    "description": "The URL value (e.g. https://example.com).",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "value"
        -                ],
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "user_defined": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for a userDefined custom field entry.",
        -                "properties": {
        -                  "key": {
        -                    "description": "Custom field key (e.g. 'ID', 'Hebrew Birthday', 'Account Number').",
        -                    "type": "string"
        -                  },
        -                  "value": {
        -                    "default": "",
        -                    "description": "Custom field value. May be omitted when using remove mode (only the key is needed).",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "key"
        -                ],
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / contacts / items
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Typed batch-create input for a contact.",
        +  "properties": {
        +    "address": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "birthday": {
        +      "default": null,
        +      "description": "Birthday as 'YYYY-MM-DD', 'MM-DD' (no year), or 'clear'/'' to remove.",
        +      "type": "string"
        +    },
        +    "email": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "emails": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for an email entry.",
        +        "properties": {
        +          "address": {
        +            "default": null,
        +            "description": "Email address value.",
        +            "type": "string"
        +          },
        +          "type": {
        +            "default": null,
        +            "description": "Email type such as work, home, or other.",
        +            "type": "string"
        +          },
        +          "value": {
        +            "default": null,
        +            "description": "Backward-compatible alias for the email address value.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "family_name": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "given_name": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "job_title": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "nicknames": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for a nickname entry.",
        +        "properties": {
        +          "type": {
        +            "default": null,
        +            "description": "Nickname type such as default, alternate_name, maiden_name, initials, or other.",
        +            "type": "string"
        +          },
        +          "value": {
        +            "description": "Nickname value. Used for bilingual contacts (e.g. Hebrew alternative form).",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "value"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "notes": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "organization": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "organizations": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for an organization entry.",
        +        "properties": {
        +          "department": {
        +            "default": null,
        +            "description": "Department name.",
        +            "type": "string"
        +          },
        +          "jobDescription": {
        +            "default": null,
        +            "description": "Optional organization job description.",
        +            "type": "string"
        +          },
        +          "name": {
        +            "default": null,
        +            "description": "Organization name.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "default": null,
        +            "description": "Job title.",
        +            "type": "string"
        +          },
        +          "type": {
        +            "default": null,
        +            "description": "Organization type such as work or school.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "phone": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "phones": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for a phone entry.",
        +        "properties": {
        +          "number": {
        +            "default": null,
        +            "description": "Phone number value.",
        +            "type": "string"
        +          },
        +          "type": {
        +            "default": null,
        +            "description": "Phone type such as mobile, work, home, or internal.",
        +            "type": "string"
        +          },
        +          "value": {
        +            "default": null,
        +            "description": "Backward-compatible alias for the phone number value.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "relations": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for a relation entry (spouse, parent, child, etc.).",
        +        "properties": {
        +          "person": {
        +            "description": "The related person's name (matched against contact names by Google Assistant).",
        +            "type": "string"
        +          },
        +          "type": {
        +            "default": null,
        +            "description": "Relation type: spouse, child, parent, father, mother, sister, brother, friend, manager, assistant, partner, sibling, domesticPartner, or custom.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "person"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "urls": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for a URL entry.",
        +        "properties": {
        +          "type": {
        +            "default": null,
        +            "description": "URL type such as homepage, blog, profile, work, ftp, reservations, or other. Custom values allowed.",
        +            "type": "string"
        +          },
        +          "value": {
        +            "description": "The URL value (e.g. https://example.com).",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "value"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "user_defined": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for a userDefined custom field entry.",
        +        "properties": {
        +          "key": {
        +            "description": "Custom field key (e.g. 'ID', 'Hebrew Birthday', 'Account Number').",
        +            "type": "string"
        +          },
        +          "value": {
        +            "default": "",
        +            "description": "Custom field value. May be omitted when using remove mode (only the key is needed).",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "key"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / contacts / type
        Added value: +"array"
      • removedInput schema / properties / field / anyOf
        Removed value: -[
        -  {
        -    "enum": [
        -      "names",
        -      "phoneNumbers",
        -      "emailAddresses",
        -      "organizations",
        -      "nicknames",
        -      "urls",
        -      "userDefined",
        -      "relations",
        -      "biographies",
        -      "addresses",
        -      "birthdays"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / field / enum
        Added value: +[
        +  "names",
        +  "phoneNumbers",
        +  "emailAddresses",
        +  "organizations",
        +  "nicknames",
        +  "urls",
        +  "userDefined",
        +  "relations",
        +  "biographies",
        +  "addresses",
        +  "birthdays"
        +]
      • addedInput schema / properties / field / type
        Added value: +"string"
      • removedInput schema / properties / updates / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": false,
        -      "description": "Typed batch-update input for a contact.",
        -      "properties": {
        -        "address": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "birthday": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "description": "Birthday as 'YYYY-MM-DD', 'MM-DD' (no year), or 'clear'/'' to remove."
        -        },
        -        "contact_id": {
        -          "description": "Contact ID like \"c123\" or full resource name like \"people/c123\".",
        -          "type": "string"
        -        },
        -        "email": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "emails": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for an email entry.",
        -                "properties": {
        -                  "address": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Email address value."
        -                  },
        -                  "type": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Email type such as work, home, or other."
        -                  },
        -                  "value": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Backward-compatible alias for the email address value."
        -                  }
        -                },
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "family_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "given_name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "job_title": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "nicknames": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for a nickname entry.",
        -                "properties": {
        -                  "type": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Nickname type such as default, alternate_name, maiden_name, initials, or other."
        -                  },
        -                  "value": {
        -                    "description": "Nickname value. Used for bilingual contacts (e.g. Hebrew alternative form).",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "value"
        -                ],
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "notes": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "organization": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "organizations": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for an organization entry.",
        -                "properties": {
        -                  "department": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Department name."
        -                  },
        -                  "jobDescription": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Optional organization job description."
        -                  },
        -                  "name": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Organization name."
        -                  },
        -                  "title": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Job title."
        -                  },
        -                  "type": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Organization type such as work or school."
        -                  }
        -                },
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "phone": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "phones": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for a phone entry.",
        -                "properties": {
        -                  "number": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Phone number value."
        -                  },
        -                  "type": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Phone type such as mobile, work, home, or internal."
        -                  },
        -                  "value": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Backward-compatible alias for the phone number value."
        -                  }
        -                },
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "relations": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for a relation entry (spouse, parent, child, etc.).",
        -                "properties": {
        -                  "person": {
        -                    "description": "The related person's name (matched against contact names by Google Assistant).",
        -                    "type": "string"
        -                  },
        -                  "type": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "Relation type: spouse, child, parent, father, mother, sister, brother, friend, manager, assistant, partner, sibling, domesticPartner, or custom."
        -                  }
        -                },
        -                "required": [
        -                  "person"
        -                ],
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "urls": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for a URL entry.",
        -                "properties": {
        -                  "type": {
        -                    "anyOf": [
        -                      {
        -                        "type": "string"
        -                      },
        -                      {
        -                        "type": "null"
        -                      }
        -                    ],
        -                    "default": null,
        -                    "description": "URL type such as homepage, blog, profile, work, ftp, reservations, or other. Custom values allowed."
        -                  },
        -                  "value": {
        -                    "description": "The URL value (e.g. https://example.com).",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "value"
        -                ],
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        },
        -        "user_defined": {
        -          "anyOf": [
        -            {
        -              "items": {
        -                "additionalProperties": false,
        -                "description": "Typed input for a userDefined custom field entry.",
        -                "properties": {
        -                  "key": {
        -                    "description": "Custom field key (e.g. 'ID', 'Hebrew Birthday', 'Account Number').",
        -                    "type": "string"
        -                  },
        -                  "value": {
        -                    "default": "",
        -                    "description": "Custom field value. May be omitted when using remove mode (only the key is needed).",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "key"
        -                ],
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null
        -        }
        -      },
        -      "required": [
        -        "contact_id"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / updates / items
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Typed batch-update input for a contact.",
        +  "properties": {
        +    "address": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "birthday": {
        +      "default": null,
        +      "description": "Birthday as 'YYYY-MM-DD', 'MM-DD' (no year), or 'clear'/'' to remove.",
        +      "type": "string"
        +    },
        +    "contact_id": {
        +      "description": "Contact ID like \"c123\" or full resource name like \"people/c123\".",
        +      "type": "string"
        +    },
        +    "email": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "emails": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for an email entry.",
        +        "properties": {
        +          "address": {
        +            "default": null,
        +            "description": "Email address value.",
        +            "type": "string"
        +          },
        +          "type": {
        +            "default": null,
        +            "description": "Email type such as work, home, or other.",
        +            "type": "string"
        +          },
        +          "value": {
        +            "default": null,
        +            "description": "Backward-compatible alias for the email address value.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "family_name": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "given_name": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "job_title": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "nicknames": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for a nickname entry.",
        +        "properties": {
        +          "type": {
        +            "default": null,
        +            "description": "Nickname type such as default, alternate_name, maiden_name, initials, or other.",
        +            "type": "string"
        +          },
        +          "value": {
        +            "description": "Nickname value. Used for bilingual contacts (e.g. Hebrew alternative form).",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "value"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "notes": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "organization": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "organizations": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for an organization entry.",
        +        "properties": {
        +          "department": {
        +            "default": null,
        +            "description": "Department name.",
        +            "type": "string"
        +          },
        +          "jobDescription": {
        +            "default": null,
        +            "description": "Optional organization job description.",
        +            "type": "string"
        +          },
        +          "name": {
        +            "default": null,
        +            "description": "Organization name.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "default": null,
        +            "description": "Job title.",
        +            "type": "string"
        +          },
        +          "type": {
        +            "default": null,
        +            "description": "Organization type such as work or school.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "phone": {
        +      "default": null,
        +      "type": "string"
        +    },
        +    "phones": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for a phone entry.",
        +        "properties": {
        +          "number": {
        +            "default": null,
        +            "description": "Phone number value.",
        +            "type": "string"
        +          },
        +          "type": {
        +            "default": null,
        +            "description": "Phone type such as mobile, work, home, or internal.",
        +            "type": "string"
        +          },
        +          "value": {
        +            "default": null,
        +            "description": "Backward-compatible alias for the phone number value.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "relations": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for a relation entry (spouse, parent, child, etc.).",
        +        "properties": {
        +          "person": {
        +            "description": "The related person's name (matched against contact names by Google Assistant).",
        +            "type": "string"
        +          },
        +          "type": {
        +            "default": null,
        +            "description": "Relation type: spouse, child, parent, father, mother, sister, brother, friend, manager, assistant, partner, sibling, domesticPartner, or custom.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "person"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "urls": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for a URL entry.",
        +        "properties": {
        +          "type": {
        +            "default": null,
        +            "description": "URL type such as homepage, blog, profile, work, ftp, reservations, or other. Custom values allowed.",
        +            "type": "string"
        +          },
        +          "value": {
        +            "description": "The URL value (e.g. https://example.com).",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "value"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "user_defined": {
        +      "default": null,
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Typed input for a userDefined custom field entry.",
        +        "properties": {
        +          "key": {
        +            "description": "Custom field key (e.g. 'ID', 'Hebrew Birthday', 'Account Number').",
        +            "type": "string"
        +          },
        +          "value": {
        +            "default": "",
        +            "description": "Custom field value. May be omitted when using remove mode (only the key is needed).",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "key"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "contact_id"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / updates / type
        Added value: +"array"
    • Changedmanage_deployment8 fields changed
      • removedInput schema / properties / deployment_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / deployment_id / type
        Added value: +"string"
      • removedInput schema / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / description / type
        Added value: +"string"
      • removedInput schema / properties / version_description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / version_description / type
        Added value: +"string"
      • removedInput schema / properties / version_number / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / version_number / type
        Added value: +"integer"
    • Changedmanage_doc_tab10 fields changed
      • removedInput schema / properties / index / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / index / type
        Added value: +"integer"
      • removedInput schema / properties / markdown_text / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / markdown_text / type
        Added value: +"string"
      • removedInput schema / properties / parent_tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / parent_tab_id / type
        Added value: +"string"
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / tab_id / type
        Added value: +"string"
      • removedInput schema / properties / title / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / title / type
        Added value: +"string"
    • Changedmanage_document_comment4 fields changed
      • removedInput schema / properties / comment_content / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / comment_content / type
        Added value: +"string"
      • removedInput schema / properties / comment_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / comment_id / type
        Added value: +"string"
    • Changedmanage_drive_access17 fields changed
      • removedInput schema / properties / allow_file_discovery / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / allow_file_discovery / type
        Added value: +"boolean"
      • removedInput schema / properties / email_message / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / email_message / type
        Added value: +"string"
      • removedInput schema / properties / expiration_time / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / expiration_time / type
        Added value: +"string"
      • removedInput schema / properties / new_owner_email / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / new_owner_email / type
        Added value: +"string"
      • removedInput schema / properties / permission_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / permission_id / type
        Added value: +"string"
      • removedInput schema / properties / recipients / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / recipients / items
        Added value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
      • addedInput schema / properties / recipients / type
        Added value: +"array"
      • removedInput schema / properties / role / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / role / type
        Added value: +"string"
      • removedInput schema / properties / share_with / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / share_with / type
        Added value: +"string"
    • Changedmanage_event62 fields changed
      • removedInput schema / properties / add_google_meet / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / add_google_meet / type
        Added value: +"boolean"
      • removedInput schema / properties / attachments / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / attachments / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / attachments / type
        Added value: +"array"
      • removedInput schema / properties / attendees / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / attendees / description
        Previous value: -"Attendee email addresses or objects."New value: +"Attendee email addresses, attendee objects (e.g. {\"email\": ..., \"responseStatus\": \"accepted\"}), or a mix of both."
      • addedInput schema / properties / attendees / items
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    }
        +  ]
        +}
      • addedInput schema / properties / attendees / type
        Added value: +"array"
      • removedInput schema / properties / color_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / color_id / type
        Added value: +"string"
      • addedInput schema / properties / conference_data / additionalProperties
        Added value: +true
      • removedInput schema / properties / conference_data / anyOf
        Removed value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / conference_data / type
        Added value: +"object"
      • removedInput schema / properties / conference_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / conference_id / type
        Added value: +"string"
      • removedInput schema / properties / conference_passcode / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / conference_passcode / type
        Added value: +"string"
      • removedInput schema / properties / conference_provider / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / conference_provider / type
        Added value: +"string"
      • removedInput schema / properties / conference_uri / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / conference_uri / type
        Added value: +"string"
      • removedInput schema / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / description / type
        Added value: +"string"
      • removedInput schema / properties / end_time / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / end_time / type
        Added value: +"string"
      • removedInput schema / properties / end_timezone / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / end_timezone / type
        Added value: +"string"
      • removedInput schema / properties / event_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / event_id / type
        Added value: +"string"
      • removedInput schema / properties / guests_can_invite_others / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / guests_can_invite_others / type
        Added value: +"boolean"
      • removedInput schema / properties / guests_can_modify / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / guests_can_modify / type
        Added value: +"boolean"
      • removedInput schema / properties / guests_can_see_other_guests / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / guests_can_see_other_guests / type
        Added value: +"boolean"
      • removedInput schema / properties / location / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / location / type
        Added value: +"string"
      • removedInput schema / properties / recurrence / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / recurrence / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / recurrence / type
        Added value: +"array"
      • changedInput schema / properties / reminders / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  }
        +]
      • removedInput schema / properties / response / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / response / type
        Added value: +"string"
      • removedInput schema / properties / rsvp_comment / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / rsvp_comment / type
        Added value: +"string"
      • removedInput schema / properties / send_updates / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / send_updates / type
        Added value: +"string"
      • removedInput schema / properties / start_time / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / start_time / type
        Added value: +"string"
      • removedInput schema / properties / start_timezone / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / start_timezone / type
        Added value: +"string"
      • removedInput schema / properties / summary / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / summary / type
        Added value: +"string"
      • removedInput schema / properties / timezone / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / timezone / type
        Added value: +"string"
      • removedInput schema / properties / transparency / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / transparency / type
        Added value: +"string"
      • removedInput schema / properties / use_default_reminders / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / use_default_reminders / type
        Added value: +"boolean"
      • removedInput schema / properties / visibility / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / visibility / type
        Added value: +"string"
    • Changedmanage_focus_time25 fields changed
      • removedInput schema / properties / auto_decline_mode / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / auto_decline_mode / type
        Added value: +"string"
      • removedInput schema / properties / chat_status / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / chat_status / type
        Added value: +"string"
      • removedInput schema / properties / decline_message / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / decline_message / type
        Added value: +"string"
      • removedInput schema / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / description / type
        Added value: +"string"
      • removedInput schema / properties / end_time / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / end_time / type
        Added value: +"string"
      • removedInput schema / properties / event_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / event_id / type
        Added value: +"string"
      • removedInput schema / properties / recurrence / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / recurrence / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / recurrence / type
        Added value: +"array"
      • removedInput schema / properties / start_time / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / start_time / type
        Added value: +"string"
      • removedInput schema / properties / summary / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / summary / type
        Added value: +"string"
      • removedInput schema / properties / time_max / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / time_max / type
        Added value: +"string"
      • removedInput schema / properties / time_min / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / time_min / type
        Added value: +"string"
      • removedInput schema / properties / timezone / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / timezone / type
        Added value: +"string"
    • Changedmanage_gmail_filter8 fields changed
      • addedInput schema / properties / criteria / additionalProperties
        Added value: +true
      • removedInput schema / properties / criteria / anyOf
        Removed value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / criteria / type
        Added value: +"object"
      • addedInput schema / properties / filter_action / additionalProperties
        Added value: +true
      • removedInput schema / properties / filter_action / anyOf
        Removed value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / filter_action / type
        Added value: +"object"
      • removedInput schema / properties / filter_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / filter_id / type
        Added value: +"string"
    • Changedmanage_gmail_label13 fields changed
      • removedInput schema / properties / background_color / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / background_color / type
        Added value: +"string"
      • removedInput schema / properties / label_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / label_id / type
        Added value: +"string"
      • changedInput schema / properties / label_list_visibility / default
        Previous value: -"labelShow"New value: +null
      • changedInput schema / properties / label_list_visibility / description
        Previous value: -"Whether the label is shown in the label list."New value: +"Whether the label is shown in the label list. Defaults to \"labelShow\" on create. On update, omitting it keeps the label's current setting."
      • changedInput schema / properties / label_list_visibility / enum
        Previous value: -[
        -  "labelShow",
        -  "labelHide"
        -]New value: +[
        +  "labelShow",
        +  "labelShowIfUnread",
        +  "labelHide"
        +]
      • changedInput schema / properties / message_list_visibility / default
        Previous value: -"show"New value: +null
      • changedInput schema / properties / message_list_visibility / description
        Previous value: -"Whether the label is shown in the message list."New value: +"Whether the label's messages are shown in the message list. Defaults to \"show\" on create. On update, omitting it keeps the label's current setting."
      • removedInput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / name / type
        Added value: +"string"
      • removedInput schema / properties / text_color / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / text_color / type
        Added value: +"string"
    • Addedmanage_named_range
    • Changedmanage_out_of_office21 fields changed
      • removedInput schema / properties / auto_decline_mode / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / auto_decline_mode / type
        Added value: +"string"
      • removedInput schema / properties / decline_message / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / decline_message / type
        Added value: +"string"
      • removedInput schema / properties / end_time / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / end_time / type
        Added value: +"string"
      • removedInput schema / properties / event_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / event_id / type
        Added value: +"string"
      • removedInput schema / properties / recurrence / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / recurrence / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / recurrence / type
        Added value: +"array"
      • removedInput schema / properties / start_time / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / start_time / type
        Added value: +"string"
      • removedInput schema / properties / summary / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / summary / type
        Added value: +"string"
      • removedInput schema / properties / time_max / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / time_max / type
        Added value: +"string"
      • removedInput schema / properties / time_min / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / time_min / type
        Added value: +"string"
      • removedInput schema / properties / timezone / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / timezone / type
        Added value: +"string"
    • Changedmanage_presentation_comment4 fields changed
      • removedInput schema / properties / comment_content / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / comment_content / type
        Added value: +"string"
      • removedInput schema / properties / comment_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / comment_id / type
        Added value: +"string"
    • Addedmanage_script_content
    • Addedmanage_script_project
    • Addedmanage_script_trigger
    • Addedmanage_script_version
    • Changedmanage_sheet_tab4 fields changed
      • removedInput schema / properties / new_index / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / new_index / type
        Added value: +"integer"
      • removedInput schema / properties / new_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / new_name / type
        Added value: +"string"
    • Changedmanage_spreadsheet_comment4 fields changed
      • removedInput schema / properties / comment_content / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / comment_content / type
        Added value: +"string"
      • removedInput schema / properties / comment_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / comment_id / type
        Added value: +"string"
    • Changedmanage_task16 fields changed
      • removedInput schema / properties / destination_task_list / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / destination_task_list / type
        Added value: +"string"
      • removedInput schema / properties / due / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / due / type
        Added value: +"string"
      • removedInput schema / properties / notes / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / notes / type
        Added value: +"string"
      • removedInput schema / properties / parent / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / parent / type
        Added value: +"string"
      • removedInput schema / properties / previous / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / previous / type
        Added value: +"string"
      • removedInput schema / properties / status / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / status / type
        Added value: +"string"
      • removedInput schema / properties / task_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / task_id / type
        Added value: +"string"
      • removedInput schema / properties / title / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / title / type
        Added value: +"string"
    • Changedmanage_task_list4 fields changed
      • removedInput schema / properties / task_list_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / task_list_id / type
        Added value: +"string"
      • removedInput schema / properties / title / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / title / type
        Added value: +"string"
    • Changedmodify_sheet_values1 field changed
      • changedInput schema / properties / values / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "type": "array"
        +  }
        +]
    • Changedquery_freebusy7 fields changed
      • removedInput schema / properties / calendar_expansion_max / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / calendar_expansion_max / type
        Added value: +"integer"
      • removedInput schema / properties / calendar_ids / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / calendar_ids / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / calendar_ids / type
        Added value: +"array"
      • removedInput schema / properties / group_expansion_max / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / group_expansion_max / type
        Added value: +"integer"
    • Changedread_sheet_values1 field changed
      • addedInput schema / properties / include_smart_chips
        Added value: +{
        +  "default": false,
        +  "description": "If True, also fetch smart chips metadata (Drive files/folders\nand People chips) for the range. Defaults to False to avoid expensive includeGridData requests.",
        +  "type": "boolean"
        +}
    • Changedresize_sheet_dimensions26 fields changed
      • changedInput schema / properties / auto_resize_columns / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / auto_resize_rows / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "type": "integer"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "integer"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / column_sizes / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • changedInput schema / properties / delete_columns / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • removedInput schema / properties / delete_row_range / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / delete_row_range / type
        Added value: +"string"
      • changedInput schema / properties / delete_rows / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "type": "integer"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "integer"
        +    },
        +    "type": "array"
        +  }
        +]
      • removedInput schema / properties / frozen_column_count / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / frozen_column_count / type
        Added value: +"integer"
      • removedInput schema / properties / frozen_row_count / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / frozen_row_count / type
        Added value: +"integer"
      • changedInput schema / properties / hide_columns / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / hide_rows / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "type": "integer"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "integer"
        +    },
        +    "type": "array"
        +  }
        +]
      • removedInput schema / properties / insert_columns / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / insert_columns / type
        Added value: +"integer"
      • removedInput schema / properties / insert_columns_at / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / insert_columns_at / type
        Added value: +"string"
      • removedInput schema / properties / insert_rows / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / insert_rows / type
        Added value: +"integer"
      • removedInput schema / properties / insert_rows_at / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / insert_rows_at / type
        Added value: +"integer"
      • changedInput schema / properties / row_sizes / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties / sheet_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / sheet_name / type
        Added value: +"string"
      • changedInput schema / properties / unhide_columns / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / unhide_rows / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "type": "integer"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "integer"
        +    },
        +    "type": "array"
        +  }
        +]
    • Changedrun_script_function5 fields changed
      • removedInput schema / properties / deployment_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / deployment_id / type
        Added value: +"string"
      • removedInput schema / properties / parameters / anyOf
        Removed value: -[
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / parameters / items
        Added value: +{}
      • addedInput schema / properties / parameters / type
        Added value: +"array"
    • Changedsearch_custom19 fields changed
      • removedInput schema / properties / country / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / country / type
        Added value: +"string"
      • removedInput schema / properties / date_restrict / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / date_restrict / type
        Added value: +"string"
      • removedInput schema / properties / file_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / file_type / type
        Added value: +"string"
      • removedInput schema / properties / language / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / language / type
        Added value: +"string"
      • removedInput schema / properties / search_type / anyOf
        Removed value: -[
        -  {
        -    "const": "image",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / search_type / enum
        Added value: +[
        +  "image"
        +]
      • addedInput schema / properties / search_type / type
        Added value: +"string"
      • removedInput schema / properties / site_search / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / site_search / type
        Added value: +"string"
      • removedInput schema / properties / site_search_filter / anyOf
        Removed value: -[
        -  {
        -    "enum": [
        -      "e",
        -      "i"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / site_search_filter / enum
        Added value: +[
        +  "e",
        +  "i"
        +]
      • addedInput schema / properties / site_search_filter / type
        Added value: +"string"
      • removedInput schema / properties / sites / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / sites / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / sites / type
        Added value: +"array"
    • Changedsearch_drive_files10 fields changed
      • removedInput schema / properties / corpora / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / corpora / type
        Added value: +"string"
      • removedInput schema / properties / drive_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / drive_id / type
        Added value: +"string"
      • removedInput schema / properties / file_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / file_type / type
        Added value: +"string"
      • removedInput schema / properties / order_by / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / order_by / type
        Added value: +"string"
      • removedInput schema / properties / page_token / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / page_token / type
        Added value: +"string"
    • Changedsearch_gmail_messages2 fields changed
      • removedInput schema / properties / page_token / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / page_token / type
        Added value: +"string"
    • Changedsearch_messages6 fields changed
      • removedInput schema / properties / query / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / query / type
        Added value: +"string"
      • removedInput schema / properties / space_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / space_id / type
        Added value: +"string"
      • removedInput schema / properties / time_filter / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / time_filter / type
        Added value: +"string"
    • Changedsend_gmail_message25 fields changed
      • removedInput schema / properties / attachments / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / attachments / items
        Added value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
      • addedInput schema / properties / attachments / type
        Added value: +"array"
      • removedInput schema / properties / bcc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / bcc / type
        Added value: +"string"
      • removedInput schema / properties / body / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / body / type
        Added value: +"string"
      • removedInput schema / properties / cc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / cc / type
        Added value: +"string"
      • removedInput schema / properties / forward_message_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / forward_message_id / type
        Added value: +"string"
      • removedInput schema / properties / from_email / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / from_email / type
        Added value: +"string"
      • removedInput schema / properties / from_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / from_name / type
        Added value: +"string"
      • removedInput schema / properties / in_reply_to / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / in_reply_to / type
        Added value: +"string"
      • removedInput schema / properties / references / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / references / type
        Added value: +"string"
      • removedInput schema / properties / subject / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / subject / type
        Added value: +"string"
      • removedInput schema / properties / thread_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / thread_id / type
        Added value: +"string"
      • removedInput schema / properties / to / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / to / type
        Added value: +"string"
    • Changedsend_message6 fields changed
      • removedInput schema / properties / message_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / message_name / type
        Added value: +"string"
      • removedInput schema / properties / thread_key / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / thread_key / type
        Added value: +"string"
      • removedInput schema / properties / thread_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / thread_name / type
        Added value: +"string"
    • Changedset_drive_file_permissions6 fields changed
      • removedInput schema / properties / copy_requires_writer_permission / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / copy_requires_writer_permission / type
        Added value: +"boolean"
      • removedInput schema / properties / link_sharing / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / link_sharing / type
        Added value: +"string"
      • removedInput schema / properties / writers_can_share / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / writers_can_share / type
        Added value: +"boolean"
    • Changedupdate_drive_file30 fields changed
      • removedInput schema / properties / add_parents / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / add_parents / type
        Added value: +"string"
      • removedInput schema / properties / content / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / content / type
        Added value: +"string"
      • removedInput schema / properties / copy_requires_writer_permission / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / copy_requires_writer_permission / type
        Added value: +"boolean"
      • removedInput schema / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / description / type
        Added value: +"string"
      • removedInput schema / properties / file_path / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / file_path / type
        Added value: +"string"
      • removedInput schema / properties / file_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / file_url / type
        Added value: +"string"
      • removedInput schema / properties / mime_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / mime_type / type
        Added value: +"string"
      • removedInput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / name / type
        Added value: +"string"
      • addedInput schema / properties / properties / additionalProperties
        Added value: +true
      • removedInput schema / properties / properties / anyOf
        Removed value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / type
        Added value: +"object"
      • removedInput schema / properties / remove_parents / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / remove_parents / type
        Added value: +"string"
      • removedInput schema / properties / source_format / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / source_format / description
        Previous 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."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 content source."
      • addedInput schema / properties / source_format / type
        Added value: +"string"
      • removedInput schema / properties / starred / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / starred / type
        Added value: +"boolean"
      • removedInput schema / properties / trashed / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / trashed / type
        Added value: +"boolean"
      • removedInput schema / properties / writers_can_share / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / writers_can_share / type
        Added value: +"boolean"
    • Removedupdate_script_content
  6. 1 tool updatev1.27.0
    • Changedget_doc_content2 fields changed
      • addedInput schema / properties / preserve_context
        Added value: +{
        +  "default": false,
        +  "description": "Include readable semantic annotations for native Docs.\nDefaults to False to retain index alignment. Office extraction is\nunaffected. With tab_id, only the selected tab is rendered.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / tab_id / description
        Previous value: -"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."New value: +"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 default output stays index-aligned with that tab. When\nomitted, every tab is returned with \"--- TAB: ... ---\" markers."
  7. 2 tool updatesv1.26.2
    • Changedlist_script_processes1 field changed
      • changedInput schema / properties / script_id / description
        Previous value: -"Optional filter by script ID"New value: +"Optional script ID. When set, lists all processes for that\nscript visible to the user, including runs by other users."
    • Changedmanage_event4 fields changed
      • changedInput schema / properties / end_time / description
        Previous value: -"End time in RFC3339 format (required for create)."New value: +"End time (required for create). An RFC3339 UTC offset identifies the exact instant and is preserved. Without an offset, supply end_timezone or timezone. All-day end dates are exclusive."
      • changedInput schema / properties / start_time / description
        Previous value: -"Start time in RFC3339 format (required for create)."New value: +"Start time (required for create). An RFC3339 UTC offset identifies the exact instant and is preserved. Without an offset, supply start_timezone or timezone. For a local wall-clock time, omit the offset and pass the zone so Google resolves daylight saving; a wrong offset moves the event. Date-only values create all-day events."
      • changedInput schema / properties / start_timezone / description
        Previous value: -"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."New value: +"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. Explicit timestamp\noffsets always preserve the instant, even when the zone differs."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone applied to both boundaries (e.g.,\n\"America/New_York\"). Overridden per boundary by start_timezone/end_timezone."New value: +"IANA timezone applied to both boundaries (e.g.,\n\"America/New_York\"). Converts offset-bearing timestamps without changing their\ninstant; interprets offset-free timestamps as local times in this zone.\nOverridden per boundary by start_timezone/end_timezone."
  8. 1 tool updatev1.26.1
    • Changedrun_script_function1 field changed
      • addedInput schema / properties / deployment_id
        Added 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."
        +}
  9. 14 tool updatesv1.26.0
    • Changedbatch_update_doc1 field changed
      • changedInput schema / properties / operations / items / oneOf
        Previous 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"
        +  }
        +]
    • Changedget_doc_as_markdown1 field changed
      • addedInput schema / properties / tab_id
        Added 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."
        +}
    • Changedget_doc_content1 field changed
      • addedInput schema / properties / tab_id
        Added 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."
        +}
    • Changedget_events2 fields changed
      • changedInput schema / properties / max_results / description
        Previous 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."
      • addedInput schema / properties / page_token
        Added 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."
        +}
    • Changedget_gmail_attachment_content1 field changed
      • addedInput schema / properties / attachment_index
        Added 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."
        +}
    • Changedget_page1 field changed
      • addedInput schema / properties / include_geometry
        Added 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"
        +}
    • Changedget_presentation1 field changed
      • addedInput schema / properties / include_geometry
        Added 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"
        +}
    • Changedinspect_doc_structure1 field changed
      • addedInput schema / properties / preview_chars
        Added 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."
        +}
    • Changedlist_calendars2 fields changed
      • addedInput schema / properties / max_results
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Maximum calendars to return in one page. Omit to use the API default."
        +}
      • addedInput schema / properties / page_token
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Token for the next page, taken from a previous response."
        +}
    • Changedmanage_event1 field changed
      • changedInput schema / properties / attachments / description
        Previous 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."
    • Changedmanage_gmail_label3 fields changed
      • addedInput schema / properties / background_color
        Added 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."
        +}
      • addedInput schema / properties / clear_color
        Added value: +{
        +  "default": false,
        +  "description": "On update, remove the label's current color. Cannot be combined with background_color or text_color.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / text_color
        Added 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."
        +}
    • Addedmanage_sheet_tab
    • Changedsend_message1 field changed
      • addedInput schema / properties / message_name
        Added 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."
        +}
    • Changedupdate_paragraph_style1 field changed
      • changedInput schema / properties / list_type / description
        Previous 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."
  10. 12 tool updatesv1.25.2
    • Changedbatch_modify_gmail_message_labels3 fields changed
      • removedInput schema / properties / add_label_ids / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / remove_label_ids / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / verify
        Added 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"
        +}
    • Changedcreate_drive_file1 field changed
      • addedInput schema / properties / base64_sha256
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks."
        +}
    • Changeddraft_gmail_message4 fields changed
      • changedInput schema / properties / from_email / description
        Previous 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."
      • changedInput schema / properties / in_reply_to / description
        Previous 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."
      • changedInput schema / properties / references / description
        Previous 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."
      • changedInput schema / properties / thread_id / description
        Previous 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."
    • Changedget_events3 fields changed
      • changedInput schema / properties / detailed / description
        Previous 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."
      • addedInput schema / properties / single_events
        Added 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"
        +}
      • changedInput schema / properties / time_min / description
        Previous 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."
    • Changedimport_to_google_doc2 fields changed
      • addedInput schema / properties / base64_content
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Standard base64-encoded bytes for a binary source such as DOCX or ODT."
        +}
      • addedInput schema / properties / base64_sha256
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks."
        +}
    • Changedimport_to_google_sheets2 fields changed
      • addedInput schema / properties / base64_content
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Standard base64-encoded bytes for an XLSX, XLS, or ODS source."
        +}
      • addedInput schema / properties / base64_sha256
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks."
        +}
    • Changedimport_to_google_slides2 fields changed
      • addedInput schema / properties / base64_content
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Standard base64-encoded bytes for a PPTX or ODP source."
        +}
      • addedInput schema / properties / base64_sha256
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks."
        +}
    • Changedlist_gmail_labels3 fields changed
      • addedInput schema / properties / compact
        Added 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"
        +}
      • addedInput schema / properties / include_system
        Added value: +{
        +  "default": true,
        +  "description": "Include Gmail system labels (INBOX, SENT, ...).\nSet False to return user labels only.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / prefix
        Added 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."
        +}
    • Changedmanage_event3 fields changed
      • addedInput schema / properties / end_timezone
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "IANA timezone for the end boundary only,\noverriding timezone. See start_timezone."
        +}
      • addedInput schema / properties / start_timezone
        Added 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."
        +}
      • changedInput schema / properties / timezone / description
        Previous 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."
    • Changedmodify_gmail_message_labels2 fields changed
      • removedInput schema / properties / add_label_ids / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / remove_label_ids / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
    • Changedsend_gmail_message3 fields changed
      • changedInput schema / properties / in_reply_to / description
        Previous 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."
      • changedInput schema / properties / references / description
        Previous 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."
      • changedInput schema / properties / thread_id / description
        Previous 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."
    • Changedupdate_drive_file3 fields changed
      • changedInput schema / properties / copy_requires_writer_permission / description
        Previous 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."
      • changedInput schema / properties / mime_type / description
        Previous 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."
      • changedInput schema / properties / writers_can_share / description
        Previous 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."
  11. 8 tool updatesv1.24.0
    • Changedbatch_update_doc1 field changed
      • changedInput schema / properties / operations / items / oneOf
        Previous 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"
        +  }
        +]
    • Changeddraft_gmail_message1 field changed
      • changedInput schema / properties / quote_original / description
        Previous 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."
    • Changedget_presentation1 field changed
      • addedInput schema / properties / include_speaker_notes
        Added 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"
        +}
    • Changedmodify_doc_text1 field changed
      • changedInput schema / properties / font_size / type
        Previous value: -"integer"New value: +"number"
    • Changedsearch_gmail_messages1 field changed
      • addedInput schema / properties / include_headers
        Added 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"
        +}
    • Changedsend_gmail_message7 fields changed
      • addedInput schema / properties / quote_original
        Added 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"
        +}
      • addedInput schema / properties / reply_all
        Added 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"
        +}
      • addedInput schema / properties / to / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / to / default
        Added value: +null
      • changedInput schema / properties / to / description
        Previous value: -"Recipient email address."New value: +"Recipient email address. Optional when replying with reply_all=True, which derives it from the thread."
      • removedInput schema / properties / to / type
        Removed value: -"string"
      • changedInput schema / required
        Previous value: -[
        -  "user_google_email",
        -  "to"
        -]New value: +[
        +  "user_google_email"
        +]
    • Changedupdate_drive_file2 fields changed
      • addedInput schema / properties / mode
        Added 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"
        +}
      • changedInput schema / properties / source_format / description
        Previous 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."
    • Changedupdate_paragraph_style5 fields changed
      • addedInput schema / properties / border_color
        Added value: +{
        +  "default": null,
        +  "description": "Border color (#RRGGBB; defaults to black)",
        +  "type": "string"
        +}
      • addedInput schema / properties / border_dash
        Added value: +{
        +  "default": null,
        +  "description": "Border dash style ('SOLID', 'DOT', or 'DASH'; defaults to 'SOLID')",
        +  "type": "string"
        +}
      • addedInput schema / properties / border_edges
        Added 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"
        +}
      • addedInput schema / properties / border_padding
        Added value: +{
        +  "default": null,
        +  "description": "Border padding in points (defaults to 4)",
        +  "type": "number"
        +}
      • addedInput schema / properties / border_width
        Added value: +{
        +  "default": null,
        +  "description": "Border width in points (defaults to 1)",
        +  "type": "number"
        +}
  12. 125 tool updatesv1.0.1
    • Addedappend_table_rows
    • Addedbatch_modify_gmail_message_labels
    • Addedbatch_update_doc
    • Addedbatch_update_form
    • Addedbatch_update_presentation
    • Addedcheck_drive_file_public_access
    • Addedcopy_drive_file
    • Addedcreate_calendar
    • Changedcreate_doc11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / content / description
        Added value: +"Optional initial plain text content to insert"
      • removedInput schema / properties / content / title
        Removed value: -"Content"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / title / description
        Added value: +"Title of the new document"
      • removedInput schema / properties / title / title
        Removed value: -"Title"
      • addedInput schema / properties / user_google_email / description
        Added value: +"User's Google email address"
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "title"
        -]New value: +[
        +  "user_google_email",
        +  "title"
        +]
      • removedInput schema / title
        Removed value: -"create_docArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedcreate_drive_file
    • Addedcreate_drive_folder
    • Removedcreate_event
    • Changedcreate_form13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / description / description
        Added value: +"The description of the form."
      • removedInput schema / properties / description / title
        Removed value: -"Description"
      • addedInput schema / properties / document_title / description
        Added value: +"The document title (shown in browser tab)."
      • removedInput schema / properties / document_title / title
        Removed value: -"Document Title"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / title / description
        Added value: +"The title of the form."
      • removedInput schema / properties / title / title
        Removed value: -"Title"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "title"
        -]New value: +[
        +  "user_google_email",
        +  "title"
        +]
      • removedInput schema / title
        Removed value: -"create_formArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedcreate_presentation
    • Addedcreate_reaction
    • Addedcreate_script_project
    • Changedcreate_sheet13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / insert_sheet_index
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / sheet_name / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / sheet_name / default
        Added value: +null
      • removedInput schema / properties / sheet_name / title
        Removed value: -"Sheet Name"
      • removedInput schema / properties / sheet_name / type
        Removed value: -"string"
      • addedInput schema / properties / source_sheet_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • removedInput schema / properties / spreadsheet_id / title
        Removed value: -"Spreadsheet Id"
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "spreadsheet_id",
        -  "sheet_name"
        -]New value: +[
        +  "user_google_email",
        +  "spreadsheet_id"
        +]
      • removedInput schema / title
        Removed value: -"create_sheetArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedcreate_spreadsheet11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / sheet_names / description
        Added value: +"List of sheet names to create. If not provided, creates one sheet with default name."
      • removedInput schema / properties / sheet_names / title
        Removed value: -"Sheet Names"
      • addedInput schema / properties / title / description
        Added value: +"The title of the new spreadsheet. Required."
      • removedInput schema / properties / title / title
        Removed value: -"Title"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "title"
        -]New value: +[
        +  "user_google_email",
        +  "title"
        +]
      • removedInput schema / title
        Removed value: -"create_spreadsheetArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedcreate_table_with_data
    • Addedcreate_version
    • Addeddebug_docs_runtime_info
    • Addeddebug_table_structure
    • Removeddelete_event
    • Addeddelete_script_project
    • Addeddownload_chat_attachment
    • Changeddraft_gmail_message21 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / attachments
        Added 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."
        +}
      • addedInput schema / properties / bcc
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional BCC email address."
        +}
      • removedInput schema / properties / body / title
        Removed value: -"Body"
      • addedInput schema / properties / body_format
        Added value: +{
        +  "default": "plain",
        +  "description": "Email body format. Use 'plain' for plaintext or 'html' for HTML content.",
        +  "enum": [
        +    "plain",
        +    "html"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / cc
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional CC email address."
        +}
      • addedInput schema / properties / from_email
        Added 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."
        +}
      • addedInput schema / properties / from_name
        Added 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>'."
        +}
      • addedInput schema / properties / in_reply_to
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')."
        +}
      • addedInput schema / properties / include_signature
        Added value: +{
        +  "default": true,
        +  "description": "Whether to append the Gmail signature from Settings > Signature when available. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / quote_original
        Added value: +{
        +  "default": false,
        +  "description": "Whether to include the original message as a quoted reply. Requires thread_id. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / references
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional chain of Message-IDs for proper threading."
        +}
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • removedInput schema / properties / subject / title
        Removed value: -"Subject"
      • addedInput schema / properties / thread_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional Gmail thread ID to reply within."
        +}
      • removedInput schema / properties / to / title
        Removed value: -"To"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required for authentication."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "subject",
        -  "body"
        -]New value: +[
        +  "user_google_email",
        +  "subject",
        +  "body"
        +]
      • removedInput schema / title
        Removed value: -"draft_gmail_messageArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedexport_doc_to_pdf
    • Addedfind_and_replace_doc
    • Addedformat_sheet_range
    • Addedgenerate_trigger_code
    • Addedget_contact
    • Addedget_contact_group
    • Addedget_doc_as_markdown
    • Changedget_doc_content11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / docs_service
        Removed value: -{
        -  "title": "docs_service",
        -  "type": "string"
        -}
      • addedInput schema / properties / document_id / description
        Added value: +"ID of the Google Doc (or full URL)"
      • removedInput schema / properties / document_id / title
        Removed value: -"Document Id"
      • removedInput schema / properties / drive_service
        Removed value: -{
        -  "title": "drive_service",
        -  "type": "string"
        -}
      • addedInput schema / properties / suggestions_view_mode
        Added 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"
        +}
      • addedInput schema / properties / user_google_email / description
        Added value: +"User's Google email address"
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "drive_service",
        -  "docs_service",
        -  "user_google_email",
        -  "document_id"
        -]New value: +[
        +  "user_google_email",
        +  "document_id"
        +]
      • removedInput schema / title
        Removed value: -"get_doc_contentArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedget_drive_file_content9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / file_id / description
        Added value: +"Drive file ID."
      • removedInput schema / properties / file_id / title
        Removed value: -"File Id"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user’s Google email address."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "file_id"
        -]New value: +[
        +  "user_google_email",
        +  "file_id"
        +]
      • removedInput schema / title
        Removed value: -"get_drive_file_contentArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedget_drive_file_download_url
    • Addedget_drive_file_permissions
    • Addedget_drive_shareable_link
    • Changedget_events19 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / calendar_id / description
        Added 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`."
      • removedInput schema / properties / calendar_id / title
        Removed value: -"Calendar Id"
      • addedInput schema / properties / detailed
        Added 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"
        +}
      • addedInput schema / properties / event_id
        Added 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."
        +}
      • addedInput schema / properties / include_attachments
        Added 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"
        +}
      • addedInput schema / properties / max_results / description
        Added value: +"The maximum number of events to return. Defaults to 25. Ignored if event_id is provided."
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • addedInput schema / properties / query
        Added 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."
        +}
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / time_max / description
        Added 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."
      • removedInput schema / properties / time_max / title
        Removed value: -"Time Max"
      • addedInput schema / properties / time_min / description
        Added 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."
      • removedInput schema / properties / time_min / title
        Removed value: -"Time Min"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"get_eventsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedget_form9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / form_id / description
        Added value: +"The ID of the form to retrieve."
      • removedInput schema / properties / form_id / title
        Removed value: -"Form Id"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "form_id"
        -]New value: +[
        +  "user_google_email",
        +  "form_id"
        +]
      • removedInput schema / title
        Removed value: -"get_formArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedget_form_response11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / form_id / description
        Added value: +"The ID of the form."
      • removedInput schema / properties / form_id / title
        Removed value: -"Form Id"
      • addedInput schema / properties / response_id / description
        Added value: +"The ID of the response to retrieve."
      • removedInput schema / properties / response_id / title
        Removed value: -"Response Id"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "form_id",
        -  "response_id"
        -]New value: +[
        +  "user_google_email",
        +  "form_id",
        +  "response_id"
        +]
      • removedInput schema / title
        Removed value: -"get_form_responseArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedget_gmail_attachment_content
    • Changedget_gmail_message_content11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body_format
        Added 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"
        +}
      • addedInput schema / properties / full
        Added 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"
        +}
      • addedInput schema / properties / message_id / description
        Added value: +"The unique ID of the Gmail message to retrieve."
      • removedInput schema / properties / message_id / title
        Removed value: -"Message Id"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "message_id",
        -  "user_google_email"
        -]New value: +[
        +  "message_id",
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"get_gmail_message_contentArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedget_gmail_messages_content_batch12 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body_format
        Added 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"
        +}
      • addedInput schema / properties / format / description
        Added value: +"Message format. \"full\" includes body, \"metadata\" only headers."
      • removedInput schema / properties / format / title
        Removed value: -"Format"
      • addedInput schema / properties / message_ids / description
        Added value: +"List of Gmail message IDs to retrieve (max 25 per batch)."
      • removedInput schema / properties / message_ids / title
        Removed value: -"Message Ids"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "message_ids",
        -  "user_google_email"
        -]New value: +[
        +  "message_ids",
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"get_gmail_messages_content_batchArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedget_gmail_thread_content11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body_format
        Added 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"
        +}
      • addedInput schema / properties / include_analysis
        Added 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"
        +}
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / thread_id / description
        Added value: +"The unique ID of the Gmail thread to retrieve."
      • removedInput schema / properties / thread_id / title
        Removed value: -"Thread Id"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "thread_id",
        -  "user_google_email"
        -]New value: +[
        +  "thread_id",
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"get_gmail_thread_contentArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        }
        +      ]
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedget_gmail_threads_content_batch
    • Changedget_messages10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / message_filter
        Added 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'"
        +}
      • removedInput schema / properties / order_by / title
        Removed value: -"Order By"
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • removedInput schema / properties / space_id / title
        Removed value: -"Space Id"
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "space_id"
        -]New value: +[
        +  "user_google_email",
        +  "space_id"
        +]
      • removedInput schema / title
        Removed value: -"get_messagesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedget_page
    • Addedget_page_thumbnail
    • Addedget_presentation
    • Addedget_script_content
    • Addedget_script_metrics
    • Addedget_script_project
    • Addedget_search_engine_info
    • Changedget_spreadsheet_info9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / spreadsheet_id / description
        Added value: +"The ID of the spreadsheet to get info for. Required."
      • removedInput schema / properties / spreadsheet_id / title
        Removed value: -"Spreadsheet Id"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "spreadsheet_id"
        -]New value: +[
        +  "user_google_email",
        +  "spreadsheet_id"
        +]
      • removedInput schema / title
        Removed value: -"get_spreadsheet_infoArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedget_task
    • Addedget_task_list
    • Addedget_version
    • Addedimport_to_google_doc
    • Addedimport_to_google_sheets
    • Addedimport_to_google_slides
    • Addedinsert_doc_elements
    • Addedinsert_doc_image
    • Addedinspect_doc_structure
    • Changedlist_calendars7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"list_calendarsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedlist_contact_groups
    • Addedlist_contacts
    • Addedlist_deployments
    • Changedlist_docs_in_folder8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / folder_id / title
        Removed value: -"Folder Id"
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"list_docs_in_folderArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedlist_document_comments
    • Addedlist_drive_items
    • Changedlist_form_responses13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / form_id / description
        Added value: +"The ID of the form."
      • removedInput schema / properties / form_id / title
        Removed value: -"Form Id"
      • addedInput schema / properties / page_size / description
        Added value: +"Maximum number of responses to return. Defaults to 10."
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • addedInput schema / properties / page_token / description
        Added value: +"Token for retrieving next page of results."
      • removedInput schema / properties / page_token / title
        Removed value: -"Page Token"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "form_id"
        -]New value: +[
        +  "user_google_email",
        +  "form_id"
        +]
      • removedInput schema / title
        Removed value: -"list_form_responsesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedlist_gmail_filters
    • Changedlist_gmail_labels7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"list_gmail_labelsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedlist_presentation_comments
    • Addedlist_script_processes
    • Addedlist_script_projects
    • Addedlist_sheet_tables
    • Changedlist_spaces8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • removedInput schema / properties / space_type / title
        Removed value: -"Space Type"
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"list_spacesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedlist_spreadsheet_comments
    • Changedlist_spreadsheets9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum number of spreadsheets to return. Defaults to 25."
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"list_spreadsheetsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedlist_task_lists
    • Addedlist_tasks
    • Addedlist_versions
    • Addedmanage_conditional_formatting
    • Addedmanage_contact
    • Addedmanage_contact_group
    • Addedmanage_contacts_batch
    • Addedmanage_deployment
    • Addedmanage_doc_tab
    • Addedmanage_document_comment
    • Addedmanage_drive_access
    • Addedmanage_event
    • Addedmanage_focus_time
    • Addedmanage_gmail_filter
    • Changedmanage_gmail_label17 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / action / description
        Added value: +"Action to perform on the label."
      • removedInput schema / properties / action / title
        Removed value: -"Action"
      • addedInput schema / properties / label_id / description
        Added value: +"Label ID. Required for update and delete operations."
      • removedInput schema / properties / label_id / title
        Removed value: -"Label Id"
      • addedInput schema / properties / label_list_visibility / description
        Added value: +"Whether the label is shown in the label list."
      • removedInput schema / properties / label_list_visibility / title
        Removed value: -"Label List Visibility"
      • addedInput schema / properties / message_list_visibility / description
        Added value: +"Whether the label is shown in the message list."
      • removedInput schema / properties / message_list_visibility / title
        Removed value: -"Message List Visibility"
      • addedInput schema / properties / name / description
        Added value: +"Label name. Required for create, optional for update."
      • removedInput schema / properties / name / title
        Removed value: -"Name"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "action"
        -]New value: +[
        +  "user_google_email",
        +  "action"
        +]
      • removedInput schema / title
        Removed value: -"manage_gmail_labelArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedmanage_out_of_office
    • Addedmanage_presentation_comment
    • Addedmanage_spreadsheet_comment
    • Addedmanage_task
    • Addedmanage_task_list
    • Addedmodify_doc_text
    • Removedmodify_event
    • Changedmodify_gmail_message_labels17 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / add_label_ids / description
        Added value: +"List of label IDs to add to the message."
      • addedInput schema / properties / add_label_ids / items
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / add_label_ids / title
        Removed value: -"Add Label Ids"
      • addedInput schema / properties / add_label_ids / type
        Added value: +"array"
      • addedInput schema / properties / message_id / description
        Added value: +"The ID of the message to modify."
      • removedInput schema / properties / message_id / title
        Removed value: -"Message Id"
      • addedInput schema / properties / remove_label_ids / description
        Added value: +"List of label IDs to remove from the message."
      • addedInput schema / properties / remove_label_ids / items
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / remove_label_ids / title
        Removed value: -"Remove Label Ids"
      • addedInput schema / properties / remove_label_ids / type
        Added value: +"array"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "message_id"
        -]New value: +[
        +  "user_google_email",
        +  "message_id"
        +]
      • removedInput schema / title
        Removed value: -"modify_gmail_message_labelsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedmodify_sheet_values18 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / clear_values / description
        Added value: +"If True, clears the range instead of writing values. Defaults to False."
      • removedInput schema / properties / clear_values / title
        Removed value: -"Clear Values"
      • addedInput schema / properties / range_name / description
        Added value: +"The range to modify (e.g., \"Sheet1!A1:D10\", \"A1:D10\"). Required."
      • removedInput schema / properties / range_name / title
        Removed value: -"Range Name"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / spreadsheet_id / description
        Added value: +"The ID of the spreadsheet. Required."
      • removedInput schema / properties / spreadsheet_id / title
        Removed value: -"Spreadsheet Id"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • addedInput schema / properties / value_input_option / description
        Added value: +"How to interpret input values (\"RAW\" or \"USER_ENTERED\"). Defaults to \"USER_ENTERED\"."
      • removedInput schema / properties / value_input_option / title
        Removed value: -"Value Input Option"
      • changedInput schema / properties / values / anyOf
        Previous 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"
        +  }
        +]
      • addedInput schema / properties / values / description
        Added value: +"2D array of values to write/update. Can be a JSON string or Python list. Required unless clear_values=True."
      • removedInput schema / properties / values / title
        Removed value: -"Values"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "spreadsheet_id",
        -  "range_name"
        -]New value: +[
        +  "user_google_email",
        +  "spreadsheet_id",
        +  "range_name"
        +]
      • removedInput schema / title
        Removed value: -"modify_sheet_valuesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedmove_sheet_rows
    • Addedquery_freebusy
    • Changedread_sheet_values14 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / include_formulas
        Added 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"
        +}
      • addedInput schema / properties / include_hyperlinks
        Added value: +{
        +  "default": false,
        +  "description": "If True, also fetch hyperlink metadata for the range.\nDefaults to False to avoid expensive includeGridData requests.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_notes
        Added value: +{
        +  "default": false,
        +  "description": "If True, also fetch cell notes for the range.\nDefaults to False to avoid expensive includeGridData requests.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / range_name / description
        Added 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."
      • removedInput schema / properties / range_name / title
        Removed value: -"Range Name"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / spreadsheet_id / description
        Added value: +"The ID of the spreadsheet. Required."
      • removedInput schema / properties / spreadsheet_id / title
        Removed value: -"Spreadsheet Id"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "spreadsheet_id"
        -]New value: +[
        +  "user_google_email",
        +  "spreadsheet_id"
        +]
      • removedInput schema / title
        Removed value: -"read_sheet_valuesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedresize_sheet_dimensions
    • Addedrun_script_function
    • Addedsearch_contacts
    • Addedsearch_custom
    • Changedsearch_docs8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "query"
        -]New value: +[
        +  "user_google_email",
        +  "query"
        +]
      • removedInput schema / title
        Removed value: -"search_docsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedsearch_drive_files22 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / corpora / description
        Added 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."
      • removedInput schema / properties / corpora / title
        Removed value: -"Corpora"
      • addedInput schema / properties / detailed
        Added value: +{
        +  "default": true,
        +  "description": "Whether to include size, modified time, and link in results. Defaults to True.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / drive_id / description
        Added value: +"ID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`."
      • removedInput schema / properties / drive_id / title
        Removed value: -"Drive Id"
      • addedInput schema / properties / file_type
        Added 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)."
        +}
      • addedInput schema / properties / include_items_from_all_drives / description
        Added value: +"Whether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`."
      • removedInput schema / properties / include_items_from_all_drives / title
        Removed value: -"Include Items From All Drives"
      • addedInput schema / properties / include_trashed
        Added 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"
        +}
      • addedInput schema / properties / order_by
        Added 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)."
        +}
      • addedInput schema / properties / page_size / description
        Added value: +"The maximum number of files to return. Defaults to 10."
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • addedInput schema / properties / page_token
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Page token from a previous response's nextPageToken to retrieve the next page of results."
        +}
      • addedInput schema / properties / query / description
        Added 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."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "query"
        -]New value: +[
        +  "user_google_email",
        +  "query"
        +]
      • removedInput schema / title
        Removed value: -"search_drive_filesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedsearch_gmail_messages12 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / page_size / description
        Added value: +"The maximum number of messages to return. Defaults to 10."
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • addedInput schema / properties / page_token
        Added 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."
        +}
      • addedInput schema / properties / query / description
        Added value: +"The search query. Supports standard Gmail search operators."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "query",
        -  "user_google_email"
        -]New value: +[
        +  "query",
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"search_gmail_messagesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedsearch_messages17 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / max_spaces
        Added value: +{
        +  "default": 10,
        +  "description": "Maximum number of spaces to search when space_id is not provided (default 10).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / page_size / description
        Added value: +"Maximum number of messages to return per space."
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • addedInput schema / properties / query / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / query / default
        Added value: +null
      • addedInput schema / properties / query / description
        Added value: +"Optional text to search for. If omitted, only time_filter is applied."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / query / type
        Removed value: -"string"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / space_id / description
        Added value: +"Optional space to restrict the search to."
      • removedInput schema / properties / space_id / title
        Removed value: -"Space Id"
      • addedInput schema / properties / time_filter
        Added 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\"'"
        +}
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "query"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"search_messagesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedsend_gmail_message30 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / attachments
        Added 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\"}]"
        +}
      • addedInput schema / properties / bcc
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional BCC email address."
        +}
      • addedInput schema / properties / body / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / body / default
        Added value: +null
      • changedInput schema / properties / body / description
        Previous 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."
      • removedInput schema / properties / body / title
        Removed value: -"Body"
      • removedInput schema / properties / body / type
        Removed value: -"string"
      • addedInput schema / properties / body_format
        Added 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"
        +}
      • addedInput schema / properties / cc
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional CC email address."
        +}
      • addedInput schema / properties / forward_message_id
        Added 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."
        +}
      • addedInput schema / properties / from_email
        Added 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."
        +}
      • addedInput schema / properties / from_name
        Added 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>'."
        +}
      • addedInput schema / properties / in_reply_to
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')."
        +}
      • addedInput schema / properties / include_forwarded_attachments
        Added value: +{
        +  "default": true,
        +  "description": "When forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_signature
        Added value: +{
        +  "default": true,
        +  "description": "Whether to append the Gmail signature from Settings > Signature when available. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / references
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional chain of Message-IDs for proper threading."
        +}
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / subject / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / subject / default
        Added value: +null
      • changedInput schema / properties / subject / description
        Previous value: -"Email subject."New value: +"Email subject. Required when sending; optional when forwarding (defaults to 'Fwd: <original subject>')."
      • removedInput schema / properties / subject / title
        Removed value: -"Subject"
      • removedInput schema / properties / subject / type
        Removed value: -"string"
      • addedInput schema / properties / thread_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional Gmail thread ID to reply within."
        +}
      • removedInput schema / properties / to / title
        Removed value: -"To"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required for authentication."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "to",
        -  "subject",
        -  "body"
        -]New value: +[
        +  "user_google_email",
        +  "to"
        +]
      • removedInput schema / title
        Removed value: -"send_gmail_messageArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedsend_message11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / message_text / title
        Removed value: -"Message Text"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • removedInput schema / properties / space_id / title
        Removed value: -"Space Id"
      • addedInput schema / properties / thread_key / description
        Added value: +"Reply in a thread by app-defined key (creates thread if not found)."
      • removedInput schema / properties / thread_key / title
        Removed value: -"Thread Key"
      • addedInput schema / properties / thread_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reply in an existing thread by its resource name (e.g. spaces/X/threads/Y)."
        +}
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "space_id",
        -  "message_text"
        -]New value: +[
        +  "user_google_email",
        +  "space_id",
        +  "message_text"
        +]
      • removedInput schema / title
        Removed value: -"send_messageArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedset_drive_file_permissions
    • Changedset_publish_settings13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / form_id / description
        Added value: +"The ID of the form to update publish settings for."
      • removedInput schema / properties / form_id / title
        Removed value: -"Form Id"
      • addedInput schema / properties / is_accepting_responses
        Added value: +{
        +  "default": true,
        +  "description": "Whether the form accepts responses. Only takes effect when the form is published. Defaults to True.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / is_published
        Added value: +{
        +  "default": true,
        +  "description": "Whether the form is published and visible to responders. Defaults to True.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / publish_as_template
        Removed value: -{
        -  "default": false,
        -  "title": "Publish As Template",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / require_authentication
        Removed value: -{
        -  "default": false,
        -  "title": "Require Authentication",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "form_id"
        -]New value: +[
        +  "user_google_email",
        +  "form_id"
        +]
      • removedInput schema / title
        Removed value: -"set_publish_settingsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedstart_google_auth8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / mcp_session_id
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Mcp Session Id"
        -}
      • removedInput schema / properties / service_name / title
        Removed value: -"Service Name"
      • addedInput schema / properties / user_google_email / default
        Added value: +null
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "user_google_email",
        -  "service_name"
        -]New value: +[
        +  "service_name"
        +]
      • removedInput schema / title
        Removed value: -"start_google_authArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedupdate_doc_headers_footers
    • Addedupdate_drive_file
    • Addedupdate_paragraph_style
    • Addedupdate_script_content
  13. 36 tool updatesv1.0.0
    • First observedcreate_doc
    • First observedcreate_event
    • First observedcreate_form
    • First observedcreate_sheet
    • First observedcreate_spreadsheet
    • First observeddelete_event
    • First observeddraft_gmail_message
    • First observedget_doc_content
    • First observedget_drive_file_content
    • First observedget_events
    • First observedget_form
    • First observedget_form_response
    • First observedget_gmail_message_content
    • First observedget_gmail_messages_content_batch
    • First observedget_gmail_thread_content
    • First observedget_messages
    • First observedget_spreadsheet_info
    • First observedlist_calendars
    • First observedlist_docs_in_folder
    • First observedlist_form_responses
    • First observedlist_gmail_labels
    • First observedlist_spaces
    • First observedlist_spreadsheets
    • First observedmanage_gmail_label
    • First observedmodify_event
    • First observedmodify_gmail_message_labels
    • First observedmodify_sheet_values
    • First observedread_sheet_values
    • First observedsearch_docs
    • First observedsearch_drive_files
    • First observedsearch_gmail_messages
    • First observedsearch_messages
    • First observedsend_gmail_message
    • First observedsend_message
    • First observedset_publish_settings
    • First observedstart_google_auth

TDQS

B3.1/5.0

Scored across 119 tools

Disambiguation3/5

Tools are mostly grouped by Google product, but several areas have overlapping boundaries, especially Docs editing (modify_doc_text, batch_update_doc, find_and_replace_doc, update_paragraph_style) and Drive permissions (manage_drive_access, set_drive_file_permissions, get_drive_shareable_link). Detailed descriptions help, but with 119 tools the risk of selecting the wrong editing or permission tool remains significant.

Naming Consistency4/5

Names overwhelmingly use snake_case with predictable verb prefixes such as get_, list_, create_, manage_, search_, and update_. There are a few descriptive outliers like start_google_auth, format_sheet_range, and check_drive_file_public_access, but the overall pattern is readable and consistent.

Tool Count2/5

The server covers a very broad Google Workspace surface, but 119 tools is far beyond a practical, well-scoped MCP tool set and creates substantial context and selection overhead. Even if many tools are justified by product breadth, the count is too heavy for reliable agent use.

Completeness4/5

Coverage is unusually comprehensive across Gmail, Calendar, Drive, Docs, Sheets, Slides, Chat, Forms, Contacts, Tasks, and Apps Script, with most core lifecycles represented. Minor gaps remain, such as limited shared-drive administration, calendar deletion/update, and some Gmail settings operations, but agents can generally work around them.

Maintenance

ActivityActive
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers