B

Gmail MCP

MCP server for Gmail - read, send, archive, and manage emails, drafts, labels, filters, and threads

Overall Score80/100

Score Breakdown

Server Info

Package
gmail-mcp
Registry
npm
Maintainer
Community
Category
Communication
Tags
emailgooglegmail
Last Scanned
7 Apr 2026

Findings

8 issues

Authentication & Identity

LOWImplements MCP OAuth spec for per-user authentication

Supports both stdio and HTTP transport. Stdio requires GOOGLE_ACCESS_TOKEN env var. HTTP mode implements full MCP OAuth spec with .well-known/oauth-authorization-server and .well-known/oauth-protected-resource endpoints. Acts as OAuth proxy to Google, handling authorization_code and refresh_token grants. Uses StreamableHTTPServerTransport. Bearer token validation on /mcp endpoint with token validity check. Allows unauthenticated tools/list for discovery.

Remediation

Document the required OAuth scopes for each tool.

Tool Schema Quality

HIGHRequired fields missing on 1 write operations

Write tools without required field declarations: filter_create.

Remediation

Add required arrays to all write/delete tool schemas.

MEDIUMOnly 4 of 36 schemas have parameter constraints

Most schemas lack maxLength, enum, or pattern constraints on string parameters.

Remediation

Add constraints to string parameters, especially on write operations.

LLM Safety

HIGHTool descriptions contain instructional language

Descriptions include directives that could influence LLM behavior beyond tool selection.

Remediation

Remove instructional language. Descriptions should be purely factual.

Data Exposure

MEDIUM3 list operations lack pagination

messages_list, threads_list, and drafts_list support pagination via maxResults (with min/max constraints) and pageToken. labels_list, filters_list, and vacation_get return all records without pagination (acceptable for small reference data). No field selection - full records returned. Output schemas validate and shape responses.

Remediation

Add limit/offset or cursor-based pagination.

LOWNo field selection on responses

Responses return full records rather than projected fields.

Remediation

Implement field selection to return only relevant fields.

Maintenance & Trust

LOWCommunity-maintained by Adam Jones (domdomegg)

No official vendor backing.

Remediation

Seek vendor verification.

MEDIUM9 dependency vulnerabilities (6 high)

npm audit found 6 high severity CVEs.

Remediation

Update vulnerable dependencies.

Tools

36 total
NameDescriptionRisk
get_profileGet the current user's Gmail profile including email addressread
messages_listList individual messages. Consider using gmail_threads_list instead to group related messages. Use gmail_message_get to fetch full content.read
message_getGet a single message by ID. Consider using gmail_thread_get to get all messages in a conversation.read
message_sendSend an email message. Can also be used to reply to existing threads.write
message_forwardForward an email message to new recipients, including attachments and inline images.write
message_modifyModify the labels on a message. Use this to archive (remove INBOX), mark as read (remove UNREAD), star, etc.write
message_archiveArchive a message by removing the INBOX label. The message remains accessible via search or All Mail.write
message_trashMove a message to the trash. Messages in trash are deleted after 30 days.write
message_untrashRemove a message from trashwrite
message_deletePermanently delete a message. This cannot be undone. Prefer gmail_message_trash for most cases.admin
messages_batch_modifyModify labels on multiple messages at oncewrite
messages_batch_deletePermanently delete multiple messages. This cannot be undone.admin
thread_getGet all messages in a thread (conversation). Recommended over gmail_message_get for reading emails.read
threads_listList or search email threads (conversations). Recommended over messages_list for most use cases.read
thread_modifyModify labels on a threadwrite
thread_trashMove a thread to trashwrite
thread_untrashRemove a thread from trashwrite
thread_deletePermanently delete a thread. This cannot be undone. Prefer gmail_thread_trash for most cases.admin
draft_createCreate a new draft email. The draft can be edited and sent later from Gmail.write
draft_getGet a specific draft by IDread
drafts_listList all draftsread
draft_updateUpdate an existing draftwrite
draft_deletePermanently delete a draftadmin
draft_sendSend an existing draftwrite
labels_listList all labels in the user's mailbox. Includes both system labels (INBOX, SENT, etc.) and user-created labels.read
label_getGet a specific label by IDread
label_createCreate a new labelwrite
label_updateUpdate an existing labelwrite
label_deleteDelete a label. System labels cannot be deleted.admin
attachment_getGet a message attachment. Returns base64url-encoded data.read
filters_listList all email filtersread
filter_getGet a specific filter by IDread
filter_createCreate a new email filterwrite
filter_deleteDelete an email filteradmin
vacation_getGet vacation auto-reply settingsread
vacation_setSet vacation auto-reply settings. To disable, set enableAutoReply to false.write

Deploy Gmail MCP securely

CompleteFlow adds per-user authentication, permission scoping, and audit logging to any MCP server out of the box.

Deploy on CompleteFlow