MCP Email Server (Gmail)
Allows sending emails from a Gmail account via the Gmail API, with optional attachments; also supports listing available attachment files and retrieving a local profile/resume summary for tailored outreach.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP Email Server (Gmail)Email jane@company.com my resume and a note about the job posting"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 fromattachments/list_attachments— lists files available to attachget_profile— returns yourprofile.md(skills, education, experience)
1. Google Cloud setup (one-time)
Go to console.cloud.google.com and create a new project (or use an existing one).
Go to APIs & Services > Library, search for Gmail API, and click Enable.
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).
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 .envEdit .env and paste in your GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET.
3. Authorize (one-time)
npm run authorizeThis 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.mdwith your skills, education, and experience — Claude will read this viaget_profileto 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 32Paste 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.mdandattachments/resume.pdfto the host too (or bake them into the deploy) — they're read from disk at runtime.Start command:
npm run start:httpThe 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
.envand anything inattachments/out of version control (already handled by.gitignore).
Available Tools
3 toolsget_profileA
Get the user's resume/profile summary (skills, education, experience) stored in profile.md. Use this to tailor cover letters and outreach emails.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Optional CC address | |
| to | Yes | Recipient email address | |
| body | Yes | Plain-text email body | |
| subject | Yes | Email subject line | |
| attachmentFilename | No | Optional filename of a file inside the attachments/ folder (e.g. 'resume.pdf'). Use list_attachments to see what's available. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses 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.
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.
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.
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.
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.
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.
3 tool updates
v1.0.0- First observed
get_profile - First observed
list_attachments - First observed
send_email
TDQS
Scored across 3 tools
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.
All tool names follow a consistent snake_case verb_noun pattern: send_email, list_attachments, get_profile. The naming is predictable and readable throughout.
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.
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
Related MCP Connectors
Connect any mailbox to Claude, ChatGPT & AI: read, send, reply, schedule & search emails.
Manage Gmail end-to-end: search, read, send, draft, label, and organize threads. Automate workflow…
Manage Gmail messages, threads, labels, drafts, and settings from your workflows. Send and organiz…
Your professional network in Claude — search contacts, log notes, and send warm intros.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables seamless email management through natural language conversations with Claude. Supports searching, reading, and sending emails securely with Gmail and other email providers.4MIT
- AlicenseNot gradedqualityCmaintenanceEnables Claude to read, search, send, label, and trash emails in any Gmail account via Google's Gmail API, using OAuth2 authentication with automatic token refresh.67 npmMIT
- FlicenseNot gradedqualityDmaintenanceProvides Claude with Gmail capabilities including sending emails, managing drafts, and searching messages.-
- FlicenseBqualityDmaintenanceEnables Claude to read unread emails and create draft responses using the Gmail API.2-