Skip to main content
Glama
thrix

gcloud-workspace-mcp

by thrix

gcloud-workspace-mcp

An MCP server for Google Docs, Drive and Gmail that authenticates through your local gcloud CLI. It doesn't need an OAuth client of its own.

Why it exists

Some Google Workspace tenants block every third-party OAuth client. Other Workspace MCP servers ask you to register or reuse an OAuth client ID, and on those tenants the sign-in stops at an "access blocked by your admin" screen. Google's own Cloud SDK client usually stays allowed. So this server borrows the access tokens that gcloud mints on your machine and calls the Google REST APIs over HTTPS.

If your tenant lets you register an OAuth app, a full-featured server such as google_workspace_mcp will cover more of the API. Use this one when gcloud is the only client you can log in with.

The only dependency is the mcp SDK. The HTTP layer uses the Python standard library.

Related MCP server: mcp-google_docs

Two credential stores

gcloud keeps two token stores, and you can't swap one for the other. A 403 usually means a call used the wrong one.

Surface

Store

Token command

Quota header

Docs & Drive

user

gcloud auth print-access-token

not needed

Gmail

ADC

gcloud auth application-default print-access-token

required

One-time setup

Install the Google Cloud SDK so gcloud is on your PATH. Then grant the scopes. The server never runs these commands for you.

Docs and Drive (user credentials):

# Grants the full drive scope. gcloud has no read-only variant.
gcloud auth login --enable-gdrive-access

Gmail (Application Default Credentials):

gcloud auth application-default login \
  --scopes=https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/gmail.readonly
gcloud auth application-default set-quota-project <your-quota-project>

Keep cloud-platform in the list if other tools on your machine use ADC for Google Cloud. The login rewrites ~/.config/gcloud/application_default_credentials.json in place, so back it up first if you care about its current scopes.

Install and register

You need uv. Register the server in Claude Code:

claude mcp add -s user gcloud-workspace \
  -e GCLOUD_QUOTA_PROJECT=<your-quota-project> \
  -- uvx --from git+https://github.com/thrix/gcloud-workspace-mcp gcloud-workspace-mcp

For another client, add this to its MCP config:

{
  "mcpServers": {
    "gcloud-workspace": {
      "command": "uvx",
      "args": [
        "--from", "git+https://github.com/thrix/gcloud-workspace-mcp",
        "gcloud-workspace-mcp"
      ],
      "env": { "GCLOUD_QUOTA_PROJECT": "<your-quota-project>" }
    }
  }
}

Pin a release by appending @v0.1.0 to the git URL.

Container

CI publishes a multi-arch image (amd64, arm64) to ghcr.io/thrix/gcloud-workspace-mcp. It holds the server and the Google Cloud SDK on a distroless Hummingbird Python image. You still do the one-time gcloud logins on your host. The container reads and refreshes the tokens through a mount of your gcloud config directory.

mkdir -p -m 700 "$HOME/.cache/gcloud-workspace-mcp/downloads"
claude mcp add -s user gcloud-workspace -- \
  podman run -i --rm --userns=keep-id:uid=65532,gid=65532 \
    -v "$HOME/.config/gcloud:/gcloud:z" \
    -v "$HOME/.cache/gcloud-workspace-mcp/downloads:$HOME/.cache/gcloud-workspace-mcp/downloads:z" \
    -e GCLOUD_WORKSPACE_DOWNLOAD_DIR="$HOME/.cache/gcloud-workspace-mcp/downloads" \
    -e GCLOUD_QUOTA_PROJECT=<your-quota-project> \
    ghcr.io/thrix/gcloud-workspace-mcp:latest

--userns=keep-id maps your host user to the image's UID 65532, so gcloud can write refreshed tokens back to your config. The downloads directory is mounted at the same path it has on your host, so the paths the server returns work outside the container too. Pass -e GCLOUD_WORKSPACE_ENABLE_WRITES=1 to enable the write tools.

Tag

Points at

latest, 0.1, 0.1.0

the newest release, and each release line

main

the tip of main

sha-<commit>

one commit on main or a release tag

Each published image carries a signed build provenance attestation. Check it with gh attestation verify oci://ghcr.io/thrix/gcloud-workspace-mcp:latest --owner thrix.

To build the image yourself, run podman build -t gcloud-workspace-mcp . and use gcloud-workspace-mcp as the image name. To pick a different SDK release, pass --build-arg GCLOUD_VERSION=<version> together with that release's GCLOUD_SHA256_X86_64 and GCLOUD_SHA256_ARM. The build checks the tarball against them.

Environment

Variable

Meaning

GCLOUD_QUOTA_PROJECT

ADC quota project, sent as x-goog-user-project. Gmail needs it.

GCLOUD_WORKSPACE_ENABLE_WRITES

Set to 1 to register the write tools. See Writes.

GCLOUD_WORKSPACE_DOWNLOAD_DIR

Where binary downloads and raw Gmail messages go. Defaults to $XDG_CACHE_HOME/gcloud-workspace-mcp/downloads, or ~/.cache/... without XDG_CACHE_HOME.

Tools

Drive and Docs use the user credentials:

Tool

What it does

drive_search(query, page_size=20, page_token="")

Search with a raw Drive q query across My Drive, files shared with you and every shared drive you belong to. Returns {files, nextPageToken, incompleteSearch}; incompleteSearch: true means Drive skipped some shared drives.

drive_get_metadata(file_id)

Metadata for one file: owners, size, link, parents.

docs_export(file_id, mime_type="text/markdown", offset=0)

Export a Google-native file as text/markdown, text/plain, text/html, text/csv or application/pdf. Docs take every type but text/csv. Sheets take text/csv, which holds the first sheet only, or PDF. Slides take text/plain or PDF. Drive caps exports at 10 MB.

drive_download(file_id, offset=0)

Download an uploaded file (PDF, xlsx, txt, images), up to 10 MB.

Text comes back 50,000 characters at a time. When there is more, the result ends with a note that gives the offset for the next call.

PDF exports and binary downloads don't go into the tool result, since base64 would blow past the client's output limit. The server saves them to the download directory as <file id>.<ext> and returns {path, name, mimeType, bytes}. Claude Code can open the PDF or image at that path with its Read tool. The directory is created with mode 0700 and each file with 0600. A second download of the same file overwrites the first.

Gmail uses ADC plus the quota header:

Tool

What it does

gmail_search(query, max_results=20, page_token="")

Search with Gmail syntax. Returns {messages, nextPageToken, resultSizeEstimate}. The estimate stops at 201, so page through results to count them.

gmail_get_message(message_id, format="text")

text gives you {id, threadId, labelIds, headers, body, attachments}, with the body decoded from text/plain or from tag-stripped text/html, in the charset the part declares. metadata, minimal and full return the Gmail resource unchanged, up to 1 MB. raw saves the whole message, attachments included, to <message id>.eml in the download directory (up to 10 MB) and returns the resource with path, mimeType and bytes in place of the base64.

gmail_get_thread(thread_id, format="text")

Every message in a thread, oldest first, decoded the same way. The bodies share a 100,000-character budget, filled from the newest message back. Older messages past it keep their headers, get body: null, and appear in omittedBodies so you can fetch them with gmail_get_message. The resource formats cap the whole thread at 1 MB.

Writes

The write tools stay unregistered until you set GCLOUD_WORKSPACE_ENABLE_WRITES=1, so your MCP client can't see or call them by default.

Tool

What it does

docs_create_from_markdown(title, markdown, parent_id="")

Create a Google Doc. Drive converts the markdown to native formatting.

docs_replace_content(file_id, markdown)

Replace a Doc's whole body with converted markdown. Drive keeps the old content in version history. Refuses any file that isn't a native Google Doc.

docs_append_text(file_id, text)

Append plain text to the end of a Doc through the Docs API.

gmail_create_draft(to, subject, body, cc="", thread_id="")

Create a plain-text draft, threaded as a reply when you pass thread_id. You send it yourself from Gmail.

The server offers no tool that sends mail, deletes files or moves them to the trash.

Drafts need one more ADC scope:

gcloud auth application-default login \
  --scopes=https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/gmail.readonly,https://www.googleapis.com/auth/gmail.compose

Prompt injection. The model reads your documents and mail, and anyone who can share a doc or send you an email can put instructions in it. With writes on, a poisoned doc could get the model to overwrite another doc or draft a message to someone. Turn writes on when you need them and review what the model changes.

Security

  • The server gets tokens only by reading the stdout of the gcloud subprocess. It never puts a token on a command line.

  • It never logs a token or returns one in a tool result or error message.

  • It attaches a token only to https URLs on a *.googleapis.com host. It checks this before it mints the token, checks every redirect target the same way, and refuses every other URL.

See SECURITY.md to report a vulnerability.

Limitations

  • You need a logged-in gcloud on the same machine. The server can't run an interactive login. When gcloud asks for reauthentication, the tool error tells you, and you re-run the login. The server gives gcloud no stdin, so a prompt fails instead of waiting, and it stops a gcloud call after 60 seconds.

  • print-access-token doesn't report an expiry. The server assumes a 55-minute lifetime, refreshes 5 minutes early, and retries once after a 401.

  • Gmail calls need GCLOUD_QUOTA_PROJECT, and they fail with 403 accessNotConfigured until that project enables the Gmail API. Drive and Docs calls don't send that header. They bill the Cloud SDK's own project, and GCLOUD_QUOTA_PROJECT can't enable an API for them.

  • Message bodies get cut at 50,000 characters, and a thread's bodies at 100,000 in total. Attachments come back as names and sizes only. HTML-only mail keeps table cells apart and shows each link target after its text.

License

MIT

Available Tools

7 tools
docs_exportA
Read-only

Export a Google Doc (or other Google-native file) to text.

Uses user credentials. Allowed export types: text/markdown, text/plain, text/html, text/csv, application/pdf. Docs export to all but text/csv. Sheets export to text/csv (first sheet only) or PDF, and Slides to text/plain or PDF. A PDF is saved to a local file, and the result gives its path; open that file to read it. Text comes back 50,000 characters at a time; a note at the end gives the offset of the next window. The Drive API refuses exports larger than 10 MB.

For files that are not Google-native (uploaded PDFs, xlsx, txt, ...) use drive_download instead.

Args: file_id: The Drive file id of a Google-native document. mime_type: Target export MIME type (see allowed list above). offset: Character offset to start the text from. Ignored for PDF.

Returns: The exported document as text, or for PDF a JSON object {path, name, mimeType, bytes} describing the saved file.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNo
file_idYes
mime_typeNotext/markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and openWorldHint, but the description adds substantial context beyond them: user credentials are used, the 10 MB Drive API export ceiling, the 50,000-character text window with an `offset` continuation note, and the fact that PDF exports land in a local file whose path must be opened. These are real behavioral traits an agent could not infer from the annotations.

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?

Well front-loaded – purpose first, then constraints, then Args/Returns. Every clause earns its place except the Returns block, which restates structure already captured by the output schema, adding mild redundancy.

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

Completeness5/5

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

For a 3-parameter tool with 0% schema coverage, no enums, and no nested objects, the description covers selection criteria, per-type MIME legality, auth context, size limits, pagination continuation, and non-text return handling. Nothing an agent needs to call this correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does: `file_id` is the Google-native document id, `mime_type` is constrained to the enumerated allowed list, and `offset` is the character start point that is explicitly ignored for PDF. Each parameter gains meaning not present in the bare schema.

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

Purpose5/5

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

States a specific verb (Export) and resource (a Google Doc or other Google-native file), with the output form (text) named up front. It also immediately distinguishes itself from the sibling drive_download by restricting scope to Google-native files.

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

Usage Guidelines5/5

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

Gives an explicit routing rule: 'For files that are not Google-native (uploaded PDFs, xlsx, txt, ...) use `drive_download` instead.' It further specifies which export MIME types are legal per source type (Docs vs Sheets vs Slides), so the agent knows both when to use this tool and which arguments are valid.

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

drive_downloadA
Read-only

Download the content of a non-Google-native Drive file.

Uses user credentials. Works for uploaded files such as PDF, xlsx, txt or images, up to 10 MB. Text files come back 50,000 characters at a time; a note at the end gives the offset of the next window. Anything else is saved to a local file, and the result gives its path; open that file to read it.

For Google Docs, Sheets and Slides use docs_export instead.

Args: file_id: The Drive file id. offset: Character offset to start the text from. Ignored for binary files.

Returns: The file content as text, or for binary files a JSON object {path, name, mimeType, bytes} describing the saved file.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNo
file_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare a safe read (readOnlyHint=true) and open-world reach, and the description adds genuinely new behavioral context: user credentials are used, large binaries are written to a local path rather than returned inline, and text is paginated in 50k-char windows. This tells the agent exactly what to expect from the call's side effects.

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

Conciseness5/5

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

Front-loaded with purpose and sibling routing, then operational detail, then a compact Args/Returns block. Every sentence carries information an agent needs to call it correctly; nothing is filler.

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

Completeness5/5

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

An output schema exists, yet the description still clarifies the practical shape of results (text vs. saved-file path). Together with the size limit, pagination behavior and credential note, an agent has everything needed to invoke and interpret this correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description carries the burden and does document both params: file_id as the Drive file id and offset as the character start position, explicitly noting it is ignored for binary files. It stops short of explaining offset's interaction with the 50k windowing beyond the implied pagination, but coverage is solid.

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

Purpose5/5

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

The first sentence names a specific verb (Download) and resource (content of a non-Google-native Drive file), and the negative qualifier immediately separates it from the export flow. Combined with the explicit pointer to docs_export, an agent can distinguish it from siblings without opening a schema.

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

Usage Guidelines5/5

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

It states when to use it (uploaded files such as PDF, xlsx, txt, images), when not to (Google Docs/Sheets/Slides), and names the exact alternative (docs_export). It also gives operational bounds: 10 MB cap and text returned in 50,000-character windows with an offset for the next page.

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

drive_get_metadataA
Read-only

Return metadata for a single Drive file.

Uses user credentials.

Args: file_id: The Drive file id.

Returns: A JSON object with common metadata fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds a genuinely useful behavioral detail beyond the annotations: it authenticates with *user* credentials, which matters for permission scoping on Drive files.

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?

Front-loaded one-line purpose followed by a short auth note and the arg. The 'Returns:' block is redundant given an output schema exists, which is minor padding but not harmful.

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

Completeness4/5

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

For a single-parameter read tool with annotations and an output schema, the description covers purpose and auth context adequately; return values need not be explained. Only the absence of guidance on behavior for missing/inaccessible file ids is a gap.

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 0%, so the description carries the burden, but it only restates the schema title ('The Drive file id'). It confirms the identifier's domain but adds no format, examples, or constraints (e.g., accepts a bare id vs. a URL).

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

Purpose4/5

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

Specific verb+resource: 'Return metadata for a single Drive file.' The word 'single' implicitly separates it from the list-returning drive_search, though no sibling is named explicitly.

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

Usage Guidelines3/5

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

Usage is only implied: the agent infers it should call this when it already has a file_id and wants metadata rather than content (drive_download) or a search (drive_search). No when-to-use or when-not-to-use statement is given.

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

gmail_get_messageA
Read-only

Fetch a single Gmail message.

Uses ADC credentials and sends the mandatory quota-project header.

Args: message_id: The Gmail message id. format: "text" (default) returns {id, threadId, labelIds, headers, body, attachments} with the body decoded to plain text (HTML-only mail is stripped of tags). "metadata", "minimal" and "full" return the Gmail message resource unchanged, up to 1 MB. "raw" saves the whole RFC 822 message, attachments included, to <message id>.eml in the download directory, and returns the resource with path, mimeType and bytes in place of the base64 raw field.

Returns: The message as JSON.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNotext
message_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only cover readOnlyHint/openWorldHint, and the description adds substantial behavior the annotations cannot: ADC credential usage, the mandatory quota-project header, the 1 MB cap on metadata/minimal/full, HTML tag-stripping on text format, and the side effect that 'raw' writes an .eml file to the download directory and swaps the base64 raw field for path/mimeType/bytes.

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

Conciseness5/5

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

Front-loads the one-line purpose, then uses standard Args/Returns sections with no filler. Every clause (decoding, size cap, file write, field substitution) conveys information an agent needs to pick a format correctly.

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

Completeness5/5

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

An output schema exists, yet the description still explains the divergent return shapes per format, which is exactly the detail that matters given the format-dependent responses. Nothing needed to invoke the tool correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does: message_id is identified as the Gmail message id, and all four format values are enumerated with their distinct return shapes and defaults. This is far beyond anything the bare schema conveys.

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

Purpose5/5

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

States a specific verb and resource ('Fetch a single Gmail message'), which cleanly separates it from gmail_search (bulk) and gmail_get_thread (thread-level). An agent can identify the tool from the first line alone.

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

Usage Guidelines3/5

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

The format modes are well explained, which effectively guides parameter selection, but the description never states when to prefer this tool over gmail_search or gmail_get_thread, nor any prerequisites for calling it. Usage is implied by the resource name rather than declared.

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

gmail_get_threadA
Read-only

Fetch a whole Gmail thread, oldest message first.

Uses ADC credentials and sends the mandatory quota-project header.

Args: thread_id: The Gmail thread id (the threadId of any of its messages). format: "text" (default) decodes every message like gmail_get_message. The bodies share a 100,000-character budget, newest message first; older messages past it keep their headers, get body: null, and their ids are listed in omittedBodies for gmail_get_message. "metadata", "minimal" and "full" return the raw Gmail resources, up to 1 MB for the whole thread.

Returns: A JSON object {id, messages: [...]}, plus omittedBodies when the "text" format dropped any body.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNotext
thread_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

Adds substantial behavior beyond the readOnlyHint/openWorldHint annotations: ADC credential use, the mandatory quota-project header, the 100,000-character body budget shared newest-first, header-only retention with body:null past the budget, the omittedBodies escape hatch, and a 1 MB cap for raw formats.

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?

Front-loaded with the core purpose, then organized into Args/Returns sections. Most detail earns its place, though the credential/header note is slightly incidental to selection and the format explanation is dense.

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

Completeness5/5

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

For a two-parameter read tool this covers everything an agent needs: credential requirements, format semantics, truncation behavior and recovery path, plus the return shape (also backed by an output schema). Nothing material is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does: thread_id is defined as the threadId of any member message, and every format value ('text' default, 'metadata', 'minimal', 'full') is explained with its decoding and size behavior.

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

Purpose5/5

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

States a specific verb and resource ('Fetch a whole Gmail thread') plus a scoping detail (oldest message first) that immediately distinguishes it from gmail_get_message, which the description names as the follow-up tool for omitted bodies.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: fetching a whole thread versus a single message is inferable from the name and from the pointer to gmail_get_message, but there is no explicit when-to-use/when-not guidance or mention of gmail_search as an alternative entry point.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv0.1.0
    • First observeddocs_export
    • First observeddrive_download
    • First observeddrive_get_metadata
    • First observeddrive_search
    • First observedgmail_get_message
    • First observedgmail_get_thread
    • First observedgmail_search

TDQS

A4.2/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a clearly distinct service, resource, and action: Drive search, Drive metadata lookup, Google-native export, non-native download, Gmail search, message fetch, and thread fetch. The descriptions explicitly delineate Google-native files (docs_export) from uploaded files (drive_download) and single messages from threads, so misselection is unlikely.

Naming Consistency4/5

The set follows a predictable service_action pattern (drive_search, drive_get_metadata, gmail_get_message, gmail_get_thread), with only a minor deviation in docs_export using the 'docs' prefix instead of 'drive'. The convention is still readable and nearly uniform throughout.

Tool Count5/5

Seven tools is well-scoped for a read/search/export-focused Drive, Docs, and Gmail integration. Each tool has a distinct purpose, and there are no redundant or filler operations.

Completeness4/5

The surface covers the core read-only lifecycle: searching and fetching Drive metadata, exporting Google-native documents, downloading non-native files, and searching/fetching Gmail messages and threads. Minor gaps remain, such as direct Gmail attachment extraction or fuller Sheets multi-sheet export, but described workarounds (raw .eml, CSV first sheet) make these manageable.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables MCP clients like Claude Desktop and Cursor to interact with Google Docs, Sheets, and Drive, providing tools for reading, writing, formatting documents, managing spreadsheets, and searching Drive files.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables reading, creating, and editing Google Docs via OAuth. Supports tools for retrieving, inserting, appending, and replacing text in documents.
    13 npm
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI agents to search, read, and compose Gmail, manage Drive files and Google Docs/Sheets/Slides, handle Calendar events and Tasks, and access Forms and Contacts using the official Workspace CLI, with credentials staying on the user's machine.
    38
    58 npm
    MIT