Skip to main content
Glama
enoch-sit

gmail-mcp-server

by enoch-sit

Gmail MCP Server

A comprehensive Model Context Protocol (MCP) server for Gmail, with 17 tools, an interactive CLI setup wizard, a browser-based Web UI wizard, and full Docker support.


Features

Tool

Description

list_emails

List emails from inbox or any label with optional query filter

read_email

Read full email content (headers + decoded body)

search_emails

Search using Gmail query syntax

list_attachments_with_safety

List message attachments with policy-based safety checks

validate_attachment

Validate one attachment against local file safety policy

download_attachment_safe

Download attachment only if it passes safety policy checks

redact_text_local

Redact sensitive text through local privacy pipeline

read_email_with_privacy

Read one email with privacy-redacted subject/snippet/body

send_email

Send plain-text or HTML emails

create_draft

Create email drafts without sending

reply_to_email

Reply to an email thread (preserves threading headers)

delete_email

Trash or permanently delete an email

mark_as_read

Mark email as read

mark_as_unread

Mark email as unread

set_labels

Add/remove labels on an email

get_labels

List all Gmail labels with message counts

get_profile

Get authenticated user profile info

Attachment safety policy defaults are defined in src/config/attachment-policy.json. Privacy policy defaults are defined in src/config/privacy-policy.json.

Optional local privacy stack (vLLM + privacy orchestrator) can be started with Docker profiles:

docker compose --profile privacy up --build

The privacy profile also enables optional persistent services:

  • Redis (redis:6379) — token store for session-aware PII re-identification (future feature)

  • SQLite (audit.db) — audit log of all PII detections and redactions for compliance

See ARCHITECTURE.md for database design details.


Related MCP server: Gmail MCP Server

Prerequisites

  • Node.js 20+ (for local setup)

  • Docker (for containerised setup)

  • A Google Cloud project with Gmail API enabled and an OAuth2 Client ID (Desktop app type)

Google Cloud Setup (one-time)

  1. Go to https://console.cloud.google.com/

  2. Create or select a project

  3. APIs & Services → Library → search "Gmail API" → Enable

  4. APIs & Services → Credentials → Create Credentials → OAuth 2.0 Client ID

    • Application type: Desktop app

    • Add Authorized redirect URIs:

      • http://localhost:3333/oauth/callback ← for CLI wizard

      • http://localhost:3000/oauth/callback ← for Web UI wizard

  5. Note your Client ID and Client Secret (or download credentials.json)


Quick Start

# 1. Install dependencies and build
npm install
npm run build

# 2. Run the interactive CLI setup wizard
npm run setup:cli

# 3. Start the MCP server
npm start

The CLI wizard will:

  • Guide you through credential input (file / paste JSON / manual entry)

  • Let you choose Gmail permission scopes

  • Open your browser for Google sign-in

  • Automatically capture the OAuth callback and save tokens

  • Validate the connection and print your email + next steps


Option B — Web UI Wizard (browser-based)

# 1. Install dependencies and build
npm install
npm run build

# 2. Start the setup wizard UI
npm run setup:ui

# 3. Open http://localhost:3000 in your browser
#    Complete the 4-step wizard, then start the server:
npm start

The Web UI provides a guided 4-step flow:

  1. Enter OAuth2 credentials

  2. Select permission scopes

  3. Click Authorize Gmail Access → completes Google sign-in flow

  4. Success page with connection stats and next steps


Option C — Manual .env (CI / Docker production)

# Copy and fill in the template
cp .env.example .env
# Edit .env: set GMAIL_CLIENT_ID, GMAIL_CLIENT_SECRET, GMAIL_REFRESH_TOKEN

npm install
npm run build
npm start

Docker

Build the image

docker build -t gmail-mcp-server .

Run the MCP server (with env vars)

# Copy .env.example → .env and fill in credentials
cp .env.example .env

docker compose up

Or pass credentials inline:

docker run -i \
  -e GMAIL_CLIENT_ID=your-client-id \
  -e GMAIL_CLIENT_SECRET=your-secret \
  -e GMAIL_REFRESH_TOKEN=your-refresh-token \
  gmail-mcp-server

Run the Web UI Setup Wizard via Docker

docker compose -f docker-compose.setup.yml up

Then open http://localhost:3000 — credentials are written back to ./credentials/ on the host via volume mount.

Mount credentials files instead of env vars

docker run -i \
  -v ./credentials:/app/credentials:ro \
  gmail-mcp-server

Environment Variables

Variable

Required

Description

GMAIL_CLIENT_ID

Yes*

Google OAuth2 Client ID

GMAIL_CLIENT_SECRET

Yes*

Google OAuth2 Client Secret

GMAIL_REFRESH_TOKEN

Yes*

Long-lived refresh token (from setup wizard)

GMAIL_REDIRECT_URI

No

Override redirect URI (default: http://localhost:3000/oauth/callback)

PORT

No

Web UI setup server port (default: 3000)

* Required when using env vars. Alternatively, use credentials/credentials.json + credentials/token.json (written by the setup wizards).


Add to MCP Client (e.g. Claude Desktop)

Edit your MCP client config:

{
  "mcpServers": {
    "gmail": {
      "command": "node",
      "args": ["/absolute/path/to/gmail-mcp-server/dist/index.js"]
    }
  }
}

Or use Docker:

{
  "mcpServers": {
    "gmail": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "GMAIL_CLIENT_ID=...",
        "-e", "GMAIL_CLIENT_SECRET=...",
        "-e", "GMAIL_REFRESH_TOKEN=...",
        "gmail-mcp-server"
      ]
    }
  }
}

Project Structure

├── src/
│   ├── index.ts                  # MCP server entry point
│   ├── gmail/
│   │   ├── auth.ts               # OAuth2 credential + token management
│   │   └── client.ts             # Gmail API client factory (singleton)
│   ├── tools/
│   │   ├── emails.ts             # list_emails, read_email, search_emails
│   │   ├── compose.ts            # send_email, create_draft, reply_to_email
│   │   ├── manage.ts             # delete_email, mark_as_read/unread, set_labels
│   │   └── meta.ts               # get_labels, get_profile
│   └── setup/
│       ├── oauth.ts              # Shared OAuth2 URL generation + token exchange
│       ├── cli.ts                # Interactive CLI setup wizard
│       └── ui-server.ts          # Express Web UI setup server
├── public/
│   └── setup/
│       └── index.html            # 4-step Web UI wizard (vanilla HTML/CSS/JS)
├── credentials/                  # Runtime secrets — gitignored
│   └── .gitkeep
├── Dockerfile                    # Multi-stage build (build + runtime)
├── docker-compose.yml            # MCP server runtime
├── docker-compose.setup.yml      # Web UI setup wizard runtime
├── .env.example                  # Environment variable template
└── tsconfig.json

Security Notes

  • credentials/ is gitignored — never commit credentials.json or token.json

  • Credentials are not baked into the Docker image — always injected via env vars or volume mounts

  • The Web UI server and CLI callback server bind to 127.0.0.1 only (not publicly accessible)

  • The runtime Docker container runs as a non-root user (mcp)


Troubleshooting

Problem

Solution

No Gmail credentials found

Run npm run setup:cli or npm run setup:ui

No Gmail token found

Re-run the setup wizard to re-authorize

invalid_client from Google

Check that Client ID and Secret are correct

redirect_uri_mismatch

Ensure the redirect URI is added in Google Cloud Console exactly as shown in the wizard

Port 3333 in use

Kill the process using port 3333, or temporarily change CLI_PORT in src/setup/cli.ts

Token expired / invalid_grant

Re-run the setup wizard to get a fresh refresh token

Docker: credentials not found

Mount ./credentials:/app/credentials or set env vars

Available Tools

18 tools
create_draftA

Create a draft email in Gmail without sending it.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoCC address(es), comma-separated (optional)
toYesRecipient email address(es), comma-separated
bccNoBCC address(es), comma-separated (optional)
bodyYesDraft body (plain text or HTML)
isHtmlNoSet to true if body is HTML (default: false)
subjectYesEmail subject line
attachmentsNoOptional file attachments to include in the draft.

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose the key behavior that the email is not sent, but it omits additional context such as authentication requirements, what is returned (e.g., draft ID), or whether the draft is saved to the user's drafts folder. For a simple creation tool, this is adequate but not rich.

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

Conciseness5/5

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

The description is a single sentence that is to the point, free of redundancy, and front-loads the essential information. Every word adds value: the action (create), the object (draft email), and the qualifier (without sending).

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

Completeness4/5

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

Given the simplicity of the tool and the complete schema coverage, the description is mostly complete. It could mention that the draft is saved, but the lack of an output schema and the non-destructive nature of the action make this a minor gap. The presence of sibling tools also provides additional context for the agent.

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?

The input schema has 100% description coverage for all 7 parameters, with each property having a clear explanation. The tool description itself adds no parameter-specific details beyond what the schema provides, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Create') with a clear resource ('a draft email in Gmail') and explicitly states 'without sending it,' which distinguishes it from the sibling tool send_email. It fully defines the tool's scope and action.

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

Usage Guidelines4/5

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

The phrase 'without sending it' clearly implies that this tool is for preparing drafts rather than delivering emails, which provides a clear usage context. However, it does not explicitly name alternative tools (like send_email) or state when not to use this tool, so it lacks the strongest level of guidance.

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

delete_emailA

Move an email to Trash. Pass permanent: true to permanently delete (irreversible).

ParametersJSON Schema
NameRequiredDescriptionDefault
messageIdYesThe Gmail message ID
permanentNoIf true, permanently delete the email (default: false — moves to Trash)

TDQS

A4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It clearly states the default action (move to Trash) and the optional permanent delete being 'irreversible', which is critical for a destructive operation. Missing minor details like permission requirements, but the key safety context is 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?

The description is two concise sentences, leading with the primary action and then the optional parameter. No wasted words, information is front-loaded and easy to parse.

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

Completeness4/5

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

For a simple two-parameter tool with no output schema, the description covers the essential behavior and the key parameter nuance. It does not explain the return value, but that is not critical for a delete operation. Overall, it is sufficiently complete for the tool's complexity.

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

Parameters3/5

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

The input schema already describes both parameters (messageId and permanent) with full coverage. The description adds the 'irreversible' nuance for permanent, but otherwise restates what the schema provides. Baseline 3 is appropriate since the schema does the heavy lifting.

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

Purpose5/5

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

The description clearly states the tool's function: 'Move an email to Trash' with an optional permanent delete. This is a specific verb+resource combination that distinguishes it from siblings like read_email or mark_as_read.

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

Usage Guidelines3/5

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

The description makes it obvious when to use this tool (for deleting emails) but does not explicitly contrast it with alternatives or mention any prerequisites. For a straightforward delete tool, the usage is implied by the clear action, but explicit guidance is missing.

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

download_attachmentB

Download a specific attachment from a Gmail message. Returns the base64-encoded attachment data and its MIME type.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageIdYesThe Gmail message ID containing the attachment
attachmentIdYesThe attachment ID (from the attachments list in read_email)

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states that the tool returns base64-encoded data and MIME type, which is useful, but it does not clarify whether this operation is read-only, whether any safety checks are performed, or whether there are rate limits or size restrictions. Given the existence of a 'safe' variant, the lack of safety context is a notable omission.

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

Conciseness5/5

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

The description is two sentences long, front-loaded with the main action, and contains no fluff. Every word contributes value, and the return format is included without extraneous detail.

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 download function with two parameters and no output schema, the description states the purpose and return format adequately. However, it lacks any mention of how to obtain the required IDs (relying on schema hints), and it does not address the safety-sensitive nature of attachments, especially with a sibling 'safe' variant. This leaves the description slightly incomplete in context.

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?

The input schema already has 100% coverage, describing both parameters clearly. The description adds no additional semantic meaning beyond what the schema provides, so the baseline score of 3 is appropriate. It does not clarify formats, constraints, or relationships beyond the schema.

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 clearly states the verb ('Download') and resource ('a specific attachment from a Gmail message'), making the purpose unmistakable. It also specifies the return format (base64 data and MIME type). However, it does not explicitly distinguish from the sibling tool 'download_attachment_safe', which likely has a related but safer behavior, so it doesn't fully earn 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?

There is no guidance on when to use this tool versus its alternatives, such as 'download_attachment_safe' or 'list_attachments_with_safety'. The schema hints at needing an ID from 'read_email', but the description itself provides no context about prerequisites, exclusions, or choice criteria.

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

download_attachment_safeA

Safely download one validated attachment. Blocks risky files and enforces policy checks before returning data.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageIdYesThe Gmail message ID containing the attachment
attachmentIdYesThe attachment ID from read_email or list_attachments_with_safety

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 burden. It discloses that it blocks risky files and enforces policy checks, which is useful behavioral info. However, it does not disclose the return format, size limits, or error behavior. It says 'before returning data' but does not specify what data. While the safety behavior is disclosed, important operational details remain missing.

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

Conciseness5/5

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

The description is one sentence, front-loaded with the main action, and every word adds value. It is concise without being terse.

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?

The tool has a low-complexity footprint (2 params, no output schema), but it sits among closely related siblings (`download_attachment`, `validate_attachment`) and the description only vaguely distinguishes it. It does not explain the return value shape or the exact policy checks, leaving some ambiguity for an agent deciding between tools.

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?

The input schema already provides full descriptions for both required parameters (messageId and attachmentId), and the description adds no additional parameter-specific context. Per calibration, schemas with >80% coverage get a baseline 3; the description does not elevate it.

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

Purpose5/5

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

The description uses a specific verb ('download') and resource ('one validated attachment'), and the phrase 'Safely' plus 'Blocks risky files' clearly distinguishes it from the plain `download_attachment` sibling. It clearly states what the tool does.

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

Usage Guidelines3/5

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

The description implies the tool is the safe/validated alternative to `download_attachment`, but it does not explicitly state when to use it versus `validate_attachment` or `list_attachments_with_safety`. It only implies safety context without naming alternatives or providing exclusions.

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

get_labelsA

List all Gmail labels (system labels like INBOX, SENT and user-created labels). Returns label IDs, names, and message counts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It does disclose the return fields (label IDs, names, message counts) and notes both system and user labels, which is useful. However, it does not explicitly state read-only behavior, pagination, limits, or authentication requirements, leaving some behavioral aspects undisclosed.

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 sentence that is direct and front-loaded. It states the action, the resource, examples, and the return payload without any wasted words.

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?

The tool is simple with no parameters and no output schema. The description fully covers what it returns and the scope of labels (system and user), which is sufficient for an agent to invoke it confidently. There are no missing prerequisites or hidden 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?

There are zero parameters, so the baseline is 4. The description adds meaningful context by specifying that all labels are returned, eliminating ambiguity about what the tool covers. No parameter documentation is needed since the schema is empty.

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 uses a specific verb 'List' and identifies the resource as 'Gmail labels', clearly distinguishing it from sibling tools like set_labels. It further clarifies the scope by including both system labels (INBOX, SENT) and user-created labels.

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

Usage Guidelines3/5

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

The description implies use when you need to see all labels and their IDs/names/counts, but it does not explicitly contrast with alternatives or state when not to use it. There is no mention of sibling tools or exclusions, so guidance is implied rather than explicit.

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

get_profileA

Get the authenticated Gmail user profile: email address, total message count, and thread count. Useful to verify the connection.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It implicitly communicates a read-only, non-destructive operation through the verb 'Get', and explicitly notes the authentication requirement ('authenticated'). It also discloses the exact return values, which is the main behavioral output. It lacks explicit statements about side effects or rate limits, but the simplicity of the operation makes this acceptable.

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

Conciseness5/5

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

Two concise sentences with no filler. The first sentence states the action and outputs; the second gives a practical use case. Information is front-loaded and every word earns its place.

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 tool's simplicity (no parameters, no output schema), the description fully covers what the agent needs: what the tool does, what it returns, and a use case. It is contextually complete for the tool's scope.

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 the baseline is 4. The description adds value by specifying the return fields, giving the agent a clear expectation of the output even without an output schema.

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

Purpose5/5

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

The description clearly states the specific verb ('Get'), the resource ('authenticated Gmail user profile'), and the exact fields returned (email address, total message count, thread count). It distinguishes itself from sibling email tools by focusing on account-level profile data rather than message operations.

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

Usage Guidelines4/5

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

The phrase 'Useful to verify the connection' provides a clear use case and context for when to invoke this tool. While it doesn't explicitly exclude alternative tools or list when not to use it, the description makes its purpose evident enough that an agent can decide appropriately.

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

list_attachments_with_safetyA

List attachments for a message and provide policy-based safety assessment for each file.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageIdYesThe Gmail message ID containing attachments

TDQS

A3.5/5.0
Behavior3/5

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

Without annotations, the description must carry the full burden of behavioral disclosure. It does add context by stating that the tool provides a 'policy-based safety assessment for each file,' which indicates the output includes safety evaluations. However, it does not explicitly state whether the operation is read-only, describe any side effects, or clarify the nature of the policy. This is adequate but not fully transparent for a tool with no annotation support.

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, concise sentence: 'List attachments for a message and provide policy-based safety assessment for each file.' It is front-loaded with the main action, contains no redundant information, and every phrase adds value.

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?

The tool has a simple input schema (one parameter) but no output schema or annotations. The description conveys the core purpose but does not detail the return structure or behavior when no attachments exist. It is minimally complete for a simple tool but leaves gaps regarding output details and edge cases.

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?

The input schema provides a full description for the only parameter ('The Gmail message ID containing attachments'), achieving 100% schema description coverage. The tool description adds no additional meaning beyond the schema, so the baseline score of 3 applies.

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

Purpose5/5

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

The description clearly states the tool's function: 'List attachments for a message and provide policy-based safety assessment for each file.' This specifies a concrete action (list) and resource (attachments for a message), and distinguishes from siblings like download_attachment_safe or validate_attachment by emphasizing listing plus safety assessment.

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 provides no explicit guidance on when to use this tool versus alternatives. It does not mention any exclusions, prerequisites, or comparisons with sibling tools such as download_attachment_safe or validate_attachment. The intended use is only implied by the tool's name and description.

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

list_emailsA

List emails from Gmail. Filter by labels and/or a search query. Returns sender, subject, date, and snippet for each message.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoGmail search query (e.g. "from:foo@example.com is:unread")
labelIdsNoLabel IDs to filter by (e.g. ["INBOX", "UNREAD"]). Defaults to INBOX.
maxResultsNoMaximum emails to return (default: 10, max: 50)

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses that the tool returns sender, subject, date, and snippet for each message, which is helpful. However, it does not mention default behaviors (e.g., default INBOX label, maxResults limits) or any side effects. The read-only nature is implied but not explicitly stated.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core action ('List emails from Gmail') and quickly presents filtering and return information. Every word earns its place with no redundancy or filler.

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

Completeness4/5

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

For a tool with 3 optional, fully documented parameters and no output schema, the description adequately covers the purpose, filtering options, and return format. The main gap is the lack of guidance on when to use this tool versus the sibling 'search_emails', which would improve contextual completeness.

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 description coverage is 100%, so the baseline is 3. The description adds value by naming the return fields (sender, subject, date, snippet), which are not present in the schema. It also reinforces the filtering semantics of labelIds and query, though this is largely redundant with the schema.

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 clearly states the action ('List emails'), the target system ('Gmail'), and the scope ('filter by labels and/or a search query'). It also specifies the return fields (sender, subject, date, snippet). However, it does not explicitly distinguish itself from the sibling tool 'search_emails', which may perform a similar function.

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

Usage Guidelines3/5

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

The description implies the tool is used for listing emails with optional filters, providing context for typical use. However, it offers no explicit guidance on when to prefer this tool over alternatives like 'search_emails', nor does it mention any exclusions or use cases to avoid.

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

mark_as_readA

Mark an email as read by removing the UNREAD label.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageIdYesThe Gmail message ID

TDQS

A4.1/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. It transparently discloses the exact behavior: removing the UNREAD label. It does not mention side effects like handling already-read messages or permissions, but the core mutation is clearly stated. This is a good level of transparency for a simple tool.

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, front-loaded sentence with no filler or redundant information. Every word earns its place, and it directly states the action and mechanism.

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 simple nature of the tool (one parameter, no output schema), the description is complete. It fully specifies what the tool does and the mechanism, making it sufficient for an agent to select and invoke correctly. No additional context is needed for this level of complexity.

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

Parameters3/5

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

Schema coverage is 100% with a clear description of messageId. The tool description adds no additional parameter context beyond what the schema provides. Per the rubric, a baseline of 3 is appropriate when the schema fully documents parameters.

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

Purpose5/5

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

The description clearly states the tool's action: 'Mark an email as read by removing the UNREAD label.' It specifies a distinct verb and resource, and differentiates itself from sibling tools like mark_as_unread by explicitly mentioning the UNREAD label removal mechanism.

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

Usage Guidelines3/5

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

The description implies usage context: use when you want to mark an email as read. However, it does not explicitly state when not to use it or mention alternatives like set_labels. It's not misleading, but the guidance is minimal and inferred from the name and description.

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

mark_as_unreadB

Mark an email as unread by adding the UNREAD label.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageIdYesThe Gmail message ID

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It reveals the label-based mechanism but does not mention side effects, idempotency, permissions, or failure modes.

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, direct sentence that efficiently communicates the tool's purpose without unnecessary words or redundancy.

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

Completeness4/5

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

For a simple one-parameter tool, the description adequately explains the core operation. Lacking an output schema or behavioral notes is a minor gap, but the low complexity makes the description sufficient.

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

Parameters3/5

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

Schema coverage is 100% for the single parameter messageId, and the schema already describes it as 'The Gmail message ID'. The description adds no additional parameter meaning, aligning with the baseline for high schema coverage.

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

Purpose5/5

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

The description clearly states the action (mark as unread) and the mechanism (adding the UNREAD label), distinguishing it from sibling tools like mark_as_read and set_labels.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. The description only states the action without context, exclusions, or references to similar tools.

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

read_emailB

Read the full content of a specific email by its message ID, including headers and decoded body.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageIdYesThe Gmail message ID (from list_emails or search_emails)

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 carries the full burden. It discloses that the tool returns decoded body content and headers, which is useful. However, it does not disclose potential privacy risks, authentication requirements, or whether any transformation (besides decoding) occurs. The read operation appears safe from the name, but the description adds only moderate behavioral context.

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

Conciseness5/5

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

A single, clear, front-loaded sentence with no unnecessary words. It states the action ('Read'), object ('email'), scope ('full content'), and qualifiers ('by message ID', 'including headers and decoded body') efficiently.

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?

The tool is simple with one parameter and no output schema, so the description covers the core functionality. However, given the existence of read_email_with_privacy and other siblings, the description could be more complete by clarifying when the plain read is appropriate versus the privacy-safe version. It also doesn't indicate potential sensitivity of the returned content, which is relevant context.

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

Parameters3/5

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

Schema coverage is 100%, so the parameter description already explains that messageId is a Gmail message ID from list_emails or search_emails. The description adds no new parameter-level meaning beyond repeating the message ID requirement. Baseline 3 is appropriate given complete schema coverage.

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 clearly states the tool reads a specific email's full content by message ID, including headers and decoded body. This distinguishes it from list_emails and search_emails, though it does not explicitly differentiate from the sibling read_email_with_privacy.

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 provides no explicit guidance on when to use this tool versus read_email_with_privacy or other alternatives. It omits any mention of privacy-sensitive content or scenarios where the privacy variant might be preferred. The only implied usage is that a message ID is needed, which is already given in the schema.

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

read_email_with_privacyA

Read one email and return only privacy-redacted subject/snippet/body fields using the local privacy pipeline.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageIdYesThe Gmail message ID to read with privacy redaction.

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that only redacted subject/snippet/body fields are returned and that a local privacy pipeline is used, adding value. However, it does not mention potential side effects, prerequisites, or error behavior, which is a gap for a privacy-sensitive tool.

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

Conciseness5/5

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

The description is one concise sentence with no redundant words. It front-loads the action ('Read one email') and efficiently conveys scope and method.

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 one-parameter tool, the description adequately covers purpose, return content, and processing method. It does not specify exact output format, but that is acceptable given no output schema and the low complexity.

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 100% for the single parameter 'messageId', so the description adds no further parameter semantics. Baseline 3 is appropriate since the schema already fully documents the parameter.

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

Purpose5/5

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

The description clearly states the tool reads one email and returns privacy-redacted fields. It distinguishes itself from sibling 'read_email' by explicitly mentioning the privacy-redaction and local pipeline, making its purpose specific and unique.

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

Usage Guidelines4/5

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

The description implies this tool is for when privacy-redacted email content is needed, contrasting with the plain 'read_email' sibling. However, it does not explicitly name alternatives or state when not to use it, but the context is clear enough.

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

redact_text_localB

Redact sensitive content from provided text using local privacy pipeline (orchestrator with deterministic fallback).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesInput text to redact.
contentTypeNoOptional MIME content type for model context (default: text/plain).

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. It discloses that processing is local and includes a deterministic fallback, which is useful. However, it does not state whether the operation is read-only, has side effects, or what the output format is.

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 sentence with no redundant words. It front-loads the primary action and appends a parenthetical with technical context, making it efficient and easy to parse.

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?

The tool lacks an output schema and annotations, so the description should clarify return behavior and limitations. It vaguely references an 'orchestrator with deterministic fallback' but does not explain what the tool returns or any edge cases, leaving the agent with incomplete understanding for correct invocation.

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

Parameters3/5

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

Schema coverage is 100% with both parameters described in the input schema. The tool description adds no parameter-specific information beyond what the schema already provides, so the baseline score of 3 applies.

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

Purpose5/5

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

The description clearly states the tool redacts sensitive content from provided text, using a specific verb and resource. It distinguishes itself from email-oriented sibling tools by focusing on generic text processing and a local privacy pipeline.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives. The description implies it is for redacting text, but lacks any mention of prerequisites, exclusions, or comparison with sibling tools like read_email_with_privacy.

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

reply_to_emailA

Reply to an existing email thread. Automatically sets Reply-To headers and preserves the thread.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesReply body (plain text or HTML)
isHtmlNoSet to true if body is HTML (default: false)
messageIdYesThe Gmail message ID to reply to
attachmentsNoOptional file attachments to include in the reply.

TDQS

A3.9/5.0
Behavior3/5

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

Discloses two behavioral traits (setting Reply-To headers, preserving the thread) beyond what annotations provide (none). However, it omits that this tool sends the email (vs. drafting) and does not mention other potential side effects like authentication or irreversible changes. With no annotations, more disclosure would be expected.

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

Conciseness5/5

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

Two concise sentences: the first states the core purpose, the second adds key behavioral details. No filler, perfectly front-loaded and efficiently written.

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 reply tool, the description covers the main intent and two behaviors, but lacks explicit confirmation that the email is actually sent (critical given send_email and create_draft siblings). With no output schema or annotations, the agent may not know the full side effects or whether a draft is created instead. More context on sending behavior would improve completeness.

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

Parameters3/5

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

The input schema provides 100% coverage of parameter descriptions, so the baseline is 3. The tool description adds no extra parameter semantics; it only indirectly references messageId via 'thread' but does not explain parameter relationships or formatting beyond schema.

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

Purpose5/5

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

Clearly states the action ('Reply to an existing email thread') and distinguishes this from sending a new email or creating a draft. The mention of 'automatically sets Reply-To headers and preserves the thread' adds specificity beyond mere naming.

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

Usage Guidelines4/5

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

The description implies the primary use case (replying to an existing thread) but does not explicitly contrast with sibling tools like send_email or create_draft. It gives clear context but lacks explicit when-not-to-use guidance or alternative tool names.

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

search_emailsA

Search Gmail using the standard Gmail search syntax. Returns matching emails with sender, subject, date, and snippet.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesGmail search query (e.g. "from:boss@company.com subject:report has:attachment")
maxResultsNoMaximum results to return (default: 10, max: 50)

TDQS

A4/5.0
Behavior3/5

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

The description indicates a read-only search and lists return fields, but with no annotations provided, it does not disclose limitations such as pagination, rate limits, or authorization requirements. The return info is useful but the disclosure is not extensive.

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 sentence that front-loads the verb and resource, stating what the tool does and what it returns without any redundancy or irrelevant detail.

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

Completeness4/5

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

Given the simplicity of a 2-param tool with no output schema or annotations, the description covers the core functionality and return format. However, it lacks explicit confirmation of read-only nature and any potential side effects or limitations, so it is not fully complete.

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

Parameters4/5

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

The schema describes query and maxResults, but the description adds meaning by explaining the query uses Gmail syntax and specifies the returned fields (sender, subject, date, snippet), which goes beyond the schema's basic type descriptions.

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

Purpose5/5

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

The description clearly states it searches Gmail using standard Gmail search syntax and lists the return fields (sender, subject, date, snippet). This distinguishes it from sibling tools like list_emails, which likely lists without search syntax.

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

Usage Guidelines3/5

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

The description implies usage for search queries with Gmail syntax but does not explicitly compare to alternatives like list_emails or provide when-not-to-use guidance. The context is clear but there are no exclusions or explicit alternative recommendations.

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

send_emailC

Send an email via the authenticated Gmail account.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoCC email address(es), comma-separated (optional)
toYesRecipient email address(es), comma-separated
bccNoBCC email address(es), comma-separated (optional)
bodyYesEmail body (plain text or HTML)
isHtmlNoSet to true if body contains HTML markup (default: false)
subjectYesEmail subject line
attachmentsNoOptional file attachments to include in the email.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries full responsibility for behavioral disclosure. It fails to mention that sending is an irreversible side effect, requires an authenticated session, may have rate limits, or that emails can include HTML and attachments. The bare phrase 'Send an email' reveals no behavioral traits.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no extraneous content. It is appropriately concise for the tool's purpose, though its brevity limits detail in other dimensions.

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

Completeness2/5

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

Given the tool's complexity (supports HTML, attachments, multiple recipients) and the absence of both annotations and an output schema, the description is insufficiently complete. It does not explain side effects, authentication prerequisites, or error behavior, leaving significant gaps for safe invocation.

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?

The input schema provides 100% coverage with clear descriptions for all 7 parameters (to, cc, bcc, subject, body, isHtml, attachments). The description adds no additional parameter meaning beyond the schema, so it meets the baseline for high schema coverage.

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 clearly states the tool sends an email via an authenticated Gmail account, using the verb 'send' and the resource 'email.' It is specific but does not explicitly differentiate from sibling tools like reply_to_email or create_draft, so it misses the full distinction criterion.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. The description does not mention exclusions, such as using create_draft for drafts or reply_to_email for replies, and only offers a vague authentication context. This leaves usage decisions entirely to the agent.

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

set_labelsA

Add and/or remove labels on an email. Use get_labels to obtain valid label IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageIdYesThe Gmail message ID
addLabelIdsNoLabel IDs to add (e.g. ["Label_123", "STARRED"])
removeLabelIdsNoLabel IDs to remove (e.g. ["INBOX", "UNREAD"])

TDQS

A4.2/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 of behavioral disclosure. It states the core operation ('Add and/or remove labels') and implies mutation, but it does not disclose potential side effects, error conditions for invalid IDs, or any required permissions. The reference to get_labels hints at validity concerns, but lacks depth.

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

Conciseness5/5

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

The description is two sentences, with the first sentence stating the purpose and the second providing a direct usage hint. Every word earns its place; it is appropriately sized and front-loaded with the main action.

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

Completeness4/5

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

Given the tool's simplicity (3 params, no output schema, no annotations), the description is largely complete. It covers the purpose, the prerequisite for valid IDs, and the operation. However, it could mention whether both add and remove can be performed in a single call (though 'and/or' implies yes) and any consequences of invalid IDs, which would make it fully self-contained.

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 100%, so the baseline is 3. The description adds minimal semantic value beyond the schema: it explains that the tool adds and/or removes labels, which maps to addLabelIds and removeLabelIds, but it does not elaborate on parameter formats or examples beyond what the schema already provides.

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

Purpose5/5

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

The description clearly states the tool's function: 'Add and/or remove labels on an email.' It uses a specific verb (add/remove) and resource (labels on an email), and it is easily distinguished from sibling tools like get_labels, which retrieves labels rather than modifying them.

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?

The description provides explicit guidance: 'Use get_labels to obtain valid label IDs.' This instructs the agent to use a specific alternative for a prerequisite action, thereby clarifying when to use set_labels (label modification) and when not to (obtaining IDs). This directly addresses usage context and alternatives.

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

validate_attachmentA

Validate one attachment against local safety policy (size, MIME type, extension, filename).

ParametersJSON Schema
NameRequiredDescriptionDefault
messageIdYesThe Gmail message ID containing the attachment
attachmentIdYesThe attachment ID from read_email or list_attachments_with_safety

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses that validation is local and lists the safety criteria, but omits the return format, error behavior, and whether any side effects occur.

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 concise sentence that front-loads the action and criteria. No wasted words.

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

Completeness3/5

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

For a simple validation tool, the purpose and criteria are clear, but without an output schema or annotation, the return value and behavior on failure are missing, making it slightly incomplete.

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

Parameters3/5

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

Schema coverage is 100%, so parameters are already well documented. The description adds no additional meaning beyond naming the attachment being validated.

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

Purpose5/5

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

The description clearly states the action (validate) and specific resource (one attachment against local safety policy), enumerating criteria (size, MIME type, extension, filename). This distinguishes it from sibling tools like download_attachment or list_attachments_with_safety.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. It does not mention prerequisites, when not to use, or alternatives like list_attachments_with_safety or download_attachment_safe.

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

TDQS

B3.3/5.0
Disambiguation2/5

Multiple tools have overlapping purposes: list_emails and search_emails both return message lists with similar fields, read_email and read_email_with_privacy both read a single email, and download_attachment/download_attachment_safe/validate_attachment all handle attachment retrieval with safety. The descriptions help distinguish them, but the boundaries are still unclear and could cause misselection.

Naming Consistency4/5

Most tools follow a consistent verb_noun snake_case pattern (e.g., read_email, list_emails, send_email, get_profile). However, a few tools have irregular modifiers like '_with_safety', '_safe', '_local', and '_with_privacy', which breaks the uniformity slightly but does not create chaos.

Tool Count3/5

18 tools falls in the heavy range and feels slightly bloated due to redundancy. For instance, list_emails and search_emails overlap, and the attachment safety pipeline has three distinct tools that could be consolidated. Each tool has a purpose, but the count could be trimmed without losing capability.

Completeness3/5

Core Gmail workflows (read, search, send, reply, delete, labels) are covered, but there are significant gaps: create_draft has no way to send or update drafts, and get_labels exists but there are no tools to create or delete labels. This leaves workflows with dead ends, such as creating a draft that cannot be sent via the same server.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A comprehensive MCP server providing 24 tools for full Gmail management, including email operations, label organization, and batch filtering. It features multi-account support and secure OAuth authentication for interacting with mailboxes via natural language.
    205
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A Gmail MCP server providing 19 tools for email operations, label and filter management, and attachment handling via the Gmail API.
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for Gmail that enables searching, reading, archiving, and managing email from any MCP client.
    54
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/enoch-sit/gmail-mcp-server'

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