gmail
com.pulsemcp/gmail
About gmail
gmail is an MCP server published by pulsemcp.com. MCP server for Gmail with OAuth2 (personal) and service account (Workspace) support.
It runs on your own machine: your AI client starts it from the npm package gmail-workspace-mcp-server at version 0.4.12.
It asks for 4 secrets: GMAIL_OAUTH_CLIENT_ID, GMAIL_OAUTH_CLIENT_SECRET, GMAIL_OAUTH_REFRESH_TOKEN and GMAIL_SERVICE_ACCOUNT_PRIVATE_KEY. Give it a key with the least access that still works.
Version 0.4.12 was published on 30 August 2026, and the source code is public, so you can read it before installing.
Written from the registry entry. 9 automated checks on the registry entry and the package code: 7 pass, 1 warn, 0 fail, 1 info. How we check.
What it asks for
| Variable | Required | Secret | Description |
|---|---|---|---|
GMAIL_OAUTH_CLIENT_ID | No | Yes | OAuth2 client ID from Google Cloud Console (for personal Gmail accounts). |
GMAIL_OAUTH_CLIENT_SECRET | No | Yes | OAuth2 client secret from Google Cloud Console. |
GMAIL_OAUTH_REFRESH_TOKEN | No | Yes | Refresh token from the OAuth2 setup script. |
GMAIL_SERVICE_ACCOUNT_CLIENT_EMAIL | No | No | Service account email address (for Google Workspace). |
GMAIL_SERVICE_ACCOUNT_PRIVATE_KEY | No | Yes | Service account private key in PEM format (for Google Workspace). |
GMAIL_IMPERSONATE_EMAIL | No | No | Email address to impersonate (required for service account mode). |
GMAIL_ENABLED_TOOLGROUPS | No | No | Comma-separated list of tool groups to enable (readonly, readwrite, readwrite_external). |
Checks
| Check | Result | Detail |
|---|---|---|
| Source repository linked | Pass | https://github.com/pulsemcp/mcp-servers |
| Version pinned | Pass | Every package has an explicit version |
| Secrets requested | Warn | Asks for 4 secrets: GMAIL_OAUTH_CLIENT_ID, GMAIL_OAUTH_CLIENT_SECRET, GMAIL_OAUTH_REFRESH_TOKEN, GMAIL_SERVICE_ACCOUNT_PRIVATE_KEY |
| Known package registry | Pass | All packages come from npm, PyPI, OCI, NuGet or MCPB |
| Namespace ownership | Info | Name verified via domain pulsemcp.com |
| Registry text aimed at the AI | Pass | Description and settings contain no hidden characters or instructions to the AI |
| Install scripts | Pass | gmail-workspace-mcp-server@0.4.12 runs nothing at install |
| Code red flags | Pass | Read 61 files in gmail-workspace-mcp-server@0.4.12: no obfuscation, encoded execution, credential reads or data-collection endpoints found |
| Text aimed at the AI | Pass | No hidden characters or instructions to the AI in 61 files, including comments and the README |
Code review: Pass, with notes
We read all 4,619 lines in 58 files of gmail-workspace-mcp-server 0.4.12 on 2026-10-31, without running it.
Lets an AI assistant search and read your Gmail, download attachments, label or archive messages, manage drafts and send email. It talks only to Google's Gmail and sign-in servers using the credentials you configure; there is no telemetry. Sending is on by default but asks you to confirm each email first unless you turn that off, and the Google access it requests covers reading, changing and sending mail.
What we found
- Note send_email (can email anyone) is enabled by default because all tool groups are on unless GMAIL_ENABLED_TOOLGROUPS is set. Its description clearly says it sends immediately and cannot be undone.
shared/tools.js:18-37 - Note Good: send_email asks the user to confirm (MCP elicitation) by default and fails closed on anything but 'accept'; if the client has no elicitation support and no fallback URL is set, sending errors out. ELICITATION_ENABLED=false turns the confirmation off, after which mail is sent without asking.
shared/tools/send-email.js:119-179; node_modules/@pulsemcp/mcp-elicitation/build/elicitation.js:136-159 - Note Requests broad Gmail scopes (gmail.readonly, gmail.modify, gmail.compose, gmail.send) even when only read-only tools are enabled.
shared/server.js:8-13; build/oauth-setup.js:13-18 - Note To/Cc/Bcc/Subject are placed into raw MIME headers without stripping CR/LF. An AI-supplied ASCII subject or recipient containing a newline could add extra headers (e.g. a hidden Bcc) that the confirmation prompt does not list under BCC. Requires the AI itself to be steered, e.g. by prompt injection.
shared/gmail-client/lib/mime-utils.js:33-51 - Note upsert_draft_email with delete=true permanently deletes a draft with no confirmation.
shared/tools/draft-email.js:141-150 - Info The manual oauth-setup command prints the client secret and refresh token to the terminal (intended, so the user can copy them into config). Its callback server listens on all interfaces (listen(port) with no host) and uses no OAuth state parameter; exposure is limited to the 5-minute setup window.
build/oauth-setup.js:53,113-132 - Info Optional HTTP confirmation fallback sends recipients and subject to user-configured URLs; off unless configured.
node_modules/@pulsemcp/mcp-elicitation/build/elicitation.js:47-100 - Info Attachments are saved under hard-coded /tmp rather than os.tmpdir(); on Windows this becomes C:\tmp. Files are not cleaned up.
shared/tools/download-email-attachments.js:141 - Info Email bodies are returned verbatim to the AI; mail from strangers can contain prompt-injection text that tries to make the AI send mail. The default send confirmation mitigates this.
shared/tools/get-email-conversation.js:135-195 - Info package.json was not part of the review set; the dependency list is inferred from imports, and install scripts (if any) could not be checked.
(package)
| Talks to | gmail.googleapis.com (/gmail/v1/users/me/*): OAuth access token; message/draft IDs, search queries, label changes, full composed emails (to/cc/bcc/subject/body) for drafts and sends; profile lookup for the account email (Only when a tool is called) oauth2.googleapis.com / accounts.google.com (via google-auth-library): OAuth client ID + secret + refresh token, or a service-account signed JWT; authorization code during setup (When a tool needs an access token (first call / refresh), and during the optional oauth-setup CLI) localhost:<PORT, default 3000> (local HTTP listener): Receives the OAuth redirect code from the browser (Only during the manual 'oauth-setup' CLI subcommand, for up to 5 minutes) ELICITATION_REQUEST_URL / ELICITATION_POLL_URL (user-configured, none by default): Confirmation prompt text including To, Subject, CC, BCC of the email (or draft ID), request ID, optional session ID (Only when send_email is called, the user configured these URLs, and the client lacks native elicitation (or ELICITATION_PREFER_HTTP_FALLBACK=true)) |
|---|---|
| Keys and settings | GMAIL_OAUTH_CLIENT_ID: Google OAuth token endpointGMAIL_OAUTH_CLIENT_SECRET: Google OAuth token endpointGMAIL_OAUTH_REFRESH_TOKEN: Google OAuth token endpointGMAIL_SERVICE_ACCOUNT_CLIENT_EMAIL: Google OAuth token endpoint (JWT issuer)GMAIL_SERVICE_ACCOUNT_PRIVATE_KEY: not sent; used locally to sign the JWTGMAIL_IMPERSONATE_EMAIL: Google OAuth (JWT subject); also used as the From headerGMAIL_ENABLED_TOOLGROUPS: not sent; local config (readonly, readwrite, readwrite_external)ELICITATION_ENABLED / _REQUEST_URL / _POLL_URL / _TTL_MS / _POLL_INTERVAL_MS / _SESSION_ID / _PREFER_HTTP_FALLBACK: Session ID goes to the user-configured elicitation URL; the rest are local configPORT: not sent; local port for the oauth-setup callbackNODE_ENV / DEBUG: not sent; debug logging to stderr |
| Files on your machine | Reads its own package.json. download_email_attachments (default inline=false) writes attachments to the hard-coded path /tmp/gmail-attachments-<sanitized email id>/<basename(filename)>; path traversal is blocked by basename() and ID sanitising (on Windows '/tmp' resolves to <drive>:\tmp). The oauth-setup subcommand opens a local HTTP server and prints credentials to stdout. No other filesystem access. |
| Runs programs | None. No child_process, eval or Function. Dynamic import() is only for the package's own fixed relative modules. |
| Telemetry | None. No analytics. The optional HTTP elicitation fallback only contacts URLs the user sets; off by default. |
| Tools | list_email_conversations, get_email_conversation, search_email_conversations, download_email_attachments, list_draft_emails, change_email_conversation, upsert_draft_email, send_email |
| Tool descriptions | clean |
This covers the package's own code only, not the 4 packages it depends on (@modelcontextprotocol/sdk, zod, google-auth-library, @pulsemcp/mcp-elicitation (bundled in node_modules; its code was read and is counted)). A new version drops this review until we read it again.
Popularity & health: 61 / 100
Worked out from public numbers and our own checks, not from user reviews or ratings. It says how used and how looked-after a server is, not whether it is safe.
10 forks, 491 merged pull requests. Sources: GitHub, npm, PyPI (pypistats.org) and Hacker News (Algolia), fetched 2026-10-31.
What people say
No Hacker News threads link to its source code.
Look further: search Reddit, search Hacker News, read its GitHub issues. These are not reviews we checked.
Facts
| Registry name | com.pulsemcp/gmail |
|---|---|
| Publisher | Domain pulsemcp.com |
| How the name is verified | Name verified via domain pulsemcp.com. The registry ties the name prefix to that account or domain; it does not check the code. |
| Type | Local: runs on your machine from a package |
| Packages | npm gmail-workspace-mcp-server 0.4.12 (stdio) |
| Version | 0.4.12 |
| Published | |
| Last updated | |
| Source repository | https://github.com/pulsemcp/mcp-servers |
| Website | None linked |
| Category | Email & messaging (assigned by keyword rule, not by hand) |
Related servers in Email & messaging
- Google Workspace7/7Give AI agents access to Gmail, Calendar, Drive, and more —…
- gws-connector4/4Multi-account Google Workspace MCP — Gmail, Calendar, Drive,…
- mcp-personal-email-to-company-resolver7/7Find the likely employer behind a Gmail or other free mail signup,…
- Gmail-MCP-Server7/7Lean Gmail MCP server with auto authentication support
- better-workspace-mcp6/7Google Workspace MCP — Docs, Drive, Calendar, Gmail, Sheets,…
Google Workspace7/7Search and work in Gmail, Calendar, Drive, Docs, Sheets and Slides…