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

VariableRequiredSecretDescription
GMAIL_OAUTH_CLIENT_IDNoYesOAuth2 client ID from Google Cloud Console (for personal Gmail accounts).
GMAIL_OAUTH_CLIENT_SECRETNoYesOAuth2 client secret from Google Cloud Console.
GMAIL_OAUTH_REFRESH_TOKENNoYesRefresh token from the OAuth2 setup script.
GMAIL_SERVICE_ACCOUNT_CLIENT_EMAILNoNoService account email address (for Google Workspace).
GMAIL_SERVICE_ACCOUNT_PRIVATE_KEYNoYesService account private key in PEM format (for Google Workspace).
GMAIL_IMPERSONATE_EMAILNoNoEmail address to impersonate (required for service account mode).
GMAIL_ENABLED_TOOLGROUPSNoNoComma-separated list of tool groups to enable (readonly, readwrite, readwrite_external).

Checks

CheckResultDetail
Source repository linkedPasshttps://github.com/pulsemcp/mcp-servers
Version pinnedPassEvery package has an explicit version
Secrets requestedWarnAsks for 4 secrets: GMAIL_OAUTH_CLIENT_ID, GMAIL_OAUTH_CLIENT_SECRET, GMAIL_OAUTH_REFRESH_TOKEN, GMAIL_SERVICE_ACCOUNT_PRIVATE_KEY
Known package registryPassAll packages come from npm, PyPI, OCI, NuGet or MCPB
Namespace ownershipInfoName verified via domain pulsemcp.com
Registry text aimed at the AIPassDescription and settings contain no hidden characters or instructions to the AI
Install scriptsPassgmail-workspace-mcp-server@0.4.12 runs nothing at install
Code red flagsPassRead 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 AIPassNo 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 togmail.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 settingsGMAIL_OAUTH_CLIENT_ID: Google OAuth token endpoint
GMAIL_OAUTH_CLIENT_SECRET: Google OAuth token endpoint
GMAIL_OAUTH_REFRESH_TOKEN: Google OAuth token endpoint
GMAIL_SERVICE_ACCOUNT_CLIENT_EMAIL: Google OAuth token endpoint (JWT issuer)
GMAIL_SERVICE_ACCOUNT_PRIVATE_KEY: not sent; used locally to sign the JWT
GMAIL_IMPERSONATE_EMAIL: Google OAuth (JWT subject); also used as the From header
GMAIL_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 config
PORT: not sent; local port for the oauth-setup callback
NODE_ENV / DEBUG: not sent; debug logging to stderr
Files on your machineReads 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 programsNone. No child_process, eval or Function. Dynamic import() is only for the package's own fixed relative modules.
TelemetryNone. No analytics. The optional HTTP elicitation fallback only contacts URLs the user sets; off by default.
Toolslist_email_conversations, get_email_conversation, search_email_conversations, download_email_attachments, list_draft_emails, change_email_conversation, upsert_draft_email, send_email
Tool descriptionsclean

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.

Popularity17 / 40

81 GitHub stars, 163 downloads last week, 0 Hacker News posts (0 points). Best two of the three, each on a log scale.

Activity17 / 25

Last push 2026-10-09, last release 2025-07-03, 1 commits in 90 days.

Issue health11 / 15

66 closed of 93 issues.

Our checks16 / 20

1 warning, each costing a fifth.

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 namecom.pulsemcp/gmail
PublisherDomain pulsemcp.com
How the name is verifiedName verified via domain pulsemcp.com. The registry ties the name prefix to that account or domain; it does not check the code.
TypeLocal: runs on your machine from a package
Packagesnpm gmail-workspace-mcp-server 0.4.12 (stdio)
Version0.4.12
Published
Last updated
Source repositoryhttps://github.com/pulsemcp/mcp-servers
WebsiteNone linked
CategoryEmail & messaging (assigned by keyword rule, not by hand)

Related servers in Email & messaging