Skip to main content
Glama
alexpekach

gmail-mcp-local

by alexpekach

gmail-mcp-local

local-first node MCP tests license

Your Gmail, inside Claude & Cursor — without handing your inbox to a server.

A local-first MCP server that lets AI assistants (Claude Desktop, Cursor, VS Code, …) search, read, label, draft, and send your Gmail. Your Google login (OAuth refresh token) is stored in your operating system's keychain and never leaves your machine — there is no cloud service in the middle, not even ours.

Why

  • 🔒 Private by design. Mail and tokens stay on your device. There is no server that ever sees your email — so no operator (including us) can read it.

  • 🧩 Cross-client. One install serves Claude Desktop, Cursor, VS Code, Windsurf.

  • 📬 Multi-account. Connect personal + work Gmail, tag them, pick per request.

  • 🛠️ 20 tools. The full read/write/organize Gmail toolkit (below).

Using it is two separate steps — install the connector once, then add Gmail accounts from inside the chat whenever you like. You never have to hand-edit a config file (but you can — see the appendix).

Related MCP server: multi-mail-mcp

1 · Install the connector (once)

One prerequisite for every path: a Google Desktop-app OAuth client id + secret. It's free and takes ~5 minutes — full walkthrough in SETUP_LIVE.md. (Tester builds with credentials already bundled skip this entirely.)

Option A — Claude Desktop extension (.mcpb) · easiest

  1. Download gmail-mcp-local-<version>.mcpb from Releases.

  2. Double-click it (or drag it into Claude Desktop).

  3. Paste your Google client id + secret when prompted — Claude Desktop stores the secret in your OS keychain.

No terminal, no Node install, no config files. (Claude Desktop only; for Cursor use Option B.)

Option B — One-click installer (Claude Desktop + Cursor)

  1. Download gmail-mcp-local-installer.zip from Releases and unzip.

  2. Double-click install.cmd (Windows) or install.command (macOS). Requires Node 20+.

  3. It copies the app to ~/.gmail-mcp-local/app and writes the MCP client config for you — Claude Desktop and Cursor are auto-detected, your existing config is preserved (and backed up to .bak).

  4. Unless your copy came with credentials bundled, put yours in ~/.gmail-mcp-local/config.json:

{ "clientId": "<your-id>.apps.googleusercontent.com", "clientSecret": "GOCSPX-…" }

Option C — From source

git clone https://github.com/alexpekach/gmail-mcp-local.git
cd gmail-mcp-local
npm install          # pulls the OS keychain helper
npm run setup        # writes the Claude Desktop / Cursor config for you (same as Option B)

Credentials go in ~/.gmail-mcp-local/config.json as in Option B (or env vars — see appendix).

Then fully quit and reopen your MCP client. That's the last time you touch an installer.

2 · Add Gmail accounts (anytime, in chat)

Connecting accounts happens in the conversation, not in config files:

connect_account({ ref: "work" })

…your browser opens → sign in with Google → click Allow → done. The refresh token lands in your OS keychain; the account is ready immediately.

  • More accounts, anytime: connect_account({ ref: "personal", tag: "home" }) — connect as many as you like.

  • Pick per request: every tool takes account, e.g. search_threads({ account: "personal", query: "newer_than:7d has:attachment" }).

  • See what's connected: list_accounts (metadata only — never tokens).

  • Remove one: remove_account({ ref: "work" }) — deletes the token from your keychain.

  • Check granted scopes: check_account_scopes({ account: "work" }).

What it can do (20 tools)

Group

Tools

Accounts

list_accounts · connect_account · remove_account · set_tag

Read

search_threads · get_thread · list_labels · list_thread_attachments · get_attachment · check_account_scopes

Write

create_draft · send_draft · send_message

Organize

label_thread · label_message · create_label · update_label · delete_label · trash_thread · untrash_thread

Privacy & security

  • Tokens in the OS keychain — macOS Keychain / Windows Credential Manager / Linux libsecret. Never written to disk in plaintext; never sent anywhere. (The .mcpb extension keeps your client secret in the keychain too.)

  • PKCE + loopback OAuth (RFC 8252) — a public client; the auth code is exchanged with a one-time verifier, not a network-shared secret.

  • Local execution — the server runs as a subprocess of your MCP client. No telemetry, no remote storage of mail or tokens.

  • Least scope — request only the Gmail scopes you need (read-only by default).

  • Restricted Gmail scopes mean your Google OAuth app must be verified (or in Testing with ≤100 users). See SETUP_LIVE.md.

How it works (30 seconds)

Your client launches gmail-mcp-local as a local stdio subprocess → it runs Google OAuth in your browser → the refresh token is saved to your OS keychain → each tool call mints a short-lived access token and calls the Gmail API directly from your machine. A single tokenFor() chokepoint keeps every tool custody-agnostic, so the same code can later swap to a team/shared backend without touching tool logic.

Optional: use it from claude.ai / web / mobile (tunnel)

The same server can speak MCP over Streamable HTTP instead of stdio, so a claude.ai custom connector can reach it — while your tokens still never leave this machine's keychain:

node bin/gmail-mcp-local.js --http       # serves http://127.0.0.1:8765/<secret>/mcp
cloudflared tunnel --url http://127.0.0.1:8765

Then in claude.ai: Settings → Connectors → Add custom connectorhttps://<tunnel-host>/<secret>/mcp.

  • The unguessable <secret> path is the only credential — treat the URL like a password. It's persisted in ~/.gmail-mcp-local/http-secret; rotate it by deleting that file.

  • Your machine must be on (server + tunnel running) for the connector to respond.

  • Even connect_account works remotely: the Google sign-in opens in the browser of the machine running the server — yours.

  • Overrides: GMAIL_MCP_HTTP_PORT, GMAIL_MCP_HTTP_SECRET (env or ~/.gmail-mcp-local/config.json).

Appendix: manual install & what's written where

You never need to hand-edit JSON — Options A–C above write everything for you. This section exists for transparency, and for clients the auto-setup doesn't cover (VS Code, Windsurf).

What the installer / npm run setup writes — one entry, added non-destructively to %APPDATA%\Claude\claude_desktop_config.json (Claude Desktop) and ~/.cursor/mcp.json (Cursor):

{
  "mcpServers": {
    "gmail-local": {
      "command": "node",
      "args": ["<install-path>/bin/gmail-mcp-local.js"]
    }
  }
}

For VS Code, Windsurf, or any other MCP client, add the same entry to that client's MCP config by hand.

Where credentials come from (precedence, highest first):

  1. Env vars — GMAIL_MCP_CLIENT_ID, GMAIL_MCP_CLIENT_SECRET (set them in the "env" block of the entry above if you prefer everything in one file)

  2. ~/.gmail-mcp-local/config.json{ "clientId": "…", "clientSecret": "…" }

  3. bundled-config.json shipped inside the package (tester/turnkey builds)

Other knobs: GMAIL_MCP_SCOPES (override requested scopes), GMAIL_MCP_CONFIG (alternate config path), GMAIL_MCP_METADATA (alternate accounts metadata path).

Uninstall: remove_account({ ref: "…" }) for each account → delete ~/.gmail-mcp-local → remove the gmail-local entry from your client config (a .bak backup sits next to it) → revoke at myaccount.google.com/permissions.

Develop

npm test             # 96 tests — no network, no browser, no native deps
npm run build:mcpb   # build the Claude Desktop extension → dist/mcpb/*.mcpb

CommonJS, Node ≥ 20. Issues and PRs welcome.

Status

v0.1.0 — local-first core (20 tools) complete and tested; verified live (read + draft) against real Gmail; ships as a one-click installer and a Claude Desktop extension (.mcpb). Roadmap: re-auth/scope-upgrade UX, signed installers, optional Pro features (shared team mailboxes via a funded backend).

License

MIT © ALEPEK Accounting and Consulting LLC.

Available Tools

20 tools
check_account_scopesA

Report the OAuth scopes currently granted on a connected account. Returns {granted_scopes[], has_write_scope, has_modify_scope, needs_reauth}. If needs_reauth, reconnect to grant compose/modify.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).

TDQS

A3.8/5.0
Behavior3/5

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

No annotations provided, so the description must disclose behavioral traits. It mentions the return structure and a conditional action, but does not declare read-only behavior, authentication needs, 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.

Conciseness5/5

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

Two concise sentences: the first states purpose and return, the second provides actionable guidance. No unnecessary words.

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

Completeness4/5

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

Given one parameter with full schema coverage, no output schema, and no annotations, the description adequately covers purpose, return value, and a conditional action. Could mention idempotency or error handling for completeness.

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

Parameters3/5

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

Schema coverage for the single parameter 'account' is 100% with a description referencing list_accounts. The description adds no extra parameter-specific meaning beyond that.

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

Purpose5/5

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

The description clearly states the tool's purpose: reporting OAuth scopes for a connected account. It includes the return structure, distinguishing it from sibling tools like connect_account or list_accounts.

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

Usage Guidelines3/5

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

The description implies usage when checking scopes and gives conditional guidance to reconnect if needs_reauth, but does not explicitly state when to use versus alternatives or any prerequisites.

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

connect_accountA

Connect a Google account on THIS device via your browser (PKCE + loopback). The refresh token is stored in your OS keychain and never leaves the machine. Returns {ref, email, tag}.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesA short id you choose, e.g. "work".
tagNoOptional tag, e.g. "personal" / "work".

TDQS

A4/5.0
Behavior4/5

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

Discloses refresh token storage in OS keychain and return format; lacks details on user interaction required or potential overrides, but given no annotations, it provides substantial behavioral context.

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

Conciseness5/5

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

Two sentences with zero waste, front-loaded with action and key details.

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

Completeness4/5

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

Covers purpose, method, security, and return format adequately for a simple tool with no output schema; could mention error cases but not required.

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

Parameters3/5

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

Schema coverage is 100% with clear descriptions for both parameters; the description adds no extra 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.

Purpose5/5

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

Clearly states verb 'Connect a Google account', specifies device and method (browser, PKCE + loopback), and distinguishes from siblings like remove_account or list_accounts.

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

Usage Guidelines3/5

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

Implies usage for first-time connection but does not explicitly state when to use or not use it, nor does it reference alternatives among siblings.

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

create_draftA

Create a Gmail draft. Returns {draft_id, message_id, thread_id}. For replies pass reply_to_message_id. Requires gmail.compose scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
toNo
ccNo
bccNo
subjectNo
bodyNoPlain-text body.
html_bodyNoHTML body. With body, sent as multipart/alternative.
reply_to_message_idNoMessage id to reply to (sets threading headers).
fromNoOptional From override (must be a verified send-as alias).
attachmentsNo

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It states the tool creates a draft and returns fields, but does not disclose behavioral traits like auto-saving, overwrite behavior, or that drafts are stored. It meets a minimal threshold but could be more informative.

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

Conciseness5/5

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

The description is very concise, two sentences, and front-loaded with the core action. Every piece of information serves a clear purpose without redundancy.

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

Completeness3/5

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

Given the tool has 10 parameters and no output schema, the description could provide more context (e.g., how drafts are handled, relationship to send_draft). It covers the basics but lacks depth for a complex tool with many options.

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

Parameters2/5

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

Schema coverage is 50%, so the description should compensate for undocumented parameters. It only adds one hint about reply_to_message_id, leaving many parameters (e.g., to, subject, attachments) with no additional meaning beyond the schema. More parameter guidance would be beneficial.

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

Purpose5/5

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

The description clearly states the tool creates a Gmail draft, with specific verb 'Create' and resource 'Gmail draft'. The return fields are listed, and the scope requirement is mentioned. This distinguishes it from sibling tools like send_draft or send_message.

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

Usage Guidelines4/5

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

The description provides specific usage guidance for replies ('For replies pass reply_to_message_id') and mentions the required scope. However, it does not explicitly compare to alternatives or state when not to use this tool.

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

create_labelA

Create a user label. Use "/" for nesting (e.g. "Clients/Acme"). Returns {id, name}. Requires gmail.modify scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
nameYes
label_list_visibilityNo
message_list_visibilityNo

TDQS

A3.5/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. Discloses nesting behavior, return shape, and auth scope. Does not clarify behavior if label already exists or effects on existing messages.

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

Conciseness4/5

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

Two sentences providing key information without extraneous detail. Efficient but could be slightly more structured with separate lines for prerequisites vs return.

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

Completeness3/5

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

Covers basic creation, nesting, return, and auth scope. Missing details on error handling, uniqueness constraints, and the two optional enum parameters' effects. Adequate but not comprehensive.

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

Parameters2/5

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

Only 25% schema description coverage; description adds nesting info for 'name' but does not explain 'label_list_visibility' and 'message_list_visibility' enum options. Incomplete parameter documentation.

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

Purpose5/5

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

Clearly states 'Create a user label', specifies nesting using '/', and mentions return value '{id, name}'. Distinguishes from sibling tools like update_label by focusing on creation.

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

Usage Guidelines3/5

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

Mentions required scope 'gmail.modify' but does not provide guidance on when to use this tool versus alternatives like update_label or delete_label. No explicit when-not or context.

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

delete_labelA

Permanently delete a user label (messages keep other labels). Requires gmail.modify scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
label_idYes

TDQS

A3.9/5.0
Behavior4/5

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

Discloses permanent deletion and impact on messages. However, without annotations, could explicitly state irreversibility and safety considerations.

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

Conciseness5/5

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

Extremely concise with one sentence plus a scope note. Every word adds value; front-loaded with primary action.

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

Completeness4/5

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

Covers purpose, scope, and side effect. Lacks output description and error handling, but sufficient for a simple deletion tool.

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

Parameters2/5

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

No additional meaning beyond schema; label_id is undocumented in both schema and description. Does not leverage list_labels for obtaining IDs.

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

Purpose5/5

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

Clearly states the verb (delete), resource (user label), and a key effect (messages keep other labels). Distinguishes from siblings like update_label and trash_thread.

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

Usage Guidelines3/5

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

Explicitly mentions required scope (gmail.modify) but does not guide when to use this tool vs. alternatives like update_label, nor prerequisites (label existence).

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

get_attachmentA

Fetch one Gmail attachment by message_id + attachment_id (discover both via list_thread_attachments). Returns base64 bytes + filename/mime_type/size_bytes; for text-like MIMEs also data_text. Default cap 5MB.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
message_idYes
attachment_idYes
max_size_bytesNoReject attachments larger than this. Default 5242880 (5MB).

TDQS

A4.4/5.0
Behavior4/5

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

The description details the return fields (base64 bytes, filename, mime_type, size_bytes, data_text) and the max_size_bytes cap, sufficiently describing the read-only behavior without annotations.

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

Conciseness5/5

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

Two sentences cover purpose, prerequisites, return format, and size cap without any redundancy.

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

Completeness4/5

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

The description covers the core functionality and key constraints, but lacks details on error handling or edge cases like missing attachments.

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

Parameters4/5

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

The description adds context for message_id and attachment_id by linking to list_thread_attachments, supplementing the 50% schema coverage. However, it does not elaborate on the account parameter beyond the schema.

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

Purpose5/5

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

The description explicitly states the tool fetches a Gmail attachment using message_id and attachment_id, and distinguishes from siblings by referencing list_thread_attachments for discovery.

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

Usage Guidelines4/5

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

The description clearly implies the prerequisite of using list_thread_attachments to obtain the IDs, but does not explicitly state when not to use or list alternatives.

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

get_threadC

Fetch a Gmail thread by id, with each message parsed into readable headers + body text/html.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
thread_idYes
formatNofull

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It states that messages are parsed but does not disclose behavior regarding read scopes, error handling (e.g., missing thread), rate limits, or the structure of the returned data beyond 'readable headers + body text/html'.

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

Conciseness4/5

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

The description is a single, front-loaded sentence that efficiently states the verb and resource. It could be slightly improved by adding a second sentence about usage without being verbose.

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

Completeness2/5

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

With no output schema and minimal annotations, the description is incomplete. It does not specify the exact return structure (e.g., a thread object containing messages), pagination, or field details. For a fetch tool with three parameters, more context is needed.

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

Parameters2/5

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

Schema description coverage is only 33% (only account gets a description). The description does not explain thread_id or format beyond what the schema provides (e.g., enum values). It adds no new meaning to parameters.

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

Purpose5/5

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

The description clearly states the tool fetches a Gmail thread by ID and parses messages into readable headers and body. It uses a specific verb ('Fetch') and resource ('Gmail thread'), distinguishing it from siblings like search_threads or label_thread.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives such as search_threads or get_attachment. The description does not mention prerequisites, context, or exclusions.

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

label_messageC

Same as label_thread but for a single message id. Requires gmail.modify scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
message_idYes
add_label_idsNo
remove_label_idsNo

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description must fully disclose behavior. It only states the scope requirement. No details on side effects, idempotency, or what happens on success/failure.

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

Conciseness5/5

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

The description is one sentence plus a scope note. It is maximally concise with no unnecessary words.

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

Completeness2/5

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

Given 4 parameters, 2 required, and no output schema, the description is inadequate. It fails to explain how to use label IDs, what the message ID expects, or the effect of the operation.

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

Parameters2/5

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

Schema description coverage is only 25% (only 'account' has a description). The description does not explain 'message_id', 'add_label_ids', or 'remove_label_ids'. It adds no value beyond the schema, which is sparse.

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

Purpose4/5

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

The description states the tool is 'Same as label_thread but for a single message id,' clearly indicating it labels a message. It distinguishes from label_thread by scope. However, it relies on knowledge of label_thread, which is acceptable given the sibling context.

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

Usage Guidelines2/5

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

The description mentions the required scope 'gmail.modify,' but provides no guidance on when to use this tool versus alternatives like label_thread. No when-not or explicit context is given.

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

label_threadA

Add/remove labels on every message in a thread. INBOX/STARRED/UNREAD/IMPORTANT/SPAM/TRASH or user label ids. Mark read: remove ["UNREAD"]. Archive: remove ["INBOX"]. Requires gmail.modify scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
thread_idYes
add_label_idsNo
remove_label_idsNo

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It explains the mutating effect (add/remove labels) and scope requirements, but lacks details on idempotency, error handling, or whether the operation is atomic. The examples help but do not fully disclose behavior like what happens if the thread is not found.

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

Conciseness5/5

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

The description is two sentences with a bullet-like list of examples. Every sentence adds value: action, examples, common operations, and scope requirement. No wasted words, front-loaded with core purpose.

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

Completeness3/5

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

Given the lack of output schema and low schema coverage, the description provides adequate context for typical use but omits return value details, error conditions, and full parameter semantics (e.g., thread_id format). The examples are helpful, but a complete description would mention response structure or success confirmation.

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

Parameters4/5

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

Schema coverage is only 25% (only 'account' described). The description compensates by explaining that 'add_label_ids' and 'remove_label_ids' accept system labels (INBOX, STARRED, etc.) or user label ids, and gives concrete mappings (remove UNREAD = mark read). However, 'thread_id' format is not clarified, and the description could elaborate on valid label id formats.

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

Purpose5/5

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

The description clearly states 'Add/remove labels on every message in a thread', specifying the verb and resource. It provides concrete examples like system labels (INBOX, STARRED) and actions (mark read: remove UNREAD). This directly distinguishes it from sibling 'label_message' which acts on a single message, making purpose unambiguous.

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

Usage Guidelines4/5

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

The description includes a prerequisite ('Requires gmail.modify scope') and demonstrates common use cases (mark read, archive). It implies when to use this tool (thread-level labeling) versus alternatives like 'label_message' for single messages, but does not explicitly state when not to use it or list alternatives.

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

list_accountsA

List the Google accounts connected on THIS device (metadata only — never tokens). Each entry has ref, email, tag, has_refresh_token. Optionally filter by tag.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOptional: only accounts with this tag.

TDQS

A4/5.0
Behavior4/5

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

Without annotations, the description carries full burden. It discloses key behavioral traits: only metadata (no tokens), device-local, and lists return fields. This provides good transparency, though it could explicitly state it's non-destructive.

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

Conciseness5/5

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

Two concise sentences: first states core function, second details output fields and optional filter. No wasted words. Front-loaded with essential information.

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

Completeness4/5

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

Despite no output schema, description specifies key output fields (ref, email, tag, has_refresh_token). Covers the optional tag filter. Lacks explicit mention of when to use vs account-related siblings, but otherwise complete for a listing tool.

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

Parameters3/5

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

Schema description coverage is high (100%). The parameter 'tag' is described in both schema and description as optional filter. Description adds no new meaning beyond the schema, so baseline score of 3 is appropriate.

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

Purpose5/5

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

Description clearly states it lists Google accounts on the device, specifying 'metadata only—never tokens' and listing output fields (ref, email, tag, has_refresh_token). This distinguishes it clearly from sibling tools like connect_account (add accounts) or check_account_scopes (check scopes).

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

Usage Guidelines3/5

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

No explicit guidance on when to use this tool versus alternatives (e.g., check_account_scopes) or when not to use it. Usage is implied from the name and description, but lacking clear when-to-use and when-to-avoid instructions.

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

list_labelsA

List Gmail labels (system + user) for a connected account.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).

TDQS

A3.6/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden. It only states it lists labels without disclosing behavioral traits such as rate limits, authentication needs, or error conditions for disconnected accounts.

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

Conciseness5/5

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

Description is a single concise sentence that efficiently conveys the tool's purpose without extraneous information.

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

Completeness4/5

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

For a simple list tool with one parameter and no output schema, the description is adequate. It could optionally mention output format (e.g., label IDs and names) but is not incomplete.

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

Parameters3/5

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

Input schema has 100% coverage for its single parameter 'account'. The description adds context that labels are Gmail-specific and for a connected account, but does not significantly enhance understanding beyond the schema description.

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

Purpose5/5

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

Description clearly states the action (list), resource (labels), and scope (system + user for a connected Gmail account). It distinguishes from sibling tools like create_label, delete_label, and update_label.

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

Usage Guidelines3/5

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

Description implies usage when needing to know available labels for a connected account, but provides no explicit guidance on when to use this tool versus alternatives or exclusions. Given many label-related siblings, more specificity would be beneficial.

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

list_thread_attachmentsA

List metadata for all attachments in a thread — filename, mime_type, size_bytes, message_id, attachment_id. No bytes (cheap). Use get_attachment to fetch one.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
thread_idYes

TDQS

A3.9/5.0
Behavior3/5

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

Without annotations, the description must fully disclose behavior. It correctly notes that it returns metadata only (no bytes) and is cheap. However, it doesn't mention any prerequisites beyond having a connected account (implied by param description), potential errors, or what happens if thread has no attachments. It lacks details on idempotency 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.

Conciseness5/5

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

The description is extremely concise, using two short sentences to convey core purpose, output fields, behavioral note (cheap, no bytes), and alternative tool. Every word earns its place. It is well-structured and easy to parse.

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

Completeness4/5

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

For a straightforward list tool with two parameters and no output schema, the description covers the essential aspects: what it lists, what fields are returned, that it's cheap (no bytes), and how to fetch actual attachments. It lacks details on error handling, account scope requirements, and potential limits on number of attachments, but these are minor gaps.

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

Parameters2/5

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

The input schema includes two required parameters, but only account has a description (in schema). The tool description does not elaborate on the parameters or their formats. thread_id lacks any description, and the tool description does not provide guidance on valid values or how to obtain them. Given the 50% coverage in schema and no additional help in description, parameter semantics are insufficient.

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

Purpose5/5

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

The description clearly states the verb (list), resource (metadata for all attachments in a thread), and scope (all attachments, not bytes). It distinguishes from the sibling get_attachment by noting that this returns metadata only and is cheap.

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

Usage Guidelines4/5

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

The description provides clear guidance on when to use this tool (to list attachment metadata) and when to use the alternative get_attachment (to fetch one attachment's bytes). It does not mention other potential uses or exclusions beyond that, but the context is sufficient for differentiating from the most relevant sibling.

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

remove_accountA

Disconnect a Google account: deletes its refresh token from the keychain and its metadata. Does NOT revoke at Google — do that at https://myaccount.google.com/permissions.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It transparently states that it deletes the refresh token and metadata and explicitly says it does NOT revoke at Google, which is critical non-obvious behavior.

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

Conciseness5/5

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

Two sentences, no wasted words, front-loaded with the action. Very concise and to the point.

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

Completeness4/5

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

For a simple destructive action with one parameter and no output schema, the description covers the essential behavior and limitations. Could mention return values or confirmation, but not critical.

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

Parameters1/5

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

The only parameter 'ref' is a string with no description in schema or the tool description. Schema coverage is 0%, and the description adds no meaning about what 'ref' represents or how to obtain it.

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

Purpose5/5

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

The description clearly specifies the verb 'Disconnect' and the resource 'Google account', detailing that it deletes the refresh token and metadata. It also distinguishes itself from revoking at Google, providing clear purpose.

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

Usage Guidelines3/5

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

While it states what the tool does, it does not provide explicit guidance on when to use it versus alternatives like 'connect_account' or 'list_accounts'. The note about not revoking at Google is helpful but not a full usage guide.

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

search_threadsA

Search Gmail threads in a connected account using Gmail search syntax (e.g. "from:bob newer_than:7d has:attachment"). Returns thread ids + snippets in one API call. Use get_thread for full content.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
queryNoGmail search query. Empty = latest threads.
max_resultsNo
page_tokenNo

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description must disclose behavioral traits. It states the tool returns thread ids and snippets in one API call, but does not mention that it is read-only, any authorization needs, rate limits, or pagination behavior. The description adds some context but lacks full transparency.

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

Conciseness5/5

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

The description is three sentences, front-loaded with the core purpose, each sentence adding unique value: the search example, return format, and alternative tool. No unnecessary words.

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

Completeness4/5

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

For a search tool with 4 parameters and no output schema, the description explains the search syntax, return type (ids + snippets), and directs to get_thread for full content. However, it omits pagination details (page_token) and does not mention rate limits, which are relevant for API calls.

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

Parameters3/5

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

Schema description coverage is 50%, so the description should compensate. It adds the Gmail search syntax example and that an empty query returns latest threads, but does not explain page_token or max_results beyond the schema. The added value is modest.

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

Purpose5/5

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

The description clearly states the tool searches Gmail threads using Gmail search syntax, and distinguishes it from get_thread (which retrieves full content). The verb 'search' and resource 'threads' are specific, and the example query clarifies the syntax.

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

Usage Guidelines4/5

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

The description provides a concrete example of when to use this tool and recommends get_thread for full content. However, it does not explicitly exclude alternative tools or mention prerequisites like account connectivity (though implied by parameter).

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

send_draftA

Send a previously-created draft (review it in Gmail first). Returns {message_id, thread_id, label_ids}. Requires gmail.compose scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
draft_idYes

TDQS

A3.8/5.0
Behavior3/5

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

No annotations provided; description adds scope requirement and return fields but omits details on side effects like draft consumption or error conditions.

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

Conciseness5/5

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

Two concise sentences covering action, return, and scope requirement. No wasted words.

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

Completeness3/5

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

For a simple 2-param tool without output schema or annotations, description covers basic purpose and constraints but lacks prerequisites and differentiation from siblings.

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

Parameters2/5

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

Schema coverage is 50% (account described, draft_id not); description adds no parameter-specific information beyond what schema provides.

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

Purpose5/5

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

Clearly states the action 'Send a previously-created draft', distinguishes from siblings like create_draft and send_message, and specifies return values.

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

Usage Guidelines4/5

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

Provides context to review draft in Gmail first and mentions required scope, but does not explicitly contrast with alternative tools.

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

send_messageA

Compose AND send in one step (no draft review). Same payload as create_draft. Returns {message_id, thread_id, label_ids}. Requires gmail.compose scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
toNo
ccNo
bccNo
subjectNo
bodyNoPlain-text body.
html_bodyNoHTML body. With body, sent as multipart/alternative.
reply_to_message_idNoMessage id to reply to (sets threading headers).
fromNoOptional From override (must be a verified send-as alias).
attachmentsNo

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It discloses key behaviors: one-step compose and send, no draft review, and the return value format. However, it could mention rate limits or other constraints.

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

Conciseness5/5

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

Two concise sentences that are front-loaded with the core purpose and return value. Every sentence adds value without redundancy.

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

Completeness4/5

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

Given moderate complexity (10 params, 1 required) and no output schema, the description covers return values, scope requirement, and basic workflow. It could mention error cases or other context, but is adequate.

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

Parameters3/5

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

Schema coverage is 50%. The description adds no extra meaning beyond the schema, only referencing that the payload is the same as create_draft. It does not compensate for missing parameter descriptions.

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

Purpose5/5

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

The description clearly states the action: 'Compose AND send in one step (no draft review)'. It distinguishes from the sibling tool 'create_draft' by noting the lack of draft review and payload similarity.

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

Usage Guidelines4/5

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

The description mentions a prerequisite ('Requires gmail.compose scope') and implies when to use (for direct sending vs. draft). It doesn't explicitly list when not to use or alternatives, but the differentiation from create_draft is clear.

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

set_tagA

Change your tag for a connected account (e.g. switch "personal" to "work"). Metadata only — never touches the token.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
tagYesThe new tag.

TDQS

A3.8/5.0
Behavior3/5

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

No annotations provided, so the description carries the full burden. It discloses that the tool is metadata-only and never touches the token, which signals safety. However, it does not explain what happens on success/failure, whether the tag is validated, or if there are side effects.

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

Conciseness5/5

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

The description is two sentences long with no redundant words. It directly states the action, provides an example, and adds a critical safety note. Every sentence serves a purpose.

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

Completeness4/5

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

Given the low complexity (2 simple params, no output schema), the description covers the core purpose, parameter source, and safety profile. It lacks details on return value or error conditions, but for a straightforward mutation, it is largely complete.

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

Parameters4/5

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

Schema coverage is 100% with both parameters described. The description adds context by noting that 'account' is a connected account ref and cross-referencing list_accounts for valid values, which aids parameter selection. The 'tag' parameter description is minimal but sufficient.

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

Purpose5/5

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

The description clearly states the verb 'Change' and the resource 'your tag for a connected account', with an example ('switch personal to work'). It distinguishes this tool from siblings like connect_account or create_label by specifying it only modifies metadata and never touches the token.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives like connect_account or list_accounts. It does not specify prerequisites (e.g., account must already be connected) or mention scenarios where this tool is preferred.

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

trash_threadA

Move a thread to TRASH (reversible via untrash_thread). Requires gmail.modify scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
thread_idYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It states the tool is reversible and requires a specific scope, but does not detail side effects (e.g., impact on labels, messages) or error conditions. This is adequate but could be more transparent.

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

Conciseness4/5

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

The description is a single sentence that conveys the core purpose, reversibility, and requirement. It is concise and front-loaded with essential information, though it could potentially include more details without becoming overly long.

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

Completeness4/5

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

For a tool with 2 required parameters and no output schema, the description explains the purpose, reversibility, and authentication scope. While it lacks details on return behavior or error handling, it is fairly complete for a simple mutation tool given the context.

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

Parameters2/5

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

Schema description coverage is 50% (only 'account' has a description). The tool description does not add any additional meaning for the parameters beyond what is in the schema. Given the low coverage, the description should compensate but fails to do so, leaving 'thread_id' unexplained.

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

Purpose5/5

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

The description clearly states the action ('Move a thread to TRASH') and the specific resource (a thread). It also distinguishes the tool from its sibling 'untrash_thread' by mentioning reversibility, providing clear purpose.

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

Usage Guidelines4/5

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

The description mentions the required scope ('gmail.modify') and the reversible nature via 'untrash_thread', which helps in deciding when to use this tool. However, it does not explicitly state when not to use it or provide alternatives for other operations.

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

untrash_threadA

Restore a trashed thread to its previous labels. Requires gmail.modify scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
thread_idYes

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description bears full burden. It discloses the restoration action and the required scope, but omits behaviors such as error conditions (e.g., thread not trashed) or side effects. The description is minimally adequate.

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

Conciseness5/5

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

Two sentences, no fluff: first states purpose, second states a requirement. Every word earns its place.

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

Completeness4/5

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

For a simple tool with only two parameters and no output schema, the description covers the core action and a key requirement. Minor gaps exist (e.g., behavior when thread not trashed, return values), but it is largely complete given the complexity.

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

Parameters2/5

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

Schema description coverage is 50%. Description adds no meaning for the 'thread_id' parameter beyond the schema, and for 'account' it only repeats what the schema already provides. With low coverage, the description fails to compensate.

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

Purpose5/5

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

Description clearly states the verb 'Restore' and the resource 'a trashed thread', specifying the outcome ('to its previous labels'). It distinguishes from the sibling tool 'trash_thread' by indicating the reverse action.

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

Usage Guidelines3/5

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

The description mentions the required scope ('Requires gmail.modify scope') but does not explicitly state when to use this tool versus alternatives like 'trash_thread' or 'label_thread'. The context is clear but lacks exclusion guidance.

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

update_labelB

Rename or change visibility of a user label. Requires gmail.modify scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesA connected account ref (see list_accounts).
label_idYes
nameNo
label_list_visibilityNo
message_list_visibilityNo

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, description should fully disclose behavior. Only states rename/change visibility and scope. No mention of side effects, reversibility, or what happens to unspecified fields.

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

Conciseness5/5

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

Two sentences, no wasted words. Front-loads purpose and critical dependency (scope). Efficient.

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

Completeness2/5

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

Tool has 5 parameters (2 required) and no output schema. Description fails to explain optional parameters, return values, or usage patterns. Incomplete for effective invocation.

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

Parameters2/5

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

Schema has 20% parameter description coverage. Description adds no additional meaning to any parameter (e.g., no explanation of label_id or visibility enums). Leaves agent guessing.

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

Purpose5/5

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

Description clearly states the tool renames or changes visibility of a user label, with specific verbs and resource. Distinguishes from sibling tools like create_label, delete_label, etc.

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

Usage Guidelines2/5

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

Only mentions required scope, but no guidance on when to use this tool versus alternatives (e.g., create_label, delete_label, or label_message). No when-not-to-use or context.

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

TDQS

A3.7/5.0
Disambiguation5/5

Each tool targets a distinct action on a specific resource (e.g., create_draft vs send_message, get_thread vs search_threads, label_message vs label_thread). There is no functional overlap; even similar-sounding tools like send_draft and send_message have clearly differentiated purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with lowercase and underscores (e.g., check_account_scopes, create_label, delete_label). The naming is predictable and makes it easy to infer the tool's function from its name alone.

Tool Count4/5

With 20 tools, the count is slightly above the typical well-scoped range of 3-15, but each tool serves a distinct purpose in Gmail management. The size is justified by the breadth of Gmail's features, making it reasonable for a comprehensive MCP server.

Completeness4/5

The tool set covers the core Gmail lifecycle: account management, email sending (draft or direct), threading, labeling, attachments, and trash operations. Minor gaps exist (e.g., no direct individual message retrieval, but get_thread suffices), but agents can work around them.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Multi-account Google MCP server providing read access to Gmail and Calendar via stdio. Supports secure authentication for personal and work accounts with OAuth and keychain token storage.
    4
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Local-first MCP server for agents that need to work across multiple Gmail and Microsoft 365 accounts without cloud token storage.
    6
  • A
    license
    Not graded
    quality
    B
    maintenance
    A local MCP server that manages multiple Gmail accounts simultaneously, allowing MCP clients to switch between accounts per request without logging out or in. It securely stores OAuth tokens in the macOS Keychain.
    MIT

Latest Blog Posts

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/alexpekach/gmail-mcp-local'

If you have feedback or need assistance with the MCP directory API, please join our Discord server