Skip to main content
Glama
aaronsb

Google Workspace MCP Server

by aaronsb

manage_email

Search, read, send, forward, or manage emails in a Google Workspace account using Gmail search syntax.

Instructions

Search, read, send, forward, or manage emails in a Google Workspace account. Supports Gmail search syntax.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
ccNoCC email(s), comma-separated. On `replyAll` these are ADDITIONAL — they do not replace the recipients already on the thread.
toNoRecipient email(s), comma-separated
bccNoBCC email(s), comma-separated
bodyNoEmail body text. On `forward`, an optional note prepended ABOVE the forwarded message.
fromNoSender email or RFC 2822 mailbox for a verified Gmail Send As alias
htmlNoTreat body as HTML content (default: plain text)
nameNoLabel name, e.g. 'REC/Receipt'. Nested labels use a slash; create the parent first if Gmail shows nesting.
draftNoSave as draft instead of sending (default: false, forced true when attachments present)
emailYesAccount email address
queryNoGmail search query (e.g. "from:alice subject:meeting has:attachment")
draftIdNoDraft id as returned by listDrafts (an r… id, not the message id)
subjectNoEmail subject line
filenameNoAttachment filename, exactly as it appears in the `read` response (e.g. 'invoice_template.md')
threadIdNoThread ID to retrieve
messageIdNoEmail message ID
operationYessearch: find emails by query | read: get full email by ID. Pass bodyFormat: 'html' when the plain-text part is a stub (marketing email, invitations, booking confirmations) and the dates/codes you need only exist in the HTML — returned HTML is sanitized and wrapped in a Spotlighting block (ADR-305). | archive: save an email's headers and body to a markdown file in the workspace — a LOCAL archive, not Gmail's 'remove from inbox' (attachments are listed, not downloaded) | send: compose and send a new email (creates draft when attachments present, 35MB attachment limit via upload endpoint) | reply: reply to a message (thread-aware, creates draft when attachments present) | replyAll: reply-all to a message (thread-aware, includes all recipients, creates draft when attachments present) | forward: forward a message to new recipients (includes original attachments by default) | triage: unread inbox summary (sender, subject, date) | trash: move a message to trash | untrash: restore a message from trash | listDrafts: list saved drafts (unsent messages) with each draft's DRAFT id (the r… id), recipient, subject and date. Use that draft id with deleteDraft — a message id from search in:drafts will not work for deletion. | deleteDraft: permanently delete a draft (unsent message) by its draft id (the r… id returned by listDrafts). Irreversible — the draft is discarded, not moved to trash. | getAttachment: download an email attachment to workspace directory (use read first to see attachment list) | viewAttachment: view an image attachment inline without saving to workspace (png, jpg, gif, webp). Use for quick preview — use getAttachment to save. | modify: add or remove labels on a message (e.g. archive, mark read/unread) | labels: list all labels in the mailbox | createLabel: create a label. A slash in the name makes it nested (e.g. 'REC/Receipt' under 'REC'). Fails if the name already exists. Use `labels` first to check, then pass the returned label ID to `modify`. | threads: list email threads by query | getThread: get all messages in a thread
bodyFormatNoHow to render the message body. 'plain' (default) returns text/plain or a crude HTML-strip fallback. 'html' returns the text/html part sanitized — useful when the plain-text part is empty/stub.
maxResultsNoMax results (default: 10, max: 50)
outputPathNoLocal path to save the markdown file (workspace-relative; defaults to a slug from the message date and subject)
addLabelIdsNoComma-separated label IDs to add (e.g. STARRED, IMPORTANT, Label_123)
attachmentsNoWorkspace filenames to attach, comma-separated (files must exist in workspace via manage_workspace). Creates draft when present.
removeLabelIdsNoComma-separated label IDs to remove (e.g. UNREAD, INBOX to archive)
labelListVisibilityNoWhether the label appears in the label list: labelShow (default), labelShowIfUnread, or labelHide
messageListVisibilityNoWhether the label appears on messages in the message list: show (default) or hide

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changedv4.6.0
    • addedInput schema / properties / draftId
      Added value: +{
      +  "description": "Draft id as returned by listDrafts (an r… id, not the message id)",
      +  "type": "string"
      +}
    • addedInput schema / properties / labelListVisibility
      Added value: +{
      +  "description": "Whether the label appears in the label list: labelShow (default), labelShowIfUnread, or labelHide",
      +  "enum": [
      +    "labelShow",
      +    "labelShowIfUnread",
      +    "labelHide"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / messageListVisibility
      Added value: +{
      +  "description": "Whether the label appears on messages in the message list: show (default) or hide",
      +  "enum": [
      +    "show",
      +    "hide"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / name
      Added value: +{
      +  "description": "Label name, e.g. 'REC/Receipt'. Nested labels use a slash; create the parent first if Gmail shows nesting.",
      +  "type": "string"
      +}
    • changedInput schema / properties / operation / description
      Previous value: -"search: find emails by query | read: get full email by ID. Pass bodyFormat: 'html' when the plain-text part is a stub (marketing email, invitations, booking confirmations) and the dates/codes you need only exist in the HTML — returned HTML is sanitized and wrapped in a Spotlighting block (ADR-305). | archive: save an email's headers and body to a markdown file in the workspace — a LOCAL archive, not Gmail's 'remove from inbox' (attachments are listed, not downloaded) | send: compose and send a new email (creates draft when attachments present, 35MB attachment limit via upload endpoint) | reply: reply to a message (thread-aware, creates draft when attachments present) | replyAll: reply-all to a message (thread-aware, includes all recipients, creates draft when attachments present) | forward: forward a message to new recipients (includes original attachments by default) | triage: unread inbox summary (sender, subject, date) | trash: move a message to trash | untrash: restore a message from trash | getAttachment: download an email attachment to workspace directory (use read first to see attachment list) | viewAttachment: view an image attachment inline without saving to workspace (png, jpg, gif, webp). Use for quick preview — use getAttachment to save. | modify: add or remove labels on a message (e.g. archive, mark read/unread) | labels: list all labels in the mailbox | threads: list email threads by query | getThread: get all messages in a thread"New value: +"search: find emails by query | read: get full email by ID. Pass bodyFormat: 'html' when the plain-text part is a stub (marketing email, invitations, booking confirmations) and the dates/codes you need only exist in the HTML — returned HTML is sanitized and wrapped in a Spotlighting block (ADR-305). | archive: save an email's headers and body to a markdown file in the workspace — a LOCAL archive, not Gmail's 'remove from inbox' (attachments are listed, not downloaded) | send: compose and send a new email (creates draft when attachments present, 35MB attachment limit via upload endpoint) | reply: reply to a message (thread-aware, creates draft when attachments present) | replyAll: reply-all to a message (thread-aware, includes all recipients, creates draft when attachments present) | forward: forward a message to new recipients (includes original attachments by default) | triage: unread inbox summary (sender, subject, date) | trash: move a message to trash | untrash: restore a message from trash | listDrafts: list saved drafts (unsent messages) with each draft's DRAFT id (the r… id), recipient, subject and date. Use that draft id with deleteDraft — a message id from search in:drafts will not work for deletion. | deleteDraft: permanently delete a draft (unsent message) by its draft id (the r… id returned by listDrafts). Irreversible — the draft is discarded, not moved to trash. | getAttachment: download an email attachment to workspace directory (use read first to see attachment list) | viewAttachment: view an image attachment inline without saving to workspace (png, jpg, gif, webp). Use for quick preview — use getAttachment to save. | modify: add or remove labels on a message (e.g. archive, mark read/unread) | labels: list all labels in the mailbox | createLabel: create a label. A slash in the name makes it nested (e.g. 'REC/Receipt' under 'REC'). Fails if the name already exists. Use `labels` first to check, then pass the returned label ID to `modify`. | threads: list email threads by query | getThread: get all messages in a thread"
    • changedInput schema / properties / operation / enum
      Previous value: -[
      -  "search",
      -  "read",
      -  "archive",
      -  "send",
      -  "reply",
      -  "replyAll",
      -  "forward",
      -  "triage",
      -  "trash",
      -  "untrash",
      -  "getAttachment",
      -  "viewAttachment",
      -  "modify",
      -  "labels",
      -  "threads",
      -  "getThread"
      -]New value: +[
      +  "search",
      +  "read",
      +  "archive",
      +  "send",
      +  "reply",
      +  "replyAll",
      +  "forward",
      +  "triage",
      +  "trash",
      +  "untrash",
      +  "listDrafts",
      +  "deleteDraft",
      +  "getAttachment",
      +  "viewAttachment",
      +  "modify",
      +  "labels",
      +  "createLabel",
      +  "threads",
      +  "getThread"
      +]
  2. First observedv4.5.0

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, and it discloses essentially nothing: no warning that trash/deleteDraft are destructive, no mention that attachments force a draft, no auth requirements. The genuinely useful behavioral detail (irreversible draft deletion, 35MB limit, sanitized HTML with Spotlighting) sits in the schema's enum and parameter descriptions, not here.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the resource and action list front-loaded and zero filler. It is efficient, though for a 19-operation tool this brevity shades into under-specification rather than admirable conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations, no output schema, and 19 operations / 24 parameters, the description is far too thin to orient an agent on its own. It does not mention the operation-dispatch model, destructive operations, or the attachment/draft behavior, leaving nearly all framing to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each of the 24 parameters is documented in the schema itself, so the baseline is 3. The description adds only the 'Gmail search syntax' note for the query parameter, which is marginal since the schema already supplies a concrete query example.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a resource ('emails in a Google Workspace account') and four concrete verbs (search, read, send, forward), but then collapses the remaining ~15 operations into the vague catch-all 'manage'. An agent gets the general domain but not the actual scope of this mega-tool; the real enumeration lives in the operation enum, not the description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is 'Supports Gmail search syntax', which is a query-format hint rather than usage routing. There is no statement of when to use this tool, when to prefer a sibling (e.g. manage_docs for attachments, manage_workspace for files), or how to pick between the 19 operations. The rich per-operation routing exists only inside the enum.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.