Skip to content

mickolasjae/mcp-gmail-send

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

mcp-gmail-send

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.

Two install paths

A. As a Claude Code plugin (recommended)

/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.

B. As a standalone MCP server

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.

OAuth setup (one-time, ~5 minutes)

1. Create a Google Cloud OAuth client

  1. Go to https://console.cloud.google.com/apis/credentials
  2. Create / pick a project. (Any project works; this is per-user OAuth, not a service account.)
  3. APIs & Services → Library → enable Gmail API.
  4. 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.
  5. 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_SECRET env var if you keep it elsewhere.

2. Authorize

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).

3. Restart Claude Code

The MCP server picks up credentials at startup. After restart, the tools become available.

Tools

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).

Why a new MCP server

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.

Security notes

  • Scope is gmail.compose, not gmail.modify or full mail.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.

Plugin layout

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

Development

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.

About

MCP server: send Gmail drafts & messages. Closes the send-mail gap in the official Anthropic Gmail MCP.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages