Skip to main content
Glama
draft-only-google

draft-only-google

draft-only-google-mcp

This is a small MCP server that gives Claude access to one Gmail mailbox and its Google Calendar. Claude can read mail, manage labels, write drafts and work with calendar events. It has no way to send email, so you review every draft and send it yourself from Gmail.

It is about 560 lines of Python. It depends only on Anthropic's mcp SDK, Google's auth libraries and requests, and it talks only to the Gmail API, the Calendar API and Google OAuth.

macOS only. Tokens are stored in the macOS Keychain and nowhere else, and the server refuses to start a login or read a token on any other system. Linux and Windows are not supported today.

What the guarantee covers

There is no code path in this server that sends mail. It has no send tool, it never calls Gmail's send endpoints, and it does not speak SMTP. Every id goes through one check before it reaches a URL, so an id cannot steer a request to another endpoint. Calendar writes always pass sendUpdates=none, and no tool has a parameter that changes that.

tests/test_no_send.py enforces this. It fails if the source mentions a send endpoint, a send scope or SMTP, if the OAuth scopes or the tool list change from a fixed list, if a tool gains a parameter with send or notify in its name, if a calendar write asks Google to notify guests, or if the final URL of any tool call leaves the Gmail and Calendar read and draft endpoints.

Related MCP server: gmail-mcp-server

What the guarantee does not cover

The guarantee is about this server's code, not about the Google token, so these limits matter:

  • The token itself can send. Gmail has no scope that allows drafts without also allowing send, so this server uses gmail.modify, which Google describes as read, compose and send. Other software holding this token could send mail.

  • An agent with a shell can reach the token. The token is stored in the Keychain by the security command, so a process running as your user can read it back with that same command without a prompt. If you need the limit to hold, do not also give the agent unrestricted shell access.

  • Calendar guests can still hear about events. attendees is refused unless you turn on DRAFT_ONLY_GOOGLE_ALLOW_ATTENDEES. Once it is on, an event with attendees can appear on their calendars even though no invite is requested, and Google's documentation says some emails might still be sent. Changing an event that already has guests can reach them the same way. Treat adding a guest as a visible action.

  • Drafts can hold private content. create_draft can attach any regular file inside the allowed folders, and mail you ask Claude to read can contain instructions written by strangers. Read each draft and its recipients before you send it.

Tools

  • Gmail: search_threads, get_thread, get_message, download_attachment, list_labels, modify_thread_labels, create_draft, update_draft, list_drafts

  • Calendar: list_calendars, list_events, get_event, create_event, update_event

Setup

You need macOS, uv and a Google account. You create your own Google OAuth client, so no third party is involved and your token only works with your client.

1. Create a Google OAuth client

  1. Open the Google Cloud console and create a new project.

  2. Under APIs & Services, open Library, then enable the Gmail API and the Google Calendar API.

  3. Open Google Auth Platform and fill in the app name and your email address when asked. Choose the audience:

    • With a Google Workspace account, choose Internal. Only people in your organization can use the app, and no review is needed.

    • With a personal Gmail account, choose External, then add your own address as a test user under Audience.

  4. Under Clients, create an OAuth client with the application type Desktop app, then download its JSON file.

An External app in Testing status gets a refresh token that expires after 7 days, so you would need to log in again each week. To avoid that, publish the app from the Audience page. Google will then show an unverified app warning at login, which you can click through because it is your own app.

2. Sign in

git clone https://github.com/elliothimmelfarb/draft-only-google-mcp.git
cd draft-only-google-mcp
uv run draft-only-google-mcp login /path/to/client_secret.json

A browser opens for Google's consent screen. When you are signed in, the token is in the Keychain and you should delete the JSON file. Run uv run draft-only-google-mcp whoami to check which account is stored.

3. Add it to Claude Code

claude mcp add -s user draft-only-google -- uv run --directory "$PWD" draft-only-google-mcp

Configuration

All settings are optional environment variables. Set them for both the login command and the server, for example with claude mcp add -e NAME=value.

Variable

Default

Purpose

DRAFT_ONLY_GOOGLE_ACCOUNT

none

Makes login refuse any other Google account. Also the Keychain account name; without it the name is default.

DRAFT_ONLY_GOOGLE_KEYCHAIN_SERVICE

draft-only-google-mcp

The Keychain service name.

DRAFT_ONLY_GOOGLE_SERVER_NAME

draft-only-google

The name the MCP server reports.

DRAFT_ONLY_GOOGLE_ATTACHMENT_DIR

~/Downloads/draft-only-google-mcp

Where download_attachment saves files.

DRAFT_ONLY_GOOGLE_ATTACHMENT_ROOTS

the attachment folder

Folders create_draft may attach from, separated by :. Links are followed first, and a draft's attachments are capped at 25 MB in total.

DRAFT_ONLY_GOOGLE_TIME_ZONE

UTC

The default time zone for calendar events.

DRAFT_ONLY_GOOGLE_ALLOW_ATTENDEES

off

Set to 1, true, yes or on to let create_event and update_event set guests.

To use two mailboxes, register the server twice with a different DRAFT_ONLY_GOOGLE_ACCOUNT for each and run login once for each.

Development

uv run pytest

License

MIT. See LICENSE.

Available Tools

14 tools
create_draftA

Create a draft in the mailbox (it is NOT sent). For a reply, pass reply_to_message_id and leave subject empty to get "Re: " threaded correctly. Write each paragraph as one line; lines wrapped by hand are joined so the email fills the reader's window. attachments: absolute paths of local files to attach. Each must be a regular file inside the attachment folder or DRAFT_ONLY_GOOGLE_ATTACHMENT_ROOTS, and together they must fit in 25 MB.

NameRequiredDescriptionDefault
ccNo
toYes
bccNo
bodyYes
subjectNo
attachmentsNo
reply_to_message_idNo

TDQS

A4.9/5.0
Behavior5/5

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

Without any annotations, the description provides critical behavioral limits, including the 25 MB limit for attachments and specific requirements for attachment locations (local paths or designated roots). It clarifies the state of the generated object (a draft, not a sent message).

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 information is highly functional and well-organized, front-loading the most important constraint (it is not sent). It is slightly dense due to the multitude of rules but maintains high information density.

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

Completeness5/5

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

Given the complexity—involving message threading logic, content formatting rules, and strict file system/size constraints—the description is exceptionally complete. It covers all major functional edge cases for this tool.

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

Parameters5/5

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

With 0% schema description coverage, the description is highly vital. It clarifies that `reply_to_message_id` requires an empty subject, and `attachments` requires local paths and adheres to a size constraint. This compensation for lack of schema detail is excellent.

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 defines the action (Create a draft) and the crucial behavioral constraint that it is not a sending action, clearly distinguishing it from siblings like 'send' or 'update_draft'.

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

Usage Guidelines5/5

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

It provides explicit guidance on using reply_to_message_id for threading, specifically instructing the agent to leave the subject empty to achieve the correct 'Re:' formatting. This is a specific behavioral prerequisite for correct usage.

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

create_eventB

Create a calendar event. start/end are RFC 3339 datetimes or YYYY-MM-DD for all-day. attendees is refused unless DRAFT_ONLY_GOOGLE_ALLOW_ATTENDEES is on. This server asks Google not to notify guests, but the event may still appear on their calendars and Google may still email them, so treat adding a guest as a visible action.

NameRequiredDescriptionDefault
endYes
startYes
summaryYes
locationNo
attendeesNo
time_zoneNoUTC
calendar_idNoprimary
descriptionNo

TDQS

B3.4/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 and does a good job on the risky dimension: it discloses the DRAFT_ONLY_GOOGLE_ALLOW_ATTENDEES gate and the crucial caveat that guests may be notified or see the event despite sendUpdates being suppressed. However, it says nothing about which calendar the event lands in by default, permission requirements, or that repeated calls create duplicate events.

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

Conciseness4/5

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

Four short sentences, front-loaded with the action and then the format rules, ending with the highest-stakes caveat. No filler, though the final sentence is dense and could be split for readability.

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 mutation tool with no annotations, no output schema, and 8 parameters at 0% schema coverage, the description covers the side effects and date formats well but leaves half the parameters and the return value undocumented. An agent still lacks guidance on time_zone/calendar_id defaults and on avoiding duplicate creates.

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 0% across 8 parameters, so the description must compensate. It adds genuinely useful semantics for start/end (RFC 3339 or YYYY-MM-DD all-day) and attendees (env-var gated), but summary, location, time_zone, calendar_id, and description receive no explanation and must be inferred from bare titles.

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?

Opens with a specific verb+resource: 'Create a calendar event.' An agent can immediately distinguish this from list_events/get_event/update_event siblings, though the description never names those siblings or states the boundary explicitly.

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

Usage Guidelines3/5

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

Usage is implied by 'Create' plus the attendee gating rule, and the draft-only flag tells the agent when attendees will fail. There is no explicit guidance on when to use this versus update_event (e.g. that it always creates a new event rather than modifying an existing one), which matters for avoiding duplicate creation.

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

download_attachmentB

Save an attachment to the attachment folder under a new unique name and return the local path.

NameRequiredDescriptionDefault
filenameYes
message_idYes
attachment_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description must carry behavior, and it does disclose two non-obvious traits: the file is written into an 'attachment folder' and renamed to a unique name rather than kept as-is, and the local path is returned. It omits failure modes, overwrite/collision behavior, permission needs, and whether the original filename is preserved anywhere.

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

Conciseness5/5

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

One sentence, front-loaded with the action and ending with the return value. No filler or redundant restatement of the tool name.

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

Completeness3/5

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

An output schema exists, so return-value detail is unnecessary, and the description correctly summarizes the path return. However, for a file-writing mutation with zero annotation coverage and completely undescribed parameters, it leaves too much unsaid about preconditions and side effects.

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 0%, so the description must compensate; it adds the meaningful semantic that 'filename' is a base for a renamed artifact rather than the resulting file name. It says nothing about message_id or attachment_id, leaving two of three required parameters undocumented.

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

Purpose4/5

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

States a specific verb (save), the resource (attachment), and the outcome (new unique name plus local path returned). It is distinguishable from read-oriented siblings such as get_message, though it never explicitly names how it relates to attachment retrieval via those siblings.

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

Usage Guidelines2/5

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

No guidance on when to use this versus get_message or other siblings, and no prerequisites stated (e.g., that the IDs come from a message). The agent must infer the workflow entirely from the parameter names.

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

get_eventC

Get one calendar event.

NameRequiredDescriptionDefault
event_idYes
calendar_idNoprimary

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the full behavioral burden, yet it only implies a safe single-record read through the verb "get". It says nothing about permission requirements, behavior when the event is missing or the calendar is inaccessible, or whether the default calendar is used.

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

Conciseness4/5

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

A single short sentence with no filler and the key information front-loaded. It is efficient, though its brevity reflects under-specification rather than disciplined editing.

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 annotations, no output schema, and zero parameter documentation, the description leaves the agent without enough to call the tool confidently — notably which calendar is searched by default and what a lookup failure looks like.

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

Parameters2/5

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

Schema description coverage is 0%, so the description should compensate, but it mentions neither event_id nor calendar_id. In particular, the calendar_id parameter defaults to "primary", a non-obvious behavior that goes entirely unexplained.

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?

"Get one calendar event" states a specific verb (get) and resource (calendar event), and the word "one" distinguishes it from list_events. It does not name create_event/update_event/delete-style siblings explicitly, but the single-record read intent is unmistakable.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus list_events (bulk) or update_event (mutation), and no mention of prerequisites such as access to the target calendar. The agent must infer usage entirely from the tool name.

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

get_messageB

Get one Gmail message with headers, plain-text body and attachment list.

NameRequiredDescriptionDefault
message_idYes

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden. It does disclose a meaningful behavioral trait by promising a 'plain-text body' and a separate 'attachment list' rather than raw MIME, but it says nothing about authentication requirements, size/truncation limits, or what happens for messages without a text part.

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

Conciseness5/5

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

A single front-loaded sentence with no filler. The returned-content clause is appended where it is most useful, and 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.

Completeness4/5

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

For a simple single-parameter read tool with no output schema, describing the returned fields covers most of what an agent needs. The remaining gap is edge-case behavior, such as HTML-only messages or large attachments, which the description does not address.

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 0% and the single parameter is just a bare string with no format hint. The description partially compensates by framing the argument as identifying 'one Gmail message', implying message_id is the message identifier, but it never states the expected ID form or where to obtain it.

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 pairs a specific verb ('Get') with a specific resource ('one Gmail message') and enumerates the payload (headers, plain-text body, attachment list). That is enough to tell it apart from list-style siblings, though it never explicitly contrasts itself with get_thread, which is the nearest ambiguous alternative.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance and no mention of the alternative (get_thread for whole conversations, list-style tools for discovery). The only signal is implicit in the word 'one', leaving the agent to infer selection from the name alone.

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

get_threadB

Get every message in a Gmail thread with headers, plain-text body and attachment list.

NameRequiredDescriptionDefault
thread_idYes

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description must carry the full behavioral burden. It does disclose the returned content shape (headers, plain-text body, attachment list) but says nothing about side effects (e.g. read-state changes), authentication/scopes, pagination for long threads, or error behavior for invalid IDs.

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

Conciseness5/5

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

One sentence, front-loaded with the verb and resource, with the return payload compactly enumerated. No filler or 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?

For a simple one-parameter read tool with no output schema, the description covers the return contents adequately. It falls short on ID format/provenance and on any behavioral context, which matters more here because no annotations exist to fill those 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 single parameter thread_id has 0% schema description coverage and the description never explains it. It does not say whether the ID is a Gmail thread ID versus an RFC Message-ID, nor what format or source (e.g. search_threads output) to use.

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

Purpose4/5

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

States a specific verb and resource ('Get every message in a Gmail thread') and enumerates the payload returned (headers, plain-text body, attachment list). It implicitly contrasts with the single-message sibling get_message, but never names it.

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

Usage Guidelines3/5

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

Usage is only implied: you call it when you have a thread and want all its messages. There is no explicit when-to-use versus search_threads or get_message, and no stated prerequisite such as needing a thread_id obtained from a search.

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

list_calendarsB

List calendars visible to the account.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the burden; "List" plus "visible to the account" conveys that this is a non-destructive read scoped by account visibility, which covers the core safety profile. It omits pagination behavior, permission requirements, and whether hidden or shared calendars are included beyond the vague "visible" qualifier.

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

Conciseness4/5

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

A single front-loaded sentence with no filler, appropriately sized for a zero-parameter list tool. There is no wasted wording, though the brevity comes at the cost of the usage context noted elsewhere.

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

Completeness4/5

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

The tool is simple, takes no parameters, and has an output schema that documents return values, so the description does not need to explain results. The remaining gap is that it never tells the agent this call typically precedes event or calendar-scoped operations, but nothing critical to correct invocation is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. Schema coverage is also reported at 100%, so no semantic gap exists on the input side.

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

Purpose4/5

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

The description states a specific verb and resource ("List calendars") plus a scope qualifier ("visible to the account"), so an agent can immediately tell this is a calendar-enumeration tool. It does not explicitly distinguish itself from siblings like list_events or list_labels, but the noun "calendars" is distinctive enough to separate it.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no mention of a typical call sequence (e.g. use this first to obtain calendar IDs for list_events/create_event), and no exclusions or alternatives named. The only hint is the word "List", leaving the agent to infer the discovery role.

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 in the mailbox, including any Bcc recipients.

NameRequiredDescriptionDefault
max_resultsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the full behavioral burden. It adds only that Bcc recipients are included; it does not disclose ordering, pagination/truncation behavior, permissions, or whether drafts are summarized versus fully returned.

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

Conciseness4/5

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

The definition is a single front-loaded sentence with no filler. However, it spends its only clause on Bcc inclusion while leaving more important operational detail unaddressed; still, the sentence itself is appropriately sized.

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

Completeness2/5

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

For a simple list tool with one optional parameter and an output schema, the description is still incomplete: no annotations, no parameter semantics, and no indication of scope, ordering, or limits. It states the resource but not enough to call it confidently beyond defaults.

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 sole parameter max_results has 0% schema description coverage and the description does not mention it. The name and default hint at result limiting, but there is no added meaning about allowed range, pagination, or default behavior.

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

Purpose4/5

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

The description states a clear verb-resource pair ('List drafts in the mailbox') and adds a content detail about Bcc recipients. It is distinguishable from create_draft/update_draft by its list/read action, though it does not explicitly name a sibling alternative.

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

Usage Guidelines2/5

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

There is no when-to-use, when-not-to-use, or alternative guidance. An agent can infer that this lists drafts, but it gets no direction on choosing list_drafts over search_threads/get_message or on preconditions.

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

list_eventsA

List calendar events between two RFC 3339 times (e.g. 2026-01-15T00:00:00+01:00). Recurring events are expanded into single instances, ordered by start time.

NameRequiredDescriptionDefault
queryNo
time_maxYes
time_minYes
calendar_idNoprimary
max_resultsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/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, and it does disclose two real behavioral traits: recurring events are expanded into instances and results are ordered by start time. It omits pagination behavior, permission/scope requirements, timezone handling, and whether cancelled events appear.

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

Conciseness5/5

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

Two tight sentences, zero filler, with the scope constraint front-loaded before the behavioral notes.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and required-parameter semantics are covered. However, for a five-parameter tool with no annotations and no schema descriptions, the three optional parameters are entirely undocumented, which is a meaningful gap an agent will hit in practice.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, but it only clarifies the format of time_min/time_max ('RFC 3339', with an example). The other three parameters — query, calendar_id (default 'primary'), and max_results (default 50) — get no mention at all, leaving search-vs-list semantics and pagination 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?

States a specific verb and resource ('List calendar events') plus a scope constraint ('between two RFC 3339 times'), which cleanly separates it from the single-record sibling get_event.

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

Usage Guidelines3/5

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

Usage is only implied by the time-range framing; the description never says when to prefer this over get_event or how it relates to list_calendars, and gives no exclusions or prerequisites.

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

list_labelsA

List Gmail labels with their ids.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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. The verb 'List' implies a read-only, non-destructive operation, and the presence of an output schema covers return structure. However, the description does not mention pagination, ordering, or whether all labels are returned, which leaves some behavioral gaps.

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

Conciseness5/5

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

The description is a single efficient sentence that front-loads the core action and resource. Every word earns its place, and there is no redundant or filler language.

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

Completeness5/5

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

For a zero-parameter list tool with an output schema, this description supplies what an agent needs: what is listed and that ids are included. The output schema handles return-value details, and no additional behavioral or usage context is essential for correct invocation. The definition is complete relative to the tool's low complexity.

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 tool has zero parameters, so there is no parameter semantics to explain. Per the baseline for zero-parameter tools, this dimension starts at 4. The description does not need to compensate for any schema coverage gaps.

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

Purpose4/5

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

The description states a specific verb and resource: 'List Gmail labels.' It also notes that ids are included, which clarifies the useful output. It does not explicitly distinguish itself from sibling list tools such as list_events or list_calendars, 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.

Usage Guidelines2/5

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

The description gives no explicit guidance on when to use this tool versus alternatives. Usage is only implied by the name and the word 'List.' Siblings like list_events and list_calendars make the domain boundaries clear enough, but the description does not reinforce them.

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

modify_thread_labelsA

Add or remove label ids on a thread. Archive = remove INBOX. Mark read = remove UNREAD.

NameRequiredDescriptionDefault
thread_idYes
add_label_idsNo
remove_label_idsNo

TDQS

A3.7/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 behavioral burden. It does disclose non-obvious semantics (that archive and mark-read are expressed as label removal, and that INBOX/UNREAD are special labels), but it says nothing about mutation safety, idempotency, behavior when a label is already present or absent, or what is returned.

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

Conciseness5/5

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

Two short sentences, front-loaded with the core action and followed by the highest-value usage idioms. Nothing is wasted and no sentence is redundant.

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 mutation tool with no annotations and no output schema, the definition covers the action and label idioms but omits return values, error behavior, permission requirements, and the source of label ids. An agent could call it, but would be guessing at the outcome and at obtaining valid ids.

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 0%, so the description must compensate: it does explain the roles of add_label_ids versus remove_label_ids and gives concrete label values. However, it never says where label ids come from (e.g. list_labels) or that thread_id identifies the target, leaving real gaps for three undocumented parameters.

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

Purpose4/5

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

The description states a concrete verb pair and resource: 'Add or remove label ids on a thread.' That is unambiguous, and no sibling tool (get_thread, list_labels, update_draft) could be mistaken for it, though it never explicitly contrasts itself with them.

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

Usage Guidelines4/5

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

It supplies concrete recipes that map user intents to parameters ('Archive = remove INBOX', 'Mark read = remove UNREAD'), which effectively tells an agent when to reach for this tool and how to configure it. It stops short of naming alternatives or stating when not to use it.

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

search_threadsA

Search Gmail threads with Gmail search syntax (from:, to:, subject:, newer_than:7d, is:unread, in:sent, label:...). Returns each thread's latest message summary. Use get_thread for full bodies.

NameRequiredDescriptionDefault
queryNo
page_tokenNo
max_resultsNo

TDQS

A3.9/5.0
Behavior3/5

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 usefully reveals the return shape ('latest message summary'), which tells the agent results are truncated previews, but says nothing about pagination via page_token, result limits, or read-only/permission behavior.

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

Conciseness4/5

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

Three tight sentences with no filler, front-loaded with purpose and examples. The operator examples earn their place; nothing is redundant.

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

Completeness4/5

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

Covers purpose, query syntax, return granularity, and the escalation path to get_thread, which is sufficient for a three-parameter search tool with no output schema. The only meaningful gap is pagination guidance for a tool that accepts page_token and caps results.

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 0%, so the description must compensate. It does a good job on 'query' by enumerating real Gmail operators, but leaves 'page_token' and 'max_results' (default 20) entirely unexplained, so the agent must infer pagination semantics from parameter names alone.

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

Purpose5/5

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

States a specific verb and resource (search Gmail threads) and immediately grounds it with concrete Gmail query operators, so an agent knows exactly what kind of matching this tool performs. It also distinguishes itself from get_thread by scope (summaries vs. full bodies).

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

Usage Guidelines4/5

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

Explicitly routes the agent to get_thread for full message bodies, which is the main sibling confusion risk. It does not discuss when not to search (e.g., empty query behavior) or how to page through large result sets, leaving some usage questions unanswered.

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

update_draftC

Replace the contents of an existing draft.

NameRequiredDescriptionDefault
ccNo
toYes
bccNo
bodyYes
subjectNo
draft_idYes
reply_to_message_idNo

TDQS

C2.6/5.0
Behavior2/5

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

No annotations are present, so the description bears full behavioral burden. Saying 'Replace' usefully implies full overwrite rather than partial patch, but it says nothing about permissions, whether omitted optional fields (cc, bcc, subject) are cleared or preserved, or what the call returns.

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

Conciseness4/5

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

A single front-loaded sentence with no filler. It is efficient, though the brevity reflects under-specification rather than disciplined concision.

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

Completeness2/5

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

For a 7-parameter mutation tool with no annotations, no output schema, and zero parameter documentation, one sentence is not enough. The agent cannot determine required-field behavior, null semantics, or side effects without guessing.

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

Parameters1/5

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

Schema description coverage is 0% across 7 parameters, and the description adds no meaning for any of them. Critical ambiguities remain unaddressed, notably whether nullable fields like subject, cc, and bcc are wiped when omitted and what reply_to_message_id does.

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

Purpose4/5

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

The description states a specific verb and resource ('Replace the contents of an existing draft'), which cleanly distinguishes it from the sibling create_draft by signaling modification of an already-existing draft. It is clear but does not name the sibling or scope the operation further.

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

Usage Guidelines2/5

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

No guidance on when to use this versus create_draft or list_drafts, and no stated preconditions (e.g. that the draft must already exist, or whether an ID must be obtained first). An agent must infer usage entirely from the name.

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

update_eventA

Change fields on a calendar event; omitted fields stay as they are. attendees replaces the whole list and is refused unless DRAFT_ONLY_GOOGLE_ALLOW_ATTENDEES is on. This server asks Google not to notify guests, but Google may still email them about a change.

NameRequiredDescriptionDefault
endNo
startNo
summaryNo
event_idYes
locationNo
attendeesNo
time_zoneNoUTC
calendar_idNoprimary
descriptionNo

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 the full burden and does well: it discloses partial-update semantics, that attendees replaces the entire list, the feature-flag gate that can cause refusal, and the notification caveat that guests may still be emailed. Missing are permission requirements and what an invalid event_id produces, but the risky behaviors an agent must know before mutating data are covered.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core semantics, then the sharpest edge case, then the external side effect. No sentence is filler.

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 mutation tool with no annotations, no output schema, and 9 undocumented parameters, the description covers mutation semantics and side effects but leaves parameter formats and failure modes unexplained. Adequate, not complete.

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

Parameters3/5

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

Schema description coverage is 0% across 9 parameters, so the description must compensate and only partly does. It clarifies the two most consequential semantics (nulls mean 'unchanged', attendees is a full replacement), but start/end string formats, time_zone, and calendar_id defaults remain undocumented anywhere.

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

Purpose4/5

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

The description opens with a specific verb+resource ('Change fields on a calendar event') that cleanly separates it from create_event and get_event in the sibling list. It doesn't name a sibling explicitly, but the partial-update framing makes the distinction obvious.

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

Usage Guidelines3/5

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

It implies when this tool applies via 'omitted fields stay as they are', which tells the agent to use it for partial edits rather than full rewrites. It also states the condition under which attendees is refused (DRAFT_ONLY_GOOGLE_ALLOW_ATTENDEES off). There is no explicit guidance on choosing this over create_event or update_draft, so usage is implied rather than directed.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updatesv0.1.0
    • First observedcreate_draft
    • First observedcreate_event
    • First observeddownload_attachment
    • First observedget_event
    • First observedget_message
    • First observedget_thread
    • First observedlist_calendars
    • First observedlist_drafts
    • First observedlist_events
    • First observedlist_labels
    • First observedmodify_thread_labels
    • First observedsearch_threads
    • First observedupdate_draft
    • First observedupdate_event

TDQS

A3.5/5.0

Scored across 14 tools

Disambiguation4/5

Each tool targets a distinct resource+action pair (thread vs message vs draft vs event), and the descriptions explicitly cross-reference each other (search_threads points to get_thread for full bodies). The only borderline pair is get_thread vs get_message, which requires the agent to know Gmail's thread/message model, but the descriptions make the split workable.

Naming Consistency5/5

All 14 tools follow a strict snake_case verb_noun pattern (list_/get_/search_/create_/update_/modify_/download_). No mixed conventions or vague verbs anywhere in the set.

Tool Count5/5

14 tools is well within a comfortable range and each maps to a concrete Gmail or Calendar operation. The split across threads, messages, attachments, labels, drafts, events, and calendars is proportionate to the two-API scope.

Completeness3/5

Read/create/update lifecycle is covered for drafts and events, and send is intentionally excluded by design (draft-only). However, there is no delete_draft, no delete_event, no get_draft, and no way to modify labels on individual messages rather than threads, leaving dead ends for cleanup workflows.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables Claude to manage Gmail, Google Calendar, and Google Contacts through a safety-first interface with soft-delete protections and draft-only email capabilities. Supports multiple Google accounts with comprehensive mutation logging and mandatory manual confirmation for destructive actions.
    16
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables reading, sending, searching, and managing Gmail through Claude using the official Google Gmail API.
    123 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables Claude to read, search, send, and manage Gmail messages and threads through natural language.
    320 npm
    MIT