gmail-mcp
Provides multi-account Gmail access for searching and reading emails and threads, listing and creating drafts and reply drafts, forwarding emails, and sending emails with a two-step confirmation flow.
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-mcpsearch my work account for unread emails from this week"
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-mcp
Multi-account Gmail MCP server (stdio). Read, search, draft, reply, forward and send, with a two-step confirmation before anything is sent.
Setup
Requires Python 3.11+ and uv. Each user brings their own Google OAuth client; nothing secret ships in this repo.
Google Cloud: create a project, enable the Gmail API, and create an OAuth client of type "Desktop app". Download the JSON to
~/.gmail-mcp/credentials.json(or setGMAIL_MCP_CREDENTIALS). If the consent screen is in Testing mode, add each Gmail address as a test user. Note: Google expires Testing-mode tokens after 7 days; the server tells the agent to re-link when that happens, or publish the app to production to stop it.Install:
git clone https://github.com/Shravanth007/Gmail-MCP.git cd Gmail-MCP uv syncLink accounts (repeat per account):
uv run gmail-mcp add-account --alias workAdd a shared group too:uv run gmail-mcp add-account --alias work1 --group work. Change it any time:gmail-mcp assign EMAIL_OR_ALIAS GROUP(use-as GROUP to clear). Also:gmail-mcp list-accounts(email, alias, group),gmail-mcp remove-account EMAIL.An alias is a unique nickname for one account. A group is a label several accounts can share (e.g.
work,personal). Aliases and groups share one namespace, so a name can't be both.Connect a client
Claude Desktop (
claude_desktop_config.json):{ "mcpServers": { "gmail": { "command": "uv", "args": ["--directory", "C:\\path\\to\\Gmail-MCP", "run", "gmail-mcp"] } } }Claude Code:
claude mcp add gmail -- uv --directory "C:\path\to\Gmail-MCP" run gmail-mcp
Related MCP server: Gmail Sender MCP Server
Security
OAuth tokens live in the OS keychain (Windows Credential Manager / macOS Keychain / Secret Service), never on disk.
accounts.jsonholds only emails and aliases.Scopes are least privilege:
gmail.readonlyandgmail.compose(read, draft, send; no delete or modify).The account email comes from Google's
getProfile, never from user input.Replying to your own message addresses the original recipients, as Gmail does. Forwards carry every named attachment, including ones nested in signed mail.
Sending is two-step: the first call returns a preview and a single-use
confirm_token(5 min TTL, bound to account and action). The message sent is rebuilt from the previewed arguments; changed arguments are rejected. Forsend_draftthe token is bound to the draft's message id, so a draft edited after the preview cannot be sent with the old token.Linking uses
prompt=consentso a refresh token is always issued; nothing is stored if Google omits it.remove-accountrevokes the token with Google and deletes it from the keychain.Logs go to stderr and never include tokens or message bodies.
Tools
list_accounts: connected accounts (email, alias, group) and agroupsmap.add_account/remove_account: link (opens a browser on the server machine, 3 min timeout; prefer the CLI) or unlink an account.remove_accountis two-step withconfirm_token.assign_account: set or clear an account's group.search_emails: Gmail search syntax.accountmay be an email, alias or group (or omitted for all accounts); every result row carries theaccountit came from, and per-account failures are reported undererrors. All other tools, including send/reply/forward, need exactly one account (email or alias).get_thread: read a thread.list_drafts: list drafts.create_draft/create_reply_draft: save a draft; nothing is sent.send_email,reply_to_email,forward_email,send_draft: two-step send withconfirm_token.
Available Tools
13 toolsadd_accountB
Connect a new Gmail account. Opens a browser window on the machine running this server
and waits up to 3 minutes for sign-in. Prefer the CLI: gmail-mcp add-account --alias NAME --group GROUP.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | ||
| group | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the behavioral burden and does well: it discloses that a browser window opens on the server host and that the call blocks for up to 3 minutes awaiting sign-in. Missing pieces are what happens on timeout/failure and whether it returns the created account identifier.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and the interactive constraint. The CLI sentence is dense and useful, though recommending an external command inside a tool description risks pulling the agent away from invoking the tool at all.
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?
There are no annotations and no output schema, and the description covers the interactive/blocking nature well, but it leaves parameter meaning and return-value expectations undocumented. For an authentication tool that can hang for minutes, a note on timeout behavior and failure modes would round it out.
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 parameters, so the description must compensate. The CLI example at least surfaces the `--alias NAME --group GROUP` names, but it never explains what an alias or a group actually means, whether they are optional, or what happens when they are omitted.
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 and resource: 'Connect a new Gmail account,' which clearly separates it from list_accounts, assign_account, and remove_account. It stops short of explicitly articulating the boundary with assign_account (which presumably attaches an already-authenticated account), so a perfect score isn't warranted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It does provide a routing hint by saying 'Prefer the CLI: gmail-mcp add-account ...', which tells the agent an out-of-band alternative exists. However, it never states when this MCP tool is the right choice (e.g., no CLI available, headless vs GUI hosts) or what to do if the browser cannot be opened.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assign_accountA
Assign an account to a group such as 'work' or 'personal' (None clears it). Many accounts may share a group.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | ||
| account | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden. It does disclose two real behavioral traits: passing None clears the group, and groups are non-exclusive ('Many accounts may share a group'). It does not say whether re-assigning overwrites a prior group, whether the group must already exist, or anything about permissions or the response.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler, and the core operation is front-loaded ahead of the null-clearing caveat and the shared-group note. Every clause adds distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no annotations and no output schema, the description covers the operation, the clearing behavior, and the sharing model. Remaining gaps - overwrite semantics on re-assignment and the account identifier format - are minor 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 for the non-obvious parameter: 'group' gets example values ('work', 'personal') and the critical null semantics. The required 'account' parameter is only implicit from the verb and its accepted format (ID vs. address) is never specified.
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 ('Assign an account') plus the target concept ('to a group'), which is clearly distinct from siblings like add_account, remove_account and list_accounts. It stops short of explicitly contrasting itself with those siblings, but the operation is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the parenthetical '(None clears it)' tells the agent how to un-assign a group, which is a useful when-to-do-what hint. There is no explicit guidance on when to prefer this over remove_account or add_account, and no prerequisite or error-condition guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_draftB
Create a draft (does not send). account is an email or alias.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | ||
| to | Yes | ||
| bcc | No | ||
| body | Yes | ||
| account | No | ||
| subject | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full behavioral burden, and it does disclose the single most important trait: nothing is transmitted. It says nothing about where the draft lands, whether recipients are validated, what happens on a bad address, or what the call returns (e.g., a draft id), so the disclosure is useful but shallow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and its key constraint, with zero filler. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and six undocumented parameters, the description should say more about result and side effects. The non-sending guarantee covers the highest-risk unknown, which keeps this from being inadequate, but the surrounding gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across six parameters, so the description must compensate and it largely does not. Only `account` is explained ("an email or alias"); the format expected for the `to`/`cc`/`bcc` string arrays and whether `body` supports HTML are left entirely to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Create a draft" is a specific verb+resource, and "(does not send)" immediately separates it from send_email and send_draft in the sibling list. It does not distinguish itself from create_reply_draft, which is the closest sibling, but the core action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical "does not send" implies the selection condition against send_email/send_draft, but only by negation. There is no explicit "use this when..." guidance and no mention of when to prefer create_reply_draft or send_draft for an existing draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_reply_draftB
Create a threaded reply draft to a message (does not send). account is an email or alias.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| account | No | ||
| reply_all | No | ||
| message_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full behavioral burden, and it does disclose the most important trait: the draft is not sent. It says nothing about whether the draft lands in a Drafts folder, whether reply_all changes recipient handling, what account defaults to when omitted, or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core action and its non-sending nature front-loaded before the parameter note. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple four-parameter draft-creation tool with no output schema and no annotations, the description covers the essential action and the non-send guarantee. It falls short on the reply_all semantics and on default account behavior, which an agent needs to call this correctly without guessing.
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 supply parameter meaning, and it only clarifies one of four: 'account is an email or alias'. The semantically loaded 'reply_all' flag is left completely unexplained (all recipients vs. sender only), and message_id/body get no elaboration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource ('Create a threaded reply draft to a message') and clarifies the key distinction from a send operation with '(does not send)'. It implicitly separates this from siblings like create_draft, reply_to_email, and send_draft, though it does not name any of them 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?
The parenthetical '(does not send)' implies the tool is for staging a reply rather than delivering it, which hints at when to use it over reply_to_email or send_draft. However, there is no explicit statement of when to choose this versus create_draft, nor any prerequisite or exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forward_emailA
Forward a message with its attachments. Two-step: first call returns a preview + confirm_token; call again
with it to send. account is an email or alias.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| body | No | ||
| account | No | ||
| message_id | Yes | ||
| confirm_token | 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 usefully discloses the two-step preview/confirm safety flow and that attachments are carried along, but says nothing about permissions, whether the original is marked as forwarded, or what the preview contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the two-step mechanic, then the one non-obvious parameter. No wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with no annotations and no output schema, the description covers the critical confirm flow but omits body semantics, the array nature of `to`, and what the preview returns. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 5 parameters, so the description must compensate. It clarifies `account` (email or alias) and `confirm_token` (obtained from the preview call), but leaves `to`, `body`, and `message_id` entirely to the bare schema titles.
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 ('Forward a message with its attachments'), which is clearly distinct from send_email and reply_to_email in the sibling list. It does not explicitly name those siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear procedural guidance: the first call returns a preview plus confirm_token, and a second call with that token actually sends. It does not say when to prefer forwarding over send_email or reply_to_email, so no exclusions are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_threadA
Read all messages in a thread (headers, plain-text body, attachment names). account is an email or alias.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| thread_id | 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 burden. It does disclose what comes back (headers, plain-text body, attachment names — notably not attachment content or HTML), which is real value, but it says nothing about read-only guarantees, permissions needed, or what happens when the thread or account is invalid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action and returned fields front-loaded, followed by the one parameter clarification that needs it. Nothing is padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description covers purpose and return shape adequately. However, with zero annotation and zero schema-description coverage it should also state the default-account behavior and any lookup-failure semantics, which it does not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for both parameters. It clarifies that `account` is an email or alias, which the bare any-of string schema does not convey, but it leaves `thread_id` format undefined and does not say what happens when `account` is omitted (schema default is null).
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 ('Read all messages in a thread') and even enumerates the payload (headers, plain-text body, attachment names), so an agent can tell this fetches a whole thread by id rather than searching. It does not explicitly contrast itself with the sibling search_emails, which keeps it 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?
Usage is implied: you call this when you already have a thread_id and want every message rather than a search result set. There is no explicit when-not guidance, no mention of when to prefer search_emails, and no note on prerequisites or failure behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsA
List connected Gmail accounts (email, alias, group).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description must carry behavioral disclosure. It says the tool lists connected accounts and mentions returned fields, but omits auth requirements, pagination or ordering, whether all accounts are returned, and any read-only safety context. For a no-annotation tool this is thin.
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?
Single front-loaded sentence with no redundant wording. It communicates the resource and the surfaced fields efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with no output schema, the description gives the core resource and fields but does not cover return shape, ordering, or pagination. It is adequate for a simple enumeration but leaves behavioral gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero input parameters, so the baseline is 4. The description's mention of email, alias, and group describes output fields rather than parameters and does not need to add parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, 'List', and resource, 'connected Gmail accounts', and names the surfaced fields (email, alias, group). The list verb clearly separates it from add_account, assign_account, and remove_account siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage by naming the resource to enumerate, but gives no explicit when-to-use guidance, prerequisites, or alternatives. An agent can infer it is the read path for accounts, yet the description does not state exclusions or when to prefer another sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_draftsC
List drafts with subject and recipients. account is an email or alias.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| max_results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full disclosure burden. It reveals that results include subject and recipients, but says nothing about read-only nature, ordering, truncation, or how max_results caps the listing — significant gaps for a paginated list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and return fields, with no filler. The brevity is close to the limit of usefulness rather than 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 simple two-parameter list tool with no output schema, the description covers the core action and one parameter but omits the result-limit behavior and any indication of what a draft entry looks like. Adequate but with clear gaps an agent would notice when calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies that `account` accepts an email or alias, which is genuinely useful, but `max_results` (default 10) is never mentioned, leaving half the parameters unexplained beyond their titles.
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 ("List drafts") and even previews the returned fields (subject and recipients), so an agent can distinguish it from mutation siblings like create_draft or send_draft. It does not explicitly differentiate it from search_emails or get_thread, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no mention of the nearby alternatives such as search_emails for filtered retrieval. The listing intent is implied by the name, but routing between siblings is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_accountA
Disconnect a Gmail account (email or alias): revokes and deletes its stored token. Two-step: first call returns a confirm_token; call again with it to remove.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | ||
| confirm_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does disclose the key traits: this is destructive (token revoked and deleted) and requires a two-step confirmation, which is the safety-relevant behavior. It omits what happens to any synced email/draft data and whether re-authorization is required afterward, leaving some destructive-side-effect detail unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler; purpose and the destructive effect come first, then the two-step contract. 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?
For a destructive two-parameter tool with no annotations and no output schema, the description covers purpose, the destructive effect, and the confirmation handshake — enough to call it correctly. It is slightly short on post-removal state and error conditions, but nothing critical to invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: 'account' is defined as an email or alias, and 'confirm_token' is explained as a value returned by the first call and passed back on the second. It adds meaning for both parameters, though it doesn't describe accepted formats for the account identifier or validation failures.
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 ('Disconnect a Gmail account') plus the exact mechanism ('revokes and deletes its stored token'). It is clearly separable from siblings like add_account, assign_account, and list_accounts without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives the operative usage procedure — first call returns a confirm_token, second call with that token performs the removal — which tells the agent how to sequence invocations. It does not explicitly state when to prefer this over assign_account or what to do if the account is unknown, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_emailB
Reply in-thread to a message. Two-step: first call returns a preview + confirm_token; call again with it
to send. account is an email or alias.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| account | No | ||
| reply_all | No | ||
| message_id | Yes | ||
| confirm_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does disclose the important two-step preview/confirm safety gate before a mutation occurs. However, it omits side effects (does it mark the thread read, send immediately on confirm, apply to all recipients with reply_all) and failure 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?
Three short sentences with no filler; the core action and the confirm flow are front-loaded. Nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a mutating, five-parameter tool with no annotations, no output schema, and zero schema descriptions, so the description needs to work harder than it does. It covers the confirm flow but leaves most parameters and the preview payload's shape unexplained.
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 five parameters, and the description only explains `account` ('an email or alias') and implicitly `confirm_token` via the two-step flow. `message_id`, `body`, and `reply_all` receive no semantic explanation 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 opens with a specific verb and resource: 'Reply in-thread to a message,' which distinguishes it from send_email (new message) and forward_email (forward). It doesn't explicitly contrast with the sibling create_reply_draft, so the agent must infer the draft-vs-send distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete invocation guidance: the first call yields a preview plus confirm_token, and a second call with that token actually sends. That is a clear usage protocol. It does not state when to prefer this over create_reply_draft/send_draft or what to do if message_id is invalid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_emailsA
Search messages using Gmail search syntax (e.g. 'from:bob is:unread'). account is an email, alias or group;
omit it to search all accounts. Each result row has the account it came from.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| account | No | ||
| max_results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full disclosure burden. It does add real behavior: the default scope spans all accounts, and each row reports its source account. It says nothing about result ordering, pagination, rate limits, or truncation behavior of max_results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and query dialect, then scope, then return shape. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read tool with no output schema and no annotations, the description covers query syntax, account scope, and result shape — the essentials. The undocumented `max_results` semantics and the absence of any output-shape details beyond the account field leave visible gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does a good job on `account` (email, alias, or group; null means all) and on `query` (Gmail syntax with an example), but says nothing about `max_results` or its default of 10.
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) plus the resource (messages/emails) and names the query dialect (Gmail search syntax with an inline example), so an agent knows exactly what the tool does. It does not distinguish itself from siblings such as get_thread or list_drafts, which is the only thing keeping it from 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?
Gives one concrete usage rule — omit `account` to search across all accounts — which is genuinely actionable. It offers no guidance on when to prefer this over get_thread or list_drafts, and no exclusions or alternatives, so usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_draftA
Send an existing draft. Two-step: first call returns a preview + confirm_token; call again with it to send.
account is an email or alias.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| draft_id | Yes | ||
| confirm_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and it does disclose the most important behavioral trait: a preview + confirm_token handshake before the irreversible send. It does not state irreversibility explicitly, mention permission needs, or describe what the preview contains or how tokens expire, which prevents a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and immediately followed by the non-obvious workflow. Nothing is redundant, though the `account` note reads as an afterthought appended after the workflow rather than integrated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, unannotated, no-output-schema tool, the description covers the critical two-step mechanic but omits what happens on a bad or expired token, whether the send is reversible, and what the preview returns. These gaps matter given the absence of annotations and output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it explains both `account` (an email or alias) and `confirm_token` (obtained from the first call and required on the second). `draft_id` is left entirely undocumented, and no format or sourcing guidance is given for it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Send an existing draft" gives a specific verb and resource, and the word "existing" distinguishes it from create_draft/create_reply_draft and from send_email, which would compose-and-send in one step. It stops short of naming those siblings explicitly, so the differentiation is implicit rather than stated.
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 two-step invocation is clearly spelled out, which is the main usage guidance an agent needs. However, there is no statement of when to prefer this over send_email, nor any prerequisites such as the draft needing to exist in the given account.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_emailB
Send a new email. Two-step: first call returns a preview + confirm_token; call again with it to send.
account is an email or alias.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | ||
| to | Yes | ||
| bcc | No | ||
| body | Yes | ||
| account | No | ||
| subject | Yes | ||
| confirm_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the most important trait: sending is gated behind a preview + confirm_token round trip, so the first call is effectively non-destructive. It stops short of stating that the second call is irreversible, what the preview contains, or whether account/permission prerequisites exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the verb and the flow, with zero filler. It is slightly too terse in the phrase "call again with it," which leaves the agent to infer that the same payload plus the token is required.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an irreversible mutation tool with no annotations and no output schema, the description covers the crucial confirm-token mechanism, which is the main failure mode. It still omits permission/authentication expectations, error behavior, and what the preview returns, leaving meaningful gaps for a 7-parameter write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 7 parameters, so the description must compensate and largely does not. It only explains `account` (email or alias) and partially explains `confirm_token` via "call again with it"; to/cc/bcc/subject/body are left to name inference, and the description does not clarify that the second call must repeat the original arguments.
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 a new email." That is enough to distinguish it from sibling draft/reply tools such as create_draft, send_draft, and reply_to_email, though the description never names those alternatives 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?
The two-step preview/confirm flow is real usage guidance that an agent must follow to avoid an accidental send. However, there is no guidance on when to prefer this over send_draft, create_draft, or reply_to_email, and no exclusions or preconditions are given.
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.
13 tool updates
v0.1.0- First observed
add_account - First observed
assign_account - First observed
create_draft - First observed
create_reply_draft - First observed
forward_email - First observed
get_thread - First observed
list_accounts - First observed
list_drafts - First observed
remove_account - First observed
reply_to_email - First observed
search_emails - First observed
send_draft - First observed
send_email
TDQS
Scored across 13 tools
Each tool maps to a distinct resource/action, and the account-scoped vs. mail-scoped tools are clearly separated. The only mild overlap is create_draft vs. create_reply_draft, but the descriptions make the threaded-reply distinction explicit.
All 13 tools follow a strict snake_case verb_noun pattern (list_accounts, add_account, search_emails, create_draft, send_email, forward_email). Action verbs are chosen consistently from a small, predictable vocabulary.
13 tools is well within the ideal range and each one covers a real workflow step (account management, search/read, drafts, sending). Nothing appears redundant or padded.
Read and send coverage is strong, but there are notable gaps: no delete/update draft, no way to trash, archive, label, or mark messages read/unread, and attachments are only listed by name with no download. These omissions will block common inbox-management workflows.
Maintenance
Related MCP Connectors
Read, send, file and search email in any Gmail, Microsoft 365 or IMAP mailbox, plus its calendar.
Permissioned access to Gmail, Drive and Calendar via the user's own Google account
Give AI agents their own email inboxes: list, read and send mail via scoped, revocable OAuth grants.
Gmail, Outlook, Hotmail, Microsoft 365, iCloud, Fastmail, other IMAP mailboxes: search, read, send.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables reading, sending, archiving, and managing Gmail emails and labels through Google OAuth authentication, acting as an OAuth proxy to the Gmail API.295 npm12MIT
- AlicenseAqualityDmaintenanceEnables sending emails and creating drafts through the Gmail API with OAuth 2.0 authentication.217 npmMIT
- AlicenseAqualityCmaintenanceManages email accounts via IMAP/SMTP, enabling reading, searching, sending, replying, forwarding, and folder management with multi-user and OAuth support.221MIT
- AlicenseAqualityBmaintenanceSafely searches, reads, flags, and drafts email through IMAP, with no send, delete, or move capabilities. Uses a local broker and OS credential store for secure authentication.16146 PyPIApache 2.0