Local stdio MCP server that closes the send-mail gap in the official Anthropic Gmail MCP. Exposes send_draft, send_message, delete_draft, and list_send_as_aliases.
Pairs with the official Gmail MCP: the official server creates drafts, this server sends them. The unique capability is send_draft(draftId) — taking a draft created by any tool and sending it without re-composing.
Designed for single-user, single-machine operation. Tokens stay on disk at ~/.config/mcp-gmail-send/token.json (mode 0600). OAuth scope is gmail.compose — narrowest scope that covers sending existing drafts, sending new messages, and deleting drafts.
/plugin marketplace add mickolasjae/mcp-gmail-send
/plugin install mcp-gmail-send
Then follow OAuth setup below. The plugin auto-registers the MCP server and ships a /gmail-authorize slash command for first-time setup.
git clone https://github.com/mickolasjae/mcp-gmail-send.git
cd mcp-gmail-send
npm install && npm run build
claude mcp add mcp-gmail-send -- node "$(pwd)/dist/src/index.js"Then follow OAuth setup below.
- Go to https://console.cloud.google.com/apis/credentials
- Create / pick a project. (Any project works; this is per-user OAuth, not a service account.)
- APIs & Services → Library → enable Gmail API.
- APIs & Services → OAuth consent screen → if not already configured:
- User type: External (your personal Gmail) or Internal (Workspace).
- App name:
mcp-gmail-send(or anything). - User support email + developer email: your own.
- Scopes step: add
https://www.googleapis.com/auth/gmail.compose. - Test users step (External only): add your own Gmail address.
- Credentials → Create Credentials → OAuth client ID:
- Application type: Desktop app.
- Name:
mcp-gmail-send. - Download the JSON. Save it as
~/.config/mcp-gmail-send/client_secret.json(mode 0600):mkdir -p ~/.config/mcp-gmail-send && chmod 700 ~/.config/mcp-gmail-send mv ~/Downloads/client_secret_*.json ~/.config/mcp-gmail-send/client_secret.json chmod 600 ~/.config/mcp-gmail-send/client_secret.json
- Override the location with the
MCP_GMAIL_SEND_CLIENT_SECRETenv var if you keep it elsewhere.
Plugin install: run /gmail-authorize in Claude Code.
Standalone install: run npm run authorize from the project directory.
Either opens a browser for one-time consent. After approving, the refresh token is written to ~/.config/mcp-gmail-send/token.json (mode 0600).
The MCP server picks up credentials at startup. After restart, the tools become available.
| Tool | Purpose |
|---|---|
send_draft |
Send an existing draft by draft ID. The fast path when another tool (or the official Gmail MCP) created the draft. Unique to this server. |
send_message |
Send a new message in one shot. Supports to, cc, bcc, subject, body, htmlBody, threadId (for replies), and from (must be a configured "Send mail as" alias). |
delete_draft |
Delete a draft by ID. |
list_send_as_aliases |
List configured "Send mail as" aliases. Use this to find the alias for sending from a non-primary address (e.g. mick@butterflysecurity.org). |
The official Anthropic Gmail MCP intentionally scopes itself to read + draft to prevent autonomous email-send. For workflows where the user has already drafted a reply and just needs to send (or wants to autonomously reply to known contacts), the friction outweighs the safety benefit. This server is the explicit opt-in for that capability, scoped narrowly and run locally so the OAuth token never leaves the user's machine.
Other Gmail MCPs (gongrzhe/server-gmail-autoauth-mcp, etc.) compose-and-send in one tool but can't send a draft created by another MCP. This server is the missing piece for two-step workflows.
- Scope is
gmail.compose, notgmail.modifyor fullmail.google.com. It cannot read your inbox, modify labels, or trash arbitrary messages. - Token is local (
~/.config/mcp-gmail-send/token.json, mode 0600). Not shared with any cloud service. - OAuth client secret stays in
~/.config/mcp-gmail-send/client_secret.json(mode 0600). Outside the project tree, so it can't be accidentally committed. - No shared OAuth client: each user brings their own Google Cloud OAuth credentials. This avoids the unverified-app consent screen and Google's distribution review process.
- To revoke: https://myaccount.google.com/permissions → find the OAuth client → Remove access. Then delete the local token file.
mcp-gmail-send/
├── .claude-plugin/
│ └── plugin.json # Plugin manifest
├── .mcp.json # MCP server registration (uses ${CLAUDE_PLUGIN_ROOT})
├── commands/
│ └── gmail-authorize.md # /gmail-authorize slash command
├── src/ # TypeScript source
├── dist/ # Compiled JS (committed for plugin distribution)
├── bin/authorize.ts # OAuth flow runner
├── package.json
└── README.md
npm install
npm run build # tsc → dist/
npm run dev # tsx watch mode (src/index.ts directly)dist/ is committed because Claude Code plugin install does not run npm install or build steps — the compiled JS must be present in the repo. If you update src/, rebuild and commit dist/ too.