gmail-multi-mcp
Provides tools for interacting with one or more Gmail accounts, including searching emails across accounts, reading messages and threads, listing labels, sending emails and threaded replies, creating drafts, modifying labels, marking messages read/unread, archiving, starring, and moving messages to Trash.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@gmail-multi-mcpsearch all my accounts for unread emails from Amazon"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
gmail-multi-mcp
An open-source MCP server that connects any number of Gmail accounts to Claude (or any MCP client) in one place. Everything runs locally, and your tokens never leave your machine.
Tools
Tool | What it does |
| Lists the connected accounts, with alias and read-only status |
| Runs a Gmail search query on one account or all of them at once |
| Reads one message or a whole conversation as plain text, with a list of attachments |
| Lists the labels for an account |
| Lists the addresses an account can send from (Gmail's "Send mail as") |
| Sends mail from a chosen account, including threaded replies. |
| Saves a draft instead of sending |
| Marks mail read or unread, archives, stars, or adds and removes labels |
| Moves a message to Trash (recoverable) |
Every tool takes an account argument, which can be the full email address or an alias such as work.
Sender addresses: if an account has extra addresses under Gmail's Settings → Accounts → Send mail as, send_email and create_draft can send from any of them with from_address. Without it, a reply goes out from the address the original was sent to, and a new mail goes out from Gmail's default sender.
Related MCP server: gmail-mcp-server
1. Create a Google OAuth client (once)
Open https://console.cloud.google.com/ and create a project.
APIs & Services → Library → enable the Gmail API.
APIs & Services → OAuth consent screen: choose External and fill in the app name and your email. Under Test users, add every Gmail address you want to connect.
APIs & Services → Credentials → Create credentials → OAuth client ID → Desktop app. Download the JSON file.
Save the file as
~/.config/gmail-multi-mcp/credentials.json.
Tip: while the app is in Testing status, Google expires refresh tokens after 7 days. For personal use you can click Publish app on the consent screen. It stays unverified, so you'll see an "unverified app" warning when you sign in, but the tokens stop expiring.
One OAuth client works for all your accounts.
2. Install
Install uv. It also installs Python for you:
curl -LsSf https://astral.sh/uv/install.sh | shThen install the server straight from GitHub:
uv tool install https://github.com/anitalklausen/gmail-multi-mcp/archive/refs/heads/main.zipTo install from a local clone instead, run uv tool install . in the project folder.
This puts gmail-multi-mcp in ~/.local/bin.
3. Connect accounts
Run this once per account. A browser opens where you choose the Google account:
gmail-multi-mcp add --alias private
gmail-multi-mcp add --alias work
gmail-multi-mcp add --alias shop --read-only
gmail-multi-mcp listRemove an account with gmail-multi-mcp remove work. New accounts are picked up by the running server without a restart.
4. Add it to Claude
Claude Desktop: go to Settings → Developer → Edit Config and add the server to claude_desktop_config.json:
{
"mcpServers": {
"gmail": {
"command": "/Users/YOUR_USERNAME/.local/bin/gmail-multi-mcp"
}
}
}Use the absolute path, because Claude Desktop does not read your shell's PATH. Restart Claude Desktop afterwards.
Claude Code:
claude mcp add gmail --scope user -- ~/.local/bin/gmail-multi-mcpConfiguration
Environment variable | Effect |
| Config/token folder. The default is |
| Path to the OAuth client JSON |
| Hides every write tool (send, draft, labels, trash) for all accounts |
Security
Tokens are stored in
tokens/<email>.jsonwith600permissions. Treat them like passwords.The default scope is
gmail.modify: read, send, and change labels, but never permanent deletion. Accounts added with--read-onlygetgmail.readonly.The server tells the model to confirm with you before sending, and Claude also asks for approval on every tool call.
See also the privacy policy.
License
MIT
Available Tools
9 toolscreate_draftB
Save an email as a draft in the given account (not sent).
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | ||
| to | Yes | ||
| bcc | No | ||
| body | Yes | ||
| account | Yes | ||
| subject | Yes | ||
| reply_to_message_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose the key outcome, that the email is saved as a draft and not sent, but omits permission requirements, whether the draft is later visible or editable, and any mutation 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 a single front-loaded sentence with no filler or repetition. It is very concise, though arguably too sparse given the tool's 7 parameters and lack of annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, no annotations, no output schema, and 0% schema description coverage, the description is incomplete. It establishes purpose and draft-vs-send behavior, but leaves major gaps in parameter meaning, usage routing, and behavioral 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 0% across 7 parameters. The description mentions only 'the given account' and a generic 'email', leaving required fields like to, subject, and body plus optional fields like cc, bcc, and reply_to_message_id completely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Save an email as a draft in the given account.' The parenthetical '(not sent)' distinguishes it from the sibling send_email tool, so an agent can identify its purpose without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase '(not sent)' implies this tool is for drafting rather than sending, but the description does not explicitly state when to choose it over send_email or other siblings. No prerequisites, account constraints, or exclusions are given beyond the not-sent clarification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsA
List all connected Gmail accounts with their alias and read-only status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description must carry the behavioral burden. It implies a read-only listing and discloses that alias and read-only status are returned, but it does not explicitly confirm that the operation is non-destructive, mention authentication requirements, or clarify pagination or ordering 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 definition is a single, front-loaded sentence with no wasted words. It communicates the essential information 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 low complexity, zero parameters, and the presence of an output schema, the description is complete enough. It succinctly describes what is listed and highlights the key returned fields without redundant detail.
Complex tools with many parameters or behaviors need more documentation. 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 tool takes zero parameters and schema coverage is effectively 100% for the empty object. The description does not need to explain parameter semantics, so a baseline of 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 states a specific verb ('List') and resource ('connected Gmail accounts') and adds the returned fields (alias, read-only status). It clearly distinguishes this account-listing tool from the email and label operation siblings without needing a sibling reference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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: call this tool when you need to enumerate connected Gmail accounts. However, it does not explicitly state when to choose this tool over alternatives or any prerequisites, leaving the agent to infer the context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_labelsC
List labels (system and user-created) for an account.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses only the label scope (system vs user-created); nothing about permissions/auth requirements, pagination, or result limits for what could be a large label set.
Agents need to know what a tool does to the 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 efficient sentence with the resource and scope front-loaded. No wasted words, though it is arguably too terse to carry the required 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?
An output schema exists, so return values need not be explained, and a one-parameter list tool is inherently simple. Still, the account format and usage context are absent, leaving gaps for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single 'account' parameter has no description in the schema. The phrase 'for an account' only vaguely gestures at it and does not clarify the expected format (ID, email, or name), so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (labels) plus scope (system and user-created, for an account). It implicitly separates from the sibling modify_labels by being a read operation, but never names or contrasts with any sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as modify_labels or how this relates to search_emails filtering. The agent must infer usage entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modify_labelsB
Add/remove labels by name or id. Examples: mark read = remove ['UNREAD']; archive = remove ['INBOX']; star = add ['STARRED'].
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | ||
| add_labels | No | ||
| message_id | Yes | ||
| remove_labels | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it largely does not: it is a mutation tool but says nothing about reversibility, permissions, error behavior on unknown labels, or whether unmentioned labels are preserved. The examples do convey that Gmail semantics collapse 'archive' into label removal, which is useful but narrow.
Agents need to know what a tool does to the 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, operation stated first, then three dense examples. Every clause earns its place and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with zero annotation coverage, no output schema, and 0% parameter documentation, the description should at minimum clarify the required identifiers and the response/error surface. It leaves both the account/message_id semantics and the result shape unstated, so an agent cannot call it confidently without trial and error.
Complex tools with many parameters or behaviors need more documentation. Simple 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. 'By name or id' does clarify the value format for add_labels/remove_labels, but the two required parameters (account, message_id) are entirely undefined in both schema and description — an agent cannot tell whether account is an email, an alias, or an id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (add/remove) and resource (labels), with concrete examples that pin down the Gmail label semantics. It does not explicitly name the sibling it is distinguished from (list_labels), but the 'archive = remove [INBOX]' example implicitly separates it from trash_email.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 three worked examples (mark read, archive, star) map common intents directly onto the call, which is strong implied guidance for when to use it. However it never states when NOT to use it, nor which tool handles the related intents it does not cover.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_emailB
Read one email in full (headers, plain-text body, attachment list).
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | ||
| message_id | Yes | ||
| max_body_chars | No |
TDQS
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 helpfully discloses the shape of the payload (headers, plain-text rather than HTML body, attachment names rather than attachment contents), but omits whether reading marks the message as read or requires any specific auth/scope, which are meaningful side effects for an email read.
Agents need to know what a tool does to the 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 the resource, scope, and payload contents, and no filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, no annotations, and 0% schema coverage, the description is the only source of truth, yet it leaves parameter meaning, truncation behavior, and side effects unspecified. An agent cannot confidently determine how to obtain message_id or whether a 20000-char cap applies.
Complex tools with many parameters or behaviors need more documentation. Simple 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 all three parameters (account, message_id, max_body_chars) are undocumented, and the description adds no meaning for account or where message_id comes from. It also says 'in full' while the schema exposes max_body_chars defaulting to 20000, leaving truncation behavior unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Read one email in full') and scopes it to a single message with an enumerated content set (headers, plain-text body, attachment list), which distinguishes it from read_thread at a glance. It stops short of naming any sibling explicitly, so an agent must infer the boundary rather than read it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no exclusions. With siblings like search_emails and read_thread available, the description never says whether to call this after a search or how it differs from reading an entire thread.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_threadC
Read every message in a conversation thread, oldest first.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | ||
| thread_id | Yes | ||
| max_body_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that messages are returned 'oldest first', but says nothing about permissions, pagination, or the fact that message bodies may be truncated — despite a max_body_chars parameter existing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, and 'oldest first' is the kind of detail that earns its place. It is slightly under-specified rather than bloated, which is the safer failure mode.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, but for a no-annotation tool with 0% parameter coverage and a truncating parameter, the description is too thin. Truncation behavior and read permissions are the notable omissions.
Complex tools with many parameters or behaviors need more documentation. Simple 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% across three parameters, so the description must compensate and does not. Neither 'account' nor 'thread_id' nor the meaningful 'max_body_chars' (default 8000, evidently a truncation control) is explained anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (Read) and resource (every message in a conversation thread) plus the ordering, so the scope is clear. It implicitly distinguishes itself from read_email (single message) and search_emails, but never names a sibling to make the distinction 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?
Usage is only implied: the phrase 'every message in a conversation thread' suggests this is for whole-thread retrieval rather than a single message. There is no explicit when-to-use, when-not-to-use, or named alternative among read_email or search_emails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_emailsA
Search email using Gmail search syntax (e.g. 'is:unread from:bob newer_than:7d').
Args: query: Gmail search query. Empty returns the newest messages. account: Email or alias. Omit to search ALL connected accounts. max_results: Max messages per account (1-50).
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| account | No | ||
| max_results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does disclose useful behavior (empty query returns newest messages, omitting account fans out across ALL connected accounts, max_results range 1-50), but says nothing about output shape, pagination across accounts, rate limits, or auth scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and a syntax example, then a compact per-parameter block. Every line earns its place; the Args formatting is slightly schema-like but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with no annotations and no output schema, the description covers inputs well but never indicates what comes back (message IDs, snippets, thread grouping?) or how results behave when multiple accounts are searched. That gap is minor for a search primitive but real.
Complex tools with many parameters or behaviors need more documentation. Simple 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, and it does: it defines the query dialect, explains that an empty query returns newest messages, clarifies that account accepts an email or alias and that omitting it searches every connected account, and adds a 1-50 bound not present in the schema. Only max_results' default behavior is left implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (email) and pins down the query dialect with a concrete Gmail-syntax example ('is:unread from:bob newer_than:7d'), which cleanly separates it from read_email/read_thread/list_accounts. It stops short of explicitly naming a sibling or stating when this is preferred over them, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the syntax example and by the hints that an empty query 'returns the newest messages' and omitting account searches all accounts, which is genuinely useful context. However, there is no explicit when-to-use vs when-not guidance and no reference to alternatives such as read_email, so it stays at the minimum-viable level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_emailA
Send an email from the given account. Confirm content with the user first.
Args: account: Sender account (email or alias). to: Comma-separated recipients. subject: Subject. May be empty when replying (uses 'Re: '). body: Plain-text body. reply_to_message_id: Message id to reply to; keeps the thread intact.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | ||
| to | Yes | ||
| bcc | No | ||
| body | Yes | ||
| account | Yes | ||
| subject | Yes | ||
| reply_to_message_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose two useful traits — that user confirmation is required before sending, and that reply_to_message_id preserves the thread — but says nothing about irreversibility, required send permissions, or rate/account limits, which matter for an outbound mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the confirmation rule, then a compact Args block; each line carries information rather than filler. It is appropriately sized for a 7-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, most parameters, and one behavioral rule for a mutation tool with no annotations and no output schema. It stops short of the sibling differentiation (create_draft) and permission/irreversibility context that would make the definition fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it documents 5 of 7 parameters with genuine semantic detail: account as email-or-alias, to as comma-separated, subject allowed empty when replying with the 'Re: <original>' behavior, and thread preservation for reply_to_message_id. Only cc and bcc are left undocumented, and those are largely 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?
States a specific verb and resource ('Send an email from the given account'), which is unambiguous on its own. It does not, however, differentiate itself from the sibling create_draft, which an agent must choose between for outbound mail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Confirm content with the user first' is a real usage directive and gives a prerequisite for invocation. But there is no explicit when-to-use guidance against the closest alternative, create_draft, nor any note on when a reply path (reply_to_message_id) should be preferred over a fresh send.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trash_emailB
Move a message to Trash (recoverable for 30 days).
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | ||
| message_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the recoverability window ('recoverable for 30 days'), which is real behavioral context beyond the name, but says nothing about required scopes, whether labels are stripped, or whether the action triggers notifications.
Agents need to know what a tool does to the 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 short sentence with the action front-loaded and the retention caveat appended. Nothing is wasted and it 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 such a simple two-parameter tool with no output schema, the description covers the action and its reversibility, which is the key fact. It remains incomplete on parameter meaning and on how this differs from sibling mutation 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 0% for both required parameters. The description alludes to 'a message' (message_id) but never mentions the required 'account' parameter or clarifies format/identity expectations, so it does not compensate for the documentation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Move a message to Trash'), so the agent knows exactly what the tool does. It does not explicitly differentiate itself from the sibling modify_labels, which could plausibly also remove a message from the inbox, 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 when-to-use, prerequisites, or alternatives are given. The agent must infer usage purely from the name and the verb, and nothing tells it why to prefer trash_email over modify_labels for removing a message.
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.
9 tool updates
v0.2.0- First observed
create_draft - First observed
list_accounts - First observed
list_labels - First observed
modify_labels - First observed
read_email - First observed
read_thread - First observed
search_emails - First observed
send_email - First observed
trash_email
TDQS
Scored across 9 tools
Each tool has a fairly distinct purpose: reading, searching, sending, drafting, trashing, and label management are all clearly separated. The only mild overlap is between modify_labels (which can apply TRASH/UNREAD labels) and trash_email, plus list_labels vs modify_labels, but descriptions make the intended use clear.
All nine tools follow a strict verb_noun snake_case pattern (list_accounts, search_emails, read_email, read_thread, list_labels, modify_labels, trash_email, send_email, create_draft). No camelCase or vague verbs mixed in.
Nine tools is a well-scoped surface for a multi-account Gmail server, covering the core mailbox operations without bloat. Every tool maps to a distinct mailbox workflow.
Core lifecycle is well covered: list/search/read/read thread, send, draft, trash, and label management across accounts. Minor gaps remain — no attachment download, no permanent delete (only trash), and no explicit forward or mark-spam/unspam tool, though these can be approximated with existing tools.
Maintenance
Related MCP Connectors
Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.
Connect any mailbox to Claude, ChatGPT & AI: read, send, reply, schedule & search emails.
Your IMAP mailbox as an MCP server: read, search and (if you allow it) organize mail. Open source.
Your mailboxes in ChatGPT and Claude: Gmail, iCloud, Fastmail, any IMAP. Passwords stay yours.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that enables Claude Desktop to interact with Gmail through secure OAuth 2.0 authentication. Send emails, search messages, read emails, and manage multiple Gmail accounts directly from Claude Desktop.46 npmMIT
- AlicenseAqualityDmaintenanceConnects multiple Gmail accounts to Claude Desktop via MCP, enabling email search, labeling, drafts, and confirmed sending through natural language.1346 npmMIT
- AlicenseNot gradedqualityDmaintenanceA local MCP server that gives Claude access to multiple Gmail accounts simultaneously for search, read, draft, send, label, and a scheduled cross-inbox digest, with enforced send policies per mailbox.MIT
- AlicenseNot gradedqualityAmaintenanceA local MCP server that lets Claude Desktop search, read, draft, and send email across multiple Gmail accounts with configurable safeguards, including two-step sending and no permanent deletion.MIT