Google Workspace MCP Server - Control Gmail, Calendar, Docs, Sheets, Slides, Chat, Forms & Drive
Google Workspace MCP 服务器
通过模型上下文协议将 MCP 客户端、AI 助手等连接到 Google Workspace 服务
观看实际操作:
📑 目录
Related MCP server: google-workspace-mcp-advanced
🌐 概述
Google Workspace MCP 服务器使用模型上下文协议 (MCP) 将 Google Workspace 服务(日历、云端硬盘、Gmail 和文档)与 AI 助手及其他应用集成。这使得 AI 系统能够安全高效地访问 Google Workspace 应用中的用户数据并进行交互。
✨ 特点
🔐 OAuth 2.0 身份验证:使用用户授权凭据通过自动令牌刷新和集中身份验证流程安全地连接到 Google API
📅 Google 日历集成:完整的日历管理 - 列出日历、获取事件、创建/修改/删除事件,支持全天和定时事件
📁 Google Drive 集成:搜索文件、列出文件夹内容、读取文件内容以及创建新文件。原生支持提取和检索 .docx、.xlsx 以及其他 Microsoft Office 格式!
📧 Gmail 集成:完整的电子邮件管理 - 搜索消息、检索内容、发送电子邮件和创建草稿,并完全支持所有查询语法
📄 Google Docs 集成:直接从聊天中搜索文档、阅读文档内容、列出文件夹中的文档以及创建新文档!
🔄 多种传输选项:可流式传输的 HTTP + SSE 回退
🔌
mcpo兼容性:轻松将服务器公开为 OpenAPI 端点,以便与 Open WebUI 等工具集成🧩 可扩展设计:简单的结构,可添加对更多 Google Workspace API 和工具的支持
🔄 集成 OAuth 回调:在端口 8000 上的服务器内直接处理 OAuth 重定向
⚡ 线程安全会话管理:通过线程安全架构实现强大的会话处理,从而提高可靠性
🚀 快速入门
先决条件
Python 3.11+
**uv**包安装程序(或 pip)
为所需 API(日历、云端硬盘、Gmail、文档)启用 OAuth 2.0 凭据的Google Cloud 项目
安装
# Clone the repository (replace with your fork URL if different)
git clone https://github.com/taylorwilsdon/google_workspace_mcp.git
cd google_workspace_mcp
# Create a virtual environment and install dependencies
uv venv
source .venv/bin/activate # On Windows use `.venv\Scripts\activate`
uv pip install -e .配置
在Google Cloud Console中创建OAuth 2.0 凭据(桌面应用程序类型)。
为您的项目启用Google 日历 API 、 Google Drive API 、 Gmail API和Google Docs API 。
将 OAuth 客户端凭据下载为
client_secret.json并将其放在项目的根目录中。在 Google Cloud Console 中,将以下重定向 URI 添加到您的 OAuth 客户端配置。请注意,
http://localhost:8000是默认的基准 URI 和端口,您可以通过环境变量(WORKSPACE_MCP_BASE_URI和WORKSPACE_MCP_PORT)进行自定义。如果您更改这些值,则必须相应地更新 Google Cloud Console 中的重定向 URI。http://localhost:8000/oauth2callback⚠️重要:确保将
client_secret.json添加到您的.gitignore文件中,并且永远不会提交到版本控制中。
服务器配置
可以使用环境变量自定义服务器的基本 URL 和端口:
WORKSPACE_MCP_BASE_URI:设置服务器的基本 URI(默认值:http://localhost)。这会影响用于 Gemini 原生函数调用的server_url以及OAUTH_REDIRECT_URI。WORKSPACE_MCP_PORT:设置服务器监听的端口(默认值:8000)。这会影响server_url、port和OAUTH_REDIRECT_URI。
使用示例:
export WORKSPACE_MCP_BASE_URI="https://my-custom-domain.com"
export WORKSPACE_MCP_PORT="9000"
uv run main.py环境设置
在开发过程中,服务器使用 HTTP 进行本地主机 OAuth 回调。在运行服务器之前,请设置此环境变量:
# Allow HTTP for localhost OAuth callbacks (development only!)
export OAUTHLIB_INSECURE_TRANSPORT=1如果没有这个,您可能会在身份验证流程中遇到“OAuth 2 必须使用 HTTPS”错误。
启动服务器
选择以下方法之一来运行服务器:
python main.py
# or using uv
uv run main.py在端口 8000 上运行带有 HTTP 传输层的服务器。
多用户 MCP 有点混乱,所以目前所有东西最好在客户端和服务器之间以 1:1 映射的方式运行。一旦 Claude 能够执行 OAuth 2.1 流程,这种情况就会改变,因此此 MCP 构建了一个简化单用户环境的标志。您可以在单用户模式下运行服务器,这将绕过会话到 OAuth 的映射,并使用.credentials目录中的任何可用凭据:
python main.py --single-user
# or using uv
uv run main.py --single-user在单用户模式下:
服务器自动查找并使用
.credentials目录中的任何有效凭据无需会话映射 - 服务器使用找到的第一个有效凭证文件
适用于开发、测试或单用户部署
仍然需要初始 OAuth 身份验证来创建凭证文件
当您不需要多用户会话管理并且想要简化凭证处理时,此模式特别有用。
您可以使用提供的Dockerfile构建并运行服务器。
# Build the Docker image
docker build -t google-workspace-mcp .
# Run the Docker container
# The -p flag maps the container port 8000 to the host port 8000
# The -v flag mounts the current directory to /app inside the container
# This is useful for development to pick up code changes without rebuilding
docker run -p 8000:8000 -v $(pwd):/app google-workspace-mcpsmithery.yaml文件配置为在 Docker 容器内正确启动服务器。
重要港口
默认端口为8000 ,但可以通过WORKSPACE_MCP_PORT环境变量进行更改。
服务 | 默认端口 | 描述 |
OAuth回调 |
| 由服务器通过 |
HTTP模式服务器 |
| 使用 HTTP 传输时的默认设置 |
连接到服务器
服务器支持多种连接方式:
克劳德桌面:
可以在任何地方运行并通过
mcp-remote使用,或者使用uv run main.py作为参数或使用带有 localhost 的mcp-remote在本地调用。
配置.json:
{
"mcpServers": {
"Google workspace": {
"command": "npx",
"args": [
"mcp-remote",
"http://localhost:8000/mcp”
]
}
}
}安装
mcpo:uv pip install mcpo或pip install mcpo创建
config.json(请参阅与 Open WebUI 集成)运行指向您的配置的
mcpo:uvx mcpo --config config.json --port 8001MCP 服务器 API 可在以下位置访问:
http://localhost:8001/google_workspace(或config.json中定义的名称)OpenAPI 文档(Swagger UI)位于:
http://localhost:8001/google_workspace/docs
使用启动命令(用于单 mcp mcpo 使用):
安装
mcpo:uv pip install mcpo或pip install mcpo从
uvx mcpo --port 8001 --api-key "top-secret" --server-type "streamablehttp" -- http://localhost:8000/mcp开始MCP 服务器 API 的地址为:
http://localhost:8001/openapi.json(或config.json中定义的名称)OpenAPI 文档(Swagger UI)位于:
http://localhost:8001/docs以 HTTP 模式启动服务器(请参阅启动服务器)
直接发送 MCP JSON 请求到
http://localhost:8000适用于使用
curl或自定义 HTTP 客户端等工具进行测试可用于服务 Claude Desktop 和其他 MCP 客户端,但需通过 mcp-remote 集成新的 Streamable HTTP 传输:
如果愿意,您还可以在 SSE 后备模式下提供服务。
与 Open WebUI 集成
要将此服务器用作 Open WebUI 中的工具提供程序:
创建
mcpo配置:创建一个名为config.json的文件,其结构如下,以便 mcpo 将可流式传输的 HTTP 端点用作 OpenAPI 规范工具。{ "mcpServers": { "google_workspace": { "type": "streamablehttp", "url": "http://localhost:8000/mcp" } } }启动
mcpo服务器:mcpo --port 8001 --config config.json --api-key "your-optional-secret-key"此命令启动
mcpo代理,在端口 8001 上为您的活动(假设端口 8000)Google Workspace MCP 提供服务。配置 Open WebUI :
导航到您的 Open WebUI 设置
转到“连接”->“工具”
点击“添加工具”
输入服务器 URL:
http://localhost:8001/google_workspace(与config.json中的mcpo基本 URL 和服务器名称匹配)如果您在
mcpo中使用了--api-key,请将其作为 API 密钥输入保存配置
现在,在 Open WebUI 中与模型交互时应该可以使用 Google Workspace 工具
首次身份验证
当调用需要 Google API 访问的工具时:
如果已向工具提供
user_google_email且凭证缺失/无效:服务器将自动启动 OAuth 2.0 流程。授权 URL 将在 MCP 响应中返回(或打印到控制台)。如果未提供
user_google_email且凭证缺失/无效:该工具将返回一条错误消息,引导 LLM 使用集中式start_google_auth工具。LLM 随后应使用用户的电子邮件和相应的service_name(例如,“Google 日历”、“Google 文档”、“Gmail”、“Google 云端硬盘”)调用start_google_auth。这还将返回一个授权 URL。
用户步骤(获得授权 URL 后):
在 Web 浏览器中打开提供的授权 URL。
登录 Google 帐户并授予指定服务所请求的权限。
授权后,Google 会将浏览器重定向到
http://localhost:8000/oauth2callback(或您配置的重定向 URI)。MCP 服务器处理此回调,将授权码与令牌交换,并安全地存储凭证。
然后,LLM 可以重试原始请求。在刷新令牌过期或被撤销之前,对同一用户和服务的后续调用应该无需重新进行身份验证即可正常工作。
🧰 可用工具
注意:如果尚未存储有效凭据,且已向工具提供
user_google_email,则首次使用任何特定 Google 服务的工具都可能触发 OAuth 身份验证流程。如果需要身份验证,但未向工具提供user_google_email,则 LLM 应使用集中式start_google_auth工具(定义在core/server.py中),并输入用户的电子邮件和相应的service_name。
📅 Google 日历
来源: gcalendar/calendar_tools.py
工具 | 描述 | 参数 |
| (集中在 | • |
| 列出经过身份验证的用户可以访问的所有日历。 | • |
| 从指定日历中检索某个时间范围内即将发生的事件。 | • |
| 创建新的日历事件。支持全天和定时事件。 | • |
| 根据 ID 更新现有事件。仅修改提供的字段。 | • |
| 根据 ID 删除事件。 | • |
ℹ️ 所有日历工具都支持通过当前 MCP 会话 (
mcp_session_id) 进行身份验证,或回退到user_google_email进行身份验证。如果两者都不可用且需要身份验证,该工具将返回错误,提示 LLM 使用集中式start_google_auth工具,并输入用户的电子邮件和service_name="Google Calendar"。
🕒 日期/时间参数:工具既接受完整的 RFC3339 时间戳(例如 2024-05-12T10:00:00Z),也接受简单日期(例如 2024-05-12)。服务器会根据需要自动格式化。
📁 Google 云端硬盘
工具 | 描述 | 参数 |
| 在用户的云端硬盘中搜索文件和文件夹 | • |
| 检索特定文件的内容 | • |
| 列出特定文件夹或根目录中的文件和文件夹 | • |
| 在 Google Drive 中创建新文件 | • |
查询语法:有关 Google Drive 搜索查询,请参阅Drive 搜索查询语法
📧 Gmail
工具 | 描述 | 参数 |
| 使用标准 Gmail 搜索运算符(发件人、主题等)搜索电子邮件。 | • |
| 通过消息 ID 获取电子邮件的主题、发件人和纯文本正文。 | • |
| 使用用户的 Gmail 帐户发送纯文本电子邮件。 | • |
| 在用户的 Gmail 帐户中创建电子邮件草稿。 | • |
查询语法:有关 Gmail 搜索查询,请参阅Gmail 搜索查询语法
📝 Google 文档
工具 | 描述 | 参数 |
| 按名称搜索 Google Docs(使用 Drive API)。 | • |
| 通过文档 ID 检索 Google Doc 的纯文本内容。 | • |
| 列出给定 Drive 文件夹内的所有 Google Docs(按文件夹 ID,默认 = | • |
| 创建一个新的 Google Doc,可选择包含初始内容。 | • |
🛠️ 开发
项目结构
google_workspace_mcp/
├── .venv/ # Virtual environment (created by uv)
├── auth/ # OAuth handling logic (google_auth.py, oauth_manager.py)
├── core/ # Core MCP server logic (server.py)
├── gcalendar/ # Google Calendar tools (calendar_tools.py)
├── gdocs/ # Google Docs tools (docs_tools.py)
├── gdrive/ # Google Drive tools (drive_tools.py)
├── gmail/ # Gmail tools (gmail_tools.py)
├── .gitignore # Git ignore file
├── client_secret.json # Google OAuth Credentials (DO NOT COMMIT)
├── config.json # Example mcpo configuration
├── main.py # Main server entry point (imports tools)
├── mcp_server_debug.log # Log file for debugging
├── pyproject.toml # Project metadata and dependencies (for uv/pip)
├── README.md # This file
├── uv.lock # uv lock fileOAuth 的端口处理
服务器巧妙地处理了 OAuth 2.0 重定向 URI( /oauth2callback ),而无需单独的 Web 服务器框架:
在 HTTP 模式或通过
mcpo运行时,它利用底层 MCP 库内置的 HTTP 服务器功能专门为端口
8000上的/oauth2callback注册了自定义 MCP 路由当 Google 在授权后将用户重定向回来时,MCP 服务器会拦截此路由上的请求
auth模块提取授权码并完成token交换这需要在本地运行时设置
OAUTHLIB_INSECURE_TRANSPORT=1,因为回调使用http://localhost
调试
检查mcp_server_debug.log获取详细日志,包括身份验证步骤和 API 调用。如有需要,请启用调试日志记录。
验证
client_secret.json是否正确且存在确保在 Google Cloud Console 中配置了正确的重定向 URI(
http://localhost:8000/oauth2callback)确认您的 Google Cloud 项目中已启用必要的 API(日历、云端硬盘、Gmail)
检查服务器进程运行环境中是否设置了
OAUTHLIB_INSECURE_TRANSPORT=1在基于浏览器的 OAuth 流程中查找特定的错误消息
检查服务器日志中是否有从 Google API 返回的回溯或错误消息。
添加新工具
选择或创建适当的模块(例如,
gdocs/gdocs_tools.py)导入必要的库(Google API 客户端库等)
为你的工具逻辑定义一个
async函数。使用类型提示作为参数使用
@server.tool("your_tool_name")修饰函数在函数内部,获取经过身份验证的凭据:
from auth.google_auth import get_credentials, CONFIG_CLIENT_SECRETS_PATH
# ...
credentials = await asyncio.to_thread(
get_credentials,
user_google_email=your_user_email_variable, # Optional, can be None if session_id is primary
required_scopes=YOUR_SPECIFIC_SCOPES_LIST, # e.g., [CALENDAR_READONLY_SCOPE]
client_secrets_path=CONFIG_CLIENT_SECRETS_PATH,
session_id=your_mcp_session_id_variable # Usually injected via Header
)
if not credentials or not credentials.valid:
# Handle missing/invalid credentials, possibly by calling start_auth_flow
# from auth.google_auth (which is what service-specific start_auth tools do)
pass构建 Google API 服务客户端:
service = build('drive', 'v3', credentials=credentials)实现调用 Google API 的逻辑
妥善处理潜在错误
将结果返回为 JSON 可序列化的字典或列表
在
main.py中导入工具函数,以便它在服务器上注册在工具模块中定义必要的特定于服务的范围常量
如果需要新的依赖项,请更新
pyproject.toml
范围管理:
config/google_config.py中的全局SCOPES列表用于初始 OAuth 同意屏幕。各个工具在调用get_credentials时,应该请求所需的最小required_scopes。
🔒 安全说明
client_secret.json:此文件包含敏感凭据。切勿将其提交到版本控制。请确保将其列在您的.gitignore文件中。请妥善保管。用户令牌:经过身份验证的用户凭据(刷新令牌)存储在本地文件中,例如
credentials-<user_id_hash>.json。由于这些文件会授予访问用户 Google 帐户数据的权限,因此请务必妥善保护它们。请确保它们也位于.gitignore中。OAuth 回调安全性:在开发过程中,已安装应用的标准 OAuth 回调方式是使用
http://localhost,但需要设置OAUTHLIB_INSECURE_TRANSPORT=1。对于 localhost 以外的生产部署,必须使用 HTTPS 作为回调 URI,并在 Google Cloud Console 中进行相应配置。mcpo安全性:如果使用mcpo通过网络公开服务器,请考虑:使用
--api-key选项进行基本身份验证在反向代理(如 Nginx 或 Caddy)后面运行
mcpo来处理 HTTPS 终止、正确的日志记录和更强大的身份验证如果将
mcpo暴露到 localhost 之外,则仅将其绑定到受信任的网络接口
范围管理:服务器会为日历、云端硬盘和 Gmail 请求特定的 OAuth 范围(权限)。用户在初始身份验证期间会根据这些范围授予访问权限。请勿请求超出已实现工具所需范围的范围。
截图:
📄 许可证
该项目根据 MIT 许可证获得许可 - 有关详细信息,请参阅LICENSE文件。
Available Tools
122 toolsappend_table_rowsAppend Table RowsA
Appends rows to a structured table in a Google Sheet. The rows are added to the end of the table body, automatically extending the table range.
Use list_sheet_tables first to find the table ID.
| Name | Required | Description | Default |
|---|---|---|---|
| values | Yes | 2D array of values to append. Each inner list is one row. Can be a JSON string or Python list. Required. | |
| table_id | Yes | The ID of the table to append to (get from list_sheet_tables). Required. | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as non-read-only and non-idempotent. The description adds that rows are added to the end and the table range automatically extends, which is useful behavioral context beyond what annotations provide. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two succinct sentences, front-loaded with the primary action, no redundant information. Each sentence earns its place by stating what the tool does and a key prerequisite.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the mutation and side-effect profile, the description is sufficiently complete. It explains the core behavior and the necessary preliminary step, without needing to detail return values or error handling for this level of complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all four parameters described. The description only reinforces the relationship between table_id and list_sheet_tables, which is already in the schema, and does not add meaningful extra semantics for parameters like values or spreadsheet_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool 'Appends rows to a structured table in a Google Sheet', specifying the verb and resource. This distinguishes it from sibling tools like create_table_with_data and modify_sheet_values by focusing on appending to existing structured tables, and mentions the automatic extension of the table range.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises 'Use list_sheet_tables first to find the table ID', providing a concrete prerequisite. It does not enumerate alternatives or exclusions, but the context within the Sheets toolset makes when-to-use clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_modify_gmail_message_labelsBatch Modify Gmail Message LabelsADestructive
Adds or removes labels from multiple Gmail messages in a single batch request.
Takes MESSAGE ids, not thread ids. Gmail's batch endpoint returns no per-message result and silently ignores ids it does not recognise, so by default this reads the messages back afterwards and reports which ids actually changed.
| Name | Required | Description | Default |
|---|---|---|---|
| verify | No | Read the messages back and report per-id outcomes. Costs one extra (batched) read per id. Set False for very large sweeps where that cost matters and an unverified result is acceptable. | |
| message_ids | Yes | A list of message IDs to modify. | |
| add_label_ids | No | List of label IDs to add to the messages. | |
| remove_label_ids | No | List of label IDs to remove from the messages. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavior not visible in annotations: the batch endpoint silently ignores unrecognized ids, returns no per-message result, and defaults to reading messages back to verify which ids changed. This significantly strengthens the agent's understanding of the mutation's real-world behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the main action, then delivers the critical caveats in clear, economical sentences. Every sentence contributes actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the most important operational quirks and the verify behavior, and an output schema exists so return values need not be spelled out. Minor gaps remain, such as not explicitly requiring at least one of add_label_ids or remove_label_ids and not naming the singular alternative for redirection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful value by clarifying that message_ids must be MESSAGE ids rather than thread ids, and by explaining the verify parameter's purpose in relation to the endpoint's silent-id behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('adds or removes labels'), the resource ('multiple Gmail messages'), and the batching scope ('single batch request'). This distinguishes it from sibling message-label tools like modify_gmail_message_labels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for batch label modifications and warns that it takes MESSAGE ids, not thread ids, which is useful guidance. However, it never explicitly names the singular sibling tool or states when to prefer this batch version over alternatives, leaving some selection inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_update_docBatch Update DocADestructive
Executes multiple low-level document operations in a single atomic batch update.
For normal header/footer text, prefer update_doc_headers_footers. Only use create_header_footer here for advanced section-break layouts.
RECOMMENDED WORKFLOW FOR BUILDING DOCUMENTS:
To avoid index calculation errors, build documents in phases:
PHASE 1 - INSERT ALL CONTENT (use end_of_segment=true, no index math): Append text, section breaks, and page breaks sequentially. Each operation appends to the end of the body. No index needed. Example batch: [ {"type": "insert_text", "end_of_segment": true, "text": "Report Title\n"}, {"type": "insert_text", "end_of_segment": true, "text": "\nExecutive Summary\n"}, {"type": "insert_text", "end_of_segment": true, "text": "Revenue grew 15%.\n"}, {"type": "insert_section_break", "end_of_segment": true, "section_type": "NEXT_PAGE"}, {"type": "insert_text", "end_of_segment": true, "text": "Detailed Analysis\n"} ]
PHASE 2 - CREATE HEADERS/FOOTERS (if needed): For normal header/footer text, use update_doc_headers_footers (it auto-creates if missing and writes the content for you). Only include create_header_footer operations in a batch when you are intentionally managing advanced section-break-specific layouts.
| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | List of operation dicts. Each operation MUST have a 'type' field. All operations accept an optional 'tab_id' to target a specific tab. | |
| document_id | Yes | ID of the document to update | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the description doesn't need to restate safety. It adds value by disclosing atomicity ('single atomic batch update') and warning about 'index calculation errors' with a phased workflow mitigation. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but well-structured with a core statement, a clear alternative reference, and a WORKFLOW section with headings. The example batch is illustrative and earned its place given the tool's complexity. It could be slightly tighter, but overall every section contributes to usability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's extensive operation schema and the presence of an output schema (per context signals), the description is reasonably complete. It covers key decision points (when to use this vs. update_doc_headers_footers, how to avoid index pitfalls) without repeating schema details. It doesn't enumerate all operation types, but the schema handles that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the three top-level parameters, so the baseline is 3. The description adds semantic guidance through concrete examples (e.g., using end_of_segment=true to avoid index math) and clarifies when operation types like create_header_footer should be used. This supplements the schema meaningfully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource: 'Executes multiple low-level document operations in a single atomic batch update.' It clearly distinguishes this from sibling tools by explicitly stating 'For normal header/footer text, prefer update_doc_headers_footers' and scoping create_header_footer to advanced section-break layouts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance with a named alternative: 'prefer update_doc_headers_footers' for normal headers/footers, and 'Only use create_header_footer here for advanced section-break layouts.' The recommended two-phase workflow (insert content with end_of_segment=true, then create headers/footers) gives clear operational context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_update_formBatch Update FormADestructive
Apply batch updates to a Google Form.
Supports adding, updating, and deleting form items, as well as updating form metadata and settings. This is the primary method for modifying form content after creation.
| Name | Required | Description | Default |
|---|---|---|---|
| form_id | Yes | The ID of the form to update. | |
| requests | Yes | List of update requests to apply. Supported request types: - createItem: Add a new question or content item - updateItem: Modify an existing item - deleteItem: Remove an item - moveItem: Reorder an item - updateFormInfo: Update form title/description - updateSettings: Modify form settings (e.g., quiz mode) | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds context about the primary use but does not disclose additional behavioral traits such as side effects, error handling, or atomicity. It does not contradict annotations, but adds limited transparency beyond what annotations and schema provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action, and every sentence adds value. It avoids verbosity and presents the scope of the tool efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and rich schema, the description provides sufficient orientation: it names operations, states it is the primary update method, and aligns with annotations. It does not explain atomicity or failure modes, but the output schema and annotations cover much of the necessary context, making it reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the 'requests' parameter listing supported request types in detail. The description mentions updating metadata and settings, but adds no extra meaning beyond the schema. Baseline 3 applies because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Apply batch updates to a Google Form.' It enumerates supported operations (adding, updating, deleting form items, metadata and settings) and explicitly distinguishes it as 'the primary method for modifying form content after creation,' differentiating it from sibling tools like create_form and get_form.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by stating this is the primary method for modifying an existing form, implying it should be used after creation. However, it does not explicitly name alternatives or state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_update_presentationBatch Update PresentationCDestructive
Apply batch updates to a Google Slides presentation.
| Name | Required | Description | Default |
|---|---|---|---|
| requests | Yes | List of update requests to apply. | |
| presentation_id | Yes | The ID of the presentation to update. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate destructiveHint=true and readOnlyHint=false, and the description adds no additional behavioral context beyond 'apply batch updates.' It does not disclose effects, required permissions, or any implications of the destructive nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the core purpose. There is no filler or repetition, making it efficient and appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with a free-form 'requests' array, yet the description provides no context on what constitutes a valid batch update request or how to construct one. The output schema exists, but the description still needs to explain the input domain sufficiently, which it does not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds no parameter-specific meaning beyond what the schema provides. The 'requests' parameter is described generically as 'List of update requests to apply', but no detail is given about valid request types or structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool applies batch updates to a Google Slides presentation, using a specific verb and resource. It is distinct from sibling tools like get_presentation or create_presentation, though it doesn't explicitly differentiate itself from potential single-update alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives. The description merely states what it does, without mentioning prerequisites, exclusions, or contexts where other tools (e.g., batch_update_doc, import_to_google_slides) would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_drive_file_public_accessCheck Drive File Public AccessARead-onlyIdempotent
Searches for a file by name and checks if it has public link sharing enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| drive_id | No | ID of the shared drive to scope the search to. When set, the underlying files.list call uses corpora='drive' and the given driveId, which is required to reliably find files that live only in that shared drive. When None, behaviour is unchanged (default API corpora applies). | |
| file_name | Yes | The name of the file to check. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the non-mutating nature is clear. The description adds the specific check behavior but does not disclose how it handles multiple files with the same name, whether it returns partial matches, or what 'public link sharing' precisely entails (e.g., 'Anyone with link'). This is some added context but not rich behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, front-loading the key action and result. No filler or redundant content. It is appropriately sized for a simple lookup tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema (not shown) and high schema/annotation coverage, so describing return values is not obligatory. The description covers the primary scenario, but leaves minor ambiguities around search behavior (e.g., exact match, case sensitivity, multiple matches). Given the low complexity, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: each parameter has a description. The tool description does not add meaning beyond the schema; it simply echoes 'file name'. The drive_id parameter is well-documented in the schema, but the description doesn't clarify how it affects search results. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: it searches for a file by name and checks if public link sharing is enabled. This uses a specific verb ('searches', 'checks') and resource ('Drive file'), and is distinct from sibling tools like get_drive_file_permissions or get_drive_shareable_link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: use when you need to verify public link sharing on a named file. However, it does not provide explicit when-to-use vs alternatives, such as noting that get_drive_file_permissions provides broader permission details or that get_drive_shareable_link returns a link. No exclusions are mentioned.
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 FileA
Creates a copy of an existing Google Drive file.
This tool copies the template document to a new location with an optional new name. The copy maintains all formatting and content from the original file.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | The ID of the file to copy. Required. | |
| new_name | No | New name for the copied file. If not provided, uses "Copy of [original name]". | |
| parent_folder_id | No | The ID of the folder where the copy should be created. Defaults to 'root' (My Drive). | root |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-destructive write operation, and the description adds that the copy maintains all formatting and content. This provides useful behavioral context beyond annotations, though it does not discuss permissions or ownership.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, with two sentences that state the core function and then add valuable context. No redundant or unnecessary wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, behavior, and result, complemented by a full schema and output schema. It is sufficient for understanding the tool, though it could mention prerequisites or side effects like permission inheritance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter descriptions. The description adds no additional parameter semantics beyond what the schema already provides, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a copy of an existing Google Drive file with an optional new name and location, using specific verbs and resources. It distinguishes itself from sibling tools like create_drive_file or update_drive_file by focusing on duplication.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for copying template documents but does not explicitly contrast with alternatives or state when not to use it. It lacks direct guidance on choosing this tool over siblings like create_drive_file.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_calendarCreate CalendarA
Creates a new secondary Google Calendar.
| Name | Required | Description | Default |
|---|---|---|---|
| summary | Yes | The title/name of the new calendar. | |
| timezone | No | IANA timezone for the calendar (e.g. 'America/New_York'). | |
| description | No | An optional description for the calendar. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false. The description adds the 'secondary' scope, which offers some behavioral context. However, it does not disclose potential side effects, auth requirements, or error conditions, so the added value is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence conveying the essential purpose. There is no fluff or redundancy. It is well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create operation with a full input schema and an output schema, the description is adequate. It clarifies the calendar type ('secondary'), which is key contextual information. It does not explain the return value, but the output schema covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; every parameter has a clear description in the schema. 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.
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'). It distinguishes itself from sibling tools like list_calendars or manage_event by specifying 'secondary', making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or alternative tools. The context is completely absent beyond the basic action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_docCreate DocA
Creates a new Google Doc and optionally inserts initial content.
After creation, the document body starts at index 1. A new empty doc has total length 2 (one section break at index 0, one newline at index 1).
To build a rich document after creation, use batch_update_doc with insert_text operations using end_of_segment=true to append content sequentially without calculating indices. Then call inspect_doc_structure to get exact positions before applying formatting in a separate batch call.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the new document | |
| content | No | Optional initial plain text content to insert | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already indicate this is a write operation (readOnlyHint false), the description adds valuable behavioral context about the document body starting at index 1 and total length 2, which helps the agent understand the internal structure. It also mentions the optional content insertion but does not disclose side effects like authentication or rate limits, though these are less critical for a creation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear topic sentence followed by technical details and a recommended workflow. It is slightly verbose due to the explicit indices and workflow steps, but every sentence contributes useful information, and the main purpose appears first. No redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is highly complete for a creation tool: it states the primary function, optional content insertion, initial document structure, and a robust follow-up workflow (batch_update_doc + inspect_doc_structure). With an output schema present, it does not need to explain return values. The description covers both immediate constraints and recommended next steps, making it self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all parameters with descriptions (100% coverage), so the description does not need to elaborate on them. However, the description adds some context by explaining that content is 'optional initial plain text content' and gives structural details about how the document is initialized, but this is more about behavior than parameter semantics. Thus, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Creates a new Google Doc and optionally inserts initial content,' which is a specific verb+resource. It distinguishes from sibling tools like batch_update_doc, inspect_doc_structure, and get_doc_content by focusing on the creation action and its unique initial-state details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides a workflow: use create_doc for creation, then use batch_update_doc with insert_text and end_of_segment=true to append content, and finally inspect_doc_structure before formatting. This clearly guides the agent on when to use this tool versus alternatives and how to chain subsequent steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_drive_fileCreate Drive FileA
Creates a new file in Google Drive, supporting creation within shared drives. Accepts direct text content, inline base64 bytes, or a fileUrl to fetch content from. This stores the supplied bytes without converting them to Google Docs, Sheets, or Slides. Use the matching import_to_google_* tool for Google-native conversion.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | If provided, the content to write to the file. | |
| fileUrl | No | If provided, fetches the file content from this URL. Supports file://, http://, and https:// protocols. | |
| file_name | Yes | The name for the new file. | |
| folder_id | No | The ID of the parent folder. Defaults to 'root'. For shared drives, this must be a folder ID within the shared drive. | root |
| mime_type | No | The MIME type of the file. Defaults to 'text/plain'. | text/plain |
| base64_sha256 | No | Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks. | |
| base64_content | No | Standard base64-encoded file bytes. | |
| content_mime_type | No | MIME type for base64_content uploads. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutating, non-idempotent operation. The description adds valuable behavior beyond that: it stores the exact bytes without converting formats, and it may fetch content from a URL. It does not discuss failure modes, size limits, or parameter precedence, but the core behavioral traits are well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three efficient sentences, front-loaded with the primary action and scope, followed by input modes and the key non-conversion caveat plus routing to the sibling tool. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich 100%-covered schema and an output schema, the description provides enough high-level context for an agent to understand the tool's purpose and boundaries. A minor gap is that it does not specify what happens if multiple content sources (content, base64_content, fileUrl) are provided simultaneously.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description groups content parameters into three modes ('direct text content, inline base64 bytes, or a fileUrl') but mostly restates what the schema already documents. It adds little parameter-specific detail beyond that conceptual grouping.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Creates') and resource ('a new file in Google Drive'), and adds clarifying scope: creation within shared drives and non-conversion to Google-native formats. It clearly distinguishes the tool from sibling import_to_google_* and Google-native creation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states that for Google-native conversion the agent should use the matching import_to_google_* tool, giving a clear when-not-to-use signal. It does not, however, give guidance on how to choose among the three content input methods (text, base64, fileUrl) for different scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_drive_folderCreate Drive FolderA
Creates a new folder in Google Drive, supporting creation within shared drives.
| Name | Required | Description | Default |
|---|---|---|---|
| folder_name | Yes | The name for the new folder. | |
| parent_folder_id | No | The ID of the parent folder. Defaults to 'root'. For shared drives, use a folder ID within that shared drive. | root |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false. The description adds the shared drive support context, which is a useful behavioral nuance not captured by annotations. However, it does not disclose other potential traits such as permission requirements, error behavior, or whether the operation is reversible, so it offers limited additional transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that immediately conveys the action and object. It avoids redundancy and is appropriately front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple create operation, the schema (which documents all parameters, including the parent_folder_id default and shared drive usage), and the presence of an output schema, the description is fairly complete. It adds the key contextual detail of shared drive support. A slight gap is the lack of explicit mention of default behavior in My Drive, but that is covered by the parent_folder_id default, so a 4 is justified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (folder_name, parent_folder_id, user_google_email) are already documented. The tool description does not add any parameter-level detail beyond what the schema provides. Per the baseline for high schema coverage, a score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Creates a new folder in Google Drive.' The verb 'Creates' and resource 'folder' distinguish it from sibling tools like create_drive_file or create_doc. The added detail about supporting shared drives further specifies its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. The description does not mention any exclusions or alternative tools for creating files or documents. The only hint is 'supporting creation within shared drives,' but this does not constitute explicit usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_formCreate FormB
Create a new form using the title given in the provided form message in the request.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | The title of the form. | |
| description | No | The description of the form. | |
| document_title | No | The document title (shown in browser tab). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false, so the tool's mutation profile is known. The description adds that it creates a new form, which is more specific, but does not disclose side effects, required permissions, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one concise sentence with no unnecessary words, front-loaded with the core action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with full schema coverage and an output schema, the description is adequately complete. It could mention that the form is created in the user's Google account, but the required user_google_email parameter implies that without needing explicit explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides full descriptions for all four parameters, so the baseline is 3. The description adds a small note about the title being sourced from the request message, but does not meaningfully expand on the parameters beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create') and resource ('a new form'), making it distinct from sibling tools like get_form or batch_update_form. However, the phrase 'using the title given in the provided form message in the request' is slightly ambiguous about the source of the title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, nor any prerequisites or context such as authentication or ownership. The description only states what the tool does, not when or why to choose it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_presentationCreate PresentationB
Create a new Google Slides presentation.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | The title for the new presentation. Defaults to "Untitled Presentation". | Untitled Presentation |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey that this is a write operation (readOnlyHint=false, idempotentHint=false). The description adds no extra behavioral context such as where the presentation is created, whether it creates a file in Google Drive, or any side effects. With no additional context, it does not go beyond what annotations already provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that directly states the action and target. There is no unnecessary fluff or repetition. Every word adds value, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with just two parameters, a complete schema, and an output schema, the description is largely sufficient. It could mention that created presentations are empty or saved to the user's Drive, but the current information combined with schema and annotations provides enough context for this straightforward operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully describes both parameters (title and user_google_email) with 100% coverage. The description itself adds no parameter-specific meaning beyond the schema. This aligns with the baseline of 3 when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Create' and the specific resource 'a new Google Slides presentation.' This distinguishes it from sibling tools like import_to_google_slides (which imports) and create_drive_file (which creates generic files). 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.
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. It does not mention when not to use it, prerequisites, or how it differs from related tools like import_to_google_slides. The description is purely definitional and offers no context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_reactionCreate ReactionB
Adds an emoji reaction to a Google Chat message.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | The message resource name (e.g. spaces/X/messages/Y). | |
| emoji_unicode | Yes | The emoji character to react with (e.g. 👍). | |
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description confirms the mutation ('Adds') and matches the readOnlyHint=false annotation. It adds some context by specifying the action's target, but does not disclose behavior such as duplicate handling, authentication requirements, or side-effect scope implied by openWorldHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no redundant words. It is appropriately front-loaded and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with three required parameters and an output schema, but the description lacks usage context and fails to explain user_google_email. This is adequate for basic selection but leaves gaps for correct invocation in all scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents message_id and emoji_unicode, but user_google_email has no description. The tool description adds no parameter information and does not compensate for the undocumented parameter, leaving a gap in the 67% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Adds') and identifies the exact resource ('emoji reaction to a Google Chat message'). This clearly distinguishes the tool from sibling tools like send_message or search_messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, no prerequisites, and no exclusions. The agent must infer usage solely from the name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_script_projectCreate Script ProjectB
Creates a new Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Project title | |
| parent_id | No | Optional Drive folder ID or bound container ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a write operation (readOnlyHint=false), and the description adds no new behavioral context beyond that. It does not disclose side effects, permission requirements, or what happens to existing resources, so it carries minimal additional value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no wasted words. It is appropriately front-loaded and serves its purpose without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create operation with well-documented parameters and an output schema, the description is minimally viable. However, it lacks guidance on when to use it and any context about project creation behavior, such as where projects are stored or the significance of parent_id, making it incomplete for richer decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters have descriptions in the schema (100% coverage), so the description adds no extra meaning. The baseline of 3 applies because the schema does the heavy lifting, and the description does not introduce any parameter-specific details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Creates a new Apps Script project' uses a specific verb and resource, clearly distinguishing it from sibling tools like delete_script_project, get_script_project, and list_script_projects. It leaves no ambiguity 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.
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, nor any mention of prerequisites like authentication or choosing between Drive folder or bound container via parent_id. The description only states what it does, not when or how to use it.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| sheet_name | No | ||
| spreadsheet_id | Yes | ||
| source_sheet_name | No | ||
| user_google_email | Yes | ||
| insert_sheet_index | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not add significant behavioral context beyond what annotations already convey. It mentions the dual behavior (create vs duplicate) but does not disclose side effects, error conditions, or details about duplication (e.g., whether formatting is copied). The annotations already indicate a non-read-only operation, but the description fails to elaborate on important behavioral nuances.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, but it is cluttered with an inline Python-style signature that disrupts readability. The action is front-loaded, but the parameter list is not well-integrated. It lacks clear structure and could be improved by separating the high-level behavior from parameter details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters and no schema descriptions, the description is insufficiently complete. It does not explain how to use the parameters in practice, what happens when creating versus duplicating, or what the expected outcome is beyond the basic operation. The presence of an output schema does not compensate for the lack of behavioral and parameter context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the lack of parameter documentation. It only lists parameter names and types inline (e.g., 'user_google_email: str'), without explaining their meaning or relationships. For instance, the roles of 'sheet_name' and 'source_sheet_name' are not explicitly defined, leaving the agent to infer their purposes from the tool description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's primary function: 'Creates a new sheet or duplicates an existing sheet.' This uses a specific verb and resource, and it distinguishes the tool from siblings like create_spreadsheet (which creates a new spreadsheet) by focusing on sheets within an existing spreadsheet.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives. It does not mention scenarios, prerequisites, or exclusions. The description is purely functional and lacks any contextual direction for an agent deciding between this and similar tools.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | The title of the new spreadsheet. Required. | |
| sheet_names | No | List of sheet names to create. If not provided, creates one sheet with default name. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds no behavioral information beyond what annotations already provide. It does not disclose any side effects, auth requirements, or details about what the created spreadsheet entails. Annotations indicate a write operation, which the description merely confirms.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no fluff, but it is highly redundant with the tool name and title. It is structurally fine but lacks informative content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create operation, the combination of schema, annotations, and output schema covers most needs. However, the description does not clarify how this differs from 'create_sheet' or what happens to the created spreadsheet (e.g., where it is stored).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage with clear descriptions for all parameters. The description does not add any parameter-specific meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (creates) and the resource (a new Google Spreadsheet). It is specific but does not distinguish from sibling tools like 'create_sheet' or 'import_to_google_sheets', so it lacks sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. Sibling tools like 'create_sheet' and 'import_to_google_sheets' exist, but the description does not mention them or any usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_table_with_dataCreate Table with DataA
Creates a table and populates it with data in one reliable operation.
CRITICAL: YOU MUST CALL inspect_doc_structure FIRST TO GET THE INDEX!
MANDATORY WORKFLOW - DO THESE STEPS IN ORDER:
Step 1: ALWAYS call inspect_doc_structure first Step 2: Use the 'total_length' value from inspect_doc_structure as your index Step 3: Format data as 2D list: [["col1", "col2"], ["row1col1", "row1col2"]] Step 4: Call this function with the correct index and data
EXAMPLE DATA FORMAT: table_data = [ ["Header1", "Header2", "Header3"], # Row 0 - headers ["Data1", "Data2", "Data3"], # Row 1 - first data row ["Data4", "Data5", "Data6"] # Row 2 - second data row ]
CRITICAL INDEX REQUIREMENTS:
NEVER use index values like 1, 2, 10 without calling inspect_doc_structure first
ALWAYS get index from inspect_doc_structure 'total_length' field
Index must be a valid insertion point in the document
DATA FORMAT REQUIREMENTS:
Must be 2D list of strings only
Each inner list = one table row
All rows MUST have same number of columns
Use empty strings "" for empty cells, never None
Use debug_table_structure after creation to verify results
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | Document position (MANDATORY: get from inspect_doc_structure 'total_length') | |
| tab_id | No | Optional tab ID to create the table in a specific tab | |
| table_data | Yes | 2D list of strings - EXACT format: [["col1", "col2"], ["row1col1", "row1col2"]] | |
| document_id | Yes | ID of the document to update | |
| header_rows | No | Number of leading rows to mark as a repeating header that reappears after each page break. Must be between 0 and the number of table rows (default: 0 = none) | |
| bold_headers | No | Whether to make first row bold (default: true) | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral constraints: index must come from inspect_doc_structure, table_data must be a 2D list of strings with uniform rows, use empty strings not None, and verify with debug_table_structure. These go beyond annotations (readOnlyHint false, etc.) and add context for correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but structured with sections and headers. It front-loads the purpose and then gives essential steps. However, there is redundancy in repeating the inspect_doc_structure requirement multiple times, so it is not maximally concise, but still efficient for a complex tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with a mandatory prerequisite, the description covers the workflow, data format, and verification thoroughly. It does not need to explain return values as an output schema exists. This is essentially complete 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all parameters with descriptions, but the description enriches table_data with an explicit example and explains the index requirement in detail. It also clarifies empty cell handling. This adds value beyond the schema, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Creates a table and populates it with data in one reliable operation,' which clearly states the action (creates), resource (table), and scope (populates with data). This distinguishes it from sibling tools like append_table_rows or insert_doc_elements by focusing on table creation with data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a mandatory workflow: always call inspect_doc_structure first, use total_length as index, format data as 2D list, then call this function. It also recommends debug_table_structure after creation. However, it does not explicitly state when not to use this tool versus alternatives, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_versionCreate VersionA
Creates a new immutable version of a script project.
Versions capture a snapshot of the current script code. Once created, versions cannot be modified.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID | |
| description | No | Optional description for this version | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds important behavioral nuance beyond the annotations: versions are immutable and cannot be modified after creation. This is disclosed clearly and complements the readOnlyHint=false annotation without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, front-loaded with the primary action, and each sentence adds value. No redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations indicating a non-read-only, non-destructive operation and an output schema present, the description fully conveys the core purpose and key immutable-snapshot constraint. It is sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for script_id and user_google_email, so the baseline is 3. The description adds no parameter-specific meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Creates a new immutable version') and resource ('script project'), clearly distinguishing it from sibling tools like get_version or list_versions. It also explains what a version is (a snapshot of current script code).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use case clear: create an immutable snapshot of current script code. However, it does not explicitly mention alternatives or when not to use it, though the verb 'creates' naturally differentiates from get_version/list_versions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_docs_runtime_infoDebug Docs Runtime InfoARead-onlyIdempotent
Return runtime/source information for diagnosing stale MCP server instances.
This is a temporary diagnostic tool intended to verify which code checkout the running MCP server has loaded.
| Name | Required | Description | Default |
|---|---|---|---|
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds that it is temporary and diagnostic, but doesn't detail what 'runtime/source information' includes or any constraints beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with the verb and purpose front-loaded. Every word adds value, no repetition of schema data, and the structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one param, output schema exists), and annotations cover safety. However, the unexplained parameter and lack of detail about the returned information make this minimally adequate rather than complete. The description does not fully compensate for the 0% schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not mention the 'user_google_email' parameter at all. The agent is given no hint about why this email is needed or how it affects results, leaving a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns runtime/source information with a specific diagnostic purpose (verifying code checkout for stale MCP instances). This distinguishes it from sibling tools, which are mostly about document, Gmail, or Drive operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: use for diagnosing stale MCP server instances. It doesn't mention exclusions or alternatives, but for a temporary diagnostic tool, the intended use case is sufficiently specific.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_table_structureDebug Table StructureARead-onlyIdempotent
ESSENTIAL DEBUGGING TOOL - Use this whenever tables don't work as expected.
USE THIS IMMEDIATELY WHEN:
Table population put data in wrong cells
You get "table not found" errors
Data appears concatenated in first cell
Need to understand existing table structure
Planning to use populate_existing_table
WHAT THIS SHOWS YOU:
Exact table dimensions (rows × columns)
Each cell's position coordinates (row,col)
Current content in each cell
Insertion indices for each cell
Table boundaries and ranges
HOW TO READ THE OUTPUT:
"dimensions": "2x3" = 2 rows, 3 columns
"position": "(0,0)" = first row, first column
"current_content": What's actually in each cell right now
"insertion_index": Where new text would be inserted in that cell
WORKFLOW INTEGRATION:
After creating table → Use this to verify structure
Before populating → Use this to plan your data format
After population fails → Use this to see what went wrong
When debugging → Compare your data array to actual table structure
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes | ID of the document to inspect | |
| table_index | No | Which table to debug (0 = first table, 1 = second table, etc.) | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds substantial context about what the tool reveals: exact dimensions, cell coordinates, current content, and insertion indices. It also explains how to read the output, going well beyond the structured annotation data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear sections and bullet lists. It is front-loaded with the 'ESSENTIAL' tag and immediate use cases. While somewhat verbose, every section provides value for debugging scenarios.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the description covers when to use it, what to expect in the output, and how to interpret that output. It also aligns with the output schema, making it a complete guide for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides complete descriptions for all three parameters (100% coverage), including the meaning of table_index and user_google_email. The tool description does not add new parameter-level semantics beyond the schema, but the schema alone is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states this is a debugging tool for table structure, with concrete use cases like 'table not found' errors and mispopulated cells. It distinguishes itself from general inspection tools by focusing on table dimensions, positions, and insertion indices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use scenarios ('USE THIS IMMEDIATELY WHEN:') and workflow integration steps. However, it does not mention when not to use it or explicitly compare against sibling tools like inspect_doc_structure, so it falls short of the highest score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_script_projectDelete Script ProjectADestructive
Deletes an Apps Script project.
This permanently deletes the script project. The action cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID to delete | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false. The description adds value by stating 'This permanently deletes the script project. The action cannot be undone,' reinforcing the irreversible nature beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: two sentences that state the action and add the critical permanence warning. Every word earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with an output schema and annotations, the description covers the essential irreversible nature. It lacks usage guidance but is otherwise complete for a simple delete operation; a stronger description might explicitly warn to confirm the script ID.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters documented. The description adds no extra meaning beyond what the schema provides, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Deletes an Apps Script project' with a specific verb and resource. It is unambiguous and distinguishes from sibling tools like get_script_project or update_script_content, as deletion is unique.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for permanently removing a script project, but provides no explicit guidance on when to use it versus alternatives, nor any caveats or prerequisites. It is adequate but lacks explicit contextual direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_chat_attachmentDownload Chat AttachmentA
Downloads an attachment from a Google Chat message and saves it to local disk.
In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour).
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | The message resource name (e.g. spaces/X/messages/Y). | |
| attachment_index | No | Zero-based index of the attachment to download (default 0). | |
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds valuable behavioral details: it saves to local disk and returns either a file path (stdio) or a temporary URL valid for 1 hour (HTTP). This goes beyond the annotation defaults and clarifies the tool's side effects and result format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the main purpose, and then a concise breakdown of mode-specific returns. Every sentence adds value, and there is no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity of the tool and the presence of an output schema, the description is complete: it explains the core action, mode-specific output, and the temporary URL validity. No further context is needed 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% (message_id and attachment_index are described, user_google_email is not). The description does not add details about parameter semantics beyond what the schema provides, so it doesn't compensate for the missing description of user_google_email. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Downloads an attachment from a Google Chat message and saves it to local disk.' This is a specific verb+resource+action, and it distinguishes this tool from siblings like get_gmail_attachment_content (Gmail) and get_drive_file_download_url (Drive) by explicitly mentioning Google Chat.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for use (Google Chat attachments) and even explains mode-specific behavior (stdio vs HTTP). It doesn't explicitly name alternatives or exclusion criteria, but the context is sufficiently clear given the many sibling workspace tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_gmail_messageDraft Gmail MessageA
Creates a draft email in the user's Gmail account. Supports both new drafts and reply drafts with optional attachments. Supports Gmail's "Send As" feature to draft from configured alias addresses.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Optional CC email address. | |
| to | No | Optional recipient email address. | |
| bcc | No | Optional BCC email address. | |
| body | Yes | Email body (plain text). | |
| subject | Yes | Email subject. | |
| from_name | No | Optional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'. | |
| thread_id | No | Optional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID. | |
| from_email | No | Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the account's default Send As address, falling back to the authenticated user's email when Gmail returns no usable Send-As entry or settings access is not authorized. | |
| references | No | Optional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target. | |
| attachments | No | Optional list of attachments. Each can have: 'url' (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR 'path' (file path, auto-encodes), OR 'content' (standard base64, not urlsafe) + 'filename'. Optional 'mime_type'. Optional 'content_id' (string) makes the attachment inline-rendered: it lands in a multipart/related part with `Content-ID: <content_id>` and `Content-Disposition: inline`, and the HTML body can reference it via `<img src="cid:<content_id>">` (RFC 2392). Without `content_id` the attachment is a regular multipart/mixed attachment. | |
| body_format | No | Email body format. Use 'plain' for plaintext or 'html' for HTML content. | plain |
| in_reply_to | No | Optional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id. | |
| quote_original | No | Whether to include the original message as a quoted reply. Only has an effect when thread_id is provided. Defaults to false. | |
| include_signature | No | Whether to append the Gmail signature from Settings > Signature when available. Defaults to true. | |
| user_google_email | Yes | The user's Google email address. Required for authentication. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, so the mutating nature is known. The description adds useful behavioral context: drafts can be new or replies, attachments are supported, and alias addresses can be used via Send As. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the core purpose and then covers the two most important behavioral variants: reply drafts and Send As support.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 15 parameters, the description is brief but the schema and output schema carry most of the detail. It could explicitly mention that the message is not sent and that send_gmail_message should be used for sending, but the current description is still sufficient for an agent to understand the tool's role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already contains rich detail for parameters like attachments, from_email, thread_id, and in_reply_to. The tool description itself adds little per-parameter meaning, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a draft email in the user's Gmail account, which is a specific verb and resource. It also distinguishes itself from the sibling send_gmail_message by emphasizing 'draft' and explicitly mentions new drafts, reply drafts, and attachments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: it is for drafts, supports replies, and supports Send As aliases. It does not explicitly name send_gmail_message as the alternative for sending immediately, but the draft-vs-send distinction is strongly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_doc_to_pdfExport Doc to PDFA
Exports a Google Doc to PDF format and saves it to Google Drive.
| Name | Required | Description | Default |
|---|---|---|---|
| folder_id | No | Drive folder ID to save PDF in (optional - if not provided, saves in root) | |
| document_id | Yes | ID of the Google Doc to export | |
| pdf_filename | No | Name for the PDF file (optional - if not provided, uses original name + "_PDF") | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true. The description adds valuable context by specifying that the tool saves the PDF to Google Drive, clarifying the side effect location. It does not mention overwrite behavior or auth limitations, but the core side effect is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that immediately conveys the tool's function. No wasted words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, the schema covers all four parameters with descriptions, and an output schema exists. The description adequately explains the core operation without needing to detail optional parameters or return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents each parameter. The description does not add extra semantics beyond what the schema provides, which is acceptable given the high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Exports a Google Doc to PDF format and saves it to Google Drive.' This distinguishes it from sibling tools that read or create docs, as it uniquely mentions PDF conversion and Drive save.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like get_drive_file_download_url or other export methods. There is no mention of prerequisites, exclusions, or preferred scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_and_replace_docFind and Replace DocADestructive
Finds and replaces text throughout a Google Doc. No index calculation required.
This is the safest way to update specific text in a document because it does not require knowing any indices. Use this tool when you need to:
Replace placeholder text (e.g., {{TITLE}}) with real content
Update specific words or phrases throughout the document
Make targeted text changes without risk of index errors
For building documents from scratch, consider inserting text with unique placeholders via batch_update_doc, then using this tool to replace them.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional ID of the tab to target | |
| find_text | Yes | Text to search for | |
| match_case | No | Whether to match case exactly | |
| document_id | Yes | ID of the document to update | |
| replace_text | Yes | Text to replace with | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutating nature is known. The description adds useful context by explaining that it requires no index calculation, making it the 'safest way' for targeted updates. It also indicates the replacement happens 'throughout' the document, implying all occurrences. It does not explicitly mention side effects like replacement counts, but this is not required given the output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a lead sentence states the core function, followed by a bulleted list of use cases, and a closing note about an alternative tool. Every sentence earns its place and the length is appropriate for the tool's clarity. It could be slightly tighter, but it remains concise and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and the 100% param coverage, the description provides sufficient context for a Google Doc find-and-replace operation. It covers the core behavior, when to use it, and an alternative for building documents from scratch. It does not mention edge cases like what happens if find_text is absent, but the output schema likely conveys that, making the description reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3. The description adds semantic value by providing a concrete example: replacing placeholder text like '{{TITLE}}'. This helps an agent understand that find_text can be a template variable and replace_text its substitution, enriching the parameter meaning beyond the schema's simple 'Text to search for' and 'Text to replace with'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Finds and replaces text throughout a Google Doc,' which clearly states the verb, resource, and scope. It further distinguishes itself from siblings by highlighting 'No index calculation required' and explicitly contrasts with batch_update_doc for building documents. This makes the purpose unmistakable and differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases: replacing placeholders, updating specific words/phrases, and making targeted changes without index errors. It also states when not to use it (building documents from scratch) and recommends an alternative approach involving batch_update_doc. This is exactly the kind of when-to-use guidance expected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
format_sheet_rangeFormat Sheet RangeA
Applies formatting to a range: colors, number formats, text wrapping, alignment, and text styling.
Colors accept hex strings (#RRGGBB). Number formats follow Sheets types (e.g., NUMBER, CURRENCY, DATE, PERCENT). If no sheet name is provided, the first sheet is used.
| Name | Required | Description | Default |
|---|---|---|---|
| bold | No | Whether to apply bold formatting. | |
| italic | No | Whether to apply italic formatting. | |
| font_size | No | Font size in points. | |
| range_name | Yes | A1-style range (optionally with sheet name). Required. | |
| text_color | No | Hex text color (e.g., "#000000"). | |
| wrap_strategy | No | Text wrap strategy - WRAP (wrap text within cell), CLIP (clip text at cell boundary), or OVERFLOW_CELL (allow text to overflow into adjacent empty cells). | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| background_color | No | Hex background color (e.g., "#FFEECC"). | |
| user_google_email | Yes | The user's Google email address. Required. | |
| number_format_type | No | Sheets number format type (e.g., "DATE"). | |
| vertical_alignment | No | Vertical text alignment - TOP, MIDDLE, or BOTTOM. | |
| horizontal_alignment | No | Horizontal text alignment - LEFT, CENTER, or RIGHT. | |
| number_format_pattern | No | Custom pattern for the number format. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds some behavior details beyond annotations, such as hex color format and Sheets number format types, and the default sheet selection. However, it does not disclose whether formatting merges with existing formatting or replaces it, nor any side effects or error behavior. The annotations already indicate non-readonly and non-destructive, and the description does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, front-loaded with the primary purpose, then elaborating with relevant parameter constraints. No redundant content, filler, or unnecessary details. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 13 parameters and annotations, the description covers the main purpose, key value format constraints, and default behavior. It does not need to explain return values due to the presence of an output schema. A minor gap is not stating the effect on existing formatting, but overall it provides adequate context for selection and usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the schema already documents each parameter. The description enriches understanding by clarifying acceptable color formats (#RRGGBB), providing examples of number format types, and explaining the default sheet behavior for ranges without a sheet name. This adds value beyond the schema's brief descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's function with a specific verb ('Applies formatting') and enumerates the types of formatting (colors, number formats, wrapping, alignment, styling), distinguishing it from sibling tools like modify_sheet_values or read_sheet_values. It also adds a useful default behavior note, making the tool's scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for formatting ranges but does not explicitly state when to use it over alternatives, mention exclusions, or reference sibling tools. The only contextual note is the default first-sheet behavior, which is more of a parameter detail than usage guidance. It provides some operational context but lacks explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_trigger_codeGenerate Trigger CodeARead-onlyIdempotent
Generates Apps Script code for creating triggers.
The Apps Script API cannot create triggers directly - they must be created from within Apps Script itself. This tool generates the code you need.
| Name | Required | Description | Default |
|---|---|---|---|
| schedule | No | Schedule details (depends on trigger_type): - For time_minutes: "1", "5", "10", "15", or "30" - For time_hours: "1", "2", "4", "6", "8", or "12" - For time_daily: hour as "0"-"23" (e.g., "9" for 9am) - For time_weekly: "MONDAY", "TUESDAY", etc. - For simple triggers (on_open, on_edit): not needed | |
| trigger_type | Yes | Type of trigger. One of: - "time_minutes" (run every N minutes: 1, 5, 10, 15, 30) - "time_hours" (run every N hours: 1, 2, 4, 6, 8, 12) - "time_daily" (run daily at a specific hour: 0-23) - "time_weekly" (run weekly on a specific day) - "on_open" (simple trigger - runs when document opens) - "on_edit" (simple trigger - runs when user edits) - "on_form_submit" (runs when form is submitted) - "on_change" (runs when content changes) | |
| function_name | Yes | The function to run when trigger fires (e.g., "sendDailyReport") |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds valuable context about the Apps Script API limitation, enhancing transparency beyond the structured hints. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the core purpose and no unnecessary words. It efficiently conveys the tool's function and important contextual constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the key limitation and purpose, and the output schema exists to explain return values. It could be slightly more complete by hinting at next steps or code format, but it is sufficient given the available structured metadata.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with detailed parameter descriptions for trigger_type, schedule, and function_name. The tool description itself adds no parameter-level detail, but the schema fully compensates, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Generates Apps Script code for creating triggers' with a specific verb and resource. It also explains the API limitation, which helps distinguish it from other script management tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use this tool (when you need trigger creation code) by explaining that the API cannot create triggers directly. However, it does not explicitly name alternative tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactGet ContactARead-onlyIdempotent
Get detailed information about a specific contact.
| Name | Required | Description | Default |
|---|---|---|---|
| contact_id | Yes | The contact ID (e.g., "c1234567890" or full resource name "people/c1234567890"). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no extra behavioral context beyond stating it gets information, which aligns with annotations but does not provide additional details like potential errors or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that delivers the core purpose without any filler or redundancy. It is well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only getter with a full output schema and 100% parameter coverage, the description is sufficiently complete. It might benefit from mentioning that the contact must be retrieved via a prior list/search, but that is not essential given the tool's straightforward nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters (contact_id and user_google_email) having explicit descriptions. The tool description adds no additional parameter meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get detailed information about a specific contact' clearly states the tool's verb and resource, and distinguishes it from list/search siblings by emphasizing 'specific contact.' However, it does not explicitly mention that the contact is identified by an ID, leaving a minor gap in precision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you have a specific contact in mind, which is a clear context, but it does not provide explicit when-to-use vs. alternatives like search_contacts or list_contacts. No exclusions or alternative suggestions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contact_groupGet Contact GroupARead-onlyIdempotent
Get details of a specific contact group including its members.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | The contact group ID. | |
| max_members | No | Maximum number of members to return (default: 100, max: 1000). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is consistent with the readOnlyHint and idempotentHint annotations, and adds that members are included in the result. However, it does not describe error behavior (e.g., unknown group_id) or any other operational details beyond the annotations and schema, so it offers minimal additional transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that is front-loaded with the verb and clearly states the tool's scope. There is no redundant or filler content, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations (readOnly, idempotent, non-destructive), a fully described input schema, and the presence of an output schema, the description adequately covers what is needed for a simple read operation. The only missing element is explicit usage differentiation from siblings, but this is a minor gap for such a straightforward tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters are fully described in the input schema with explicit descriptions (e.g., group_id: 'The contact group ID.', max_members: 'Maximum number of members to return (default: 100, max: 1000).', user_google_email: 'The user's Google email address. Required.'). The tool description adds no parameter-specific meaning beyond the schema, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool's verb and resource specifically: 'Get details of a specific contact group including its members.' It clearly distinguishes from siblings like list_contact_groups, which likely only lists groups without member details, and manage_contact_group for modifications.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need details of a single contact group, but it does not explicitly contrast with alternatives such as list_contact_groups for enumeration or search_contacts. No when-to-use or when-not-to-use guidance is provided beyond the verb 'Get'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_doc_as_markdownGet Doc as MarkdownARead-onlyIdempotent
Reads a Google Doc and returns it as clean Markdown with optional comment context.
Unlike get_doc_content which returns plain text, this tool preserves document formatting as Markdown: headings, bold/italic/strikethrough, links, code spans, ordered/unordered lists with nesting, and tables.
When comments are included (the default), each comment's anchor text — the specific text the comment was attached to — is preserved, giving full context for the discussion.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes | ID of the Google Doc (or full URL) | |
| comment_mode | No | How to display comments: - "inline": Footnote-style references placed at the anchor text location (default) - "appendix": All comments grouped at the bottom with blockquoted anchor text - "none": No comments included | inline |
| include_comments | No | Whether to include comments (default: True) | |
| include_resolved | No | Whether to include resolved comments (default: False) | |
| user_google_email | Yes | User's Google email address | |
| suggestions_view_mode | No | How to render suggestions in the returned content: - "DEFAULT_FOR_CURRENT_ACCESS": Default based on user's access level - "SUGGESTIONS_INLINE": Suggested changes appear inline in the document - "PREVIEW_SUGGESTIONS_ACCEPTED": Preview as if all suggestions were accepted - "PREVIEW_WITHOUT_SUGGESTIONS": Preview as if all suggestions were rejected | DEFAULT_FOR_CURRENT_ACCESS |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds valuable behavioral context about how comments are handled (default included, anchor text preserved, comment_mode options) and which formatting elements are preserved. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured into three concise paragraphs: purpose, differentiation, and comment behavior. Each sentence earns its place with no redundancy, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the read-only nature confirmed by annotations and the presence of an output schema, the description is complete. It covers the tool's core behavior, differentiation from similar tools, and comment handling. There are no significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3. The description adds meaning by explaining the effect of comment-related parameters, such as the default behavior of including comments and preserving anchor text. This helps the agent understand the purpose of include_comments and comment_mode beyond their schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Reads a Google Doc and returns it as clean Markdown with optional comment context.' It uses a specific verb and resource, and explicitly differentiates from sibling get_doc_content by noting it returns plain text while this preserves formatting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance by contrasting with get_doc_content: 'Unlike get_doc_content which returns plain text, this tool preserves document formatting as Markdown.' This tells the agent when to choose this tool over the alternative, and the comment context section clarifies behavior around comments.
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 ContentBRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes | ID of the Google Doc (or full URL) | |
| user_google_email | Yes | User's Google email address | |
| suggestions_view_mode | No | How to render suggestions in the returned content: - "DEFAULT_FOR_CURRENT_ACCESS": Default based on user's access level - "SUGGESTIONS_INLINE": Suggested changes appear inline in the document - "PREVIEW_SUGGESTIONS_ACCEPTED": Preview as if all suggestions were accepted - "PREVIEW_WITHOUT_SUGGESTIONS": Preview as if all suggestions were rejected | DEFAULT_FOR_CURRENT_ACCESS |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description adds limited extra behavioral context. It explains the use of Docs API vs Drive API for different file types, which is useful, but does not disclose other important behaviors like output format or potential limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with a clear opening statement followed by two bullet points that efficiently summarize the two retrieval paths. There is no redundant wording or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with output schema and rich annotations, the description is mostly complete. It adequately explains the two file-type scenarios, though it could mention limitations or explicitly guide users to alternatives, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all parameters. The description adds minimal meaning beyond the schema, mainly mentioning the document_id role, but does not elaborate on parameter formats or usage nuances.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves content from Google Docs or Drive files, using specific verbs and resources. It distinguishes between native Google Docs and Office files, but does not explicitly differentiate from sibling tools like get_drive_file_content or get_doc_as_markdown.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives, nor does it mention exclusions. The handling of different file types is implied by the description, but no direct comparison to sibling tools is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_drive_file_contentGet Drive File ContentARead-onlyIdempotent
Retrieves the content of a specific Google Drive file by ID, supporting files in shared drives.
• Native Google Docs, Sheets, Slides → exported as text / CSV. • Office files (.docx, .xlsx, .pptx) → unzipped & parsed with std-lib to extract readable text. • PDFs → text extracted with pypdf when possible; scanned/image-only PDFs fall back to a download hint. • Images → returned as base64 with MIME metadata for multimodal clients. • Any other file → downloaded; tries UTF-8 decode, else notes binary.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | Drive file ID. | |
| user_google_email | Yes | The user’s Google email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses meaningful behavioral traits: native docs are exported as text/CSV, Office files are unzipped, PDFs may fall back to a download hint for scanned images, images return base64 with MIME metadata, and other binaries are handled with UTF-8 detection. This adds significant context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a single purpose sentence followed by bullet points for each file-type behavior. Each bullet contributes unique information with no redundancy or filler, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the read-only annotations and the presence of an output schema, the description covers the necessary context: shared drives, format-specific extraction, fallbacks, and binary handling. It does not explain errors or auth, but those are already covered by annotations and the user_google_email parameter. The coverage is strong, though not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides clear descriptions for both params (file_id and user_google_email) with 100% coverage. The description adds no additional parameter semantics beyond the phrase 'by ID', which duplicates schema information. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Retrieves the content of a specific Google Drive file by ID' and then details format-specific behaviors, making the purpose unambiguous. It distinguishes itself from download-URL or search siblings by focusing on content extraction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the description (i.e., use when you need file content), but no explicit alternatives or when-not-to-use guidance is provided. For example, it does not mention get_drive_file_download_url as the alternative for when a URL is sufficient. This falls into 'implied usage' rather than clear, explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_drive_file_download_urlGet Drive File Download URLARead-onlyIdempotent
Downloads a Google Drive file and saves it to local disk.
In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour).
For Google native files (Docs, Sheets, Slides), exports to a useful format:
Google Docs -> PDF (default) or DOCX if export_format='docx'
Google Sheets -> XLSX (default), PDF if export_format='pdf', or CSV if export_format='csv'
Google Slides -> PDF (default) or PPTX if export_format='pptx'
For other files, downloads the original file format.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | The Google Drive file ID to download. | |
| export_format | No | Optional export format for Google native files. Options: 'pdf', 'docx', 'xlsx', 'csv', 'pptx'. If not specified, uses sensible defaults (PDF for Docs/Slides, XLSX for Sheets). For Sheets: supports 'csv', 'pdf', or 'xlsx' (default). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnly, idempotent, non-destructive), the description discloses key behaviors: saving to local disk, temporary URL validity in HTTP mode, and format conversion rules for Google native files. This exceeds what annotations provide and sets clear expectations for side effects and return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear main statement, mode-specific details, and a bulleted list for format conversions. Every sentence serves a purpose without redundancy, making it concise yet informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully covers the tool's behavior across modes, file types, and export formats. It explains return values (local path vs URL) and edge cases like native file conversion, making it complete for an agent to select and invoke the tool correctly without needing additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds value by explaining export format mappings per file type (e.g., Docs to PDF/DOCX, Sheets to XLSX/PDF/CSV). This enriches the parameter semantics beyond the schema's plain option list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it downloads a Google Drive file and saves it to local disk, using a specific verb and resource. It distinguishes from siblings like get_drive_file_content or get_drive_shareable_link by focusing on the download behavior and local file access.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context, explaining mode-specific behavior (stdio vs HTTP) and export format options. It does not explicitly name alternatives or exclusions, but the context makes it obvious when to use this tool for downloading files rather than just reading or sharing them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_drive_file_permissionsGet Drive File PermissionsARead-onlyIdempotent
Gets detailed metadata about a Google Drive file including sharing permissions, parent folder IDs, ownership, and lifecycle timestamps.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | The ID of the file to check permissions for. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds value by specifying exactly what metadata categories are returned (permissions, parent folder IDs, ownership, lifecycle timestamps), which goes beyond the annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence that lists the key metadata categories without any filler. It is efficiently front-loaded with the action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only metadata lookup with a rich output schema and comprehensive annotations, the description sufficiently communicates the tool's purpose and return scope. It could mention error conditions or permission requirements, but these are not critical given the output schema and safety annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully described in the input schema with clear purposes (file_id and user_google_email). The description itself does not add any parameter-specific details, so it relies on the schema's complete coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Gets') and resource ('Google Drive file'), and enumerates concrete metadata categories: sharing permissions, parent folder IDs, ownership, and lifecycle timestamps. This clearly differentiates it from sibling tools like get_drive_file_content or get_drive_file_download_url.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a caller needs comprehensive file metadata, but it does not explicitly state when to prefer this tool over related siblings such as check_drive_file_public_access or get_drive_shareable_link. No exclusions or alternative guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventsGet EventsARead-onlyIdempotent
Retrieves events from a specified Google Calendar. Can retrieve a single event by ID or multiple events within a time range. You can also search for events by keyword by supplying the optional "query" param.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | A keyword to search for within event fields (summary, description, location). Ignored if event_id is provided. | |
| detailed | No | Whether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also report the parent series ID needed to edit the whole series; recurring masters report their raw RFC5545 recurrence rules; and events that are not ordinary confirmed meetings report their event type (outOfOffice, workingLocation, focusTime) and status. Defaults to False. | |
| event_id | No | The ID of a specific event to retrieve. If provided, retrieves only this event and ignores time filtering parameters. | |
| time_max | No | The end of the time range (exclusive) in RFC3339 format. If omitted, events starting from `time_min` onwards are considered (up to `max_results`). Ignored if event_id is provided. | |
| time_min | No | The start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time when single_events=True. It is omitted from unexpanded queries so recurring masters that began in the past but still have future occurrences remain discoverable. Ignored if event_id is provided. | |
| calendar_id | No | The ID of the calendar to query. Use 'primary' for the user's primary calendar. Defaults to 'primary'. Calendar IDs can be obtained using `list_calendars`. | primary |
| max_results | No | The maximum number of events to return. Defaults to 25. Ignored if event_id is provided. | |
| single_events | No | Whether to expand recurring series into individual instances. Defaults to True for backwards compatibility. Set to False with detailed=True to retrieve recurring master events and their exact RFC5545 recurrence rules instead of inferring cadence from expanded instances. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| include_attachments | No | Whether to include attachment information in detailed event output. When True, shows attachment details (fileId, fileUrl, mimeType, title) for events that have attachments. Only applies when detailed=True. Set this to True when you need to view or access files that have been attached to calendar events, such as meeting documents, presentations, or other shared files. Defaults to False. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description does not need to restate those. The description adds useful behavioral context about the three major retrieval modes. It does not disclose details like rate limits or default response shape, but those gaps are minor given the strong annotations and output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler. The main purpose is front-loaded, and each sentence adds a distinct retrieval mode. It is concise without sacrificing the key decision points for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 10 parameters, the description is appropriately high-level, with the heavy detail carried by the input schema and output schema. It covers all major entry points: ID lookup, time range, and keyword search. It does not explicitly mention defaults like 'primary' calendar or the detailed flag, but those are fully documented in the schema, so no critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description mentions the optional query parameter and the ID/time-range distinction, but all parameter-level meaning is already thoroughly documented in the input schema. The description adds little beyond a high-level framing of the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Retrieves events from a specified Google Calendar.' It then clearly enumerates the three retrieval modes—by ID, by time range, and by keyword—which distinguishes this read tool from siblings like manage_event or list_calendars. An agent can understand what the tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context by describing the supported use cases: single event retrieval, time-range retrieval, and keyword search. It does not explicitly name alternatives or state when not to use it, but the read-only semantics and retrieval modes make intended usage obvious relative to sibling write tools like manage_event.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_formGet FormCRead-onlyIdempotent
Get a form.
| Name | Required | Description | Default |
|---|---|---|---|
| form_id | Yes | The ID of the form to retrieve. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false) already establish the safety profile, but the description adds no additional behavioral context such as what exactly is returned, potential errors, or authorization requirements beyond what the schema states. The description is neutral but does not enhance transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, but it is under-specified rather than concise. It fails to provide necessary context or details, making it inadequate for an AI agent to understand the tool's purpose and usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of rich annotations, a fully described schema, and an output schema, the description is minimally adequate. However, it lacks any contextual details about what 'form' refers to or how it fits with related tools, so it is not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both form_id and user_google_email having descriptions. The tool description adds no parameter-related information, but since the schema fully documents the parameters, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get a form.' simply restates the tool name without adding any specific detail about what the form retrieval entails. It lacks information on what a 'form' is in this context (e.g., Google Form structure, settings) and does not explicitly distinguish from sibling tools like get_form_response, making it nearly tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool or how it compares to alternatives. It does not mention any context, prerequisites, or exclusions, leaving the agent without information about appropriate usage scenarios.
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 ResponseARead-onlyIdempotent
Get one response from the form.
| Name | Required | Description | Default |
|---|---|---|---|
| form_id | Yes | The ID of the form. | |
| response_id | Yes | The ID of the response to retrieve. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false, idempotentHint, and openWorldHint, so the safety profile is clear. The description adds no extra behavioral context, such as error behavior or return format, but it also does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence: 'Get one response from the form.' It is front-loaded, immediately conveys the purpose, and contains no filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only getter with a full output schema and rich annotations, the description is adequate but not fully complete. It does not mention the necessity of a response_id (though the schema covers it) or provide any context about what a response contains, but given the tool's simplicity, the missing details are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are well-documented in the schema. The description does not add any additional parameter-level information, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get one response from the form' clearly identifies the action (get) and resource (form response), with the scope 'one' distinguishing it from listing all responses (e.g., list_form_responses). It is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. It does not mention that it requires a response_id or that list_form_responses should be used for multiple responses. The usage context is left entirely to inference from the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gmail_attachment_contentGet Gmail Attachment ContentA
Downloads an email attachment and saves it to local disk.
In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour). May re-fetch message metadata to resolve filename and MIME type.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | The ID of the Gmail message containing the attachment. | |
| attachment_id | Yes | The ID of the attachment to download. | |
| return_base64 | No | When True, includes the full attachment as a standard base64 string in the response (in addition to any file path or download URL). Useful for sandboxed clients that cannot reach localhost download URLs or the MCP server's local file paths (e.g. containerized agents with network allowlists). The returned base64 uses the standard alphabet, so it can be passed directly to tools like ``draft_gmail_message`` that expect standard (not URL-safe) base64. Default False preserves the existing behavior and response size. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: it saves to disk, returns a temporary URL valid for 1 hour in HTTP mode, and may re-fetch message metadata. Annotations provide limited safety info (readOnlyHint=false), so the description carries the burden of explaining side effects and output behavior, which it does effectively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: it opens with the main action, then breaks down output modes in two clear sentences, and ends with a relevant behavioral caveat. Every sentence adds distinct value, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists and the input schema is thorough, the description provides the essential extra context: mode-specific outputs, time validity, and side effects. It does not explain error cases or prerequisites, but these are not critical given the tool's moderate complexity and the schema richness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with detailed descriptions for all four parameters including return_base64. The tool description itself does not add parameter-level information, but since the schema fully documents each parameter, the baseline of 3 is appropriate—the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action with a specific verb ('Downloads') and resource ('email attachment'), and further specifies it saves to local disk. This distinguishes it from siblings like get_gmail_message_content by focusing on attachment content, and the mode-specific output details reinforce its unique purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool by explaining its behavior in stdio and HTTP modes, which helps select it for attachment downloads. It does not explicitly name alternatives or exclusions, but the context is sufficient for most scenarios without needing explicit '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_gmail_message_contentGet Gmail Message ContentARead-onlyIdempotent
Retrieves the full content (subject, sender, recipients, body) of a specific Gmail message.
Bodies are returned inline and truncated at 20,000 characters. Set full=True to get the complete, untruncated message instead: it is exported to disk and the response carries a short-lived download URL (HTTP transport) or file path (stdio transport) rather than the body, so large messages never stream through the model context. Stateless deployments have no file storage, so there full=True returns the untruncated body inline.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | When True, return the COMPLETE untruncated message: saved to local storage and referenced by download URL/file path instead of the body text, or inlined in the response when the server has no file storage (stateless mode). Use for messages large enough to hit the truncation limit, or when byte-exact fidelity is needed (pair with body_format='raw' for a .eml export). | |
| message_id | Yes | The unique ID of the Gmail message to retrieve. | |
| body_format | No | Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches the full raw MIME message and returns the base64url-decoded content. | text |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds substantial behavioral detail: 20,000-character truncation, export-to-disk with a short-lived download URL or file path, and stateless inline fallback. These details help the agent anticipate response size and transport behavior, going well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tightly written paragraphs: a one-sentence purpose statement, a concise explanation of truncation and full=True behavior, and a short note on stateless deployments. Every sentence contributes new information and is front-loaded with the most important details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the strong annotations, complete input schema with 100% parameter coverage, and presence of an output schema, the description covers all key operational edge cases: truncation, full=True behavior, transport differences, and stateless mode. It is fully sufficient for reliable tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema itself has rich parameter descriptions. The tool description adds extra value by explaining the 20,000-character truncation threshold and the rationale that large messages never stream through model context, which complements the schema's full=True description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Retrieves the full content (subject, sender, recipients, body) of a specific Gmail message,' using a specific verb and clearly identifying the resource and scope. The 'specific' qualifier distinguishes it from sibling batch/thread/attachment tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use full=True (large messages, byte-exact fidelity) and when the default truncated inline body is used. It does not explicitly name sibling alternatives or state when not to use this tool, so it lacks explicit exclusion guidance but is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gmail_messages_content_batchGet Gmail Messages Content BatchARead-onlyIdempotent
Retrieves the content of multiple Gmail messages in a single batch request. Supports up to 25 messages per batch to prevent SSL connection exhaustion.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Message format. "full" includes body, "metadata" only headers. | full |
| body_format | No | Body output format (only applies when format='full'). 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches the full raw MIME message and returns the base64url-decoded content. | text |
| message_ids | Yes | List of Gmail message IDs to retrieve (max 25 per batch). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds the 25-message limit and the rationale ('to prevent SSL connection exhaustion'), which is behavioral context beyond the annotations and schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose, and every word earns its place. The second sentence explains a practical constraint without verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is straightforward, with full schema coverage and an output schema available. The description covers batch size and rationale, and the sibling list includes the singular variant, making the context clear. It doesn't discuss error handling or partial failures, but that's not critical for a read-only batch retriever.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear descriptions for all four parameters. The description does not add any parameter-specific detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves content of multiple Gmail messages in a single batch request. The verb 'retrieves' with the resource 'Gmail messages' and the scope 'batch' distinctly differentiate it from the singular get_gmail_message_content sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides the key context of batching up to 25 messages per request, which guides when to use this tool over the singular version. However, it does not explicitly say 'use this for multiple messages instead of single fetch' or name the alternative, so it falls short of explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gmail_thread_contentGet Gmail Thread ContentARead-onlyIdempotent
Retrieves the complete content of a Gmail conversation thread, including all messages.
Optionally also returns structured ownership analysis so a caller can determine who sent the last message and who owes whom a response without re-parsing the formatted string or making a second tool call.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | The unique ID of the Gmail thread to retrieve. | |
| body_format | No | Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches each message's full raw MIME content and returns the base64url-decoded body. | text |
| include_analysis | No | When True, the return value is a dict with both the formatted thread content AND structured ownership analysis (last sender, ball-in-court verdict, per-sender message counts, participants). Defaults to False, in which case the existing string return shape is preserved. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds behavioral context about return shape (string by default, dict when include_analysis=True) and clarifies that the default preserves the existing string return shape, which is beyond annotation data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first clearly states the core purpose, the second explains an optional feature and its benefit. No redundant wording, well-front-loaded, every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists and annotations are rich, the description covers the essential aspects: thread retrieval, all messages, optional analysis, and default return shape. It is sufficiently complete for an agent to understand the tool's functionality without ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description enriches the include_analysis parameter by explaining the structured ownership analysis (last sender, ball-in-court verdict), which is not fully captured in the schema. It also clarifies body_format behavior via the schema, and the description adds value by describing the default return shape.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool retrieves complete Gmail thread content including all messages, using a specific verb and resource. It distinguishes from sibling tools like get_gmail_message_content by focusing on the whole thread, and mentions optional structured ownership analysis as an added feature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool (to retrieve full thread content) and hints at a reason to prefer it over alternatives: by enabling include_analysis, callers avoid re-parsing or making a second call. It does not explicitly name sibling alternatives, but the guidance is useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gmail_threads_content_batchGet Gmail Threads Content BatchARead-onlyIdempotent
Retrieves the content of multiple Gmail threads in a single batch request. Supports up to 25 threads per batch to prevent SSL connection exhaustion.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_ids | Yes | A list of Gmail thread IDs to retrieve. The function will automatically batch requests in chunks of 25. | |
| body_format | No | Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches each message's full raw MIME content and returns the base64url-decoded body. | text |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint=true, idempotentHint=true, and destructiveHint=false, the description adds valuable context beyond these: the batch limit of 25 threads and the rationale (SSL connection exhaustion). The parameter description also notes automatic batching in chunks of 25, which is additional behavioral detail. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exactly two sentences, both front-loaded and free of filler. The first sentence delivers the core purpose, the second provides a key constraint. Every word earns its place, making it an exemplary concise description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, annotations cover safety, and schema descriptions cover all parameters, the description only needs to convey the tool's unique value and constraints. It does that well by highlighting batch retrieval and the 25-thread limit. It could mention alternatives for full completeness, but the existing information is sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description itself does not add parameter-level semantics beyond what the schema provides. The schema already contains detailed explanations for thread_ids (batching) and body_format (text/html/raw), so no compensation is needed. The description adds no extra value here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific verb and resource: 'Retrieves the content of multiple Gmail threads in a single batch request.' This distinguishes it from sibling tools like get_gmail_thread_content (single thread) and get_gmail_messages_content_batch (messages, not threads) by focusing on 'multiple threads' and 'batch'. The addition of the 25-thread limit further clarifies its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for fetching multiple threads at once and provides a rationale ('to prevent SSL connection exhaustion'). However, it does not explicitly name alternatives or state when not to use this tool, though the name and context make batch usage clear. Given the existence of a sibling for single threads, a brief 'for a single thread, use get_gmail_thread_content' would have made it a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_messagesGet MessagesCRead-onlyIdempotent
Retrieves messages from a Google Chat space.
| Name | Required | Description | Default |
|---|---|---|---|
| order_by | No | createTime desc | |
| space_id | Yes | ||
| page_size | No | ||
| message_filter | No | Optional filter string using the Chat API filter syntax. Supports createTime and thread.name. Examples: 'createTime > "2026-03-18T00:00:00-03:00"' 'createTime > "2026-03-18T00:00:00-03:00" AND createTime < "2026-03-19T00:00:00-03:00"' 'thread.name = spaces/X/threads/Y' | |
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, but the description adds no behavioral context beyond the basic retrieval action. It does not mention filtering, ordering, pagination, or any limits, nor does it contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no filler or repetition. It front-loads the verb and object.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters and a sibling search_messages, this description is too sparse to support selection and correct invocation. The presence of an output schema helps with return values, but the description fails to explain filtering capabilities, pagination defaults, or how this differs from related message retrieval tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% (just message_filter has a description), yet the tool description adds no explanation for user_google_email, space_id, order_by, or page_size. The phrase 'from a Google Chat space' weakly maps to space_id but is not enough to compensate for the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieves') and names a concrete resource ('Google Chat space'), making the core action clear. However, it does not distinguish this from sibling tools like 'search_messages' or 'search_drive_files', so it falls short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as search_messages. The description is a single statement with no context, exclusions, or alternative references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pageGet PageBRead-onlyIdempotent
Get details about a specific page (slide) in a presentation.
| Name | Required | Description | Default |
|---|---|---|---|
| page_object_id | Yes | The object ID of the page/slide to retrieve. | |
| presentation_id | Yes | The ID of the presentation. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety and mutation aspects. The description adds minimal extra behavioral context beyond a minor clarification that 'page' means 'slide'. With annotations present, this is acceptable but not enriched.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that front-loads the essential purpose. It contains no redundant phrases, making it maximally concise while remaining informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the existence of an output schema, the description sufficiently covers what the tool does. It does not explain return format or error behavior, but the output schema handles return details, and the operation is a straightforward read. It lacks a bit of contextual guidance but is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all three parameters. The description clarifies that 'page' refers to a slide, which slightly aids understanding of page_object_id, but it does not elaborate on details like ID formats or defaults. This aligns with the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Get') and resource ('details about a specific page (slide) in a presentation'). It conveys the tool's specific function without ambiguity. However, it does not explicitly differentiate from sibling tools like get_presentation or get_page_thumbnail, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention exclusions, prerequisites, or contrast with other getters in the sibling list. The usage context is only implied by the tool's name and nature.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_thumbnailGet Page ThumbnailARead-onlyIdempotent
Generate a thumbnail URL for a specific page (slide) in a presentation.
| Name | Required | Description | Default |
|---|---|---|---|
| page_object_id | Yes | The object ID of the page/slide. | |
| thumbnail_size | No | Size of thumbnail ("LARGE", "MEDIUM", "SMALL"). Defaults to "MEDIUM". | MEDIUM |
| presentation_id | Yes | The ID of the presentation. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, covering the safety profile. The description adds minimal behavioral context beyond stating the output (a URL). It does not disclose any side effects, permissions, or additional behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no fluff. It front-loads the core purpose and is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations and complete schema descriptions, the description suffices. It does not explain return values in detail, but the presence of an output schema fills that gap. It is complete enough for this straightforward tool, though it omits any caveats about URL expiry or usage constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all parameters. The description mentions 'specific page (slide)', which aligns with page_object_id, but does not add extra meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb 'Generate' and a specific resource 'thumbnail URL for a specific page (slide) in a presentation.' It distinguishes itself from sibling tools like get_page or get_presentation by focusing on thumbnail URL generation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its usage context (obtaining a thumbnail URL for a slide) but provides no explicit guidance on when to choose this over alternatives or any exclusions. There is no mention of when not to use it or which sibling tool might be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_presentationGet PresentationARead-onlyIdempotent
Get details about a Google Slides presentation.
| Name | Required | Description | Default |
|---|---|---|---|
| presentation_id | Yes | The ID of the presentation to retrieve. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| include_speaker_notes | No | Also report each slide's speaker (presenter) notes and the object ID of the shape holding them. Pass True when you need to read or edit notes: that shape ID is the only valid target for insertText/deleteText on notes, and batch_update_presentation writes notes by deleting the shape's existing text and inserting new text. Defaults to False. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, so the description doesn't need to repeat those. It adds value by explaining that include_speaker_notes reports speaker notes and the shape object ID, and that the shape ID is the only valid target for insertText/deleteText on notes—useful behavioral context beyond annotations. No contradiction found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with zero filler. It states the core purpose efficiently, and all additional necessary detail is delegated to the input schema and annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool, the description is adequate, especially given the presence of an output schema (which explains return values) and rich annotations. It could mention that it returns presentation-level metadata rather than slide contents, but that's an enhancement, not a gap, because the schema and output schema cover the specifics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even without parameter info in the tool description. The description itself doesn't add meaning beyond the schema, but the schema's include_speaker_notes parameter has a rich explanation covering both its purpose and its relation to editing operations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get details') and the resource ('a Google Slides presentation'), which distinguishes it from tools for other Google services. However, it doesn't explicitly differentiate from sibling presentation tools like get_page, which retrieves page-level details, so it's clear but not fully distinguishing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like get_page or batch_update_presentation. The only usage hint is buried in the include_speaker_notes parameter description, which mentions when to pass True and references batch_update_presentation for writing notes, but that's parameter-level guidance, not tool selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_script_contentGet Script ContentBRead-onlyIdempotent
Retrieves content of a specific file within a project.
| Name | Required | Description | Default |
|---|---|---|---|
| file_name | Yes | Name of the file to retrieve | |
| script_id | Yes | The script project ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds no extra behavioral context (e.g., required permissions, return format, or error conditions). Since annotations do the heavy lifting, a score of 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that immediately conveys the tool's purpose. It contains no filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple nature of this read-only tool, the presence of rich annotations, complete schema descriptions, and an output schema, the one-sentence description is largely sufficient. It could be improved by clarifying that 'content' refers to source code within an Apps Script project, but overall it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter having a basic description. The tool description itself does not add any additional meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'retrieves' and identifies the resource as 'content of a specific file within a project,' which clearly outlines the tool's function. However, it does not explicitly differentiate from similar sibling tools like get_script_project or update_script_content, so it is clear but not fully distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions. With many sibling tools for script-related operations, some usage context would be helpful, but it is entirely absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_script_metricsGet Script MetricsARead-onlyIdempotent
Gets execution metrics for a script project.
Returns analytics data including active users, total executions, and failed executions over time.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID | |
| user_google_email | Yes | User's email address | |
| metrics_granularity | No | Granularity of metrics - "DAILY" or "WEEKLY" | DAILY |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, lowering the burden. The description adds useful context about the returned data (active users, executions, failures) and confirms the read-only nature. It does not cover pagination or time range defaults, but these are not critical given the annotations and output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action, and contains no filler or redundancy. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return value documentation is handled. The description provides a high-level overview of metrics types and time dimension, and annotations cover safety. It could mention when to use it relative to similar tools, but for a straightforward read-only metrics tool this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with clear parameter descriptions for script_id, user_google_email, and metrics_granularity. The description does not add parameter-specific guidance, but the schema fully documents the parameters, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Gets execution metrics for a script project' with a specific verb and resource. It distinguishes from sibling script tools like get_script_project or get_script_content by focusing on execution analytics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving script execution metrics over time, but it does not explicitly state when to use this tool versus alternatives or any exclusions. No when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_script_projectGet Script ProjectARead-onlyIdempotent
Retrieves complete project details including all source files.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that it includes 'all source files', which gives some scope context, but it does not disclose additional behavioral traits such as authentication requirements, rate limits, or what 'complete' entails beyond the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with zero redundant words. It immediately states the verb and resource, earning its place without fluff. This is ideal conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations (readOnlyHint, idempotentHint, openWorldHint) and the presence of an output schema, the description is sufficient for a simple getter tool. It communicates the essential scope ('complete project details including all source files') and does not need to explain return values or safety, as those are covered by structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for both parameters with clear descriptions. The tool description does not add any additional meaning beyond the schema's field labels. Baseline 3 is appropriate as the schema carries the semantic burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Retrieves' and the resource 'complete project details including all source files', distinguishing it from sibling tools like list_script_projects (which lists projects) and get_script_content (which focuses on content). The scope is explicit and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of alternatives, use cases, or exclusion criteria. The description merely states what it does without contextualizing when the agent should choose it.
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 InfoARead-onlyIdempotent
Retrieves metadata about a Programmable Search Engine.
| Name | Required | Description | Default |
|---|---|---|---|
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive, covering the safety profile. The description adds that it retrieves 'metadata' (not content), but this is minimal additional context. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the verb and resource. No wasted words, perfectly sized for the tool's simple purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values are documented externally. The description is adequate for a simple metadata retrieval operation. However, it does not mention prerequisites (e.g., need for authorization) or what 'metadata' includes, but these are minor given the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers the single parameter (user_google_email) with full description coverage (100%), so the description adds no parameter-specific meaning. Baseline 3 applies as the schema already documents the parameter adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('retrieves') and resource ('Programmable Search Engine metadata'), clearly stating the tool's function. It doesn't explicitly distinguish it from sibling tools, but the resource is specific enough that confusion is unlikely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving metadata about a search engine but provides no explicit guidance on when to use this versus other tools or any exclusions. It's clear only from the tool name and context, not from explicit instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_spreadsheet_infoGet Spreadsheet InfoARead-onlyIdempotent
Gets information about a specific spreadsheet including its sheets.
| Name | Required | Description | Default |
|---|---|---|---|
| spreadsheet_id | Yes | The ID of the spreadsheet to get info for. Required. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds some behavioral context by noting that the response includes sheets, but it does not disclose additional details like error conditions, permission requirements, or the exact format of returned information beyond what the output schema already provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that immediately states what the tool does and what result to expect. There is no redundancy, filler, or repetition of schema details, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the presence of a rich output schema, and annotations covering safety behavior, the description is largely sufficient. It clearly identifies the tool's purpose and key output characteristic ('including its sheets'). The only minor gap is not elaborating on the format of the spreadsheet_id (e.g., URL vs. raw ID), but this is likely covered elsewhere or by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters (spreadsheet_id and user_google_email) already well-documented in the input schema. The description adds no additional parameter-level meaning, so a baseline score of 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Gets') with a clear resource ('information about a specific spreadsheet') and explicitly scopes the result ('including its sheets'). It distinguishes itself from sibling tools like list_spreadsheets (which lists spreadsheets) and read_sheet_values (which reads cell values), making its function immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys that this is for retrieving metadata about a specific spreadsheet, which implies usage when a spreadsheet_id is known and high-level structure/sheet info is needed. However, it does not explicitly mention when not to use it, nor does it name alternatives such as list_spreadsheets or read_sheet_values for different needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskGet TaskARead-onlyIdempotent
Get details of a specific task.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The ID of the task to retrieve. | |
| task_list_id | Yes | The ID of the task list containing the task. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds no behavioral context beyond what annotations already declare (readOnlyHint, idempotentHint, destructiveHint). It does not mention error behavior, permissions, or response specifics, so it contributes no additional transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with zero filler or redundancy, making it appropriately sized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool, the presence of an output schema, and strong annotations, the one-sentence description is sufficient to convey the core function. It lacks usage nuances but is complete for basic selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers all three parameters with descriptions (100% coverage), so the schema already provides the parameter semantics. The description adds no extra information about the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get details of a specific task' uses a specific verb ('get') and resource ('specific task'), clearly distinguishing it from siblings like list_tasks (multiple tasks) and manage_task (mutations).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance is provided. The usage is only implied by the phrase 'specific task,' leaving the agent to infer that this is for single-task retrieval rather than listing or managing tasks.
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 ListARead-onlyIdempotent
Get details of a specific task list.
| Name | Required | Description | Default |
|---|---|---|---|
| task_list_id | Yes | The ID of the task list to retrieve. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds no additional behavioral context beyond the operation type; it does not mention return format, error cases, or required scopes. Since annotations carry the burden, a score of 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or redundant information. It efficiently communicates the core purpose, making it easy to parse and remember.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (2 required params, no nesting), rich annotations, and presence of an output schema, the description is largely complete. It clearly states the action and target, while the schema and annotations cover the remaining details. Slight deduction for not mentioning relationship to sibling list tools, but this is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of the parameters (user_google_email and task_list_id) with clear descriptions. The tool description adds no extra parameter semantics, but the schema is sufficient. Baseline of 3 is warranted because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'get' with the resource 'task list', clearly indicating a read operation for a single list. It naturally distinguishes itself from sibling tools like 'list_task_lists' (which lists all) and 'get_task' (which retrieves a task within a list), making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives such as 'list_task_lists' or 'get_task'. It does not mention prerequisites, typical scenarios, or situations where another tool would be more appropriate, leaving the agent without sufficient decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_versionGet VersionBRead-onlyIdempotent
Gets details of a specific version.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID | |
| version_number | Yes | The version number to retrieve (1, 2, 3, etc.) | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds no behavioral context beyond what annotations and the output schema imply, such as what 'details' are included or any auth constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no redundant wording. It is front-loaded with the main action and resource, making it highly concise and appropriately sized for a simple read operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple read nature, full schema, output schema, and annotations, the description is minimally sufficient. However, it lacks explicit context that this retrieves an Apps Script version, which could lead to ambiguity even with sibling names present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all three parameters (script_id, version_number, user_google_email) are fully documented in the schema. The description adds no parameter-specific semantics, but the baseline of 3 applies given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Gets' and identifies a resource ('details of a specific version'), which clearly distinguishes it from siblings like list_versions (all versions) and create_version (new version). However, it does not explicitly mention that it retrieves a script version, relying on parameter context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. It does not mention that list_versions should be used for retrieving all versions or that this tool is for a single version, leaving the agent to infer usage from the name and sibling context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_to_google_docImport to Google DocA
Imports a file (Markdown, DOCX, TXT, HTML, RTF, ODT) into Google Docs format with automatic conversion.
Google Drive automatically converts the source file to native Google Docs format, preserving formatting like headings, lists, bold, italic, etc. Binary sources may be passed directly as base64_content. For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | Text content for text-based formats. Use only for short snippets or content already in memory. | |
| file_url | No | Remote URL to fetch the file from (http/https). | |
| file_name | Yes | The name for the new Google Doc (extension will be ignored). | |
| file_path | No | Local file path or file:// URL for any supported format (MD, TXT, HTML, DOCX, ODT, RTF). Appropriate for larger files than content, but file_path may still load the file into memory or perform non-streaming reads. Avoid very large files that could exceed memory or time limits; use streaming/chunked uploads or an alternative API for huge files. | |
| folder_id | No | The ID of the parent folder. Defaults to 'root'. | root |
| base64_sha256 | No | Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks. | |
| source_format | No | Source format hint ('md', 'markdown', 'docx', 'txt', 'html', 'rtf', 'odt'). Auto-detected from file_name extension if not provided. | |
| base64_content | No | Standard base64-encoded bytes for a binary source such as DOCX or ODT. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations by explaining that Google Drive automatically converts the file, preserves formatting, and that binary sources can be passed as base64_content. It also discloses that file_path can still load files into memory, which is useful performance-related behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core action, and every sentence serves a purpose. It avoids restating the parameter schema and keeps additional guidance brief.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description, combined with 100% schema description coverage and an output schema, provides enough information to select and invoke the tool correctly. It covers supported formats, conversion behavior, input modes, and practical guidance for larger files.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds extra value by advising when to prefer file_path for batch operations and by clarifying that binary sources may use base64_content, going beyond what the schema fields already state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Imports'), a clear target resource ('Google Docs format'), and enumerates the supported source formats. It differentiates from sibling import tools (import_to_google_slides, import_to_google_sheets) by making the destination format explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use file_path versus content/base64_content, especially for batch operations, telling callers to avoid loading full file contents into context. It does not explicitly contrast against sibling tools, but the intended use case is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_to_google_sheetsImport to Google SheetsA
Imports a spreadsheet (XLSX, XLS, ODS, CSV, TSV) into Google Sheets format with automatic conversion.
Google Drive automatically converts the source spreadsheet to native Google Sheets format, preserving rows, columns, sheets, and values. Binary sources may be passed directly as base64_content. For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | Text content for text-based formats (CSV, TSV). Use only for short snippets or content already in memory. | |
| file_url | No | Remote URL to fetch the spreadsheet from (http/https). | |
| file_name | Yes | The name for the new Google Sheets spreadsheet (extension will be ignored). | |
| file_path | No | Local file path or file:// URL for any supported format (XLSX, XLS, ODS, CSV, TSV). Appropriate for larger files than content, but file_path may still load the file into memory or perform non-streaming reads. Avoid very large files that could exceed memory or time limits; use streaming/chunked uploads or an alternative API for huge files. | |
| folder_id | No | The ID of the parent folder. Defaults to 'root'. | root |
| base64_sha256 | No | Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks. | |
| source_format | No | Source format hint ('xlsx', 'xls', 'ods', 'csv', 'tsv'). Auto-detected from file_name extension if not provided. | |
| base64_content | No | Standard base64-encoded bytes for an XLSX, XLS, or ODS source. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (mutating, non-destructive, non-idempotent, open-world); the description adds real behavioral context — 'Google Drive automatically converts the source spreadsheet to native Google Sheets format, preserving rows, columns, sheets, and values.' It stops short of covering auth prerequisites or failure modes, but there is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: purpose, conversion behavior, and delivery-channel guidance. The most important information (what it imports and where) is front-loaded, with no redundancy against the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with full schema coverage, an output schema, and annotations, the description covers purpose, behavior, and selection guidance in compact form. It could add one sentence on auth expectations (user_google_email is required) or where the resulting spreadsheet lands (folder_id defaults to 'root'), but those are already documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description pushes above it by explaining when to prefer file_path over base64_content/content and by framing base64_content as the channel for binary sources. The remaining parameters (folder_id, source_format, base64_sha256) are left to the already-detailed schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Imports a spreadsheet (XLSX, XLS, ODS, CSV, TSV) into Google Sheets format with automatic conversion.' The enumerated formats and explicit destination make it immediately distinguishable from the import_to_google_doc and import_to_google_slides siblings by target format.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides actionable delivery-channel guidance: 'Binary sources may be passed directly as base64_content' and 'For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.' It does not, however, say when to choose this over near-siblings (create_spreadsheet, import_to_google_doc, import_to_google_slides) or state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_to_google_slidesImport to Google SlidesA
Imports a presentation (PPTX, PPT, ODP) into Google Slides format with automatic conversion.
Google Drive automatically converts the source presentation to native Google Slides format, preserving slides, layouts, text, and images. Binary sources may be passed directly as base64_content. For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.
| Name | Required | Description | Default |
|---|---|---|---|
| file_url | No | Remote URL to fetch the presentation from (http/https). | |
| file_name | Yes | The name for the new Google Slides presentation (extension will be ignored). | |
| file_path | No | Local file path or file:// URL for any supported format (PPTX, PPT, ODP). Appropriate for larger files than content, but file_path may still load the file into memory or perform non-streaming reads. Avoid very large files that could exceed memory or time limits; use streaming/chunked uploads or an alternative API for huge files. | |
| folder_id | No | The ID of the parent folder. Defaults to 'root'. | root |
| base64_sha256 | No | Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks. | |
| source_format | No | Source format hint ('pptx', 'ppt', 'odp'). Auto-detected from file_name extension if not provided. | |
| base64_content | No | Standard base64-encoded bytes for a PPTX or ODP source. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses automatic Google Drive conversion, preservation of slides/layouts/text/images, and the important caveat that file_path may still load the file into memory or perform non-streaming reads, with advice to avoid very large files. This adds substantial behavioral context beyond the sparse annotations and contains no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three focused sentences: purpose first, then conversion behavior, then input-method guidance. Every sentence earns its place, and there is no redundant or vague wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter import tool, the description plus schema and output schema cover supported formats, conversion behavior, input methods, destination folder default, and performance/memory caveats. The description does not need to enumerate every parameter because the schema already does so comprehensively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds useful semantics for choosing between base64_content and file_path, especially for batch operations and avoiding context bloat. It does not need to repeat the schema's detailed parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Imports a presentation (PPTX, PPT, ODP) into Google Slides format with automatic conversion.' It names supported source formats and the destination format, which clearly distinguishes it from siblings like import_to_google_doc and import_to_google_sheets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical guidance: binary sources may use base64_content, and batch operations should prefer file_path to avoid loading full contents into context. However, it does not explicitly compare this tool to alternatives such as create_presentation or other import tools, so when-not-to-use guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_doc_elementsInsert Doc ElementsB
Inserts structural elements like tables, lists, or page breaks into a Google Doc.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Number of rows for table (required for table) | |
| text | No | Initial text content for list items | |
| index | Yes | Position to insert element (0-based) | |
| columns | No | Number of columns for table (required for table) | |
| list_type | No | Type of list ("UNORDERED", "ORDERED") (required for list) | |
| document_id | Yes | ID of the document to update | |
| element_type | Yes | Type of element to insert ("table", "list", "page_break") | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutation (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds no behavioral context beyond that, such as how insertion affects existing content, positional indexing behavior, or any side effects. It does not contradict the annotations, but fails to enrich them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with zero wasted words. It immediately states the action, target, and examples, making it easy to scan and understand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a fully described schema, annotations, and an output schema, the one-sentence description is largely sufficient. However, the tool has 8 parameters with conditional dependencies, and while the schema covers these, a bit more contextual guidance (e.g., 'required parameters depend on element_type') would help. Still, the structured data compensates well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, describing each parameter including conditional requirements (e.g., rows/columns for table, list_type for list). The description only names example element types and does not add meaning beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Inserts') and resource ('structural elements like tables, lists, or page breaks into a Google Doc'), clearly distinguishing it from sibling tools like insert_doc_image (images) and modify_doc_text (text). It precisely communicates the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as batch_update_doc, create_table_with_data, or insert_doc_image. There is no mention of prerequisites, exclusions, or scenarios where another tool would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_doc_imageInsert Doc ImageA
Inserts an image into a Google Doc from Drive or a URL.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | Position to insert image (0-based) | |
| width | No | Image width in points (optional) | |
| height | No | Image height in points (optional) | |
| document_id | Yes | ID of the document to update | |
| image_source | Yes | Drive file ID or public image URL | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, establishing a safe mutation profile. The description adds context about supported source types (Drive/URL) but does not disclose other behavioral details such as effects on existing content or permission requirements. With annotations present, the bar is lower, so this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant words. It clearly states the action and source in minimal space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema and annotations, the description covers the essential context adequately. It clearly states the core operation, and the schema handles parameter details, while annotations handle safety. Minor additional context (e.g., prerequisites or error scenarios) would have pushed it higher, but the tool is well-specified already.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% parameter description coverage, so the schema already documents each parameter and its purpose. The description's mention of 'from Drive or a URL' loosely corresponds to the image_source parameter but adds no additional semantic detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Inserts') with a specific resource ('image into a Google Doc') and specifies the source ('from Drive or a URL'). This clearly distinguishes it from broader sibling tools like insert_doc_elements, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the primary use case (inserting an image into a Google Doc) but does not explicitly state when to use this tool over alternatives or any exclusions. With many sibling tools like insert_doc_elements, explicit guidance would have been helpful, but the specificity of the action makes the intended context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_doc_structureInspect Doc StructureARead-onlyIdempotent
Essential tool for finding safe insertion points and understanding document structure.
USE THIS FOR:
Finding the correct index for table insertion
Understanding document layout before making changes
Locating existing tables and their positions
Getting document statistics and complexity info
Inspecting structure of specific tabs
CRITICAL FOR TABLE OPERATIONS: ALWAYS call this BEFORE creating tables to get a safe insertion index.
WHAT THE OUTPUT SHOWS:
total_elements: Number of document elements
total_length: Maximum safe index for insertion
tables: Number of existing tables
table_details: Position and dimensions of each table
headers / footers: Real segment IDs and previews for header/footer editing
tabs: List of available tabs in the document (if no tab_id specified)
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional ID of the tab to inspect. If not provided, inspects main document. | |
| detailed | No | Whether to return detailed structure information | |
| document_id | Yes | ID of the document to inspect | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint and non-destructive, but the description adds substantial behavioral context: total_length is the maximum safe insertion index, headers/footers return real segment IDs, and detailed output includes exact start/end indices. It also warns 'Do not invent IDs,' which is valuable operational guidance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear headings and front-loaded purpose. Every section (USE THIS FOR, OUTPUT SHOWS, workflows) provides operational value, though the step-by-step workflow details make it more verbose than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is thorough: it explains safe insertion indices, output fields, detailed mode, tab behavior, and integration with batch_update_doc and update_doc_headers_footers. Since an output schema exists, it does not need to enumerate return values, making it complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaning for `detailed` by explaining it returns exact start_index/end_index per paragraph for formatting workflows, and for `tab_id` by noting it lists tabs when omitted. Other parameters are self-explanatory and already covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Essential tool for finding safe insertion points and understanding document structure,' a specific verb+resource+scope statement. It clearly enumerates use cases like locating tables, inspecting tabs, and getting document statistics, which distinguishes it from sibling doc mutation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit 'USE THIS FOR' list and a 'CRITICAL FOR TABLE OPERATIONS' warning to always call before creating tables. It also gives step-by-step workflows for table insertion, formatting, and header/footer editing, and explicitly says to use `update_doc_headers_footers` for ordinary header/footer text instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_calendarsList CalendarsARead-onlyIdempotent
Retrieves a list of calendars accessible to the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the description does not need to repeat those. It adds the scope 'accessible to the authenticated user', which is useful context, but does not disclose additional behaviors like pagination 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that is front-loaded with the action and resource. Every word adds value, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one parameter, complete annotations, and an output schema, the description is sufficiently complete. It does not need to explain return values because the output schema handles that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of the parameters, including a description for user_google_email. The tool description adds no parameter-specific meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves a list of calendars accessible to the authenticated user. It uses a specific verb ('retrieves') and resource ('list of calendars'), and distinguishes it from sibling tools like create_calendar or get_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a list of calendars is needed but does not explicitly mention when to use this tool over alternatives or any exclusions. There is no guidance about prerequisites or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contact_groupsList Contact GroupsARead-onlyIdempotent
List contact groups (labels) for the user.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Maximum number of groups to return (default: 100, max: 1000). | |
| page_token | No | Token for pagination. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds minimal context by clarifying the scope ('for the user') and the terminology ('labels'). It does not disclose pagination behavior or other operational details, but the annotations cover the safety profile adequately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant words. It states the action, resource, and scope efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the presence of a rich output schema, and strong annotations, the description is adequate. It could mention pagination or the required user_google_email, but those are already covered by the schema, so the description remains sufficient without being verbose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter described in the input schema. The description adds no parameter-specific meaning, so it does not compensate beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('contact groups'), with an explicit alias ('labels') and scope ('for the user'). This clearly distinguishes it from sibling tools like get_contact_group and manage_contact_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as get_contact_group or list_contacts. The description only implies usage through its name and does not mention exclusions or alternative scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contactsList ContactsBRead-onlyIdempotent
List contacts for the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Maximum number of contacts to return (default: 100, max: 1000). | |
| page_token | No | Token for pagination. | |
| sort_order | No | Sort order: "LAST_MODIFIED_ASCENDING", "LAST_MODIFIED_DESCENDING", "FIRST_NAME_ASCENDING", or "LAST_NAME_ASCENDING". | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior. The description adds the scope constraint 'for the authenticated user,' which is useful context beyond the annotations. However, it does not disclose pagination behavior, default ordering, or what fields are returned, so it provides limited additional behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no filler or redundancy. It is appropriately sized for a simple list operation and front-loads the key action and scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the strong annotations, complete parameter descriptions, and presence of an output schema, the description is mostly sufficient for a straightforward read-only list. It clearly states the resource and user scope, though it lacks alternative-tool guidance, which is covered under usage guidelines rather than completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters, including defaults and token semantics. The description does not add extra meaning beyond the schema, resulting in the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List contacts for the authenticated user.' This clearly conveys the tool's function. However, it does not explicitly differentiate from sibling tools like search_contacts or get_contact, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives such as search_contacts or get_contact. The description only states what it does, leaving the agent to infer usage context without explicit exclusions or recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_deploymentsList DeploymentsARead-onlyIdempotent
Lists all deployments for a script project, including the bound version number of each deployment so callers can verify which version is served.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive, idempotent nature of the operation. The description adds useful behavioral context beyond the annotations by stating that each deployment exposes its bound version number and that this enables verification of which version is served.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the primary action and resource, then adds the most important distinguishing behavior. Every phrase earns its place and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list operation with two fully described parameters, strong annotations, and an output schema, the description is complete. It tells the agent what the tool does, what extra information it provides, and why that information matters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the input schema. The description does not add parameter-level detail, but it also does not need to because the schema fully covers them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Lists') and resource ('all deployments for a script project'), and explains the key distinguishing detail that each deployment includes its bound version number. This makes it easy to tell apart from sibling tools like manage_deployment or list_versions without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: to list deployments and verify which version is served. It does not explicitly name alternatives or state when not to use it, but the purpose is specific enough that an agent can infer the appropriate scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_docs_in_folderList Docs in FolderARead-onlyIdempotent
Lists Google Docs within a specific Drive folder.
Returns: str: A formatted list of Google Docs in the specified folder.
| Name | Required | Description | Default |
|---|---|---|---|
| folder_id | No | root | |
| page_size | No | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds that it returns a formatted list and scopes to a specific folder, providing some context beyond annotations, but doesn't discuss pagination, error handling, or that it only returns Google Docs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, no fluff. The return type is noted compactly without unnecessary elaboration, making it highly scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with safety annotations and a default-everything schema, the description covers the core purpose and return shape. It lacks parameter semantics and usage contrast, but these are scored separately; overall it's adequately complete for its low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain any of the three parameters. The phrase 'specific Drive folder' hints at folder_id but provides no detail on defaults, required user_google_email, or page_size, leaving the agent without critical parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Lists' with resource 'Google Docs' and scoping phrase 'within a specific Drive folder', clearly distinguishing it from related tools like list_drive_items and search_drive_files. The title and description align perfectly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this vs alternatives is provided. The description implies usage for listing docs in a folder but doesn't mention exclusions or alternative tools such as search_drive_files, leaving the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_document_commentsList Document CommentsARead-onlyIdempotent
List all comments from a Google Document (optional max_comments to limit results).
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes | ||
| max_comments | No | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the description only adds the max_comments limiting behavior. It does not disclose any other behavioral traits such as pagination, sorting, or whether resolved comments are included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the primary purpose (list all comments) and includes the optional parameter. Every word earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a simple tool, annotations, and an output schema, the description is minimally complete but lacks details like whether comments include resolved ones, pagination behavior, or any filtering. It does not fully leverage the context, leaving some ambiguity about the return set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains max_comments as a limit on results, but does not clarify document_id or user_google_email, although their names are somewhat self-explanatory. The description adds limited value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all comments from a Google Document, specifying the resource (Google Document) and the action (list). This distinguishes it from sibling tools like list_spreadsheet_comments and manage_document_comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating the tool lists comments and mentions an optional limit using max_comments, but it does not explicitly state when to use this tool versus alternatives or any exclusion criteria. No alternatives are referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_drive_itemsList Drive ItemsARead-onlyIdempotent
Lists files/folders or shared drive containers, supporting shared drives.
If drive_id is specified, lists items within that shared drive. folder_id is then relative to that drive (or use drive_id as folder_id for root).
If drive_id is not specified, lists items from user's "My Drive" and accessible shared drives (if include_items_from_all_drives is True).
Set resource_type to "shared_drives" to list shared drive containers instead of folder contents.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Shared drive query used only when resource_type="shared_drives", e.g. "name contains 'Engineering'". | |
| corpora | No | Corpus to query ('user', 'drive', 'allDrives'). If `drive_id` is set and `corpora` is None, 'drive' is used. If None and no `drive_id`, API defaults apply. | |
| detailed | No | Whether to include size, modified time, and link in results. Defaults to True. | |
| drive_id | No | ID of the shared drive. If provided, the listing is scoped to this drive. | |
| order_by | No | Sort order. Comma-separated list of sort keys with optional 'desc' modifier. Valid keys: 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', 'viewedByMeTime'. Example: 'modifiedTime desc' or 'folder,modifiedTime desc,name'. Defaults to None (Drive API default ordering). | |
| file_type | No | Restrict results to a specific file type. Accepts a friendly name ('folder', 'document'/'doc', 'spreadsheet'/'sheet', 'presentation'/'slides', 'form', 'drawing', 'pdf', 'shortcut', 'script', 'site', 'jam'/'jamboard') or any raw MIME type string (e.g. 'application/pdf'). Defaults to None (all types). | |
| folder_id | No | The ID of the Google Drive folder. Defaults to 'root'. For a shared drive, this can be the shared drive's ID to list its root, or a folder ID within that shared drive. | root |
| page_size | No | The maximum number of items to return. Defaults to 100. | |
| page_token | No | Page token from a previous response's nextPageToken to retrieve the next page of results. | |
| resource_type | No | What to list. Use "items" for folder contents or "shared_drives" for shared drive containers. Defaults to "items". | items |
| user_google_email | Yes | The user's Google email address. Required. | |
| include_organizers | No | When resource_type="shared_drives", include principals with the organizer role. This costs one extra permissions.list API call per shared drive returned. Defaults to False. | |
| include_items_from_all_drives | No | Whether items from all accessible shared drives should be included if `drive_id` is not set. Defaults to True. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable scoping behavior (how drive_id and resource_type alter the listing scope) and notes the include_items_from_all_drives condition, going beyond the annotation signals. It does not disclose pagination or rate-limit behavior, but for a straightforward list tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences with no filler. The first sentence states the core purpose, and the remaining sentences concisely explain the key decision branches. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the comprehensive input schema, presence of an output schema, and clear annotations, the description covers the main behavioral branches of this listing tool. It could mention how it differs from search_drive_files or discuss edge cases like pagination, but it is complete enough for an agent to understand scope and core usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema already documents all 13 parameters. The description adds semantic value by explaining the relationship between drive_id, folder_id, and resource_type, and by clarifying when include_items_from_all_drives applies—context that is not evident from the individual parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Lists files/folders or shared drive containers', providing a specific verb and resource. The conditional logic for drive_id and resource_type clarifies distinct listing modes, making it clearly distinct from sibling tools like search_drive_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool based on whether drive_id is provided or resource_type is set to 'shared_drives'. However, it does not explicitly contrast with alternatives like search_drive_files or get_drive_file_content, so it lacks explicit when-not guidance.
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 ResponsesARead-onlyIdempotent
List a form's responses.
| Name | Required | Description | Default |
|---|---|---|---|
| form_id | Yes | The ID of the form. | |
| page_size | No | Maximum number of responses to return. Defaults to 10. | |
| page_token | No | Token for retrieving next page of results. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds no additional behavioral context such as pagination behavior or return format, but these are inferable from the schema and output schema. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is front-loaded and contains zero wasted words. It efficiently states the core function without unnecessary detail, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, rich schema (100% parameter coverage), output schema, and comprehensive annotations, the one-sentence description is adequate. It does not need to explain return values (output schema covers that) or pagination (schema covers that). The description is complete for its purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add any parameter semantics beyond what the schema already provides; it only states the general purpose without elaborating on parameter usage or syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (List) and the resource (a form's responses), making the purpose explicit. It does not differentiate from the sibling tool get_form_response, which likely retrieves a single response, so it lacks explicit sibling differentiation. Verb+resource+scope is clear, but the scope is generic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like get_form_response, and does not mention pagination or when to use page_token. It simply states the function without any contextual usage hints or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gmail_filtersList Gmail FiltersARead-onlyIdempotent
Lists all Gmail filters configured in the user's mailbox.
| Name | Required | Description | Default |
|---|---|---|---|
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false, fully covering the safety profile. The description adds no additional behavioral context such as pagination, rate limits, or auth requirements, so it provides no extra value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no wasted words. It directly states the purpose without redundancy, making it appropriately sized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter, complete schema, strong annotations, and an output schema present. The description adequately states what it does, though it lacks additional context like scope limitations (e.g., delegated accounts) or data freshness. It is nearly complete for this straightforward list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% as the sole parameter `user_google_email` has a clear description ('The user's Google email address. Required.'). The tool description does not add any parameter-specific meaning, so it sits at the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Lists' with a clear resource 'all Gmail filters' and scope 'in the user's mailbox'. This clearly distinguishes it from sibling tools like manage_gmail_filter (which mutates filters) and list_gmail_labels (different resource).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus alternatives. It implies its use for listing filters but does not mention that it is the read-only counterpart to manage_gmail_filter or provide any exclusions. Usage is implied, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gmail_labelsList Gmail LabelsCRead-onlyIdempotent
Lists labels in the user's Gmail account.
| Name | Required | Description | Default |
|---|---|---|---|
| prefix | No | Return only labels whose name starts with this exact (case-sensitive) string. users.labels.list accepts no filter, so the full list is fetched and narrowed here: this shrinks what the caller receives, not the API call. | |
| compact | No | Return minimal JSON {"count", "labels": [{"id", "name"}]} sorted by name, instead of the formatted text list. For callers that parse the result, e.g. a label cache refresh. | |
| include_system | No | Include Gmail system labels (INBOX, SENT, ...). Set False to return user labels only. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already carry the safety profile (readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false), but the description itself adds zero behavioral context beyond restating the tool's name. It discloses no auth requirements, no account-scope nuances, and no output characteristics; notably, the schema's prefix parameter description ('the full list is fetched and narrowed here') does more behavioral disclosure than the tool description itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero filler and the core action front-loaded. It is appropriately sized for a simple read tool. It doesn't earn a 5 because the brevity comes at the cost of omitting usage guidance that similar tools include as a second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 100% schema coverage, detailed parameter descriptions, a present output schema, and four safety annotations, an agent can technically invoke and parse the result correctly. The description is adequate but complete only in a minimal sense: it fails to help an agent disambiguate between list_gmail_labels and list_gmail_filters, and it never states that this tool is the read-side counterpart to manage_gmail_label.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline of 3 applies. The tool description mentions no parameters, but each of the four parameters carries a rich description in the schema, including prefix case-sensitivity and the fetch-then-narrow behavior, the compact JSON response shape, and the include_system toggle. The schema does the heavy lifting here, and the description adds nothing beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Lists labels in the user's Gmail account' uses a specific verb (Lists) and a clear resource (labels in the user's Gmail account). It is precise about what is being listed and does not confuse the operation with mutation tools like manage_gmail_label. However, it does not explicitly differentiate from the closely related sibling list_gmail_filters, leaving the agent to infer the labels-vs-filters distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives. With siblings like list_gmail_filters, manage_gmail_label, and modify_gmail_message_labels, an agent receives no basis for choosing between listing labels, listing filters, or managing labels, so the when-to-use decision is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_presentation_commentsList Presentation CommentsARead-onlyIdempotent
List all comments from a Google Presentation (optional max_comments to limit results).
| Name | Required | Description | Default |
|---|---|---|---|
| max_comments | No | ||
| presentation_id | Yes | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds context about the optional max_comments limit, which clarifies that all comments are returned unless a limit is set. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that states the verb, object, and a conditional modifier. No irrelevant detail or repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a read-only, idempotent annotation set and an output schema present, the description is adequate for a simple list operation. It covers the core behavior and the optional parameter, though it doesn't discuss pagination or auth prerequisites (already implied by user_google_email and annotations).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies max_comments as a limit, but presentation_id and user_google_email are only explained by their names and the tool's context. The description adds some meaning but not enough to fully cover the required parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' plus a clear resource 'all comments from a Google Presentation'. It distinguishes from sibling tools like list_document_comments and manage_presentation_comment by specifying the presentation scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates the tool is for reading comments from a presentation, but it does not explicitly contrast with related tools such as manage_presentation_comment or list_document_comments. The context is clear, but no direct exclusions or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_script_processesList Script ProcessesARead-onlyIdempotent
Lists recent execution processes for user's scripts.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Number of results (default: 50) | |
| script_id | No | Optional filter by script ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the 'recent' scope and 'user's scripts' context, which is useful, but it doesn't disclose behavioral details like pagination behavior, ordering, or filtering beyond what the schema specifies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that is front-loaded with the key verb 'Lists' and includes all essential information without redundancy. It wastes no words and is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward listing tool, the description is sufficiently complete given the presence of an output schema and comprehensive annotations. It doesn't explain what 'execution processes' mean in detail, but that is likely domain-standard. The only minor gap is that 'recent' is not precisely defined, but this is not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes all three parameters (page_size, script_id, user_google_email) with their types and defaults, achieving 100% schema description coverage. The description adds no parameter-level information, so it does not enhance what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Lists' with a clear resource 'recent execution processes for user's scripts', making the tool's purpose unambiguous. It distinguishes itself from sibling tools like list_script_projects and list_versions by focusing on execution processes rather than projects or versions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is for retrieving execution history, which provides context. However, it does not explicitly mention when to use it versus alternatives like get_script_metrics or list_script_projects, nor does it state any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_script_projectsList Script ProjectsARead-onlyIdempotent
Lists Google Apps Script projects accessible to the user.
Uses Drive API to find Apps Script files.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Number of results per page (default: 50) | |
| page_token | No | Token for pagination (optional) | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the context that it uses the Drive API to find Apps Script files, which is a useful implementation detail. However, it does not disclose pagination behavior or whether it returns only projects the user owns or all accessible projects. With annotations carrying the safety burden, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, containing only two short sentences. The first sentence front-loads the core purpose ('Lists Google Apps Script projects accessible to the user'), and the second adds relevant implementation context ('Uses Drive API to find Apps Script files'). Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple: a list operation with well-specified schema and annotations. The description confirms the scope (accessible to the user) and the underlying method (Drive API). The presence of an output schema means return values need not be described. The only minor gap is not mentioning that this may only return projects with Drive visibility, but that is covered by 'accessible to the user.' Overall, it is complete enough for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add any additional meaning to the parameters (page_size, page_token, user_google_email) beyond what the schema already provides. It does not clarify how page_size interacts with results or what page_token refers to. The schema fully documents parameter names and defaults, so no deduction is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Lists Google Apps Script projects accessible to the user.' This is a specific verb+resource combination that distinguishes it from sibling tools like get_script_project (which fetches a single project) and list_deployments (which lists deployments). The mention of 'Drive API' further clarifies the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need to enumerate all Apps Script projects visible to the user, but it does not explicitly name alternatives or exclusions. For example, it does not say 'For a specific project, use get_script_project' or 'For scripts that are running, use list_script_processes.' This is implied usage rather than explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sheet_tablesList Sheet TablesARead-onlyIdempotent
Lists all structured tables in a spreadsheet with their IDs, names, ranges, and column details. Use this to find table IDs for append_table_rows.
| Name | Required | Description | Default |
|---|---|---|---|
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is clear. The description adds behavioral detail by specifying what is returned (IDs, names, ranges, column details) and that it lists all structured tables, which goes beyond the annotations. This is helpful context for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences total, front-loaded with the main action in the first sentence. Every word adds value: the first specifies the resource and output, the second gives the use case. No waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists (though not shown), the description appropriately summarizes the return values (IDs, names, etc.) at a high level. It also mentions the downstream use case, and annotations cover safety. This is complete for a simple read-only listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides full descriptions for both parameters (spreadsheet_id and user_google_email) with 100% coverage. The description does not add further parameter details, but none are needed because the schema is sufficient. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all structured tables in a spreadsheet, specifying the resource (tables) and the action (lists). It also distinguishes from sibling tools by noting it provides table IDs for append_table_rows, which is a sibling tool. This makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly suggests using this tool to find table IDs for append_table_rows, giving a concrete use case. It doesn't explicitly mention when not to use it, but the context is clear enough for an agent to select it for table discovery. It doesn't reference alternative tools, but the named downstream use is sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_spacesList SpacesBRead-onlyIdempotent
Lists Google Chat spaces (rooms and direct messages) accessible to the user.
Returns: str: A formatted list of Google Chat spaces accessible to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | ||
| space_type | No | all | |
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context about the scope ('accessible to the user') and the return type (a formatted string). However, it does not explain behavior around pagination, space_type filtering, or what happens if the user email is invalid/unauthorized.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very brief and front-loaded, stating the core purpose in the first sentence. The 'Returns' line is somewhat redundant given the output schema, but it is acceptable. No unnecessary fluff, though it could be more informative within the same length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 parameters and no parameter descriptions, the description is incomplete. It does not explain the use of page_size or space_type, nor does it provide usage context. Although it is a simple list operation, the lack of parameter semantics and usage guidance makes it insufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not mention any of the three parameters (user_google_email, page_size, space_type). It fails to explain the meaning or purpose of these inputs, leaving the agent to guess. This is a significant gap because the description does not compensate for the missing parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Lists') and resource ('Google Chat spaces'), and clarifies the scope ('accessible to the user'). It also distinguishes between rooms and direct messages, which helps differentiate it from other list_* tools for different Google services.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention any prerequisites, typical use cases, or why you might need to list spaces (e.g., before sending a message). There is no mention of excluded scenarios or similar tools.
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 CommentsARead-onlyIdempotent
List all comments from a Google Spreadsheet (optional max_comments to limit results).
| Name | Required | Description | Default |
|---|---|---|---|
| max_comments | No | ||
| spreadsheet_id | Yes | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool safe (readOnlyHint, idempotentHint, non-destructive), so the description's burden is lighter. It adds the optional max_comments limiting behavior, but does not disclose return format or any other behavioral traits. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with front-loaded purpose and a brief optional parameter note. No filler or unnecessary detail, perfectly sized for a simple list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, strong annotations, and existence of an output schema, the description is largely complete. It states the action, the resource, and the optional limit. It lacks usage guidance, but that is already penalized in the usage_guidelines dimension.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies that max_comments limits results, but leaves spreadsheet_id and user_google_email unaddressed. While these are somewhat self-explanatory from names, the description only partially covers parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'list' with a clear resource 'comments from a Google Spreadsheet', distinguishing it from sibling tools like manage_spreadsheet_comment (manage vs list) and list_document_comments/list_presentation_comments (different resources).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, no exclusions, and no prerequisites. It simply states what it does without contextualizing its place among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_spreadsheetsList SpreadsheetsARead-onlyIdempotent
Lists spreadsheets from Google Drive that the user has access to.
| Name | Required | Description | Default |
|---|---|---|---|
| max_results | No | Maximum number of spreadsheets to return. Defaults to 25. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds a scoping constraint ('user has access to'), which is useful context. However, it does not elaborate on pagination or output behavior beyond what the schema provides, so the added behavioral insight 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundancy. It efficiently conveys the essential information without any filler or extraneous details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing operation with complete schema coverage, annotations, and an output schema, the description sufficiently covers the core functionality. However, the absence of any mention of related tools or potential limitations makes it not fully complete in the broader context of many similar Drive-related tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, meaning both parameters (max_results, user_google_email) already have descriptions in the schema. The tool description does not add any additional semantics or usage details for the parameters, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('lists') and clearly identifies the resource ('spreadsheets from Google Drive') and scope ('that the user has access to'). This differentiates it from sibling tools like get_spreadsheet_info or read_sheet_values which target specific spreadsheets or data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like list_drive_items or search_drive_files. There are no exclusions or explicit mentions of suitable contexts, leaving the agent without decision support for tool selection.
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 ListsARead-onlyIdempotent
List all task lists for the user.
| Name | Required | Description | Default |
|---|---|---|---|
| page_token | No | Token for pagination. | |
| max_results | No | Maximum number of task lists to return (default: 1000, max: 1000). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no extra behavioral context, such as pagination behavior or that 'all' may be subject to max_results limits, which could mislead.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that communicates the core purpose without redundancy. Every word earns its place, and there is no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description is mostly complete for a simple list operation. However, the word 'all' could conflict with max_results/pagination, so a brief mention of pagination would have made it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with all three parameters described in the input schema. The description does not add meaning beyond the schema, but the schema already explains page_token, max_results, and user_google_email. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('all task lists'), clearly distinguishing it from sibling tools like get_task_list (singular) and list_tasks (tasks within a list). The scope is explicitly 'for the user', making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when you need to enumerate all task lists for a user, but it does not explicitly state when to prefer this over alternatives like get_task_list or manage_task_list. There are no exclusions or alternative references, so usage guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksList TasksARead-onlyIdempotent
List all tasks in a specific task list.
| Name | Required | Description | Default |
|---|---|---|---|
| due_max | No | Upper bound for due date (RFC 3339 timestamp). | |
| due_min | No | Lower bound for due date (RFC 3339 timestamp). | |
| page_token | No | Token for pagination. | |
| max_results | No | Maximum number of tasks to return. (default: 20, max: 10000). | |
| show_hidden | No | Whether to include hidden tasks (default: False). | |
| updated_min | No | Lower bound for last modification time (RFC 3339 timestamp). | |
| show_deleted | No | Whether to include deleted tasks (default: False). | |
| task_list_id | Yes | The ID of the task list to retrieve tasks from. | |
| completed_max | No | Upper bound for completion date (RFC 3339 timestamp). | |
| completed_min | No | Lower bound for completion date (RFC 3339 timestamp). | |
| show_assigned | No | Whether to include assigned tasks (default: False). | |
| show_completed | No | Whether to include completed tasks (default: True). Note that show_hidden must also be true to show tasks completed in first party clients, such as the web UI and Google's mobile apps. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds no behavioral context beyond the core action, such as pagination or default filtering, though the schema provides extensive details. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 9 words, front-loaded with the action and resource. Every word is useful, with no unnecessary elaboration or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for tool selection given the rich schema and output schema. It does not summarize the filtering parameters, but the schema fully compensates for that. It is slightly less complete than a description that explicitly mentions filtering capabilities, but still sufficient for a list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for all 13 parameters, so the description adds no additional parameter meaning. The baseline of 3 applies because the schema fully documents each parameter's purpose and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' with resource 'tasks' and scoping 'in a specific task list'. This clearly distinguishes it from sibling tools like get_task (single task) and list_task_lists (task lists).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as get_task or list_task_lists. It only states the basic action, leaving the selection entirely to the agent without explicit context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_versionsList VersionsARead-onlyIdempotent
Lists all versions of a script project.
Versions are immutable snapshots of your script code. They are created when you deploy or explicitly create a version.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | The script project ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds useful context by explaining that versions are immutable snapshots, which informs the agent about the nature of the data. This goes beyond the structured annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two sentences that front-load the main purpose and then provide a brief, relevant clarification about version immutability. Every sentence earns its place, with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool, the description is sufficiently complete: the input schema fully documents parameters, annotations cover the safety profile, an output schema exists, and the description provides essential conceptual context about what versions are. No significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both required parameters (script_id and user_google_email), so the schema already provides complete parameter documentation. The description does not add additional meaning or usage details for the parameters, making the baseline score of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Lists all versions of a script project.' The verb ('lists') and resource ('versions of a script project') are specific, and the clarification that versions are immutable snapshots distinguishes this tool from get_version and create_version siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool by explaining that versions are created on deployment or explicit creation, suggesting it is used to inspect the history of a script. However, it does not explicitly state when to use this tool over alternatives like get_version or list_deployments, nor does it mention exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_conditional_formattingManage Conditional FormattingADestructive
Manages conditional formatting rules on a Google Sheet. Supports adding, updating, and deleting conditional formatting rules via a single tool.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The operation to perform. Must be one of "add", "update", or "delete". | |
| range_name | No | A1-style range (optionally with sheet name). Required for "add". Optional for "update" (preserves existing ranges if omitted). Not used for "delete". | |
| rule_index | No | 0-based index of the rule. For "add", optionally specifies insertion position. Required for "update" and "delete". | |
| sheet_name | No | Sheet name to locate the rule when range_name is omitted. Defaults to the first sheet. Used by "update" and "delete". | |
| text_color | No | Hex text color to apply when condition matches. Used by "add" and "update". | |
| condition_type | No | Sheets condition type (e.g., NUMBER_GREATER, TEXT_CONTAINS, DATE_BEFORE, CUSTOM_FORMULA). Required for "add". Optional for "update" (preserves existing type if omitted). | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| gradient_points | No | List (or JSON list) of gradient points for a color scale. If provided, a gradient rule is created and boolean parameters are ignored. Used by "add" and "update". | |
| background_color | No | Hex background color to apply when condition matches. Used by "add" and "update". | |
| condition_values | No | Values for the condition; accepts a list or a JSON string representing a list. Depends on condition_type. Used by "add" and "update". | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds that the tool supports delete operations, which is consistent with the annotations, but offers no additional side-effect context such as behavior on missing rules or replacement semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one clear sentence, front-loaded with the primary purpose, and immediately enumerates the three operations. There is no filler or redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and thorough annotations, the description need not explain return values or safety. It provides enough high-level context for a complex tool, though it could mention distinctions from nearby formatting tools. Overall, it is adequate given the structured data available.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description does not need to explain parameters. It adds no extra parameter semantics beyond the schema; the baseline of 3 applies because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'manages conditional formatting rules on a Google Sheet' and enumerates the supported operations: adding, updating, and deleting. This specific verb+resource combination distinguishes it from sibling tools like format_sheet_range, which handles other formatting aspects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for conditional formatting rule management but provides no explicit when-to-use guidance or alternatives. It does not mention when to prefer this tool over format_sheet_range or other sheet-modification tools, leaving the agent to infer context from the name and operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_contactManage ContactADestructive
Create, update, or delete a contact. Consolidated tool replacing create_contact, update_contact, and delete_contact.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | List of URL dicts {value, type?}. Supported types: homepage, blog, profile, work, ftp, reservations, other, etc. | |
| No | [DEPRECATED] Email address. Use emails=[{"address":..., "type":"other"}]. | ||
| notes | No | Additional notes (for create/update). | |
| phone | No | [DEPRECATED] Single phone number. Use phones=[{"number":..., "type":"mobile"}]. | |
| action | Yes | The action to perform: "create", "update", or "delete". | |
| emails | No | List of email dicts {address, type?}. | |
| phones | No | List of phone dicts {number, type?}. Supported types: mobile, work, home, main, workMobile, internal, other, etc. Use type="internal" for internal PBX/ATS short numbers (e.g. 250, 301) — stored as a standalone number without + prefix, displayed as "Internal: 250". | |
| address | No | Street address (for create/update). | |
| birthday | No | Birthday as 'YYYY-MM-DD', 'MM-DD' (no year), or 'clear'/'' to remove. | |
| job_title | No | [DEPRECATED] Job title. Use organizations=[{"title":...}]. | |
| nicknames | No | List of nickname dicts {value, type?}. Useful for bilingual contacts (e.g. Hebrew/English alternative forms). Android dialer and WhatsApp search both index nicknames, enabling cross-script lookup. Supported types: default, alternate_name, maiden_name, initials, other, etc. | |
| relations | No | List of relation dicts {person, type?}. Supported types: spouse, child, parent, friend, manager, assistant, etc. | |
| urls_mode | No | How to update urls on "update": "merge" (default), "replace", or "remove". merge dedups by normalized URL (lowercased, trailing slash stripped). | merge |
| contact_id | No | The contact ID. Required for "update" and "delete" actions. | |
| given_name | No | First name (for create/update). | |
| emails_mode | No | How to update emails on "update": "merge" (default), "replace", or "remove". | merge |
| family_name | No | Last name (for create/update). | |
| phones_mode | No | How to update phones on "update": "merge" (default), "replace", or "remove". merge = read-modify-write with dedup by canonicalForm/normalized value. replace = overwrite all phones with provided list. remove = delete phones matching provided numbers. | merge |
| organization | No | [DEPRECATED] Company name. Use organizations=[{"name":...}]. | |
| user_defined | No | List of custom field dicts {key, value}. Useful for structured data like account numbers, IDs, or custom dates. | |
| organizations | No | List of org dicts {name?, title?, department?, jobDescription?, type?}. | |
| nicknames_mode | No | How to update nicknames on "update": "merge" (default), "replace", or "remove". | merge |
| relations_mode | No | How to update relations on "update": "merge" (default), "replace", or "remove". | merge |
| user_defined_mode | No | How to update custom fields on "update": "merge" (default), "replace", or "remove". merge overrides value on matching key; new keys appended. | merge |
| user_google_email | Yes | The user's Google email address. Required. | |
| organizations_mode | No | How to update orgs on "update": "merge" (default), "replace", or "remove". | merge |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, covering the safety profile. The description adds the 'consolidated tool' context, which is useful but does not disclose other behavioral traits like merge/replace/remove update modes or the requirement of contact_id for update/delete. These are left to the schema descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the action verb, and every word earns its place. 'Create, update, or delete a contact' is concise and complete, followed by the consolidation note that explains why this tool exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 26-parameter CRUD tool with a rich schema and output schema, the description gives enough orientation (verb + consolidation) while the schema handles parameter-level details. It could briefly mention that batch operations are handled elsewhere, but the existing text is adequate given the schema size.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents every parameter with detailed descriptions, including deprecated aliases, mode behavior, and formatting. The description adds no parameter-specific semantics beyond 'contact', so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb + resource: 'Create, update, or delete a contact.' It clearly distinguishes this from the 100+ sibling tools by stating it consolidates three former contact tools (create_contact, update_contact, delete_contact). This is a clear, unambiguous statement of purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says this tool replaces create_contact, update_contact, and delete_contact, which tells the agent when to use it for those operations. However, it does not mention when NOT to use it (e.g., batch operations via manage_contacts_batch), leaving a small gap in exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_contact_groupManage Contact GroupADestructive
Create, update, delete a contact group, or modify its members. Consolidated tool replacing create_contact_group, update_contact_group, delete_contact_group, and modify_contact_group_members.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The group name. Required for "create" and "update" actions. | |
| action | Yes | The action to perform: "create", "update", "delete", or "modify_members". | |
| group_id | No | The contact group ID. Required for "update", "delete", and "modify_members" actions. | |
| add_contact_ids | No | Contact IDs to add (for "modify_members"). | |
| delete_contacts | No | If True and action is "delete", also delete contacts in the group (default: False). | |
| user_google_email | Yes | The user's Google email address. Required. | |
| remove_contact_ids | No | Contact IDs to remove (for "modify_members"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=false and destructiveHint=true, and the description's mention of 'delete' is consistent. However, the description adds no additional behavioral context beyond what the annotations and the schema already convey, such as irreversibility or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that conveys the tool's purpose and consolidation. Every part contributes value, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, 4 actions), the description provides a clear high-level overview. It does not explain action-specific behavior, but the schema and output schema fill that gap, making the description sufficiently complete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds no parameter-level detail, only summarizing the action types. It does not contradict or extend the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Create, update, delete a contact group, or modify its members.' It uses a specific verb+resource structure and distinguishes itself from siblings by noting it is a 'Consolidated tool replacing create_contact_group, update_contact_group, delete_contact_group, and modify_contact_group_members.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly identifies the four tools it replaces, giving clear guidance on when to use this consolidated tool versus the alternatives. The action parameter enumeration further supports when to use it, though it stop short of describing when not to use other group-related tools like listing.
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 BatchADestructive
Batch create, update, or delete contacts. Consolidated tool replacing batch_create_contacts, batch_update_contacts, and batch_delete_contacts.
| Name | Required | Description | Default |
|---|---|---|---|
| field | No | For "update" action — the single People API field to update across all contacts in this batch. Required. Must be one of: names, phoneNumbers, emailAddresses, organizations, nicknames, urls, userDefined, relations, biographies, addresses, birthdays. Using a single field per batch call prevents unintentional data loss from a union updateMask overwriting unrelated fields. | |
| action | Yes | The action to perform: "create", "update", or "delete". | |
| updates | No | List of update dicts for "update" action. Each dict must contain contact_id and may contain the same fields as contacts. | |
| contacts | No | List of contact dicts for "create" action. Each dict may contain: given_name, family_name, phones, emails, organizations, notes, address. Deprecated: phone, email, organization, job_title. | |
| contact_ids | No | List of contact IDs for "delete" action. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and readOnlyHint=false, so the description's statement 'Batch create, update, or delete contacts' adds no behavioral information beyond what annotations provide. It does not disclose aspects like partial-failure behavior, permissions, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the core action, and includes a brief consolidation note with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex, but the input schema is exceptionally rich and the output schema is present. The description adequately identifies the tool's role as a batch mutation endpoint, though it could ideally include a pointer to the singular manage_contact tool for non-batch operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with detailed per-parameter descriptions in the input schema. The tool description itself adds no parameter-level meaning, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb phrase 'Batch create, update, or delete contacts' that clearly identifies the resource (contacts) and the batch scope. It also distinguishes from siblings by noting it is a consolidated replacement for three prior batch tools, making its role clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys clear context: this is the batch counterpart for contact mutations, and it explicitly says it replaces three older batch tools. However, it does not provide explicit guidance about when to use this instead of the singular 'manage_contact' sibling, nor does it list exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_deploymentManage DeploymentBDestructive
Manages Apps Script deployments. Supports creating, updating, and deleting deployments.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform - "create", "update", or "delete" | |
| script_id | Yes | The script project ID | |
| description | No | Deployment description (required for create; optional for update when version_number is supplied) | |
| deployment_id | No | The deployment ID (required for update and delete) | |
| version_number | No | Version number to point the deployment at (for update only). Required to roll a deployment forward to a newly created script version. | |
| user_google_email | Yes | User's email address | |
| version_description | No | Optional version description (for create only) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, and the description merely restates the operations without adding context about the consequences of deletion/update, required permissions, irreversibility, or side effects. No additional behavioral disclosure is provided beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the resource and actions, with zero filler. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is minimal but the rich schema (100% param descriptions) and annotations cover operation safety. However, it lacks contextual guidance on selecting this tool vs siblings and doesn't synthesize the action-specific parameters, leaving some completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameter purposes and conditional requirements (e.g., deployment_id required for update/delete). The description adds no parameter-level information, meeting the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Manages Apps Script deployments' and enumerates the supported operations ('creating, updating, and deleting deployments'), giving a specific verb and resource. While 'manages' is somewhat generic, the explicit operation list distinguishes it from siblings like list_deployments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by listing the actions (create/update/delete), so an agent can infer that this tool is for deployment mutation. However, it does not explicitly mention when to use it over alternatives (e.g., list_deployments for reading) or provide 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_doc_tabManage Doc TabBDestructive
Manage document tabs: create, rename, delete, or populate from Markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Position index for new tab, 0-based among siblings (required for create) | |
| title | No | Tab title (required for create; used by rename) | |
| action | Yes | Action to perform - "create", "rename", "delete", or "populate_from_markdown" | |
| tab_id | No | Tab ID (required for rename, delete, populate_from_markdown; use inspect_doc_structure to find IDs) | |
| document_id | Yes | ID of the document | |
| markdown_text | No | Markdown source to render (populate_from_markdown only) | |
| parent_tab_id | No | Optional parent tab ID to nest under (create only) | |
| replace_existing | No | Clear tab body before inserting markdown (default True) | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description need not repeat safety profiles. The description lists destructive actions but does not add context such as replace_existing behavior or irreversibility. It aligns with annotations without adding rich behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with an em-colon list of actions. Zero redundant words or filler; it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 9 parameters and 4 distinct actions, but the schema fills in per-action requirements and output schema exists, reducing the burden on the description. The description is minimal but sufficient with structured data. However, a sentence about prerequisites like using inspect_doc_structure for tab IDs would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 9 parameters with descriptions (100% coverage), including action-specific requirements like 'index required for create'. The description adds no extra parameter meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (document tabs) and lists specific actions: create, rename, delete, populate from Markdown. This distinguishes it from other doc manipulation siblings. However, 'Manage' is a generic verb rather than a specific operation, though the list compensates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance, nor alternatives. The tool's purpose is implied by the resource, but there are no exclusions or comparisons to sibling tools like inspect_doc_structure or get_doc_as_markdown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_document_commentManage Document CommentA
Manage comments on a Google Document.
Actions:
create: Create a new document-level comment. Requires comment_content. Note: The Drive API cannot anchor comments to specific text; only the Google Docs UI can do that.
reply: Reply to a comment. Requires comment_id and comment_content.
resolve: Resolve a comment. Requires comment_id.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| comment_id | No | ||
| document_id | Yes | ||
| comment_content | No | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a key behavioral constraint—the Drive API cannot anchor comments to text—which goes beyond annotations. It does not discuss permissions, reversibility of resolve, or other side effects, but annotations already signal non-read-only behavior. Net contribution is moderate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact summary followed by a bulleted list of actions, each with dependencies. The note about Drive API limitations is the only extra context and is valuable. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the three operations and their parameter dependencies, with an output schema available for return values. It lacks details on prerequisites (e.g., edit permissions) and error conditions, but given the multi-action scope, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by specifying which parameters each action requires (comment_content for create; comment_id and comment_content for reply; comment_id for resolve). It also enumerates the three valid action values. It does not describe document_id or user_google_email, but their names are self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages document comments and enumerates three specific actions (create, reply, resolve), distinguishing it from read-only sibling list_document_comments and other resource-specific comment tools. The scope is explicit and matches the title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys when to use each action by listing required parameters, and the Drive API anchoring note imposes a limitation on creation. However, it does not explicitly point to list_document_comments for viewing or mention alternative tools, so usage vs alternatives is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_drive_accessManage Drive AccessADestructive
Consolidated tool for managing Google Drive file and folder access permissions.
Supports granting, batch-granting, updating, revoking permissions, and transferring file ownership -- all through a single entry point.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Permission role -- 'reader', 'commenter', or 'writer'. Used by "grant" (defaults to 'reader') and "update". | |
| action | Yes | The access management action to perform. Required. One of: - "grant": Share with a single user, group, domain, or anyone. - "grant_batch": Share with multiple recipients in one call. - "update": Modify an existing permission (role or expiration). - "revoke": Remove an existing permission. - "transfer_owner": Transfer file ownership to another user. | |
| file_id | Yes | The ID of the file or folder. Required. | |
| recipients | No | List of recipient objects for "grant_batch". Each should have: email (str), role (str, optional), share_type (str, optional), expiration_time (str, optional). For domain shares use 'domain' field instead of 'email'. | |
| share_type | No | Type of sharing -- 'user', 'group', 'domain', or 'anyone'. Used by "grant". Defaults to 'user'. | user |
| share_with | No | Email address (user/group), domain name (domain), or omit for 'anyone'. Used by "grant". | |
| email_message | No | Custom notification email message. Used by "grant" and "grant_batch". | |
| permission_id | No | The permission ID to modify or remove. Required for "update" and "revoke" actions. | |
| expiration_time | No | Expiration in RFC 3339 format (e.g., "2025-01-15T00:00:00Z"). Used by "grant" and "update". | |
| new_owner_email | No | Email of the new owner. Required for "transfer_owner". | |
| send_notification | No | Whether to send notification emails. Defaults to True. Used by "grant" and "grant_batch". | |
| user_google_email | Yes | The user's Google email address. Required. | |
| allow_file_discovery | No | For 'domain'/'anyone' shares, whether the file appears in search. Used by "grant". | |
| move_to_new_owners_root | No | Move file to the new owner's My Drive root. Defaults to False. Used by "transfer_owner". |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose destructiveHint=true and readOnlyHint=false, so mutation risk is known. The description adds the specific actions like revoking and transferring ownership, but does not elaborate on consequences, irreversibility, or notification behaviors beyond what the schema already states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise, front-loaded sentences. It wastes no words and communicates the tool's scope and key operations immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema, annotations, and output schema, the description sufficiently frames a complex permission-management tool. It lacks only explicit cross-referencing to permission-related sibling tools, which would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each of the 14 parameters individually described. The tool description does not add parameter-level meaning beyond listing high-level capabilities, so it stays at the baseline for a fully schema-documented tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the resource (Google Drive file/folder access permissions) and lists the exact supported operations: granting, batch-granting, updating, revoking, and ownership transfer. The 'consolidated tool' and 'single entry point' framing help distinguish it from more specialized permission siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a one-stop tool for drive access management but never explicitly states when to use it versus alternatives like set_drive_file_permissions or get_drive_file_permissions. No when-not-to-use or exclusion guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_eventManage EventBDestructive
Manages calendar events. Supports creating, updating, deleting, and RSVP.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform - "create", "update", "delete", or "rsvp". | |
| summary | No | Event title (required for create). | |
| color_id | No | Event color ID (1-11, update only). | |
| end_time | No | End time in RFC3339 format (required for create). | |
| event_id | No | Event ID (required for update and delete). | |
| location | No | Event location. | |
| response | No | RSVP response — "accepted", "declined", "tentative", or "needsAction" (rsvp action only). | |
| timezone | No | IANA timezone applied to both boundaries (e.g., "America/New_York"). Overridden per boundary by start_timezone/end_timezone. | |
| attendees | No | Attendee email addresses or objects. | |
| reminders | No | Custom reminder objects. | |
| recurrence | No | RFC5545 recurrence rules for a recurring event, e.g. ["RRULE:FREQ=WEEKLY;COUNT=10"]. | |
| start_time | No | Start time in RFC3339 format (required for create). | |
| visibility | No | "default", "public", "private", or "confidential". | |
| attachments | No | List of Google Drive file URLs or IDs to attach. | |
| calendar_id | No | Calendar ID (default: 'primary'). | primary |
| description | No | Event description. | |
| end_timezone | No | IANA timezone for the end boundary only, overriding timezone. See start_timezone. | |
| rsvp_comment | No | Optional message to include with the RSVP response (rsvp action only). | |
| send_updates | No | Notification behavior for create, update, delete, and rsvp — "all" (default), "externalOnly", or "none". | |
| transparency | No | "opaque" (busy) or "transparent" (free). | |
| conference_id | No | Optional provider-side conference/meeting ID. | |
| conference_uri | No | Join URL for the third-party conference (e.g. "https://zoom.us/j/123456789"). Required when conference_provider is set. | |
| start_timezone | No | IANA timezone for the start boundary only, overriding timezone. Use for events whose two ends sit in different zones - a flight departing 13:45 "Asia/Jerusalem" and landing 17:50 "Europe/Amsterdam" is one event authored in two zones. Passing a single timezone for such an event silently rewrites one end's wall-clock. | |
| add_google_meet | No | Whether to add/remove native Google Meet. | |
| conference_data | No | Raw Google Calendar `conferenceData` payload to attach a third-party conference (Zoom/Webex/Teams add-on). Use this for full control; mutually exclusive with the conference_provider helper params and with add_google_meet. (create/update only) | |
| guests_can_modify | No | Whether attendees can modify. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| conference_passcode | No | Optional passcode for the third-party conference. | |
| conference_provider | No | Higher-level helper: third-party provider name (e.g. "zoom", "webex", "teams"). Requires conference_uri. The MCP builds the addOn `conferenceData` block internally. (create/update only) | |
| use_default_reminders | No | Whether to use default reminders. | |
| guests_can_invite_others | No | Whether attendees can invite others. | |
| guests_can_see_other_guests | No | Whether attendees can see other guests. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true, and idempotentHint=false; the description's create/update/delete operations are consistent with them, so there is no contradiction. Yet the description adds no behavioral context of its own — nothing about irreversibility of deletion, notification side effects, or the RSVP state change — leaving the annotations to carry the full burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler, and the resource 'calendar events' is front-loaded. It is efficiently written, though for a 32-parameter, four-mode tool the description could carry more useful signal without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool this complex, the description is thin: it offers no usage routing, no authentication note, and no cross-action parameter guidance. The 100%-covered schema and the presence of an output schema compensate substantially, so the tool remains correctly invokable, but the description alone leaves an agent under-informed about prerequisites and action-specific expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with detailed per-parameter docstrings (e.g., 'required for create', 'rsvp action only'), so the baseline of 3 applies. The description merely enumerates the four action values already defined in the schema and adds no additional parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource ('calendar events') and the operations ('creating, updating, deleting, and RSVP'), which tells an agent this is the write/management tool for events rather than the read-only get_events. However, 'manages' is a generic verb and no sibling is named explicitly, so differentiation is conveyed only through the action list rather than a direct contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The operation list ('creating, updating, deleting, and RSVP') implies when the tool applies, which is the minimum viable usage signal. But the description gives no explicit when-to-use vs alternatives — notably get_events for reading, create_calendar for calendar-level work — and no mention of the start_google_auth prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_focus_timeManage Focus TimeADestructive
Manages Focus Time events on Google Calendar. These special events auto-decline meeting invitations and, by default, set the user's chat status to Do Not Disturb, helping protect blocks of uninterrupted work time.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform - "create", "list", "update", or "delete". | |
| summary | No | Display text on the calendar. Defaults to "Focus Time". | |
| end_time | No | End date/time (exclusive). Same format as start_time. For a single full day on April 5, use start_time='2026-04-05' and end_time='2026-04-06'. Required for create. | |
| event_id | No | Event ID. Required for "update" and "delete" actions. | |
| time_max | No | For "list" action: end of time range. | |
| time_min | No | For "list" action: start of time range. Defaults to current time. Recurring series are expanded into individual instances in the requested range. | |
| timezone | No | Timezone for the event (e.g., "America/New_York", "Europe/London"). Required when using date-only values or dateTime values without an explicit UTC offset. | |
| recurrence | No | RFC5545 recurrence rules for a recurring Focus Time series, e.g. ["RRULE:FREQ=WEEKLY;COUNT=10"]. | |
| start_time | No | Start date/time. Use 'YYYY-MM-DD' for full-day or RFC3339 for partial-day (e.g., '2024-04-05T09:00:00Z'). Date-only values are auto-converted to dateTime (midnight-to-midnight). Required for create. | |
| calendar_id | No | Calendar ID. Defaults to 'primary'. Focus Time status events live on primary calendars, so use 'primary' or a user's primary calendar ID/email rather than a secondary calendar ID. | primary |
| chat_status | No | Google Chat status during the focus time. Supports "doNotDisturb" (default) and "available". | |
| description | No | Event description. Useful for adding context about what the focus time is for. | |
| max_results | No | For "list" action: maximum events to return. Defaults to 10. | |
| decline_message | No | Message included when auto-declining invitations. | |
| auto_decline_mode | No | How to handle conflicting invitations. One of: "declineAllConflictingInvitations" (default), "declineOnlyNewConflictingInvitations", "declineNone". | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive and non-read-only behavior, so the description adds valuable context by disclosing key side effects: auto-declining meeting invitations and setting chat status to Do Not Disturb by default. This goes beyond the structured annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the verb and resource, and every word earns its place. It is concise and structured effectively.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter tool, the description is brief but sufficient because the schema carries detailed parameter semantics and the output schema is present. It explains the purpose and key side effects, making it complete enough for an agent to understand what the tool does, though it does not enumerate the CRUD actions (already in the action parameter schema).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% parameter description coverage, so the baseline is 3. The description does not add parameter-specific details beyond what the schema provides, though it does mention defaults behavior that maps to chat_status and auto_decline_mode. This adds some context but does not compensate for anything missing in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Manages Focus Time events on Google Calendar' and distinguishes these special events from regular calendar events by mentioning they auto-decline meeting invitations and set chat status to Do Not Disturb. This differentiates it from sibling tools like manage_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context that this tool is for Focus Time events, which are distinct from regular events due to their auto-decline and DND behaviors. It implies when to use this tool, though it does not explicitly name alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_gmail_filterManage Gmail FilterBDestructive
Manages Gmail filters. Supports creating and deleting filters.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform - "create" or "delete". | |
| criteria | No | Filter criteria object (required for create). | |
| filter_id | No | ID of the filter to delete (required for delete). | |
| filter_action | No | Filter action object (required for create). Named 'filter_action' to avoid shadowing the 'action' parameter. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive behavior (destructiveHint: true). The description adds no additional behavioral context, such as side effects of deletion, error handling, or requirements like Google account authentication. It merely restates the create/delete actions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, but the first sentence 'Manages Gmail filters' is redundant with the tool title and adds no value. The second sentence 'Supports creating and deleting filters' is the substantive part. Could be condensed to a single sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 5 parameters with conditional requirements, the description does not explain the two distinct modes (create vs delete) or the need to provide criteria and filter_action for create, and filter_id for delete. The schema covers this, but the description offers no operational context. Output schema exists, so return values are not needed, but usage context is lacking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are fully documented in the schema. The description adds no further semantic information about what criteria or filter_action objects should contain, relying on the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates and deletes Gmail filters, distinguishing it from read-only sibling tools like list_gmail_filters. The specific actions (create/delete) make the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (use when you need to create/delete filters) but does not explicitly mention alternatives or clearly define when not to use this tool. No reference to list_gmail_filters for read operations or to manage_gmail_label for labels.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_gmail_labelManage Gmail LabelBDestructive
Manages Gmail labels: create, update, or delete labels.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Label name. Required for create, optional for update. | |
| action | Yes | Action to perform on the label. | |
| label_id | No | Label ID. Required for update and delete operations. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| label_list_visibility | No | Whether the label is shown in the label list. | labelShow |
| message_list_visibility | No | Whether the label is shown in the message list. | show |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and readOnlyHint=false, so the tool is known to be a mutating/destructive operation. However, the description adds no behavioral context beyond the raw actions—e.g., it doesn't disclose that deleting a label may remove it from all messages, that updates could affect visibility settings, or any side effects. With annotations present, the description should add such context but doesn't.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no fluff. It front-loads the resource (Gmail labels) and lists the three actions cleanly. Every word earns its place, achieving maximum conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, 3 actions, output schema present), the description is minimal but sufficient. The schema and output schema cover parameter details and return format, while annotations cover safety. The description only needs to convey the high-level CRUD nature, which it does. It could mention per-action requirements, but those are in the schema, so a score of 4 is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with each parameter (name, action, label_id, user_google_email, label_list_visibility, message_list_visibility) already documented. The description adds no semantic value for parameters, only listing the actions. Since schema covers everything, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Manages Gmail labels: create, update, or delete labels.' This distinguishes it from read-only sibling tools like list_gmail_labels and modify_gmail_message_labels, which operate on label assignments rather than label definitions. The verb 'manages' is generic, but the enumerated actions make the purpose explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for creating, updating, or deleting Gmail labels, but provides no explicit guidance on when to choose this tool over alternatives like list_gmail_labels for reading or modify_gmail_message_labels for altering message-label associations. It gives no exclusions or alternative references, 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.
manage_out_of_officeManage Out of OfficeADestructive
Manages Out of Office events on Google Calendar. These special events auto-decline meeting invitations and set the user's status to "Out of office" across Google Workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform - "create", "list", "update", or "delete". | |
| summary | No | Display text on the calendar. Defaults to "Out of Office". | |
| end_time | No | End date/time (exclusive). Same format as start_time. For a single full day on April 5, use start_time='2026-04-05' and end_time='2026-04-06'. Required for create. | |
| event_id | No | Event ID. Required for "update" and "delete" actions. | |
| time_max | No | For "list" action: end of time range. | |
| time_min | No | For "list" action: start of time range. Defaults to current time. Recurring series are expanded into individual instances in the requested range. | |
| timezone | No | Timezone for the event (e.g., "America/New_York", "Europe/London"). Required when using date-only values or dateTime values without an explicit UTC offset. | |
| recurrence | No | RFC5545 recurrence rules for a recurring Out of Office series, e.g. ["RRULE:FREQ=WEEKLY;COUNT=10"]. | |
| start_time | No | Start date/time. Use 'YYYY-MM-DD' for full-day or RFC3339 for partial-day (e.g., '2024-04-05T09:00:00Z'). Date-only values are auto-converted to dateTime (midnight-to-midnight). Required for create. | |
| calendar_id | No | Calendar ID. Defaults to 'primary'. Out of Office status events live on primary calendars, so use 'primary' or a user's primary calendar ID/email rather than a secondary calendar ID. | primary |
| max_results | No | For "list" action: maximum events to return. Defaults to 10. | |
| decline_message | No | Message included when auto-declining invitations. | |
| auto_decline_mode | No | How to handle conflicting invitations. One of: "declineAllConflictingInvitations" (default), "declineOnlyNewConflictingInvitations", "declineNone". | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond annotations: OOO events auto-decline invitations and set the user's status across Google Workspace. It does not contradict the destructiveHint or readOnlyHint annotations, and the auto-decline behavior is meaningful for agent decisions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no redundancy. The first sentence front-loads the verb and resource; the second adds essential behavioral details. Highly efficient and structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the tool has many parameters and actions, the rich schema and output schema fully cover operational details. The description provides the necessary OOO-specific context and status effect, making the tool understandable without over-explaining. Slightly more could be said about action types, but structured data compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with detailed descriptions for all 14 parameters, including defaults, required conditions, and format examples. The description adds only high-level context and does not need to duplicate schema details, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages Out of Office events on Google Calendar and explains their special effects (auto-declining invitations and setting status across Workspace). It distinguishes from generic event tools like manage_event by focusing on OOO-specific behavior, though the verb 'Manages' is somewhat generic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for Out of Office events but does not explicitly state when to use it versus alternatives like manage_event or manage_focus_time. No exclusions or alternative tool mentions are provided, leaving the agent to infer from the OOO context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_presentation_commentManage Presentation CommentA
Manage comments on a Google Presentation.
Actions:
create: Create a new comment. Requires comment_content. Note: The Drive API cannot anchor comments to arbitrary text; Slides comments are element-scoped via the API.
reply: Reply to a comment. Requires comment_id and comment_content.
resolve: Resolve a comment. Requires comment_id.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| comment_id | No | ||
| comment_content | No | ||
| presentation_id | Yes | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotation flags, the description adds a valuable behavioral note that the Drive API cannot anchor comments to arbitrary text and that Slides comments are element-scoped via the API. It also states required parameters for each action, providing useful context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a bulleted list of actions and a concise note about API limitations. Every sentence adds value and the structure makes requirements easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all three actions, their parameter requirements, and a key limitation, making it sufficient for correct invocation. It could be more explicit about the role of user_google_email and presentation_id, but the output schema and general context fill most gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description compensates by mapping actions to their required parameters (comment_content for create, comment_id/comment_content for reply, comment_id for resolve). It does not explain user_google_email or presentation_id, but these are likely self-evident from the tool context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Manage comments on a Google Presentation' and lists three specific actions (create, reply, resolve), distinguishing it from sibling comment-management tools for other Google Workspace types (e.g., manage_document_comment, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by defining each action and its required parameters, implying when to use the tool. However, it does not explicitly mention alternatives or exclusions, such as when to use list_presentation_comments instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_spreadsheet_commentManage Spreadsheet CommentA
Manage comments on a Google Spreadsheet.
Actions:
create: Create a new comment. Requires comment_content. Note: The Drive API cannot anchor comments to arbitrary text; Sheets comments are cell-scoped via the API.
reply: Reply to a comment. Requires comment_id and comment_content.
resolve: Resolve a comment. Requires comment_id.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| comment_id | No | ||
| spreadsheet_id | Yes | ||
| comment_content | No | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false), the description adds meaningful context: a note that the Drive API cannot anchor comments to arbitrary text and that Sheets comments are cell-scoped. This helps set expectations about what the create action can and cannot do. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured with a brief overview followed by a bulleted action list. Every sentence contributes useful information, and the API limitation note is placed where relevant. No redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately complex multi-action tool with an output schema, the description covers the main behavior, required parameters, and a key API constraint. It does not explain how cell scope is specified in practice or what happens with an invalid action, but the output schema and annotation context cover some gaps. Overall it is adequate for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the burden of explaining parameters. It does so effectively by mapping each action to its required parameters (create→comment_content; reply→comment_id+comment_content; resolve→comment_id). It leaves user_google_email and spreadsheet_id implicit, but their roles are reasonably inferable from the tool name and context. The nullable comment_id and comment_content are partially clarified through action-specific requirements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages comments on a Google Spreadsheet and enumerates three specific actions (create, reply, resolve) with a verb+resource pattern. This distinguishes it from sibling tools like manage_document_comment and manage_presentation_comment by explicitly scoping to spreadsheets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action list with required parameters provides clear guidance on when to use each sub-operation. However, it does not explicitly mention when not to use this tool or point to alternatives like list_spreadsheet_comments for read-only comment retrieval. The note about API limitations implies trade-offs but no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_taskManage TaskADestructive
Manage tasks: create, update, delete, or move tasks within task lists.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | Due date in RFC 3339 format (e.g., "2024-12-31T23:59:59Z"). Used by "create" and "update" actions. | |
| notes | No | Notes/description for the task. Used by "create" and "update" actions. | |
| title | No | The title of the task. Required for "create", optional for "update". | |
| action | Yes | The action to perform. Must be one of: "create", "update", "delete", "move". | |
| parent | No | Parent task ID (for subtasks). Used by "create" and "move" actions. | |
| status | No | Task status ("needsAction" or "completed"). Used by "update" action. | |
| task_id | No | The ID of the task. Required for "update", "delete", and "move" actions. | |
| previous | No | Previous sibling task ID (for positioning). Used by "create" and "move" actions. | |
| task_list_id | Yes | The ID of the task list. Required for all actions. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| destination_task_list | No | Destination task list ID (for moving between lists). Used by "move" action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds the specific actions but does not disclose additional behavioral nuances such as irreversibility of delete, dependency on task_id for update/delete/move, or the meaning of 'move' (between lists vs. reordering). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, concise sentence that front-loads the tool's purpose and actions. No filler or repetition of schema information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 11 parameters and an output schema, but the description is minimal. While the schema fills in parameter details, the description could provide more context on action-specific parameter requirements (e.g., task_id needed for update/delete/move, destination_task_list for moves between lists). It is adequate for a basic understanding but not comprehensive for a multi-action mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are well-documented. The description itself does not add new parameter details, but it does mention action types that map to the 'action' parameter. This meets the baseline but adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('manage') and resource ('tasks'), and enumerates the actions: create, update, delete, or move. It distinguishes from siblings like manage_task_list (task lists) and read-only tools like list_tasks/get_task by specifying task-level mutations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: use this when you need to create, update, delete, or move tasks. However, it does not explicitly contrast with alternatives (e.g., list_tasks for viewing) or provide guidance on which action to choose for specific scenarios. The 'within task lists' phrase gives partial context but no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_task_listManage Task ListBDestructive
Manage task lists: create, update, delete, or clear completed tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | The title for the task list. Required for "create" and "update" actions. | |
| action | Yes | The action to perform. Must be one of: "create", "update", "delete", "clear_completed". | |
| task_list_id | No | The ID of the task list. Required for "update", "delete", and "clear_completed" actions. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, and the description merely echoes this by listing 'delete' and 'clear completed tasks' without adding contextual details such as permanence of deletion, impact on contained tasks, or permission requirements. It does not contradict the annotations, but it fails to disclose behavior beyond what the schema and annotations already convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the core purpose and enumerates the specific operations. Every word contributes meaning, with no redundancy or filler. It is appropriately sized for a tool with four parameters and a straightforward CRUD-like behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of a complete output schema, full parameter descriptions, and annotations covering destructive behavior, the description is largely sufficient. It captures the high-level operations and the specific 'clear completed tasks' nuance. However, it could be slightly improved by adding a note about the irreversibility of delete or clear actions, though this is partially covered by the destructiveHint annotation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already well-documented (e.g., title required for create/update, task_list_id for update/delete/clear_completed). The description adds no new parameter-level semantics beyond restating the allowed actions, which are also listed in the action parameter's description. Thus the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Manage task lists: create, update, delete, or clear completed tasks.' It identifies the resource (task lists) and enumerates the supported operations, distinguishing it from siblings like manage_task (which handles individual tasks) and list_task_lists (which is read-only). However, the verb 'Manage' is somewhat generic and does not add specificity beyond the enumerated actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for task list management but provides no explicit guidance on when to use this tool versus alternatives such as manage_task for individual tasks or list_task_lists for retrieval. There are no stated exclusions or alternative tool recommendations, so the usage context is only inferred from the resource type and sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modify_doc_textModify Doc TextADestructive
Modifies text in a Google Doc - can insert/replace text and/or apply formatting in a single operation.
TIP: To append text to the end of the document without calculating indices, set end_of_segment=true. This avoids index calculation errors.
For ordinary header/footer text, prefer update_doc_headers_footers. Only pass segment_id when you already have a real header/footer/footnote segment ID from inspect_doc_structure output. Do not guess IDs such as "kix.header" or "kix.footer".
| Name | Required | Description | Default |
|---|---|---|---|
| bold | No | Whether to make text bold (True/False/None to leave unchanged) | |
| text | No | New text to insert or replace with (optional - can format existing text without changing it) | |
| italic | No | Whether to make text italic (True/False/None to leave unchanged) | |
| tab_id | No | Optional document tab ID to target | |
| link_url | No | Hyperlink URL (http/https) | |
| end_index | No | End position for text replacement/formatting (if not provided with text, text is inserted) | |
| font_size | No | Font size in points | |
| underline | No | Whether to underline text (True/False/None to leave unchanged) | |
| clear_link | No | Remove hyperlink from the target range | |
| segment_id | No | Optional header/footer/footnote segment ID to target | |
| small_caps | No | Whether to apply small caps | |
| text_color | No | Foreground text color (#RRGGBB) | |
| document_id | Yes | ID of the document to update | |
| font_family | No | Font family name (e.g., "Arial", "Times New Roman") | |
| font_weight | No | Font weight (100-900 in steps of 100; requires font_family) | |
| start_index | Yes | Start position for operation using Docs API indices from inspect_doc_structure. For the main body, 0 is also accepted as an alias for the first writable position. | |
| strikethrough | No | Whether to strike through text (True/False/None to leave unchanged) | |
| end_of_segment | No | Insert text at the end of the targeted segment instead of start_index | |
| baseline_offset | No | One of NONE, SUPERSCRIPT, SUBSCRIPT | |
| background_color | No | Background/highlight color (#RRGGBB) | |
| user_google_email | Yes | User's Google email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation risk is known. The description adds behavioral context beyond annotations by warning about index calculation errors, explaining end_of_segment behavior, and cautioning about ID guessing. It does not detail irreversible side effects, but the annotation covers the core 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: main purpose in the first sentence, then a useful TIP, then explicit exclusions and warnings. Every sentence provides actionable value, and key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of 21 parameters and an output schema, the description effectively covers the essential operational nuances: insertion vs replacement, formatting-only usage, end_of_segment for append, header/footer guidance, and segment ID provenance. It is complete enough for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the schema itself documents all parameters. The description adds operational meaning beyond the schema, particularly for end_of_segment ('avoids index calculation errors') and segment_id ('Do not guess IDs'), which helps the agent use parameters correctly. This goes beyond baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Modifies text in a Google Doc') and clearly enumerates the scope: insert/replace text and/or apply formatting in a single operation. It distinguishes itself from likely siblings (e.g., update_doc_headers_footers) by explicitly addressing header/footer use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives direct guidance on when to use an alternative: 'For ordinary header/footer text, prefer update_doc_headers_footers.' It also provides concrete procedural warnings, such as only passing real segment IDs from inspect_doc_structure and not guessing IDs, plus a practical TIP for appending with end_of_segment=true.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modify_gmail_message_labelsModify Gmail Message LabelsADestructive
Adds or removes labels from a Gmail message. To archive an email, remove the INBOX label. To delete an email, add the TRASH label.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | The ID of the message to modify. | |
| add_label_ids | No | List of label IDs to add to the message. | |
| remove_label_ids | No | List of label IDs to remove from the message. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description is not contradicting them. The description adds value by explaining the side effects of specific label choices (removing INBOX archives, adding TRASH deletes), which is meaningful behavioral context beyond the raw annotation. However, it does not mention that changes are immediate, whether label removal can permanently delete messages, or any permissions/user-consent implications. With annotations present, the description's additional behavioral detail earns a 3 rather than lower.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core action. The two example sentences are useful and non-redundant. It could be slightly improved by adding a sentence on label ID format, but the current length is appropriate and every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-message label modification tool, the description is fairly complete: it states the action, gives the two most important use cases, and annotations cover the destructive nature. The output schema exists (though not shown) which may cover return values. It could have mentioned the relationship to batch_modify_gmail_message_labels and that custom label IDs are allowed, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters with descriptions, so the baseline is 3. The description's examples imply the meaning of add_label_ids and remove_label_ids but do not add technical details like label ID format (e.g., 'INBOX', 'TRASH', custom ID). Since the schema already documents all parameters, the description does not need to compensate for gaps; it just doesn't add much beyond the examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Adds or removes labels from a Gmail message') and immediately provides two concrete operational examples (archiving via removing INBOX, deleting via adding TRASH). This clearly distinguishes the tool from siblings like manage_gmail_label (which manages label definitions) and batch_modify_gmail_message_labels (which operates on multiple messages).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context for common operations (archive and delete), which helps the agent understand when to use this tool. However, it does not explicitly mention when to prefer batch_modify_gmail_message_labels over this single-message tool, nor does it state any exclusions for when not to use it. The practical examples imply usage well but leave the single-vs-batch distinction implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modify_sheet_valuesModify Sheet ValuesBDestructive
Modifies values in a specific range of a Google Sheet - can write, update, or clear values.
| Name | Required | Description | Default |
|---|---|---|---|
| values | No | 2D array of values to write/update. Can be a JSON string or Python list. Required unless clear_values=True. | |
| range_name | Yes | The range to modify (e.g., "Sheet1!A1:D10", "A1:D10"). Required. | |
| clear_values | No | If True, clears the range instead of writing values. Defaults to False. | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| value_input_option | No | How to interpret input values ("RAW" or "USER_ENTERED"). Defaults to "USER_ENTERED". | USER_ENTERED |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=false. The description adds no behavioral context beyond restating the tool's purpose (write/update/clear). It does not mention that writes overwrite existing data or that clear operations are permanent, which would be valuable given the destructive hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that efficiently conveys the core action and supported operations. There is no waste or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is relatively simple with 6 parameters, 3 required, and an output schema present. The description covers the basic function but lacks additional context such as side effects or typical use cases. Given the annotations and schema coverage, it meets the minimum viable completeness but does not go beyond it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all parameters, including values, clear_values, and value_input_option. The description's phrase 'can write, update, or clear values' aligns with the schema but adds no new semantic information beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Modifies') and resource ('values in a specific range of a Google Sheet'), and further clarifies the supported actions (write, update, clear). This clearly distinguishes it from sibling tools like read_sheet_values 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives such as append_table_rows or format_sheet_range. It does not mention exclusions or conditions that would help an agent decide between this and similar sheet-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_sheet_rowsMove Sheet RowsADestructive
Moves rows from one sheet to another within the same spreadsheet. The move is performed in a single batchUpdate (copyPaste followed by deleteDimension). Note: batchUpdate executes requests sequentially but does not roll back on partial failure — if the copy succeeds but the delete fails, rows may be duplicated. Formulas, data types, and formatting are preserved (unlike a values.get/append round-trip). Row numbers are 1-based (matching the spreadsheet UI).
| Name | Required | Description | Default |
|---|---|---|---|
| end_row | Yes | Last row to move (1-based, inclusive). Required. | |
| start_row | Yes | First row to move (1-based, inclusive). Required. | |
| source_sheet | Yes | Name of the sheet to move rows from. Required. | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| destination_sheet | Yes | Name of the sheet to move rows to. Required. | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses non-rollback partial failure and duplication risk, preservation of formulas/types/formatting, and 1-based row semantics, all beyond the annotations. The destructiveHint annotation is consistent with the described deleteDimension step, so no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense, information-bearing sentences, front-loaded with the action; every sentence contributes essential behavioral context without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers operation mechanics, failure behavior, preservation guarantees, and row numbering. Missing destination placement details (e.g., where moved rows land in destination sheet) is a minor gap, but annotations and output schema cover safety and return context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema handles per-parameter documentation; the description's 1-based/inclusive note partially repeats schema text. It adds no significant new parameter-level details beyond making the row-number convention explicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly identifies a specific operation (moving rows) with explicit scope (between sheets in the same spreadsheet). This distinguishes it from sibling tools like modify_sheet_values or append_table_rows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States that the operation uses batchUpdate rather than a values round-trip and explicitly contrasts with values.get/append behavior, giving context for when choosing this tool. It does not name alternative tools explicitly or list cases where a different operation should be used, but the purpose is specific enough to imply usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_freebusyQuery FreebusyBRead-onlyIdempotent
Returns free/busy information for a set of calendars.
| Name | Required | Description | Default |
|---|---|---|---|
| time_max | Yes | The end of the interval for the query in RFC3339 format (e.g., '2024-05-12T18:00:00Z' or '2024-05-12'). | |
| time_min | Yes | The start of the interval for the query in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). | |
| calendar_ids | No | List of calendar identifiers to query. If not provided, queries the primary calendar. Use 'primary' for the user's primary calendar or specific calendar IDs obtained from `list_calendars`. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| group_expansion_max | No | Maximum number of calendar identifiers to be provided for a single group. Optional. An error is returned for a group with more members than this value. Maximum value is 100. | |
| calendar_expansion_max | No | Maximum number of calendars for which FreeBusy information is to be provided. Optional. Maximum value is 50. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and idempotent, but the description adds no further behavioral context—no limits, error conditions, or notes on time zone handling. It is purely a return-type statement, adding no value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single concise sentence with no filler. It is appropriately sized and to the point, clearly stating the tool's core function without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and highly descriptive input schema, the description is minimally sufficient. It identifies the action and resource, and the phrase 'set of calendars' implies support for multiple calendars. No critical context appears to be missing for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides comprehensive descriptions for all six parameters, including examples, defaults, and validation details. The description adds no additional parameter semantics, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Returns') and resource ('free/busy information') for 'a set of calendars'. It clearly identifies the tool's function and differentiates it from sibling tools like get_events or list_calendars by focusing on free/busy availability rather than event details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as get_events or list_calendars. The description simply states what it returns, leaving usage context implicit and not offering any exclusions or prerequisites.
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 ValuesBRead-onlyIdempotent
Reads values from a specific range in a Google Sheet.
| Name | Required | Description | Default |
|---|---|---|---|
| range_name | No | The range to read (e.g., "Sheet1!A1:D10", "A1:D10"). Defaults to "A1:Z1000". Open-ended or oversized ranges are clamped to at most 1000 rows before the Sheets API request to bound memory use. | A1:Z1000 |
| include_notes | No | If True, also fetch cell notes for the range. Defaults to False to avoid expensive includeGridData requests. | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| include_formulas | No | If True, also fetch raw formula strings for cells that contain formulas. Useful for identifying cross-sheet references before writing back to a range. Defaults to False to avoid an extra API request. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| include_hyperlinks | No | If True, also fetch hyperlink metadata for the range. Defaults to False to avoid expensive includeGridData requests. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral details beyond the obvious 'reads values'; it doesn't mention range clamping, default behaviors, or return format. It provides minimal additional value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero waste. It clearly states the core purpose and relies on the schema for details, making it an appropriately sized description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, annotations cover safety, schema covers all parameters, and an output schema exists. However, the description lacks usage context such as when to choose this over other sheet tools, and doesn't mention the required user_google_email or that it's a read-only operation. It's adequate but leaves room for improvement in guiding selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with detailed parameter descriptions including defaults, clamping behavior, and performance implications (e.g., includeGridData). The description itself adds no parameter semantics, but the baseline of 3 is appropriate given the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('reads') and resource ('values from a specific range in a Google Sheet'), clearly indicating the tool's function. It doesn't explicitly differentiate from siblings like get_spreadsheet_info or list_spreadsheets, but the action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as modify_sheet_values, format_sheet_range, or get_spreadsheet_info. The description only states what it does, leaving the agent to infer usage context without explicit exclusions or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resize_sheet_dimensionsResize Sheet DimensionsADestructive
Manages sheet-level dimension properties: resize columns/rows, auto-resize to fit content, freeze rows/columns, hide/unhide rows/columns, and insert/delete rows/columns.
| Name | Required | Description | Default |
|---|---|---|---|
| hide_rows | No | List of 1-based row numbers to hide. Example: [3, 4]. | |
| row_sizes | No | Dict mapping 1-based row numbers to pixel heights. Example: {"1": 40, "3": 60}. Can be a JSON string or Python dict. | |
| sheet_name | No | Sheet name to target. Defaults to the first sheet if not provided. | |
| delete_rows | No | List of 1-based row numbers to delete. Example: [5, 6]. Best for non-contiguous rows. | |
| insert_rows | No | Number of rows to insert. | |
| unhide_rows | No | List of 1-based row numbers to unhide. Example: [3, 4]. | |
| column_sizes | No | Dict mapping column letters to pixel widths. Example: {"A": 200, "C": 300}. Can be a JSON string or Python dict. | |
| hide_columns | No | List of column letters to hide. Example: ["C", "D"]. | |
| delete_columns | No | List of column letters to delete. Example: ["E", "F"]. | |
| insert_columns | No | Number of columns to insert. | |
| insert_rows_at | No | 1-based row number to insert before. Appends to the end of the sheet if omitted. | |
| spreadsheet_id | Yes | The ID of the spreadsheet. Required. | |
| unhide_columns | No | List of column letters to unhide. Example: ["C", "D"]. | |
| auto_resize_rows | No | List of 1-based row numbers to auto-resize to fit content. Example: [1, 2]. | |
| delete_row_range | No | Contiguous range of rows to delete, as "start:end" (1-based, inclusive). Example: "5:10" deletes rows 5 through 10. More efficient than delete_rows for large contiguous ranges. | |
| frozen_row_count | No | Number of rows to freeze from the top. Use 0 to unfreeze all rows. | |
| insert_columns_at | No | Column letter to insert before (e.g. "C"). Appends to the end if omitted. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| auto_resize_columns | No | List of column letters to auto-resize to fit content. Example: ["A", "B"]. | |
| frozen_column_count | No | Number of columns to freeze from the left. Use 0 to unfreeze all columns. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the description is not required to repeat these. It adds context by specifying the types of destructive operations (insert/delete rows/columns), but does not disclose additional behavioral traits such as potential data shifts or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with a colon-separated list, front-loading the key resource ('sheet-level dimension properties'). It is efficient and covers all major operations without redundancy, though the list format is a bit transactional.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 20 parameters, a high-level summary is appropriate. The schema and annotations provide detailed parameter definitions and safety profile. An output schema exists, so return values need not be explained. The description is complete enough for the agent to understand the tool's purpose and choose it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented with examples and defaults. The description itself adds no parameter-level detail, but the schema fully compensates. This meets the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages sheet-level dimension properties and enumerates specific operations (resize, auto-resize, freeze, hide/unhide, insert/delete). While 'manages' is not as sharp as a direct verb like 'resize,' the list of actions removes ambiguity and distinguishes it from sibling tools that handle values or formatting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for dimension-related changes but does not explicitly state when to use it vs alternatives like modify_sheet_values or format_sheet_range. No exclusions or alternative tool names are provided, though the scope is reasonably clear from the listed operations.
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 FunctionCDestructive
Executes a function in a deployed script.
| Name | Required | Description | Default |
|---|---|---|---|
| dev_mode | No | Whether to run latest code vs deployed version | |
| script_id | Yes | The script project ID | |
| parameters | No | Optional list of parameters to pass | |
| function_name | Yes | Name of function to execute | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses only the basic action. It does not explain that running a function may execute arbitrary code with side effects, act as the user (based on user_google_email), or affect user data. Annotations already signal destructive and not read-only, but the description fails to add useful context beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It efficiently communicates the primary action, though this conciseness comes at the cost of missing important behavioral and usage context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (running arbitrary script functions, potential side effects) and the existence of an output schema, the description is far too sparse. It doesn't explain what happens after execution, how errors are returned, or the implications of running code as the user. This is insufficient for an agent to safely and correctly use the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully describes all parameters (100% coverage), so the baseline is 3. The description adds no extra meaning about parameter relationships, like how dev_mode changes execution target or how parameters are passed. It simply restates the action without enriching schema semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb 'executes' and resource 'function in a deployed script', but the qualifier 'deployed' is inaccurate because the tool can also run latest code via dev_mode (as noted in the schema). This partial misstatement obscures the full scope, so it's not a fully reliable purpose statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There is no mention of prerequisites, such as needing a deployment or auth, and no reference to sibling tools that manage script projects or deployments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contactsSearch ContactsCRead-onlyIdempotent
Search contacts by name, email, phone number, or other fields.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query string (searches names, emails, phone numbers). | |
| page_size | No | Maximum number of results to return (default: 30, max: 30). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds no behavioral context beyond what annotations already provide. Annotations declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive, but the description only restates the search functionality without additional disclosures like result scope, pagination behavior, or user-specific data access.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that accurately conveys the core function. It is concise with no wasted words, well-suited for its simple purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the schema and annotations are enriched, the description fails to provide usage context. It does not distinguish itself from the closely related list_contacts tool, leaving a gap in how the agent should choose between them. For a tool with many siblings, more explicit context is expected.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter having a helpful description. The main description's mention of name, email, and phone number is redundant with the query parameter description, adding no new semantic value. Baseline of 3 applies given the strong schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches contacts by name, email, phone number, or other fields, giving a specific verb and resource. However, it does not differentiate from sibling tools like list_contacts or get_contact, so it lacks explicit sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use search_contacts versus list_contacts or get_contact. There are no alternatives mentioned, exclusions, or contextual triggers for choosing this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_customSearch CustomCRead-onlyIdempotent
Performs a search using Google Custom Search JSON API.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | The search query. Required. | |
| num | No | Number of results to return (1-10). Defaults to 10. | |
| safe | No | Safe search level. Defaults to "off". | off |
| sites | No | List of sites/domains to restrict search to (e.g., ["example.com", "docs.example.com"]). When provided, results are limited to these sites. | |
| start | No | The index of the first result to return (1-based). Defaults to 1. | |
| country | No | Country code for results (e.g., "countryUS"). | |
| language | No | Language code for results (e.g., "lang_en"). | |
| file_type | No | Filter by file type (e.g., "pdf", "doc"). | |
| search_type | No | Search for images if set to "image". | |
| site_search | No | Restrict search to a specific site/domain. | |
| date_restrict | No | Restrict results by date (e.g., "d5" for past 5 days, "m3" for past 3 months). | |
| user_google_email | Yes | The user's Google email address. Required. | |
| site_search_filter | No | Exclude ("e") or include ("i") site_search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description adds no extra behavioral context beyond the generic fact that it performs a search. It does not address rate limits, result variability, or how the openWorld hint impacts results, so the description contributes no value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence that is easy to parse and free of redundant information. It efficiently states the core purpose, but is so terse that it lacks any usage guidance. It is appropriately sized for a simple tool though not maximally informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (13 parameters, output schema present), the minimal description is sufficient for basic invocation, especially with the schema handling parameter details. However, it lacks any context about when to choose this tool over other search tools, and the return format is not summarized. The description meets a minimum viable threshold but has clear gaps in usability guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% parameter description coverage, with each of the 13 parameters clearly described. The tool description itself adds no parameter-specific information. Baseline 3 is appropriate since the schema carries the full burden for parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Performs a search') and identifies the specific API ('Google Custom Search JSON API'). This distinguishes it from sibling search tools that target specific services like Gmail or Drive, though the exact scope of results (e.g., web search vs. other content) is not explicitly stated. It is more specific than a vague 'search' but lacks detailed differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like search_gmail_messages or search_drive_files, nor any mention of prerequisites or exclusions. The description does not help an agent decide between this and other search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch DocsARead-onlyIdempotent
Searches for Google Docs by name using Drive API (mimeType filter).
Returns: str: A formatted list of Google Docs matching the search query.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| page_size | No | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, read-only, idempotent operation. The description adds that it uses the Drive API with a mimeType filter and returns a formatted list, but it does not elaborate on pagination behavior, auth requirements, or what 'formatted list' entails. With annotations covering the safety profile, the description adds only modest extra behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the core action, and contains no fluff or redundancy. It efficiently states what the tool does and what it returns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With three parameters, 0% schema description coverage, and an output schema present, the description is too thin. It explains the query as a name search but omits usage context for required parameters like user_google_email and does not specify how page_size affects results. This is insufficient for reliable tool invocation without external knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for missing parameter explanations. It clarifies that 'query' is a name search, but it fails to explain 'page_size' and especially 'user_google_email' (a required parameter). This leaves the agent unsure how to populate essential inputs correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches for Google Docs by name using Drive API with a mimeType filter. This distinguishes it from broader file search (search_drive_files) and Gmail search, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for finding Google Docs specifically by name, providing clear context for when to use it. However, it does not explicitly mention alternatives or when not to use it, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_drive_filesSearch Drive FilesARead-onlyIdempotent
Searches for files and folders within a user's Google Drive, including shared drives.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The search query string. Supports Google Drive search operators. NOTE: Owner-based queries ('user@example.com' in owners) DO NOT WORK in Shared Drives because files are owned by the shared drive itself, not individual users. For recent files by a specific user in Shared Drives, search by modifiedTime and use order_by='modifiedTime desc' instead. | |
| corpora | No | Bodies of items to query (e.g., 'user', 'domain', 'drive', 'allDrives'). If 'drive_id' is specified and 'corpora' is None, it defaults to 'drive'. Otherwise, Drive API default behavior applies. Prefer 'user' or 'drive' over 'allDrives' for efficiency. | |
| detailed | No | Whether to include size, modified time, and link in results. Defaults to True. | |
| drive_id | No | ID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`. | |
| order_by | No | Sort order. Comma-separated list of sort keys with optional 'desc' modifier. Valid keys: 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', 'viewedByMeTime'. Example: 'modifiedTime desc' or 'folder,modifiedTime desc,name'. Defaults to None (Drive API default ordering). | |
| file_type | No | Restrict results to a specific file type. Accepts a friendly name ('folder', 'document'/'doc', 'spreadsheet'/'sheet', 'presentation'/'slides', 'form', 'drawing', 'pdf', 'shortcut', 'script', 'site', 'jam'/'jamboard') or any raw MIME type string (e.g. 'application/pdf'). Defaults to None (all types). | |
| page_size | No | The maximum number of files to return. Defaults to 10. | |
| page_token | No | Page token from a previous response's nextPageToken to retrieve the next page of results. | |
| include_trashed | No | Whether to include files in the trash. Defaults to False, matching the Drive web UI and `list_drive_items`. Ignored when `query` already contains its own `trashed` clause (`=` or `!=`), which always wins. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| include_items_from_all_drives | No | Whether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and idempotentHint=true, so the description's mention of 'including shared drives' adds a useful scope detail not covered by annotations. However, the description does not disclose search limitations (e.g., owner-based query issues) or pagination behavior; those are left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that conveys the essential action and scope without any wasted words. It is concise and appropriately sized for the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema (11 params, 100% coverage), the presence of an output schema, and strong annotations, the description needs only to clarify purpose and scope. It does so effectively by specifying files/folders and shared drives. It could mention more about search behavior, but the schema covers the gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The top-level description does not add parameter semantics; all parameter meaning is already fully documented in the input schema, including examples, defaults, and notes on query operators.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Searches for files and folders within a user's Google Drive, including shared drives.' This uses a specific verb ('Searches') and resource (files/folders in Google Drive) and distinguishes it from sibling tools like list_drive_items by emphasizing search functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for searching Google Drive files but does not explicitly mention when to use this tool versus alternatives (e.g., list_drive_items or search_docs). It lacks direct exclusions or recommendations for choosing between tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_gmail_messagesSearch Gmail MessagesARead-onlyIdempotent
Searches messages in a user's Gmail account based on a query. Returns both Message IDs and Thread IDs for each found message, along with Gmail web interface links for manual verification. Supports pagination via page_token parameter.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The search query. Supports standard Gmail search operators. | |
| page_size | No | The maximum number of messages to return. Defaults to 10. | |
| page_token | No | Token for retrieving the next page of results. Use the next_page_token from a previous response. | |
| include_headers | No | If True, also fetch each message's metadata and include Subject, From, and Date per result. Costs one metadata get per result, grouped into HTTP batches of up to 10, plus retries for transient failures. Defaults to False (output unchanged from prior versions). | |
| user_google_email | Yes | The user's Google email address. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation read-only and idempotent. The description adds meaningful behavioral details: the return of both Message IDs and Thread IDs, Gmail web links for manual verification, and pagination support. It does not disclose potential rate limits or the additional cost of fetching headers, but the schema covers the include_headers behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the primary action, and contains no redundant information. Every sentence earns its place: purpose, return value, and pagination feature.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and full schema parameter descriptions, the description provides sufficient context for a search tool. It covers the main purpose, return values, and pagination. It does not mention include_headers, but that parameter's behavior is fully described in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are fully documented in the schema. The description mentions query and page_token but adds no new semantics beyond what the schema already provides, such as Gmail search operator support or pagination token usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches a user's Gmail messages based on a query, returns Message IDs and Thread IDs, and provides web links for verification. It uses specific verbs and resources, distinguishing it from sibling tools that fetch content or manage labels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clarifies the search context and mentions pagination but does not explicitly contrast with sibling tools like get_gmail_message_content or search_drive_files. No when-not-to-use scenarios or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_messagesSearch MessagesARead-onlyIdempotent
Searches for messages in Google Chat spaces by text content and/or time range.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional text to search for. If omitted, only time_filter is applied. | |
| space_id | No | Optional space to restrict the search to. | |
| page_size | No | Maximum number of messages to return per space. | |
| max_spaces | No | Maximum number of spaces to search when space_id is not provided (default 10). | |
| time_filter | No | Optional filter using Chat API createTime syntax. Examples: 'createTime > "2026-03-18T00:00:00-03:00"' 'createTime > "2026-03-18T00:00:00-03:00" AND createTime < "2026-03-19T00:00:00-03:00"' | |
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive nature of the tool. The description adds that it searches by text/time and across spaces, which is useful, but it does not disclose additional behavioral details like pagination, rate limits, or multi-space scoping beyond what the schema already indicates. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence: 'Searches for messages in Google Chat spaces by text content and/or time range.' It is front-loaded with the verb and resource, contains no filler or redundant phrases, and every word contributes to understanding the tool's core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of a rich output schema, detailed parameter descriptions, and annotations, the description is adequate for an agent to select and invoke the tool. It captures the essential search capability and differentiates from siblings, though it does not explicitly mention cross-space search or pagination—details available in the schema. The overall package is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so parameters are well-documented (e.g., query optional, time_filter syntax, max_spaces defaults). The description adds a high-level mapping of 'text content' to query and 'time range' to time_filter, which is helpful but does not add new meaning beyond the existing schema documentation. The baseline is 3 due to high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Searches for messages in Google Chat spaces by text content and/or time range.' It specifies the resource (messages in Google Chat spaces) and the two search dimensions (text content, time range), distinguishing it from Gmail search and other message-related tools like get_messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: searching for Chat messages by content or time. However, it does not explicitly mention alternatives or exclusion scenarios (e.g., 'use get_messages to fetch a specific thread' or 'use search_gmail_messages for email'). The context is clear but lacks explicit 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.
send_gmail_messageSend Gmail MessageA
Sends an email using the user's Gmail account. Supports new emails, replies, and forwards, with optional attachments. Supports Gmail's "Send As" feature to send from configured alias addresses.
To forward an existing message, pass forward_message_id. The original subject, body (quoted with a "Forwarded message" header), and attachments are carried over. In forward mode, body (if any) is prepended as a note and subject is optional. Threading, reply, and signature options do not apply when forwarding.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Optional CC email address. | |
| to | No | Recipient email address. Optional when replying with reply_all=True, which derives it from the thread. | |
| bcc | No | Optional BCC email address. | |
| body | No | Email body content (plain text or HTML). Required when sending. When forwarding, this is an optional note prepended above the quoted original. | |
| subject | No | Email subject. Required when sending; optional when forwarding (defaults to 'Fwd: <original subject>'). | |
| from_name | No | Optional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'. | |
| reply_all | No | Whether to derive reply-all recipients from the thread: To = the sender being replied to, Cc = the other participants, excluding the authenticated account and from_email. Requires thread_id. Explicit to/cc win; when cc is omitted the sender being replied to is added to the derived Cc if they are not already in To. Defaults to false. | |
| thread_id | No | Optional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID. | |
| from_email | No | Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email. | |
| references | No | Optional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target. | |
| attachments | No | Optional list of attachments. Each can have: "url" (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR "path" (file path, auto-encodes), OR "content" (standard base64, not urlsafe) + "filename". Optional "mime_type". Optional "content_id" (string) makes the attachment inline-rendered: it lands in a multipart/related part with `Content-ID: <content_id>` and `Content-Disposition: inline`, and the HTML body can reference it via `<img src="cid:<content_id>">` (RFC 2392). Without `content_id` the attachment is a regular multipart/mixed attachment. Example: [{"url": "https://host/attachments/abc-123", "filename": "report.pdf"}] | |
| body_format | No | Format of the body content (and of the prepended note when forwarding). Use 'plain' for plaintext or 'html' for HTML content. | plain |
| in_reply_to | No | Optional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id. | |
| quote_original | No | Whether to include the message being replied to as a quoted original. Only has an effect when thread_id is provided. Defaults to false. | |
| include_signature | No | Whether to append the Gmail signature from Settings > Signature when available. Defaults to true. | |
| user_google_email | Yes | The user's Google email address. Required for authentication. | |
| forward_message_id | No | Set to a Gmail message ID to forward that message instead of composing a new one. The original subject, body, and (optionally) attachments are carried over; 'body' becomes an optional note prepended to the forward. | |
| include_forwarded_attachments | No | When forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutating, non-idempotent operation, but the description adds useful behavioral detail: forward mode carries over the original subject, quotes the body with a 'Forwarded message' header, optionally includes attachments, and disables threading/reply/signature options. This goes beyond the annotations and helps the agent predict side effects. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the core action, followed by a focused paragraph on forward-mode behavior. Every sentence earns its place, with no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (18 parameters, multiple modes), the description provides a solid orientation to new/reply/forward and alias sending, while the highly detailed schema covers the remaining parameter-level semantics. An output schema exists, so the description does not need to explain return values. No critical calling context is missing for an agent to use this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics not fully captured in individual property descriptions: how forward mode treats body as a prepended note, which options are ignored, and the overall relationship between forward_message_id, subject, and body. This helps an agent reason about combinations of parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it 'Sends an email using the user's Gmail account.' It clearly identifies the main modes (new, reply, forward), attachments, and the 'Send As' alias feature, which distinguishes it from siblings like draft_gmail_message and the Chat-oriented send_message. An agent can immediately understand what this tool accomplishes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete usage direction for forwarding: pass forward_message_id, and explains that the original subject/body/attachments are carried over and that body becomes an optional note. It also notes which options do not apply when forwarding. However, it does not explicitly contrast this tool with draft_gmail_message or state when to prefer a reply versus a new message, leaving some selection inference to the reader.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageSend MessageB
Sends a message to a Google Chat space.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | Yes | ||
| thread_key | No | Reply in a thread by app-defined key (creates thread if not found). | |
| thread_name | No | Reply in an existing thread by its resource name (e.g. spaces/X/threads/Y). | |
| message_text | Yes | ||
| user_google_email | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds no behavioral context beyond what annotations already provide. It does not mention side effects, authentication needs, rate limits, or threading behavior. It is consistent with annotations (readOnlyHint false) but does not enrich the agent's understanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no redundant words. It is front-loaded and efficiently conveys the core purpose without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters (3 required) and no usage guidance, the description is too sparse. It does not explain the roles of space_id, user_google_email, or message_text, nor does it mention threading options beyond what the schema provides. Annotations and output schema do not compensate for the lack of contextual explanations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description offers no explanation of parameters. Schema coverage is only 40% (thread_key and thread_name have descriptions), leaving space_id, message_text, and user_google_email undocumented. The description does not compensate for this gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Sends a message to a Google Chat space' clearly identifies the specific verb (sends) and resource (Google Chat space). It distinguishes this tool from siblings like 'send_gmail_message' and Chat read tools such as 'get_messages'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. No mention of exclusions, prerequisites, or situations where another tool would be more appropriate. The description only states the basic action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_drive_file_permissionsSet Drive File PermissionsADestructive
Sets file-level sharing settings and controls link sharing for a Google Drive file or folder.
This is a high-level tool for the most common permission changes. Use this to toggle "anyone with the link" access or configure file-level sharing behavior. For managing individual user/group permissions, use share_drive_file or update_drive_permission instead.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | The ID of the file or folder. Required. | |
| link_sharing | No | Control "anyone with the link" access for the file. - "off": Disable "anyone with the link" access for this file. - "reader": Anyone with the link can view. - "commenter": Anyone with the link can comment. - "writer": Anyone with the link can edit. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| writers_can_share | No | Whether editors can change permissions and share. If False, only the owner can share. Defaults to None (no change). | |
| copy_requires_writer_permission | No | Whether viewers and commenters are prevented from copying, printing, or downloading. Defaults to None (no change). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds some context by noting it's a 'high-level tool for the most common permission changes' and that it handles link sharing. However, it does not disclose potential side effects like overwriting existing file-level settings or what exactly happens when link_sharing is set to 'off.' The description does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, two short paragraphs, with the main purpose front-loaded. Every sentence contributes useful information: the first defines the tool, the second clarifies scope and alternatives. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is incomplete due to the confusing requirement of user_google_email. It claims the tool is only for file-level link sharing, yet it requires a user email, which strongly suggests individual user permissions. This contradiction is not addressed, potentially leading an agent to misuse the tool. The description should explain why user_google_email is needed despite the stated scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter. The description does not explain why user_google_email is required if the tool is not for individual permissions, which is a notable gap. It adds no extra meaning beyond the schema, so it meets the baseline but does not elevate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Sets file-level sharing settings and controls link sharing for a Google Drive file or folder.' It uses specific verbs and identifies the resource. It distinguishes itself from sibling tools by labeling itself as a 'high-level tool for the most common permission changes' and explicitly naming alternatives for individual user/group permissions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use this to toggle "anyone with the link" access or configure file-level sharing behavior.' It also specifies when not to use it and names alternatives: 'For managing individual user/group permissions, use share_drive_file or update_drive_permission instead.' This is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_publish_settingsSet Publish SettingsB
Updates the publish settings of a form.
| Name | Required | Description | Default |
|---|---|---|---|
| form_id | Yes | The ID of the form to update publish settings for. | |
| is_published | No | Whether the form is published and visible to responders. Defaults to True. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| is_accepting_responses | No | Whether the form accepts responses. Only takes effect when the form is published. Defaults to True. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false, but the description adds no extra behavioral context, such as side effects on existing responses, required permissions, or whether changes are reversible. It does not contradict annotations, but fails to enrich them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no fluff. However, it is arguably too terse for a tool with four parameters and no guidance, though conciseness itself is well-executed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The presence of an output schema and complete parameter descriptions lowers the burden on the description. Still, the description does not explain when to use this tool instead of batch_update_form, nor the implications of altering publish settings. It is minimally sufficient for a simple tool but leaves gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description provides no additional parameter meaning; the schema's own field descriptions fully document form_id, is_published, user_google_email, and is_accepting_responses.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Updates' and a specific resource 'publish settings' targeting 'a form'. This clearly distinguishes it from broader tools like batch_update_form, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as batch_update_form or get_form. There are no exclusions or context cues to help an agent choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_google_authStart Google AuthA
Manually initiate Google OAuth authentication flow.
NOTE: This is a legacy OAuth 2.0 tool and is disabled when OAuth 2.1 is enabled. The authentication system automatically handles credential checks and prompts for authentication when needed. Only use this tool if:
You need to re-authenticate with different credentials
You want to proactively authenticate before using other tools
The automatic authentication flow failed and you need to retry
In most cases, simply try calling the Google Workspace tool you need - it will automatically handle authentication if required.
| Name | Required | Description | Default |
|---|---|---|---|
| service_name | Yes | ||
| user_google_email | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond annotations: it's a legacy tool, disabled with OAuth 2.1, and the system already auto-handles auth. This clarifies when the manual initiation is appropriate, which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening statement, a note about legacy status, and a numbered list of use cases. Every sentence adds value, and the alternative guidance is succinct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's narrow scope and presence of an output schema, the description covers purpose, usage conditions, and important limitations. The main gap is parameter details, but the overall context is sufficient for an agent to decide when to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description adds no guidance on the meaning or usage of `service_name` and `user_google_email`. While parameter names are somewhat self-explanatory, the description completely ignores them, failing to compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: "Manually initiate Google OAuth authentication flow." This specific verb+resource phrasing distinguishes it from all sibling tools, which are service-specific operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance. It lists three specific conditions for use and explicitly points to alternatives: "simply try calling the Google Workspace tool you need - it will automatically handle authentication if required."
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_drive_fileUpdate Drive FileADestructive
Updates metadata, properties, and/or content of a Google Drive file.
Providing one of content, file_path, or file_url replaces the file's
content in place, preserving the existing file ID, sharing, comments, and links.
For native Google Docs/Sheets/Slides the source is uploaded with its source MIME
type so the Drive API applies the same format conversion as import_to_google_doc
(markdown headings, tables, bold, etc.). For any other file (.md, .txt, .pdf, ...)
there is nothing to convert, so the bytes are written back as-is under the file's
own MIME type. Metadata and content can be updated in a single call.
mode='append'/'prepend' splice content onto the file's existing text
server-side, so only the new text has to be supplied — no need to send the whole
file back to rewrite it.
Drive shortcuts are handled according to the kind of update: supported resource-local metadata changes (rename, move, trash, star, description, and custom properties) apply to the supplied shortcut, while content replacement follows the shortcut and updates its target. To avoid applying metadata to the wrong resource, a shortcut call cannot combine content with resource-local metadata. Update the shortcut metadata and target content in separate calls.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | How to apply the new content — 'replace' (default), 'append', or 'prepend'. Append/prepend require 'content' and a UTF-8 text file such as .md or .txt; a newline is inserted at the seam if neither side has one. For native Google Docs use insert_doc_elements, modify_doc_text, or find_and_replace_doc, which edit in place instead of rewriting the file. | replace |
| name | No | New name for the file. | |
| content | No | New text content for text-based formats (markdown, TXT, HTML). | |
| file_id | Yes | The ID of the file to update. Required. | |
| starred | No | Whether to star/unstar the file. | |
| trashed | No | Whether to move file to/from trash. | |
| file_url | No | Remote http(s) URL to fetch new content from. | |
| file_path | No | Local file path for binary formats (DOCX, ODT). Supports file:// URLs. | |
| mime_type | No | New MIME type (note: changing type may require content upload). For a shortcut ID, this must accompany content and applies to the resolved target. | |
| properties | No | Custom key-value properties for the file. | |
| add_parents | No | Comma-separated folder IDs to add as parents. | |
| description | No | New description for the file. | |
| source_format | No | Source format hint for conversion (md, markdown, docx, txt, html, rtf, odt). Auto-detected when omitted, and ignored for non-Google files, which are uploaded without conversion. Provide at most one of content/file_path/file_url. | |
| remove_parents | No | Comma-separated folder IDs to remove from parents. | |
| user_google_email | Yes | The user's Google email address. Required. | |
| writers_can_share | No | Whether editors can share the file. Pass the target ID directly; this cannot be changed on a shortcut resource. | |
| copy_requires_writer_permission | No | Whether copying requires writer permission. Pass the target ID directly; this cannot be changed on a shortcut resource. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, readOnlyHint=false), the description discloses important behaviors: replacement happens in place while preserving file ID, sharing, comments, and links; source MIME conversion applies for native formats; append/prepend splice server-side; and shortcut updates route content to the target while metadata applies locally. This is rich behavioral context that materially shapes how an agent should invoke the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense and well-organized into focused paragraphs: core behavior, conversion semantics, append/prepend behavior, and shortcut handling. Almost every sentence adds operational value, though a few points such as 'there is nothing to convert' are slightly explanatory rather than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity tool with 17 parameters, destructive behavior, shortcut edge cases, and format-conversion nuances, the description covers the critical decision points an agent needs. An output schema exists, so return-value documentation is not required here. The combination of rich annotations, full schema coverage, and this description makes the tool fully navigable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter individually. The description adds cross-parameter meaning that the schema does not: 'content', 'file_path', and 'file_url' are mutually exclusive for content replacement, metadata and content can be updated in one call, and shortcut-specific restrictions on combining content with resource-local metadata. This justifies a score above the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Updates metadata, properties, and/or content of a Google Drive file.' It further distinguishes content replacement from metadata updates and explains how native Google formats are converted, which separates this tool from siblings like import_to_google_doc and modify_doc_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names alternatives: for native Google Docs append/prepend it directs agents to insert_doc_elements, modify_doc_text, or find_and_replace_doc, and it references import_to_google_doc for conversion behavior. It also states when not to combine operations, as with shortcuts, making the when-to-use guidance unusually concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_paragraph_styleUpdate Paragraph StyleA
Apply paragraph-level formatting, heading styles, and/or list formatting to a range in a Google Doc.
This tool can apply named heading styles (H1-H6) for semantic document structure, create bulleted or numbered lists with nested indentation, and customize paragraph properties like alignment, spacing, and indentation. All operations can be applied in a single call.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional document tab ID to target | |
| alignment | No | Text alignment - 'START' (left), 'CENTER', 'END' (right), or 'JUSTIFIED' | |
| direction | No | Paragraph direction - 'LEFT_TO_RIGHT' or 'RIGHT_TO_LEFT' | |
| end_index | Yes | End position (exclusive) - should cover the entire paragraph | |
| list_type | No | Create a list from existing paragraphs ('UNORDERED' for bullets, 'ORDERED' for numbers, 'CHECKBOX' for checklists) | |
| indent_end | No | Right/end indent in points | |
| segment_id | No | Optional header/footer/footnote segment ID to target | |
| border_dash | No | Border dash style ('SOLID', 'DOT', or 'DASH'; defaults to 'SOLID') | |
| document_id | Yes | Document ID to modify | |
| space_above | No | Space above paragraph in points (e.g., 12 for one line) | |
| space_below | No | Space below paragraph in points | |
| start_index | Yes | Start position using Docs API indices from inspect_doc_structure. For the main body, 0 is also accepted as an alias for the first writable position. | |
| border_color | No | Border color (#RRGGBB; defaults to black) | |
| border_edges | No | Paragraph border edges to update ('top', 'bottom', 'left', 'right', or 'between'); omit to update all four outer edges | |
| border_width | No | Border width in points (defaults to 1) | |
| indent_start | No | Left/start indent in points | |
| line_spacing | No | Line spacing multiplier (1.0 = single, 1.5 = 1.5x, 2.0 = double) | |
| spacing_mode | No | 'NEVER_COLLAPSE' or 'COLLAPSE_LISTS' | |
| bullet_preset | No | Optional explicit Google Docs bullet preset | |
| heading_level | No | Heading level 0-6 (0 = NORMAL_TEXT, 1 = H1, 2 = H2, etc.) Use for semantic document structure | |
| shading_color | No | Paragraph shading/background color (#RRGGBB) | |
| border_padding | No | Border padding in points (defaults to 4) | |
| keep_with_next | No | Keep the paragraph with the next paragraph | |
| named_style_type | No | Direct named style type - 'NORMAL_TEXT', 'TITLE', 'SUBTITLE', 'HEADING_1' through 'HEADING_6'. Mutually exclusive with heading_level. | |
| indent_first_line | No | First line indent in points (e.g., 36 for 0.5 inch) | |
| page_break_before | No | Start the paragraph on a new page | |
| user_google_email | Yes | User's Google email address | |
| list_nesting_level | No | Nesting level for lists (0-8, where 0 is top level, default is 0) Use higher levels for nested/indented list items | |
| keep_lines_together | No | Keep all lines of the paragraph together | |
| avoid_widow_and_orphan | No | Avoid widows/orphans for the paragraph |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, so the agent knows this is a mutation. The description adds that multiple formatting operations can be combined in a single call, which is useful context. However, it does not disclose potential side effects, permissions, or behavior on invalid indices.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no redundant text. Efficiently summarizes the tool's capability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 30 parameters and an output schema, and the schema fully documents parameters. The description provides a clear high-level overview of the tool's purpose and combinations, though it could mention using indices from inspect_doc_structure but that's already in the parameter description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter having a description. The tool description adds no parameter-specific semantics beyond what the schema already provides, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Apply') and names the resource ('paragraph-level formatting, heading styles, and/or list formatting to a range in a Google Doc'). It clearly differentiates from sibling tools that handle text insertion or document-wide updates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating what it can do and that all operations can be applied in a single call, but it does not explicitly name alternative tools or exclusion criteria. It provides clear context for when to choose this tool for paragraph styling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_script_contentUpdate Script ContentADestructive
Update or create files in a script project.
By default this merges the supplied files into the existing project by file
name, leaving other files untouched. Set merge=False to replace the entire
project: any existing file omitted from files is permanently deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | File objects with name, type, and source to create or update | |
| merge | No | When True (default), overlay these files onto the current project. When False, replace the full project file set; omitted files are deleted. | |
| script_id | Yes | The script project ID | |
| user_google_email | Yes | User's email address |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true; the description adds crucial context by stating that with merge=False, any existing file omitted from `files` is permanently deleted. It also clarifies that default is non-destructive (leaving other files untouched), which is beyond annotation info.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and efficiently communicates the key merge/replace distinction without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with full schema coverage, annotations, and an output schema, the description sufficiently covers the essential behavior (merge vs replace and deletion). It lacks only explicit prerequisites or alternative tool references, but these are not necessary given the context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with detailed descriptions, including the merge behavior identical to the description. The description adds no extra parameter semantics beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update or create files in a script project' with a specific verb and resource, and distinguishes from sibling tools like create_script_project and delete_script_project by focusing on file-level updates within an existing project. The merge behavior further clarifies scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the default merge behavior and the alternative merge=False replacement, giving clear context for when to use this tool. However, it does not explicitly exclude alternatives like creating a new project with create_script_project, so it lacks explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
12 tool updates
v1.25.2- Changed
batch_modify_gmail_message_labels3 fields changed- removed
Input schema / properties / add_label_ids / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / remove_label_ids / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Input schema / properties / verifyAdded value: +{ + "default": true, + "description": "Read the messages back and report per-id outcomes. Costs\none extra (batched) read per id. Set False for very large sweeps\nwhere that cost matters and an unverified result is acceptable.", + "type": "boolean" +}
- Changed
create_drive_file1 field changed- added
Input schema / properties / base64_sha256Added value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks." +}
- Changed
draft_gmail_message4 fields changed- changed
Input schema / properties / from_email / descriptionPrevious value: -"Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email."New value: +"Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the account's default Send As address, falling back to the authenticated user's email when Gmail returns no usable Send-As entry or settings access is not authorized." - changed
Input schema / properties / in_reply_to / descriptionPrevious value: -"Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')."New value: +"Optional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id." - changed
Input schema / properties / references / descriptionPrevious value: -"Optional chain of Message-IDs for proper threading."New value: +"Optional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target." - changed
Input schema / properties / thread_id / descriptionPrevious value: -"Optional Gmail thread ID to reply within."New value: +"Optional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID."
- Changed
get_events3 fields changed- changed
Input schema / properties / detailed / descriptionPrevious value: -"Whether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also report the parent series ID needed to edit the whole series, and events that are not ordinary confirmed meetings report their event type (outOfOffice, workingLocation, focusTime) and status. Defaults to False."New value: +"Whether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also report the parent series ID needed to edit the whole series; recurring masters report their raw RFC5545 recurrence rules; and events that are not ordinary confirmed meetings report their event type (outOfOffice, workingLocation, focusTime) and status. Defaults to False." - added
Input schema / properties / single_eventsAdded value: +{ + "default": true, + "description": "Whether to expand recurring series into individual instances. Defaults to True for backwards compatibility. Set to False with detailed=True to retrieve recurring master events and their exact RFC5545 recurrence rules instead of inferring cadence from expanded instances.", + "type": "boolean" +} - changed
Input schema / properties / time_min / descriptionPrevious value: -"The start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time. Ignored if event_id is provided."New value: +"The start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time when single_events=True. It is omitted from unexpanded queries so recurring masters that began in the past but still have future occurrences remain discoverable. Ignored if event_id is provided."
- Changed
import_to_google_doc2 fields changed- added
Input schema / properties / base64_contentAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Standard base64-encoded bytes for a binary source such as DOCX or ODT." +} - added
Input schema / properties / base64_sha256Added value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks." +}
- Changed
import_to_google_sheets2 fields changed- added
Input schema / properties / base64_contentAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Standard base64-encoded bytes for an XLSX, XLS, or ODS source." +} - added
Input schema / properties / base64_sha256Added value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks." +}
- Changed
import_to_google_slides2 fields changed- added
Input schema / properties / base64_contentAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Standard base64-encoded bytes for a PPTX or ODP source." +} - added
Input schema / properties / base64_sha256Added value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks." +}
- Changed
list_gmail_labels3 fields changed- added
Input schema / properties / compactAdded value: +{ + "default": false, + "description": "Return minimal JSON {\"count\", \"labels\": [{\"id\", \"name\"}]}\nsorted by name, instead of the formatted text list. For callers\nthat parse the result, e.g. a label cache refresh.", + "type": "boolean" +} - added
Input schema / properties / include_systemAdded value: +{ + "default": true, + "description": "Include Gmail system labels (INBOX, SENT, ...).\nSet False to return user labels only.", + "type": "boolean" +} - added
Input schema / properties / prefixAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Return only labels whose name starts with this\nexact (case-sensitive) string. users.labels.list accepts no filter,\nso the full list is fetched and narrowed here: this shrinks what the\ncaller receives, not the API call." +}
- Changed
manage_event3 fields changed- added
Input schema / properties / end_timezoneAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "IANA timezone for the end boundary only,\noverriding timezone. See start_timezone." +} - added
Input schema / properties / start_timezoneAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "IANA timezone for the start boundary only,\noverriding timezone. Use for events whose two ends sit in different zones -\na flight departing 13:45 \"Asia/Jerusalem\" and landing 17:50\n\"Europe/Amsterdam\" is one event authored in two zones. Passing a single\ntimezone for such an event silently rewrites one end's wall-clock." +} - changed
Input schema / properties / timezone / descriptionPrevious value: -"Timezone (e.g., \"America/New_York\")."New value: +"IANA timezone applied to both boundaries (e.g.,\n\"America/New_York\"). Overridden per boundary by start_timezone/end_timezone."
- Changed
modify_gmail_message_labels2 fields changed- removed
Input schema / properties / add_label_ids / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / remove_label_ids / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]
- Changed
send_gmail_message3 fields changed- changed
Input schema / properties / in_reply_to / descriptionPrevious value: -"Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')."New value: +"Optional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id." - changed
Input schema / properties / references / descriptionPrevious value: -"Optional chain of Message-IDs for proper threading."New value: +"Optional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target." - changed
Input schema / properties / thread_id / descriptionPrevious value: -"Optional Gmail thread ID to reply within."New value: +"Optional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID."
- Changed
update_drive_file3 fields changed- changed
Input schema / properties / copy_requires_writer_permission / descriptionPrevious value: -"Whether copying requires writer permission."New value: +"Whether copying requires writer\npermission. Pass the target ID directly; this cannot be changed on a\nshortcut resource." - changed
Input schema / properties / mime_type / descriptionPrevious value: -"New MIME type (note: changing type may require content upload)."New value: +"New MIME type (note: changing type may require\ncontent upload). For a shortcut ID, this must accompany content and applies\nto the resolved target." - changed
Input schema / properties / writers_can_share / descriptionPrevious value: -"Whether editors can share the file."New value: +"Whether editors can share the file. Pass the\ntarget ID directly; this cannot be changed on a shortcut resource."
8 tool updates
v1.24.0- Changed
batch_update_doc1 field changed- changed
Input schema / properties / operations / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "end_of_segment": { - "default": false, - "description": "Append to the end of the targeted body/segment instead of using index.", - "type": "boolean" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "text": { - "description": "Text to insert.", - "type": "string" - }, - "type": { - "const": "insert_text", - "type": "string" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_index": { - "type": "integer" - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "delete_text", - "type": "string" - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_index": { - "type": "integer" - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "text": { - "description": "Replacement text.", - "type": "string" - }, - "type": { - "const": "replace_text", - "type": "string" - } - }, - "required": [ - "type", - "start_index", - "end_index", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "background_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "baseline_offset": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "bold": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "clear_link": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "end_index": { - "type": "integer" - }, - "font_family": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "font_size": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "font_weight": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "italic": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "link_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "small_caps": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "start_index": { - "type": "integer" - }, - "strikethrough": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "text_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "type": { - "const": "format_text", - "type": "string" - }, - "underline": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "alignment": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "avoid_widow_and_orphan": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "direction": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "end_index": { - "type": "integer" - }, - "heading_level": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "indent_end": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "indent_first_line": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "indent_start": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "keep_lines_together": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "keep_with_next": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "line_spacing": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "named_style_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_break_before": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "shading_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "space_above": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "space_below": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "spacing_mode": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "update_paragraph_style", - "type": "string" - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "background_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "border_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "border_width": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "column_index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "column_span": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "content_alignment": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "padding_bottom": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "padding_left": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "padding_right": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "padding_top": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "row_index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "row_span": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "update_table_cell_style", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "columns": { - "type": "integer" - }, - "end_of_segment": { - "default": false, - "description": "Append to the end of the targeted body/segment instead of using index.", - "type": "boolean" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "rows": { - "type": "integer" - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "insert_table", - "type": "string" - } - }, - "required": [ - "type", - "rows", - "columns" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "insert_below": { - "default": true, - "type": "boolean" - }, - "row_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "insert_table_row", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "row_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "delete_table_row", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_index": { - "type": "integer" - }, - "insert_right": { - "default": true, - "type": "boolean" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "insert_table_column", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "column_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "delete_table_column", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "column_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_index": { - "type": "integer" - }, - "column_span": { - "type": "integer" - }, - "row_index": { - "type": "integer" - }, - "row_span": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "merge_table_cells", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_index", - "column_index", - "row_span", - "column_span" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_index": { - "type": "integer" - }, - "column_span": { - "type": "integer" - }, - "row_index": { - "type": "integer" - }, - "row_span": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "unmerge_table_cells", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_index", - "column_index", - "row_span", - "column_span" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_indices": { - "items": { - "type": "integer" - }, - "type": "array" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "update_table_column_properties", - "type": "string" - }, - "width": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "width_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type", - "table_start_index", - "column_indices" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "min_row_height": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Minimum row height in points." - }, - "row_indices": { - "description": "Zero-based row indices to style, e.g. [0] for the header row.", - "items": { - "type": "integer" - }, - "type": "array" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "update_table_row_style", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "row_indices" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "pinned_header_rows_count": { - "description": "Number of leading rows to pin as a repeating header on each page. 0 unpins all rows. Use this dedicated request because the 'tableHeader' value reported in TableRowStyle cannot be set through UpdateTableRowStyleRequest.", - "minimum": 0, - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "table_start_index": { - "type": "integer" - }, - "type": { - "const": "pin_table_header_rows", - "type": "string" - } - }, - "required": [ - "type", - "table_start_index", - "pinned_header_rows_count" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_of_segment": { - "default": false, - "description": "Append to the end of the body instead of using index.", - "type": "boolean" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "insert_page_break", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_of_segment": { - "default": false, - "description": "Append to the end of the body instead of using index.", - "type": "boolean" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "section_type": { - "default": "NEXT_PAGE", - "enum": [ - "CONTINUOUS", - "NEXT_PAGE" - ], - "type": "string" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "insert_section_break", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "find_text": { - "type": "string" - }, - "match_case": { - "default": false, - "type": "boolean" - }, - "replace_text": { - "type": "string" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "find_replace", - "type": "string" - } - }, - "required": [ - "type", - "find_text", - "replace_text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bullet_preset": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "end_index": { - "type": "integer" - }, - "list_type": { - "default": "UNORDERED", - "enum": [ - "UNORDERED", - "ORDERED", - "CHECKBOX", - "NONE" - ], - "type": "string" - }, - "nesting_level": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "paragraph_start_indices": { - "anyOf": [ - { - "items": { - "type": "integer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "create_bullet_list", - "type": "string" - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "create_named_range", - "type": "string" - } - }, - "required": [ - "type", - "name", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "named_range_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "named_range_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "text": { - "type": "string" - }, - "type": { - "const": "replace_named_range_content", - "type": "string" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "named_range_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "named_range_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "delete_named_range", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "background_color": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "document_mode": { - "anyOf": [ - { - "enum": [ - "PAGES", - "PAGELESS" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "flip_page_orientation": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_bottom": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_footer": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_header": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_left": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_right": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_top": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_height": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_number_start": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_width": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "update_document_style", - "type": "string" - }, - "use_even_page_header_footer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "use_first_page_header_footer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "column_count": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "column_separator_style": { - "anyOf": [ - { - "enum": [ - "NONE", - "BETWEEN_EACH_COLUMN" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "column_spacing": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "content_direction": { - "anyOf": [ - { - "enum": [ - "LEFT_TO_RIGHT", - "RIGHT_TO_LEFT" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "end_index": { - "type": "integer" - }, - "flip_page_orientation": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_bottom": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_footer": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_header": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_left": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_right": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "margin_top": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null - }, - "page_number_start": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "start_index": { - "type": "integer" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "update_section_style", - "type": "string" - }, - "use_first_page_header_footer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type", - "start_index", - "end_index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "header_footer_type": { - "default": "DEFAULT", - "description": "Header/footer type to create.", - "enum": [ - "DEFAULT", - "FIRST_PAGE_ONLY", - "EVEN_PAGE" - ], - "type": "string" - }, - "section_break_index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional section break index for section-scoped layouts." - }, - "section_type": { - "description": "Which section to create.", - "enum": [ - "header", - "footer" - ], - "type": "string" - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "create_header_footer", - "type": "string" - } - }, - "required": [ - "type", - "section_type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "end_of_segment": { - "default": false, - "description": "Append to the end of the targeted body/segment instead of using index.", - "type": "boolean" - }, - "height": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - }, - "image_uri": { - "description": "Image URL or resolvable image URI.", - "type": "string" - }, - "index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Insertion index. Omit when end_of_segment=true." - }, - "segment_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." - }, - "tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional document tab ID to target." - }, - "type": { - "const": "insert_image", - "type": "string" - }, - "width": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "type", - "image_uri" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "index": { - "type": "integer" - }, - "parent_tab_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "title": { - "type": "string" - }, - "type": { - "const": "insert_doc_tab", - "type": "string" - } - }, - "required": [ - "type", - "title", - "index" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "tab_id": { - "type": "string" - }, - "type": { - "const": "delete_doc_tab", - "type": "string" - } - }, - "required": [ - "type", - "tab_id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "tab_id": { - "type": "string" - }, - "title": { - "type": "string" - }, - "type": { - "const": "update_doc_tab", - "type": "string" - } - }, - "required": [ - "type", - "tab_id", - "title" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "end_of_segment": { + "default": false, + "description": "Append to the end of the targeted body/segment instead of using index.", + "type": "boolean" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "text": { + "description": "Text to insert.", + "type": "string" + }, + "type": { + "const": "insert_text", + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_index": { + "type": "integer" + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "delete_text", + "type": "string" + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_index": { + "type": "integer" + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "text": { + "description": "Replacement text.", + "type": "string" + }, + "type": { + "const": "replace_text", + "type": "string" + } + }, + "required": [ + "type", + "start_index", + "end_index", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "background_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "baseline_offset": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "bold": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "clear_link": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "end_index": { + "type": "integer" + }, + "font_family": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "font_size": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "font_weight": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "italic": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "link_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "small_caps": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "start_index": { + "type": "integer" + }, + "strikethrough": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "text_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "type": { + "const": "format_text", + "type": "string" + }, + "underline": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "alignment": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "avoid_widow_and_orphan": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_dash": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_edges": { + "anyOf": [ + { + "items": { + "enum": [ + "top", + "bottom", + "left", + "right", + "between" + ], + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Paragraph border edges to update; omit to update top, bottom, left, and right." + }, + "border_padding": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "direction": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "end_index": { + "type": "integer" + }, + "heading_level": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "indent_end": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "indent_first_line": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "indent_start": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "keep_lines_together": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "keep_with_next": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "line_spacing": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "named_style_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_break_before": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "shading_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "space_above": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "space_below": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "spacing_mode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "update_paragraph_style", + "type": "string" + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "background_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "border_edges": { + "anyOf": [ + { + "items": { + "enum": [ + "top", + "bottom", + "left", + "right" + ], + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Table-cell border edges to update; omit to update all four edges." + }, + "border_width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "column_index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "column_span": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "content_alignment": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "padding_bottom": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "padding_left": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "padding_right": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "padding_top": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "row_index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "row_span": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "update_table_cell_style", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "columns": { + "type": "integer" + }, + "end_of_segment": { + "default": false, + "description": "Append to the end of the targeted body/segment instead of using index.", + "type": "boolean" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "rows": { + "type": "integer" + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "insert_table", + "type": "string" + } + }, + "required": [ + "type", + "rows", + "columns" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "insert_below": { + "default": true, + "type": "boolean" + }, + "row_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "insert_table_row", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "row_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "delete_table_row", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_index": { + "type": "integer" + }, + "insert_right": { + "default": true, + "type": "boolean" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "insert_table_column", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "column_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "delete_table_column", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "column_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_index": { + "type": "integer" + }, + "column_span": { + "type": "integer" + }, + "row_index": { + "type": "integer" + }, + "row_span": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "merge_table_cells", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_index", + "column_index", + "row_span", + "column_span" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_index": { + "type": "integer" + }, + "column_span": { + "type": "integer" + }, + "row_index": { + "type": "integer" + }, + "row_span": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "unmerge_table_cells", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_index", + "column_index", + "row_span", + "column_span" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_indices": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "update_table_column_properties", + "type": "string" + }, + "width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "width_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type", + "table_start_index", + "column_indices" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "min_row_height": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Minimum row height in points." + }, + "row_indices": { + "description": "Zero-based row indices to style, e.g. [0] for the header row.", + "items": { + "type": "integer" + }, + "type": "array" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "update_table_row_style", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "row_indices" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "pinned_header_rows_count": { + "description": "Number of leading rows to pin as a repeating header on each page. 0 unpins all rows. Use this dedicated request because the 'tableHeader' value reported in TableRowStyle cannot be set through UpdateTableRowStyleRequest.", + "minimum": 0, + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "table_start_index": { + "type": "integer" + }, + "type": { + "const": "pin_table_header_rows", + "type": "string" + } + }, + "required": [ + "type", + "table_start_index", + "pinned_header_rows_count" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_of_segment": { + "default": false, + "description": "Append to the end of the body instead of using index.", + "type": "boolean" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "insert_page_break", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_of_segment": { + "default": false, + "description": "Append to the end of the body instead of using index.", + "type": "boolean" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "section_type": { + "default": "NEXT_PAGE", + "enum": [ + "CONTINUOUS", + "NEXT_PAGE" + ], + "type": "string" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "insert_section_break", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "find_text": { + "type": "string" + }, + "match_case": { + "default": false, + "type": "boolean" + }, + "replace_text": { + "type": "string" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "find_replace", + "type": "string" + } + }, + "required": [ + "type", + "find_text", + "replace_text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bullet_preset": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "end_index": { + "type": "integer" + }, + "list_type": { + "default": "UNORDERED", + "enum": [ + "UNORDERED", + "ORDERED", + "CHECKBOX", + "NONE" + ], + "type": "string" + }, + "nesting_level": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "paragraph_start_indices": { + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "create_bullet_list", + "type": "string" + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "create_named_range", + "type": "string" + } + }, + "required": [ + "type", + "name", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "named_range_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "named_range_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "text": { + "type": "string" + }, + "type": { + "const": "replace_named_range_content", + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "named_range_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "named_range_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "delete_named_range", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "background_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "document_mode": { + "anyOf": [ + { + "enum": [ + "PAGES", + "PAGELESS" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "flip_page_orientation": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_bottom": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_footer": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_header": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_left": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_right": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_top": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_height": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_number_start": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "update_document_style", + "type": "string" + }, + "use_even_page_header_footer": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "use_first_page_header_footer": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "column_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "column_separator_style": { + "anyOf": [ + { + "enum": [ + "NONE", + "BETWEEN_EACH_COLUMN" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "column_spacing": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "content_direction": { + "anyOf": [ + { + "enum": [ + "LEFT_TO_RIGHT", + "RIGHT_TO_LEFT" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "end_index": { + "type": "integer" + }, + "flip_page_orientation": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_bottom": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_footer": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_header": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_left": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_right": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "margin_top": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "page_number_start": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "start_index": { + "type": "integer" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "update_section_style", + "type": "string" + }, + "use_first_page_header_footer": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type", + "start_index", + "end_index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "header_footer_type": { + "default": "DEFAULT", + "description": "Header/footer type to create.", + "enum": [ + "DEFAULT", + "FIRST_PAGE_ONLY", + "EVEN_PAGE" + ], + "type": "string" + }, + "section_break_index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional section break index for section-scoped layouts." + }, + "section_type": { + "description": "Which section to create.", + "enum": [ + "header", + "footer" + ], + "type": "string" + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "create_header_footer", + "type": "string" + } + }, + "required": [ + "type", + "section_type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "end_of_segment": { + "default": false, + "description": "Append to the end of the targeted body/segment instead of using index.", + "type": "boolean" + }, + "height": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "image_uri": { + "description": "Image URL or resolvable image URI.", + "type": "string" + }, + "index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Insertion index. Omit when end_of_segment=true." + }, + "segment_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'." + }, + "tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional document tab ID to target." + }, + "type": { + "const": "insert_image", + "type": "string" + }, + "width": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "type", + "image_uri" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "index": { + "type": "integer" + }, + "parent_tab_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "title": { + "type": "string" + }, + "type": { + "const": "insert_doc_tab", + "type": "string" + } + }, + "required": [ + "type", + "title", + "index" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "tab_id": { + "type": "string" + }, + "type": { + "const": "delete_doc_tab", + "type": "string" + } + }, + "required": [ + "type", + "tab_id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "tab_id": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "const": "update_doc_tab", + "type": "string" + } + }, + "required": [ + "type", + "tab_id", + "title" + ], + "type": "object" + } +]
- Changed
draft_gmail_message1 field changed- changed
Input schema / properties / quote_original / descriptionPrevious value: -"Whether to include the original message as a quoted reply. Requires thread_id. Defaults to false."New value: +"Whether to include the original message as a quoted reply. Only has an effect when thread_id is provided. Defaults to false."
- Changed
get_presentation1 field changed- added
Input schema / properties / include_speaker_notesAdded value: +{ + "default": false, + "description": "Also report each slide's speaker (presenter)\nnotes and the object ID of the shape holding them. Pass True when you\nneed to read or edit notes: that shape ID is the only valid target for\ninsertText/deleteText on notes, and batch_update_presentation writes\nnotes by deleting the shape's existing text and inserting new text.\nDefaults to False.", + "type": "boolean" +}
- Changed
modify_doc_text1 field changed- changed
Input schema / properties / font_size / typePrevious value: -"integer"New value: +"number"
- Changed
search_gmail_messages1 field changed- added
Input schema / properties / include_headersAdded value: +{ + "default": false, + "description": "If True, also fetch each message's metadata and include\nSubject, From, and Date per result. Costs one metadata get per result,\ngrouped into HTTP batches of up to 10, plus retries for transient failures.\nDefaults to False (output unchanged from prior versions).", + "type": "boolean" +}
- Changed
send_gmail_message7 fields changed- added
Input schema / properties / quote_originalAdded value: +{ + "default": false, + "description": "Whether to include the message being replied to as a quoted original. Only has an effect when thread_id is provided. Defaults to false.", + "type": "boolean" +} - added
Input schema / properties / reply_allAdded value: +{ + "default": false, + "description": "Whether to derive reply-all recipients from the thread: To = the sender being replied to, Cc = the other participants, excluding the authenticated account and from_email. Requires thread_id. Explicit to/cc win; when cc is omitted the sender being replied to is added to the derived Cc if they are not already in To. Defaults to false.", + "type": "boolean" +} - added
Input schema / properties / to / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / to / defaultAdded value: +null - changed
Input schema / properties / to / descriptionPrevious value: -"Recipient email address."New value: +"Recipient email address. Optional when replying with reply_all=True, which derives it from the thread." - removed
Input schema / properties / to / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "user_google_email", - "to" -]New value: +[ + "user_google_email" +]
- Changed
update_drive_file2 fields changed- added
Input schema / properties / modeAdded value: +{ + "default": "replace", + "description": "How to apply the new content — 'replace' (default), 'append', or\n'prepend'. Append/prepend require 'content' and a UTF-8 text file such as\n.md or .txt; a newline is inserted at the seam if neither side has one.\nFor native Google Docs use insert_doc_elements, modify_doc_text, or\nfind_and_replace_doc, which edit in place instead of rewriting the file.", + "type": "string" +} - changed
Input schema / properties / source_format / descriptionPrevious value: -"Source format hint for conversion\n(md, markdown, docx, txt, html, rtf, odt). Auto-detected when omitted.\nProvide at most one of content/file_path/file_url."New value: +"Source format hint for conversion\n(md, markdown, docx, txt, html, rtf, odt). Auto-detected when omitted, and\nignored for non-Google files, which are uploaded without conversion.\nProvide at most one of content/file_path/file_url."
- Changed
update_paragraph_style5 fields changed- added
Input schema / properties / border_colorAdded value: +{ + "default": null, + "description": "Border color (#RRGGBB; defaults to black)", + "type": "string" +} - added
Input schema / properties / border_dashAdded value: +{ + "default": null, + "description": "Border dash style ('SOLID', 'DOT', or 'DASH'; defaults to 'SOLID')", + "type": "string" +} - added
Input schema / properties / border_edgesAdded value: +{ + "default": null, + "description": "Paragraph border edges to update ('top', 'bottom', 'left',\n 'right', or 'between'); omit to update all four outer edges", + "items": { + "enum": [ + "top", + "bottom", + "left", + "right", + "between" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / border_paddingAdded value: +{ + "default": null, + "description": "Border padding in points (defaults to 4)", + "type": "number" +} - added
Input schema / properties / border_widthAdded value: +{ + "default": null, + "description": "Border width in points (defaults to 1)", + "type": "number" +}
125 tool updates
v1.0.1- Added
append_table_rows - Added
batch_modify_gmail_message_labels - Added
batch_update_doc - Added
batch_update_form - Added
batch_update_presentation - Added
check_drive_file_public_access - Added
copy_drive_file - Added
create_calendar - Changed
create_doc11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / content / descriptionAdded value: +"Optional initial plain text content to insert" - removed
Input schema / properties / content / titleRemoved value: -"Content" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / title / descriptionAdded value: +"Title of the new document" - removed
Input schema / properties / title / titleRemoved value: -"Title" - added
Input schema / properties / user_google_email / descriptionAdded value: +"User's Google email address" - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "title" -]New value: +[ + "user_google_email", + "title" +] - removed
Input schema / titleRemoved value: -"create_docArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
create_drive_file - Added
create_drive_folder - Removed
create_event - Changed
create_form13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / description / descriptionAdded value: +"The description of the form." - removed
Input schema / properties / description / titleRemoved value: -"Description" - added
Input schema / properties / document_title / descriptionAdded value: +"The document title (shown in browser tab)." - removed
Input schema / properties / document_title / titleRemoved value: -"Document Title" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / title / descriptionAdded value: +"The title of the form." - removed
Input schema / properties / title / titleRemoved value: -"Title" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "title" -]New value: +[ + "user_google_email", + "title" +] - removed
Input schema / titleRemoved value: -"create_formArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
create_presentation - Added
create_reaction - Added
create_script_project - Changed
create_sheet13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / insert_sheet_indexAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / sheet_name / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / sheet_name / defaultAdded value: +null - removed
Input schema / properties / sheet_name / titleRemoved value: -"Sheet Name" - removed
Input schema / properties / sheet_name / typeRemoved value: -"string" - added
Input schema / properties / source_sheet_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / spreadsheet_id / titleRemoved value: -"Spreadsheet Id" - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "spreadsheet_id", - "sheet_name" -]New value: +[ + "user_google_email", + "spreadsheet_id" +] - removed
Input schema / titleRemoved value: -"create_sheetArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
create_spreadsheet11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / sheet_names / descriptionAdded value: +"List of sheet names to create. If not provided, creates one sheet with default name." - removed
Input schema / properties / sheet_names / titleRemoved value: -"Sheet Names" - added
Input schema / properties / title / descriptionAdded value: +"The title of the new spreadsheet. Required." - removed
Input schema / properties / title / titleRemoved value: -"Title" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "title" -]New value: +[ + "user_google_email", + "title" +] - removed
Input schema / titleRemoved value: -"create_spreadsheetArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
create_table_with_data - Added
create_version - Added
debug_docs_runtime_info - Added
debug_table_structure - Removed
delete_event - Added
delete_script_project - Added
download_chat_attachment - Changed
draft_gmail_message21 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / attachmentsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional list of attachments. Each can have: 'url' (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR 'path' (file path, auto-encodes), OR 'content' (standard base64, not urlsafe) + 'filename'. Optional 'mime_type'. Optional 'content_id' (string) makes the attachment inline-rendered: it lands in a multipart/related part with `Content-ID: <content_id>` and `Content-Disposition: inline`, and the HTML body can reference it via `<img src=\"cid:<content_id>\">` (RFC 2392). Without `content_id` the attachment is a regular multipart/mixed attachment." +} - added
Input schema / properties / bccAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional BCC email address." +} - removed
Input schema / properties / body / titleRemoved value: -"Body" - added
Input schema / properties / body_formatAdded value: +{ + "default": "plain", + "description": "Email body format. Use 'plain' for plaintext or 'html' for HTML content.", + "enum": [ + "plain", + "html" + ], + "type": "string" +} - added
Input schema / properties / ccAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional CC email address." +} - added
Input schema / properties / from_emailAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email." +} - added
Input schema / properties / from_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'." +} - added
Input schema / properties / in_reply_toAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')." +} - added
Input schema / properties / include_signatureAdded value: +{ + "default": true, + "description": "Whether to append the Gmail signature from Settings > Signature when available. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / quote_originalAdded value: +{ + "default": false, + "description": "Whether to include the original message as a quoted reply. Requires thread_id. Defaults to false.", + "type": "boolean" +} - added
Input schema / properties / referencesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional chain of Message-IDs for proper threading." +} - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - added
Input schema / properties / thread_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional Gmail thread ID to reply within." +} - removed
Input schema / properties / to / titleRemoved value: -"To" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required for authentication." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "subject", - "body" -]New value: +[ + "user_google_email", + "subject", + "body" +] - removed
Input schema / titleRemoved value: -"draft_gmail_messageArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
export_doc_to_pdf - Added
find_and_replace_doc - Added
format_sheet_range - Added
generate_trigger_code - Added
get_contact - Added
get_contact_group - Added
get_doc_as_markdown - Changed
get_doc_content11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / docs_serviceRemoved value: -{ - "title": "docs_service", - "type": "string" -} - added
Input schema / properties / document_id / descriptionAdded value: +"ID of the Google Doc (or full URL)" - removed
Input schema / properties / document_id / titleRemoved value: -"Document Id" - removed
Input schema / properties / drive_serviceRemoved value: -{ - "title": "drive_service", - "type": "string" -} - added
Input schema / properties / suggestions_view_modeAdded value: +{ + "default": "DEFAULT_FOR_CURRENT_ACCESS", + "description": "How to render suggestions in the returned content:\n- \"DEFAULT_FOR_CURRENT_ACCESS\": Default based on user's access level\n- \"SUGGESTIONS_INLINE\": Suggested changes appear inline in the document\n- \"PREVIEW_SUGGESTIONS_ACCEPTED\": Preview as if all suggestions were accepted\n- \"PREVIEW_WITHOUT_SUGGESTIONS\": Preview as if all suggestions were rejected", + "type": "string" +} - added
Input schema / properties / user_google_email / descriptionAdded value: +"User's Google email address" - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "drive_service", - "docs_service", - "user_google_email", - "document_id" -]New value: +[ + "user_google_email", + "document_id" +] - removed
Input schema / titleRemoved value: -"get_doc_contentArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
get_drive_file_content9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / file_id / descriptionAdded value: +"Drive file ID." - removed
Input schema / properties / file_id / titleRemoved value: -"File Id" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user’s Google email address." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "file_id" -]New value: +[ + "user_google_email", + "file_id" +] - removed
Input schema / titleRemoved value: -"get_drive_file_contentArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
get_drive_file_download_url - Added
get_drive_file_permissions - Added
get_drive_shareable_link - Changed
get_events19 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / calendar_id / descriptionAdded value: +"The ID of the calendar to query. Use 'primary' for the user's primary calendar. Defaults to 'primary'. Calendar IDs can be obtained using `list_calendars`." - removed
Input schema / properties / calendar_id / titleRemoved value: -"Calendar Id" - added
Input schema / properties / detailedAdded value: +{ + "default": false, + "description": "Whether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also report the parent series ID needed to edit the whole series, and events that are not ordinary confirmed meetings report their event type (outOfOffice, workingLocation, focusTime) and status. Defaults to False.", + "type": "boolean" +} - added
Input schema / properties / event_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The ID of a specific event to retrieve. If provided, retrieves only this event and ignores time filtering parameters." +} - added
Input schema / properties / include_attachmentsAdded value: +{ + "default": false, + "description": "Whether to include attachment information in detailed event output. When True, shows attachment details (fileId, fileUrl, mimeType, title) for events that have attachments. Only applies when detailed=True. Set this to True when you need to view or access files that have been attached to calendar events, such as meeting documents, presentations, or other shared files. Defaults to False.", + "type": "boolean" +} - added
Input schema / properties / max_results / descriptionAdded value: +"The maximum number of events to return. Defaults to 25. Ignored if event_id is provided." - removed
Input schema / properties / max_results / titleRemoved value: -"Max Results" - added
Input schema / properties / queryAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "A keyword to search for within event fields (summary, description, location). Ignored if event_id is provided." +} - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / time_max / descriptionAdded value: +"The end of the time range (exclusive) in RFC3339 format. If omitted, events starting from `time_min` onwards are considered (up to `max_results`). Ignored if event_id is provided." - removed
Input schema / properties / time_max / titleRemoved value: -"Time Max" - added
Input schema / properties / time_min / descriptionAdded value: +"The start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time. Ignored if event_id is provided." - removed
Input schema / properties / time_min / titleRemoved value: -"Time Min" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"get_eventsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
get_form9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / form_id / descriptionAdded value: +"The ID of the form to retrieve." - removed
Input schema / properties / form_id / titleRemoved value: -"Form Id" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "form_id" -]New value: +[ + "user_google_email", + "form_id" +] - removed
Input schema / titleRemoved value: -"get_formArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
get_form_response11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / form_id / descriptionAdded value: +"The ID of the form." - removed
Input schema / properties / form_id / titleRemoved value: -"Form Id" - added
Input schema / properties / response_id / descriptionAdded value: +"The ID of the response to retrieve." - removed
Input schema / properties / response_id / titleRemoved value: -"Response Id" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "form_id", - "response_id" -]New value: +[ + "user_google_email", + "form_id", + "response_id" +] - removed
Input schema / titleRemoved value: -"get_form_responseArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
get_gmail_attachment_content - Changed
get_gmail_message_content11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / body_formatAdded value: +{ + "default": "text", + "description": "Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches the full raw MIME message and returns the base64url-decoded content.", + "enum": [ + "text", + "html", + "raw" + ], + "type": "string" +} - added
Input schema / properties / fullAdded value: +{ + "default": false, + "description": "When True, return the COMPLETE untruncated message: saved to local storage and referenced by download URL/file path instead of the body text, or inlined in the response when the server has no file storage (stateless mode). Use for messages large enough to hit the truncation limit, or when byte-exact fidelity is needed (pair with body_format='raw' for a .eml export).", + "type": "boolean" +} - added
Input schema / properties / message_id / descriptionAdded value: +"The unique ID of the Gmail message to retrieve." - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "message_id", - "user_google_email" -]New value: +[ + "message_id", + "user_google_email" +] - removed
Input schema / titleRemoved value: -"get_gmail_message_contentArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
get_gmail_messages_content_batch12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / body_formatAdded value: +{ + "default": "text", + "description": "Body output format (only applies when format='full'). 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches the full raw MIME message and returns the base64url-decoded content.", + "enum": [ + "text", + "html", + "raw" + ], + "type": "string" +} - added
Input schema / properties / format / descriptionAdded value: +"Message format. \"full\" includes body, \"metadata\" only headers." - removed
Input schema / properties / format / titleRemoved value: -"Format" - added
Input schema / properties / message_ids / descriptionAdded value: +"List of Gmail message IDs to retrieve (max 25 per batch)." - removed
Input schema / properties / message_ids / titleRemoved value: -"Message Ids" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "message_ids", - "user_google_email" -]New value: +[ + "message_ids", + "user_google_email" +] - removed
Input schema / titleRemoved value: -"get_gmail_messages_content_batchArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
get_gmail_thread_content11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / body_formatAdded value: +{ + "default": "text", + "description": "Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches each message's full raw MIME content and returns the base64url-decoded body.", + "enum": [ + "text", + "html", + "raw" + ], + "type": "string" +} - added
Input schema / properties / include_analysisAdded value: +{ + "default": false, + "description": "When True, the return value is a dict with both the formatted thread content AND structured ownership analysis (last sender, ball-in-court verdict, per-sender message counts, participants). Defaults to False, in which case the existing string return shape is preserved.", + "type": "boolean" +} - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / thread_id / descriptionAdded value: +"The unique ID of the Gmail thread to retrieve." - removed
Input schema / properties / thread_id / titleRemoved value: -"Thread Id" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "thread_id", - "user_google_email" -]New value: +[ + "thread_id", + "user_google_email" +] - removed
Input schema / titleRemoved value: -"get_gmail_thread_contentArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } + ] + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
get_gmail_threads_content_batch - Changed
get_messages10 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / message_filterAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional filter string using the Chat API filter syntax.\n Supports createTime and thread.name.\n Examples:\n 'createTime > \"2026-03-18T00:00:00-03:00\"'\n 'createTime > \"2026-03-18T00:00:00-03:00\" AND createTime < \"2026-03-19T00:00:00-03:00\"'\n 'thread.name = spaces/X/threads/Y'" +} - removed
Input schema / properties / order_by / titleRemoved value: -"Order By" - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - removed
Input schema / properties / space_id / titleRemoved value: -"Space Id" - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "space_id" -]New value: +[ + "user_google_email", + "space_id" +] - removed
Input schema / titleRemoved value: -"get_messagesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
get_page - Added
get_page_thumbnail - Added
get_presentation - Added
get_script_content - Added
get_script_metrics - Added
get_script_project - Added
get_search_engine_info - Changed
get_spreadsheet_info9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"The ID of the spreadsheet to get info for. Required." - removed
Input schema / properties / spreadsheet_id / titleRemoved value: -"Spreadsheet Id" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "spreadsheet_id" -]New value: +[ + "user_google_email", + "spreadsheet_id" +] - removed
Input schema / titleRemoved value: -"get_spreadsheet_infoArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
get_task - Added
get_task_list - Added
get_version - Added
import_to_google_doc - Added
import_to_google_sheets - Added
import_to_google_slides - Added
insert_doc_elements - Added
insert_doc_image - Added
inspect_doc_structure - Changed
list_calendars7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"list_calendarsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
list_contact_groups - Added
list_contacts - Added
list_deployments - Changed
list_docs_in_folder8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / folder_id / titleRemoved value: -"Folder Id" - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"list_docs_in_folderArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
list_document_comments - Added
list_drive_items - Changed
list_form_responses13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / form_id / descriptionAdded value: +"The ID of the form." - removed
Input schema / properties / form_id / titleRemoved value: -"Form Id" - added
Input schema / properties / page_size / descriptionAdded value: +"Maximum number of responses to return. Defaults to 10." - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - added
Input schema / properties / page_token / descriptionAdded value: +"Token for retrieving next page of results." - removed
Input schema / properties / page_token / titleRemoved value: -"Page Token" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "form_id" -]New value: +[ + "user_google_email", + "form_id" +] - removed
Input schema / titleRemoved value: -"list_form_responsesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
list_gmail_filters - Changed
list_gmail_labels7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"list_gmail_labelsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
list_presentation_comments - Added
list_script_processes - Added
list_script_projects - Added
list_sheet_tables - Changed
list_spaces8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - removed
Input schema / properties / space_type / titleRemoved value: -"Space Type" - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"list_spacesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
list_spreadsheet_comments - Changed
list_spreadsheets9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of spreadsheets to return. Defaults to 25." - removed
Input schema / properties / max_results / titleRemoved value: -"Max Results" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"list_spreadsheetsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
list_task_lists - Added
list_tasks - Added
list_versions - Added
manage_conditional_formatting - Added
manage_contact - Added
manage_contact_group - Added
manage_contacts_batch - Added
manage_deployment - Added
manage_doc_tab - Added
manage_document_comment - Added
manage_drive_access - Added
manage_event - Added
manage_focus_time - Added
manage_gmail_filter - Changed
manage_gmail_label17 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / action / descriptionAdded value: +"Action to perform on the label." - removed
Input schema / properties / action / titleRemoved value: -"Action" - added
Input schema / properties / label_id / descriptionAdded value: +"Label ID. Required for update and delete operations." - removed
Input schema / properties / label_id / titleRemoved value: -"Label Id" - added
Input schema / properties / label_list_visibility / descriptionAdded value: +"Whether the label is shown in the label list." - removed
Input schema / properties / label_list_visibility / titleRemoved value: -"Label List Visibility" - added
Input schema / properties / message_list_visibility / descriptionAdded value: +"Whether the label is shown in the message list." - removed
Input schema / properties / message_list_visibility / titleRemoved value: -"Message List Visibility" - added
Input schema / properties / name / descriptionAdded value: +"Label name. Required for create, optional for update." - removed
Input schema / properties / name / titleRemoved value: -"Name" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "action" -]New value: +[ + "user_google_email", + "action" +] - removed
Input schema / titleRemoved value: -"manage_gmail_labelArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
manage_out_of_office - Added
manage_presentation_comment - Added
manage_spreadsheet_comment - Added
manage_task - Added
manage_task_list - Added
modify_doc_text - Removed
modify_event - Changed
modify_gmail_message_labels17 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / add_label_ids / descriptionAdded value: +"List of label IDs to add to the message." - added
Input schema / properties / add_label_ids / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / add_label_ids / titleRemoved value: -"Add Label Ids" - added
Input schema / properties / add_label_ids / typeAdded value: +"array" - added
Input schema / properties / message_id / descriptionAdded value: +"The ID of the message to modify." - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - added
Input schema / properties / remove_label_ids / descriptionAdded value: +"List of label IDs to remove from the message." - added
Input schema / properties / remove_label_ids / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / remove_label_ids / titleRemoved value: -"Remove Label Ids" - added
Input schema / properties / remove_label_ids / typeAdded value: +"array" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "message_id" -]New value: +[ + "user_google_email", + "message_id" +] - removed
Input schema / titleRemoved value: -"modify_gmail_message_labelsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
modify_sheet_values18 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / clear_values / descriptionAdded value: +"If True, clears the range instead of writing values. Defaults to False." - removed
Input schema / properties / clear_values / titleRemoved value: -"Clear Values" - added
Input schema / properties / range_name / descriptionAdded value: +"The range to modify (e.g., \"Sheet1!A1:D10\", \"A1:D10\"). Required." - removed
Input schema / properties / range_name / titleRemoved value: -"Range Name" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"The ID of the spreadsheet. Required." - removed
Input schema / properties / spreadsheet_id / titleRemoved value: -"Spreadsheet Id" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - added
Input schema / properties / value_input_option / descriptionAdded value: +"How to interpret input values (\"RAW\" or \"USER_ENTERED\"). Defaults to \"USER_ENTERED\"." - removed
Input schema / properties / value_input_option / titleRemoved value: -"Value Input Option" - changed
Input schema / properties / values / anyOfPrevious value: -[ - { - "items": { - "items": { - "type": "string" - }, - "type": "array" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "items": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / values / descriptionAdded value: +"2D array of values to write/update. Can be a JSON string or Python list. Required unless clear_values=True." - removed
Input schema / properties / values / titleRemoved value: -"Values" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "spreadsheet_id", - "range_name" -]New value: +[ + "user_google_email", + "spreadsheet_id", + "range_name" +] - removed
Input schema / titleRemoved value: -"modify_sheet_valuesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
move_sheet_rows - Added
query_freebusy - Changed
read_sheet_values14 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / include_formulasAdded value: +{ + "default": false, + "description": "If True, also fetch raw formula strings for cells that\ncontain formulas. Useful for identifying cross-sheet references before writing\nback to a range. Defaults to False to avoid an extra API request.", + "type": "boolean" +} - added
Input schema / properties / include_hyperlinksAdded value: +{ + "default": false, + "description": "If True, also fetch hyperlink metadata for the range.\nDefaults to False to avoid expensive includeGridData requests.", + "type": "boolean" +} - added
Input schema / properties / include_notesAdded value: +{ + "default": false, + "description": "If True, also fetch cell notes for the range.\nDefaults to False to avoid expensive includeGridData requests.", + "type": "boolean" +} - added
Input schema / properties / range_name / descriptionAdded value: +"The range to read (e.g., \"Sheet1!A1:D10\", \"A1:D10\").\nDefaults to \"A1:Z1000\". Open-ended or oversized ranges are clamped to\nat most 1000 rows before the Sheets API request to bound memory use." - removed
Input schema / properties / range_name / titleRemoved value: -"Range Name" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / spreadsheet_id / descriptionAdded value: +"The ID of the spreadsheet. Required." - removed
Input schema / properties / spreadsheet_id / titleRemoved value: -"Spreadsheet Id" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "spreadsheet_id" -]New value: +[ + "user_google_email", + "spreadsheet_id" +] - removed
Input schema / titleRemoved value: -"read_sheet_valuesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
resize_sheet_dimensions - Added
run_script_function - Added
search_contacts - Added
search_custom - Changed
search_docs8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "query" -]New value: +[ + "user_google_email", + "query" +] - removed
Input schema / titleRemoved value: -"search_docsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
search_drive_files22 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / corpora / descriptionAdded value: +"Bodies of items to query (e.g., 'user', 'domain', 'drive', 'allDrives').\n If 'drive_id' is specified and 'corpora' is None, it defaults to 'drive'.\n Otherwise, Drive API default behavior applies. Prefer 'user' or 'drive' over 'allDrives' for efficiency." - removed
Input schema / properties / corpora / titleRemoved value: -"Corpora" - added
Input schema / properties / detailedAdded value: +{ + "default": true, + "description": "Whether to include size, modified time, and link in results. Defaults to True.", + "type": "boolean" +} - added
Input schema / properties / drive_id / descriptionAdded value: +"ID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`." - removed
Input schema / properties / drive_id / titleRemoved value: -"Drive Id" - added
Input schema / properties / file_typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Restrict results to a specific file type. Accepts a friendly\n name ('folder', 'document'/'doc', 'spreadsheet'/'sheet',\n 'presentation'/'slides', 'form', 'drawing', 'pdf', 'shortcut',\n 'script', 'site', 'jam'/'jamboard') or any raw MIME type\n string (e.g. 'application/pdf'). Defaults to None (all types)." +} - added
Input schema / properties / include_items_from_all_drives / descriptionAdded value: +"Whether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`." - removed
Input schema / properties / include_items_from_all_drives / titleRemoved value: -"Include Items From All Drives" - added
Input schema / properties / include_trashedAdded value: +{ + "default": false, + "description": "Whether to include files in the trash. Defaults to False, matching\n the Drive web UI and `list_drive_items`. Ignored when `query` already\n contains its own `trashed` clause (`=` or `!=`), which always wins.", + "type": "boolean" +} - added
Input schema / properties / order_byAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Sort order. Comma-separated list of sort keys with optional 'desc' modifier.\n Valid keys: 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime',\n 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime',\n 'starred', 'viewedByMeTime'. Example: 'modifiedTime desc' or 'folder,modifiedTime desc,name'.\n Defaults to None (Drive API default ordering)." +} - added
Input schema / properties / page_size / descriptionAdded value: +"The maximum number of files to return. Defaults to 10." - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - added
Input schema / properties / page_tokenAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Page token from a previous response's nextPageToken to retrieve the next page of results." +} - added
Input schema / properties / query / descriptionAdded value: +"The search query string. Supports Google Drive search operators.\n NOTE: Owner-based queries ('user@example.com' in owners) DO NOT WORK in Shared Drives\n because files are owned by the shared drive itself, not individual users.\n For recent files by a specific user in Shared Drives, search by modifiedTime\n and use order_by='modifiedTime desc' instead." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "query" -]New value: +[ + "user_google_email", + "query" +] - removed
Input schema / titleRemoved value: -"search_drive_filesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
search_gmail_messages12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / page_size / descriptionAdded value: +"The maximum number of messages to return. Defaults to 10." - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - added
Input schema / properties / page_tokenAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Token for retrieving the next page of results. Use the next_page_token from a previous response." +} - added
Input schema / properties / query / descriptionAdded value: +"The search query. Supports standard Gmail search operators." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "query", - "user_google_email" -]New value: +[ + "query", + "user_google_email" +] - removed
Input schema / titleRemoved value: -"search_gmail_messagesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
search_messages17 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / max_spacesAdded value: +{ + "default": 10, + "description": "Maximum number of spaces to search when space_id is not provided (default 10).", + "type": "integer" +} - added
Input schema / properties / page_size / descriptionAdded value: +"Maximum number of messages to return per space." - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - added
Input schema / properties / query / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / defaultAdded value: +null - added
Input schema / properties / query / descriptionAdded value: +"Optional text to search for. If omitted, only time_filter is applied." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / query / typeRemoved value: -"string" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / space_id / descriptionAdded value: +"Optional space to restrict the search to." - removed
Input schema / properties / space_id / titleRemoved value: -"Space Id" - added
Input schema / properties / time_filterAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional filter using Chat API createTime syntax.\n Examples:\n 'createTime > \"2026-03-18T00:00:00-03:00\"'\n 'createTime > \"2026-03-18T00:00:00-03:00\" AND createTime < \"2026-03-19T00:00:00-03:00\"'" +} - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "query" -]New value: +[ + "user_google_email" +] - removed
Input schema / titleRemoved value: -"search_messagesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
send_gmail_message30 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / attachmentsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional list of attachments. Each can have: \"url\" (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR \"path\" (file path, auto-encodes), OR \"content\" (standard base64, not urlsafe) + \"filename\". Optional \"mime_type\". Optional \"content_id\" (string) makes the attachment inline-rendered: it lands in a multipart/related part with `Content-ID: <content_id>` and `Content-Disposition: inline`, and the HTML body can reference it via `<img src=\"cid:<content_id>\">` (RFC 2392). Without `content_id` the attachment is a regular multipart/mixed attachment. Example: [{\"url\": \"https://host/attachments/abc-123\", \"filename\": \"report.pdf\"}]" +} - added
Input schema / properties / bccAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional BCC email address." +} - added
Input schema / properties / body / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / body / defaultAdded value: +null - changed
Input schema / properties / body / descriptionPrevious value: -"Email body (plain text)."New value: +"Email body content (plain text or HTML). Required when sending. When forwarding, this is an optional note prepended above the quoted original." - removed
Input schema / properties / body / titleRemoved value: -"Body" - removed
Input schema / properties / body / typeRemoved value: -"string" - added
Input schema / properties / body_formatAdded value: +{ + "default": "plain", + "description": "Format of the body content (and of the prepended note when forwarding). Use 'plain' for plaintext or 'html' for HTML content.", + "enum": [ + "plain", + "html" + ], + "type": "string" +} - added
Input schema / properties / ccAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional CC email address." +} - added
Input schema / properties / forward_message_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Set to a Gmail message ID to forward that message instead of composing a new one. The original subject, body, and (optionally) attachments are carried over; 'body' becomes an optional note prepended to the forward." +} - added
Input schema / properties / from_emailAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email." +} - added
Input schema / properties / from_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'." +} - added
Input schema / properties / in_reply_toAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')." +} - added
Input schema / properties / include_forwarded_attachmentsAdded value: +{ + "default": true, + "description": "When forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set.", + "type": "boolean" +} - added
Input schema / properties / include_signatureAdded value: +{ + "default": true, + "description": "Whether to append the Gmail signature from Settings > Signature when available. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / referencesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional chain of Message-IDs for proper threading." +} - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / subject / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / subject / defaultAdded value: +null - changed
Input schema / properties / subject / descriptionPrevious value: -"Email subject."New value: +"Email subject. Required when sending; optional when forwarding (defaults to 'Fwd: <original subject>')." - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - removed
Input schema / properties / subject / typeRemoved value: -"string" - added
Input schema / properties / thread_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional Gmail thread ID to reply within." +} - removed
Input schema / properties / to / titleRemoved value: -"To" - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required for authentication." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "to", - "subject", - "body" -]New value: +[ + "user_google_email", + "to" +] - removed
Input schema / titleRemoved value: -"send_gmail_messageArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
send_message11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / message_text / titleRemoved value: -"Message Text" - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - removed
Input schema / properties / space_id / titleRemoved value: -"Space Id" - added
Input schema / properties / thread_key / descriptionAdded value: +"Reply in a thread by app-defined key (creates thread if not found)." - removed
Input schema / properties / thread_key / titleRemoved value: -"Thread Key" - added
Input schema / properties / thread_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Reply in an existing thread by its resource name (e.g. spaces/X/threads/Y)." +} - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "space_id", - "message_text" -]New value: +[ + "user_google_email", + "space_id", + "message_text" +] - removed
Input schema / titleRemoved value: -"send_messageArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
set_drive_file_permissions - Changed
set_publish_settings13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / form_id / descriptionAdded value: +"The ID of the form to update publish settings for." - removed
Input schema / properties / form_id / titleRemoved value: -"Form Id" - added
Input schema / properties / is_accepting_responsesAdded value: +{ + "default": true, + "description": "Whether the form accepts responses. Only takes effect when the form is published. Defaults to True.", + "type": "boolean" +} - added
Input schema / properties / is_publishedAdded value: +{ + "default": true, + "description": "Whether the form is published and visible to responders. Defaults to True.", + "type": "boolean" +} - removed
Input schema / properties / publish_as_templateRemoved value: -{ - "default": false, - "title": "Publish As Template", - "type": "boolean" -} - removed
Input schema / properties / require_authenticationRemoved value: -{ - "default": false, - "title": "Require Authentication", - "type": "boolean" -} - removed
Input schema / properties / serviceRemoved value: -{ - "title": "service", - "type": "string" -} - added
Input schema / properties / user_google_email / descriptionAdded value: +"The user's Google email address. Required." - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "service", - "user_google_email", - "form_id" -]New value: +[ + "user_google_email", + "form_id" +] - removed
Input schema / titleRemoved value: -"set_publish_settingsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
start_google_auth8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / mcp_session_idRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Mcp Session Id" -} - removed
Input schema / properties / service_name / titleRemoved value: -"Service Name" - added
Input schema / properties / user_google_email / defaultAdded value: +null - removed
Input schema / properties / user_google_email / titleRemoved value: -"User Google Email" - changed
Input schema / requiredPrevious value: -[ - "user_google_email", - "service_name" -]New value: +[ + "service_name" +] - removed
Input schema / titleRemoved value: -"start_google_authArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Added
update_doc_headers_footers - Added
update_drive_file - Added
update_paragraph_style - Added
update_script_content
36 tool updates
v1.0.0- First observed
create_doc - First observed
create_event - First observed
create_form - First observed
create_sheet - First observed
create_spreadsheet - First observed
delete_event - First observed
draft_gmail_message - First observed
get_doc_content - First observed
get_drive_file_content - First observed
get_events - First observed
get_form - First observed
get_form_response - First observed
get_gmail_message_content - First observed
get_gmail_messages_content_batch - First observed
get_gmail_thread_content - First observed
get_messages - First observed
get_spreadsheet_info - First observed
list_calendars - First observed
list_docs_in_folder - First observed
list_form_responses - First observed
list_gmail_labels - First observed
list_spaces - First observed
list_spreadsheets - First observed
manage_gmail_label - First observed
modify_event - First observed
modify_gmail_message_labels - First observed
modify_sheet_values - First observed
read_sheet_values - First observed
search_docs - First observed
search_drive_files - First observed
search_gmail_messages - First observed
search_messages - First observed
send_gmail_message - First observed
send_message - First observed
set_publish_settings - First observed
start_google_auth
TDQS
While tools are mostly grouped by service (Gmail, Drive, Docs), there is significant overlap within services. For example, get_drive_file_content, get_drive_file_download_url, and get_doc_content all retrieve file content in slightly different ways; similarly, manage_drive_access, set_drive_file_permissions, and share_drive_file overlap in permission management. This can confuse agents about which tool to use.
Tool names predominantly follow a clear verb_noun pattern (get_, list_, create_, update_, manage_, search_, send_), which is consistent across services. A few exceptions like debug_docs_runtime_info, inspect_doc_structure, and start_google_auth deviate from this pattern, but they are minor and still readable.
With 122 tools covering multiple Workspace services, the count is extremely high for an MCP server. While it aims to be a comprehensive Workspace integration, the sheer number makes the tool surface unwieldy and harder for agents to navigate. Typically, a server with this breadth would be split into smaller service-specific servers.
The server provides extensive coverage across Gmail, Drive, Calendar, Docs, Sheets, Chat, Forms, Slides, Tasks, Contacts, Apps Script, and Custom Search. It includes CRUD operations, search, batch processing, and comments. Minor gaps exist (e.g., Gmail vacation responder, Calendar sharing), but overall the surface is very complete for the stated scope.
Maintenance
Related MCP Connectors
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
Streamable HTTP MCP server for Google Calendar and Sheets with OAuth login.
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for Google Workspace APIs - Docs, Sheets, Drive, Gmail, and Calendar. Enables reading, creating, and editing Google Docs and Sheets, managing comments, reading emails, and viewing calendar events.343917MIT
- AlicenseBqualityDmaintenanceProduction-ready MCP server for Google Workspace providing broad coverage across Gmail, Drive, Calendar, Docs, Sheets, and more, with safe-by-default write operations and markdown-to-Google-Docs support.100MIT
- FlicenseBqualityDmaintenanceMCP server providing full access to Google Workspace services (Gmail, Drive, Calendar, Docs, Sheets, Slides, Forms, Tasks, Contacts) using OAuth authentication.1001-
- AlicenseBqualityCmaintenanceComprehensive Google Workspace MCP server with Gmail, Drive, Calendar, and Contacts integration.2614MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/taylorwilsdon/google_workspace_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server