Skip to main content
Glama
iamahmed28

MCP Email Server (Gmail)

by iamahmed28

MCP Email Server (Gmail)

An MCP server that lets Claude send emails from your Gmail account — with attachments (e.g. your resume) — and pull your profile/resume summary for tailoring outreach.

Tools exposed to Claude:

  • send_email — sends an email, optional attachment from attachments/

  • list_attachments — lists files available to attach

  • get_profile — returns your profile.md (skills, education, experience)


1. Google Cloud setup (one-time)

  1. Go to console.cloud.google.com and create a new project (or use an existing one).

  2. Go to APIs & Services > Library, search for Gmail API, and click Enable.

  3. Go to APIs & Services > OAuth consent screen.

    • User type: External (unless you have a Workspace account).

    • Fill in app name, your email as support/contact.

    • Add your own Gmail address under Test users (required while the app is unpublished).

  4. Go to APIs & Services > Credentials > Create Credentials > OAuth client ID.

    • Application type: Desktop app.

    • Save the Client ID and Client Secret.

Related MCP server: Gmail MCP Server

2. Local setup

cd mcp-email-server
npm install
cp .env.example .env

Edit .env and paste in your GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET.

3. Authorize (one-time)

npm run authorize

This opens a URL — open it in your browser, sign in with the Gmail account you want to send from, and approve access. The script will print a GOOGLE_REFRESH_TOKEN — paste that into your .env file too.

4. Add your resume and profile

  • Drop your resume PDF into attachments/ (e.g. attachments/resume.pdf)

  • Fill in profile.md with your skills, education, and experience — Claude will read this via get_profile to tailor cover letters to each job posting.

5. Connect to Claude

There are two server modes, depending on which Claude client you want to use.

Option A — Claude Desktop / Claude Code (local, simplest)

Uses src/index.js (stdio transport) — runs on your machine, no deployment needed.

Edit your MCP config (claude_desktop_config.json or equivalent) and add:

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

Restart Claude Desktop. The tools (send_email, list_attachments, get_profile) will then be available in chat.

Option B — Claude web / mobile / Desktop via Custom Connector (remote)

Claude web and mobile can only use remote MCP servers — reachable over the public internet from Anthropic's cloud, not a process running on your laptop. Use src/http-server.js for this.

1. Set an auth token. Since this server will be reachable by anyone with the URL, generate a secret and put it in .env:

openssl rand -hex 32

Paste the result into .env as MCP_AUTH_TOKEN=....

2. Deploy it somewhere public with HTTPS. Any Node-friendly host works — Railway, Render, Fly.io, a VPS, etc. The important parts:

  • Set the same environment variables from your .env (GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN, MCP_AUTH_TOKEN) on the host.

  • Upload profile.md and attachments/resume.pdf to the host too (or bake them into the deploy) — they're read from disk at runtime.

  • Start command: npm run start:http

  • The server listens on process.env.PORT (most hosts set this automatically) and exposes the MCP endpoint at /mcp.

3. Add it to Claude as a custom connector:

  • Go to Settings → Connectors → Add custom connector (in claude.ai, Cowork, or Desktop — they all use the same account-level connector list)

  • If your dialog shows an Advanced settings → Request headers section: add Authorization: Bearer <your MCP_AUTH_TOKEN> there, and use the plain URL (https://your-deployed-domain.com/mcp).

  • If it doesn't (this is a beta feature Anthropic is still rolling out — some accounts only see Name / URL / OAuth Client ID / OAuth Client Secret): put the token in the URL as a query param instead: https://your-deployed-domain.com/mcp?token=<your MCP_AUTH_TOKEN> The server accepts the token either way. Query-param tokens are logged more easily than headers, so treat the URL itself as a secret — don't paste it anywhere public.

  • Save, then enable it in your conversation via the "+" → Connectors menu

Once added, send_email, list_attachments, and get_profile are available from any device — web, mobile, or desktop — all connecting to the same account.

Security note: this endpoint can send email from your Gmail account, so treat MCP_AUTH_TOKEN like a password. Don't commit it, don't share the URL+token publicly, and rotate it if you suspect it leaked.

6. Usage examples

  • "Send an email to jane@company.com letting her know I'll be 10 minutes late to our call."

  • "Here's a job posting: [url]. Read it, check it against my profile, and draft a tailored email + cover letter to hr@company.com with my resume attached. Show me the draft before sending."

  • "Here are 10 HR emails: [list]. For each, I'll give you the job posting link — personalize the email to that role and send with my resume attached."

Notes on safe/effective use

  • Gmail sending limits: personal Gmail accounts are capped around 500 emails/day (2,000/day for Workspace) — irrelevant at 10 emails, but worth knowing if you scale up.

  • Personalize each email. Cold outreach that's obviously templated performs worse and can get flagged as spam. Have Claude pull 2-3 specific details from each job posting/company rather than doing pure find-and-replace.

  • Always review before sending. Claude will draft the email and should show it to you before calling send_email — treat this as a hard rule when you set up your instructions to Claude.

  • Scope of the OAuth token: this app only requests gmail.send — it cannot read your inbox or delete anything.

  • Keep .env and anything in attachments/ out of version control (already handled by .gitignore).

Available Tools

3 tools
get_profileA

Get the user's resume/profile summary (skills, education, experience) stored in profile.md. Use this to tailor cover letters and outreach emails.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/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, and it does add useful context by naming the storage location (profile.md) and the fields returned. However, it omits failure behavior if profile.md is absent and any permission/availability constraints, leaving the read-only, zero-parameter profile only partially disclosed.

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: the resource and its contents come first, the usage context second. Nothing is redundant and no filler is present.

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?

With no output schema, the description does supply the returned field categories (skills, education, experience), which is sufficient for a simple zero-parameter reader. It stops short of noting what happens when the profile file is missing or empty, a small but real gap.

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. The description correctly implies no inputs are needed to identify the user's own profile.

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 ('Get') and resource ('the user's resume/profile summary'), and enumerates the contents (skills, education, experience) plus the backing file profile.md. This is clearly distinct from the siblings send_email and list_attachments, which operate on different resources.

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

Usage Guidelines4/5

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

Provides explicit usage context ('Use this to tailor cover letters and outreach emails'), telling the agent when the result is relevant. It does not name alternatives or state when not to use it, but no sibling performs the same fetch, so the routing gap is minor.

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

list_attachmentsA

List files available in the attachments/ folder (e.g. resume.pdf) that can be attached to an email.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 usefully discloses the source location ('attachments/ folder') and gives a concrete filename example, but says nothing about whether this is a read-only listing, ordering, or what happens if the folder is empty.

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 zero filler; the resource and its scope lead immediately, and the example and email context add value without bloat.

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 zero-parameter, no-output-schema listing tool, the description conveys enough to call it correctly: where the files live and what they represent. A brief note on the response shape (e.g. a list of filenames/paths) is the only minor gap.

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 of 4 applies; there is nothing for the description to disambiguate.

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 ('List') and resource ('files available in the attachments/ folder'), with an example (resume.pdf) that makes the returned content concrete. It doesn't explicitly name or contrast with the siblings send_email/get_profile, but those are unrelated operations so selection ambiguity is low.

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 phrase 'that can be attached to an email' implies the purpose is to discover attachment candidates before calling send_email, giving implicit context. However, there is no explicit when-to-use, when-not, or named alternative guidance.

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

send_emailA

Send an email via Gmail, optionally attaching a file from the attachments folder (e.g. a resume PDF). Always show the user the drafted subject/body/recipient and get confirmation before calling this.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoOptional CC address
toYesRecipient email address
bodyYesPlain-text email body
subjectYesEmail subject line
attachmentFilenameNoOptional filename of a file inside the attachments/ folder (e.g. 'resume.pdf'). Use list_attachments to see what's available.

TDQS

A4/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 usefully discloses that the send is gated on user confirmation and that attachments come from the attachments/ folder, but it omits the irreversibility of sending, auth/account requirements, and failure behavior.

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

Conciseness5/5

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

Two sentences, front-loaded with the core action and followed by the confirmation requirement. No filler 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 5-parameter tool with full schema coverage but no annotations or output schema, the description covers the action, the attachment mechanism, and the confirmation gate. It could do slightly more on auth and irreversibility but is largely 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 description coverage is 100%, so every parameter is already documented in the schema. The description restates the attachment folder and points at list_attachments, adding little 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?

States a specific verb (Send) and resource (an email via Gmail), with the optional attachment capability called out explicitly. It also names the attachments folder in a way that connects to the sibling list_attachments, letting an agent distinguish it from that tool.

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?

Gives an explicit pre-call workflow: show the drafted subject/body/recipient and get confirmation first. That is strong actionable guidance, but it does not state when not to use the tool or what the alternatives are.

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. 3 tool updatesv1.0.0
    • First observedget_profile
    • First observedlist_attachments
    • First observedsend_email

TDQS

A4/5.0

Scored across 3 tools

Disambiguation5/5

Each tool targets a clearly distinct resource and action: sending email, listing attachment files, and retrieving the user profile. There is no overlap in purpose, so an agent can easily select the right tool.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern: send_email, list_attachments, get_profile. The naming is predictable and readable throughout.

Tool Count4/5

Three tools is slightly thin for a server labeled as a Gmail email server, but each tool earns its place for the apparent send-focused outreach workflow. More email management tools would be expected for a broader Gmail integration.

Completeness3/5

The surface covers sending emails, listing attachments, and retrieving profile context, but obvious Gmail operations like reading, searching, replying, or managing drafts are missing. These gaps are notable for an email server, though the described outreach use case is partially supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers