Google Workspace MCP Server - Control Gmail, Calendar, Docs, Sheets, Slides, Chat, Forms & Drive
The Google Workspace MCP Server enables seamless integration with Google Workspace services, providing:
Authentication: Secure OAuth 2.0 flow for Google Workspace access
Gmail: Search, read, send, and manage emails, drafts, threads, and labels
Google Drive: Search, access, and manage files/folders including shared drives and Office formats
Google Calendar: Create, modify, delete, and retrieve events and calendars
Google Docs: Search, read, create, and manage documents
Google Sheets: Create, read, modify spreadsheets and cell values
Google Forms: Create forms, manage publish settings, and retrieve responses
Google Chat: Manage chat spaces, send messages, and search chat history
The server supports multiple transport methods (HTTP, SSE) and integrates with AI assistants like Claude Desktop and Open WebUI.
Enables complete email management including searching messages, retrieving content, sending emails, and creating drafts with full support for Gmail query syntax.
Provides full calendar management capabilities including listing calendars, fetching events, creating/modifying/deleting events with support for all-day and timed events.
Allows searching for documents, reading document content, listing documents in folders, and creating new documents directly from chat.
Enables searching files, listing folder contents, reading file content, and creating new files with support for extraction and retrieval of Microsoft Office formats.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Google Workspace MCP Server - Control Gmail, Calendar, Docs, Sheets, Slides, Chat, Forms & Drive check my calendar for meetings tomorrow and send me a summary"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Google Workspace MCP Server
Full natural language control over Google Calendar, Drive, Gmail, Docs, Sheets, Slides, Forms, Tasks, Contacts, and Chat through all MCP clients, AI assistants and developer tools. Includes a full featured CLI & Code Mode for use with tools like Claude Code and Codex!
The fastest, most feature-complete Google Workspace MCP server is in a class of it's own: it can do things that Google's own tooling and the built in integrations with Claude and ChatGPT can't come close to with multi-user support, rich fine-grained editing tools and the most extensive coverage of any Workspace AI integration in existence.
By leveraging native OAuth 2.1, stateless deployment capability and external auth server & gateway passthrough auth support, it's also the only Workspace MCP you can host for your whole organization centrally & securely! Supports all free Google accounts & Google Workspace plans with expanded app options like Chat & Spaces.
See it in action:
What It Does
Workspace MCP connects AI assistants to all twelve major Google Workspace services - 120+ tools behind a single MCP server, with OAuth 2.1 multi-user auth, three progressive tool tiers, read-only mode, a full CLI, and stateless container deployment. It runs locally over stdio for legacy clients and remotely over streamable HTTP with full implementation of the latest MCP spec.
The README covers just enough to get you running, with extensive documentation on the website:
Where to go | What you'll find |
Google Cloud setup, credentials, and client connection with screenshots | |
Every tool, parameter, and auth mode | |
Reverse proxy & nginx config, origin validation, credential store backends (GCS/CMEK), trusted-gateway identity, and the complete environment variable reference | |
Claude Desktop/web Connectors, ChatGPT Developer Mode, and more | |
Enabling Google APIs, OAuth errors, redirect URIs, Google Chat setup, client quirks |
Related MCP server: google-workspace-mcp-advanced
Security & Compliance
For Security Teams
By default, this server sends no data anywhere except Google's APIs, on behalf of the authenticated user, using your own OAuth client credentials. There is no usage reporting, analytics, license server, or SaaS dependency outside optional OTel support for your own usage.
Fully open source — every line is auditable in this repo
Your OAuth client, your GCP project — credentials never leave your environment & you control scopes
You control the network — deploy behind your reverse proxy, in your VPC, on your own terms
Stateless mode — zero disk writes for locked-down container environments
Sensitive path blocking — local file reads default to the managed attachment directory, and
validate_file_path()still blocks.env*files plus common home-directory credential stores such as~/.ssh/and~/.aws/even ifALLOWED_FILE_DIRSis broadened
Full dependency tree in pyproject.toml, pinned in uv.lock.
For Legal & Procurement
This project is MIT licensed —
Use commercially without restriction — build products, sell services, deploy internally
Fork, embed, redistribute — MIT requires only attribution
No CLA — contributions remain under MIT
No built-in telemetry to disclose — optional tracing is off unless you configure it
No network effects — the server never contacts any endpoint you didn't configure
Standard dependency licenses — MIT, Apache 2.0, and BSD throughout the dependency chain; no copyleft, no AGPL
Services
Each page lists every tool with its tier, parameters, required scopes, and example prompts. The complete reference covers all twelve in one place.
💬 Google Chat needs a one-time Chat app configuration and a Workspace account - see the Chat setup FAQ.
Quick Start
Set credentials → pick a launch command → connect your client. Full walkthrough with screenshots: workspacemcp.com/quick-start
You'll need an OAuth client from Google Cloud Console in a project with the Google APIs enabled for the services you plan to use. The docs have one-click enable links for every API plus a single gcloud services enable command that covers them all, and the quick start guide walks through the whole setup in about five minutes.
Agentic OAuth clients: this server only calls Google's REST APIs, so your OAuth client does not need Google's "Use this client for an AI-powered agent" setting. If your organization wants agent traffic labeled for admin controls, create a separate client with that setting enabled; it can't be changed on an existing client after November 12, 2026.
Confidential Client
# 1. Credentials
export GOOGLE_OAUTH_CLIENT_ID="..."
export GOOGLE_OAUTH_CLIENT_SECRET="..."
# 2. Launch - pick a tier
uvx workspace-mcp --tool-tier core # essential tools
uvx workspace-mcp --tool-tier extended # core + management ops
uvx workspace-mcp --tool-tier complete # everything
# Or cherry-pick services
uvx workspace-mcp --tools gmail drive calendarOAuth 2.1 (PKCE)
# 1. Credentials - MCP clients connect with PKCE and no
# secret, but Google still requires one server-side
export MCP_ENABLE_OAUTH21=true
export GOOGLE_OAUTH_CLIENT_ID="..."
export GOOGLE_OAUTH_CLIENT_SECRET="..."
# Alternatively, point GOOGLE_CLIENT_SECRET_PATH at a client_secret.json
# that contains the client id and secret (env vars take precedence).
export WORKSPACE_MCP_PORT=8000
export GOOGLE_OAUTH_REDIRECT_URI="http://localhost:${WORKSPACE_MCP_PORT}/oauth2callback"
export OAUTHLIB_INSECURE_TRANSPORT=1
# 2. Launch - OAuth 2.1 requires HTTP transport
uvx workspace-mcp --transport streamable-http --tool-tier coreTool tiers keep context windows lean: core is the essential set, extended adds management operations, complete loads everything. Combine with --tools <service> ..., --read-only, or per-service --permissions, and subtract individual tools with --disabled-tools <name> ... - details in the server modes docs.
Per-request toolsets let HTTP clients sharing one server see different tools, using the same headers as the GitHub MCP server. X-MCP-Toolsets takes comma-separated service names (the --tools names, e.g. gmail,drive) and X-MCP-Tools takes comma-separated tool names (e.g. search_gmail_messages); when both are sent the request gets the union. Names ignore case and whitespace, unknown names match nothing, and a blank or missing header leaves the tool list unchanged. Headers only narrow what the server already loaded: a tool removed by the tier, --tools, --read-only, --permissions or --disabled-tools stays unavailable, and calls to tools outside the request's selection fail as unknown tools.
Connect Your Client
Claude Desktop, web & mobile - run the server in HTTP mode and add it as a Connector (Settings → Connectors → Add custom connector). This is the recommended path; the Connector guide has step-by-step screenshots. Legacy stdio configuration remains available for clients without Connector support - see the FAQ.
Claude Code
# Start the server in HTTP mode, then:
claude mcp add --transport http workspace-mcp http://localhost:8000/mcp
# Optional: install the bundled skill for better Workspace tool routing
ln -s "$(pwd)/skills/managing-google-workspace" ~/.claude/skills/managing-google-workspaceChatGPT - connect via Developer Mode with the ChatGPT guide.
VS Code, LM Studio, Open WebUI, and everything else - any MCP client works over streamable HTTP (recommended) or stdio. Client-specific walkthroughs live in the guides and FAQ.
CLI
workspace-cli lists and calls tools against a running server with encrypted, disk-backed OAuth token caching - authenticate once, script forever:
uv run workspace-cli list
uv run workspace-cli call search_gmail_messages query="is:unread" max_results=5Install globally with uv tool install . from this repo. ⚠️ Don't use uvx workspace-cli - an abandoned PyPI package squats that name.
Deployment & Advanced Configuration
Everything you need to run this in production lives in two places. The documentation covers auth modes and server configuration:
OAuth 2.1 multi-user auth - bearer tokens, required for remote or shared HTTP endpoints
Stateless container mode - zero disk writes for locked-down deployments
OAuth proxy storage backends - memory, disk, or Valkey/Redis for distributed setups
External OAuth provider mode - bring your own auth server, validate bearer tokens only
Service accounts with domain-wide delegation - per-request user impersonation with an optional domain allowlist
Trusted-gateway identity - proxy-verified per-user isolation with Pomerium, Cloudflare Access, oauth2-proxy, or any JWKS-verifiable gateway
OpenTelemetry tracing - optional, off unless you configure an OTLP endpoint
Docker -
docker build -t workspace-mcp . && docker run -p 8000:8000 workspace-mcp
The Advanced Deployment guide covers self-hosting specifics: reverse proxy setup with WORKSPACE_EXTERNAL_URL (including the nginx Origin: null consent workaround, the WORKSPACE_MCP_ALLOW_NULL_ORIGIN_CONSENT escape hatch, and the Referrer-Policy pitfall), origin validation and VS Code webview allowlisting, credential store backends (local directory or GCS with CMEK enforcement), and the complete environment variable reference.
Production tuning is all environment variables; the names below link to their reference entries.
Google API requests:
WORKSPACE_MCP_GOOGLE_API_WORKERS,WORKSPACE_MCP_GOOGLE_API_TIMEOUT_SECONDSExternal OAuth token validation:
WORKSPACE_MCP_TOKEN_VALIDATION_WORKERS,WORKSPACE_MCP_TOKEN_VALIDATION_CACHE_TTLMemory ceilings:
WORKSPACE_MCP_MAX_FILE_BYTES,WORKSPACE_MCP_STATELESS_INLINE_MAX_BYTES,WORKSPACE_MCP_MAX_OFFICE_XML_BYTESText returned per call:
get_drive_file_contentreturns long content a page at a time by default, so a long file does not fill the model's context.WORKSPACE_MCP_MAX_CONTENT_CHARSsets the page size (default40000;0returns whole content by default). Each page ends with a note giving theoffsetto read on from. This is only the default: a client can always passfull_content=trueto get the whole file in one call. Text being read page by page is kept in memory for ten minutes so later pages are not downloaded again, withinWORKSPACE_MCP_PAGED_CONTENT_CACHE_BYTESper process (default33554432, 32 MiB;0keeps nothing).Sessions and health probes:
WORKSPACE_MCP_SESSION_IDLE_TIMEOUT,WORKSPACE_MCP_READINESS_TIMEOUT_SECONDSDNS-rebinding protection:
WORKSPACE_MCP_ALLOWED_HOSTS, a comma-separated list of hostnames without ports (for exampleworkspace-mcp,10.0.0.5). When set, requests whoseHostis not loopback, listed, or the host ofWORKSPACE_EXTERNAL_URLor an allowed origin get403, so include every name clients and health probes use. Unset, anyHostis accepted.Hosted servers without access to the caller's disk:
WORKSPACE_MCP_DISABLE_LOCAL_FILESWith local files disabled,create_drive_file,update_drive_fileand the import tools offerreturn_upload_url: the caller PUTs the bytes to the returned URL. If the file sits in a cloud-mirrored folder (Drive for desktop), copy it to a local directory first, since mirrored paths can stall mid-upload.OAuth 2.1 token refresh and lifetimes: see
.env.oauth21OAuth 2.1 consent screen:
WORKSPACE_MCP_OAUTH_PROXY_REQUIRE_CONSENT=remembershows the OAuth proxy's consent screen once per browser for each MCP client instead of on every authorization; cross-site navigations are still prompted. The default,always, prompts every time. Any other value fails startup.OAuth 2.1 Google account choice:
WORKSPACE_MCP_OAUTH_PROXY_GOOGLE_PROMPTsets thepromptthe OAuth proxy sends to Google's authorization endpoint (defaultconsent); external provider mode ignores it.select_account consentshows Google's account chooser, so a user signed in to Google with another account can pick the right one, and still returns a refresh token. The only other accepted value isconsent; anything else fails startup.
For downloads, horizontally scaled or scale-to-zero HTTP deployments (Cloud Run, Kubernetes) can stage attachments in Google Cloud Storage instead of instance-local disk, whose /attachments/{id} URL may reach a different instance. Install the gcs extra and set WORKSPACE_MCP_FILES_GCS_BUCKET to a bucket name; objects are written under WORKSPACE_MCP_FILES_GCS_PREFIX (default attachments) and handed out as V4 signed URLs valid for one hour, which the client fetches straight from GCS. This also lets stateless mode return download URLs instead of inline files. stdio ignores the setting, since its client reads the local file path directly. The runtime service account needs object read and write access on the bucket — roles/storage.objectUser, or roles/storage.objectCreator plus roles/storage.objectViewer — and, without an exported private key, roles/iam.serviceAccountTokenCreator on itself so URLs can be signed through IAM. Read access is not optional: a signed URL carries the signer's authority, so without storage.objects.get the upload and the signing both succeed while the client's download fails with 403. Objects are not deleted by the server, so add a bucket lifecycle rule that removes them after a few hours.
Security Best Practices
By default this server sends no data anywhere except Google's APIs, using your own OAuth client credentials - no usage reporting, analytics, license server, or SaaS dependency. MIT licensed with no CLA, no dual licensing, and no copyleft in the dependency chain. The full security posture - scope minimization, sensitive-path blocking, stateless mode - is documented at workspacemcp.com.
A few things worth internalizing before you connect an LLM to your email:
Prompt injection is real. Emails, docs, and events can contain hidden instructions. Only connect trusted data to an LLM, and be deliberate about which write tools you enable.
Never commit
.env,client_secret.json, or.credentials/to source control.Local file reads are sandboxed to the managed attachment directory. Broaden with
ALLOWED_FILE_DIRSonly if you trust the client and its data sources;.env*,~/.ssh/,~/.aws/, and similar paths are always blocked.Production deployments should use HTTPS and OAuth 2.1.
Development
uv sync --group dev # install deps
uv run ruff check . # lint
uv run pytest # testSingle-file service modules live in g<service>/, tools are registered with @server.tool decorators, and tiers are defined in core/tool_tiers.yaml. PRs welcome.
License
MIT - see LICENSE. The license is 21 lines and says what it means.
Workspace MCP is an independent open-source project and is not affiliated with, endorsed by, or sponsored by Google LLC. Google and Google Workspace are trademarks of Google LLC.
Validations:
Available Tools
119 toolsappend_table_rowsAppend Table RowsA
Appends rows to a structured table in a Google Sheet. The rows are added to the end of the table body, automatically extending the table range.
Use list_sheet_tables first to find the table ID.
Inputs: values (required), table_id (required), spreadsheet_id (required), user_google_email (required). Returns: result
batch_modify_gmail_message_labelsBatch Modify Gmail Message LabelsADestructive
Adds or removes labels on many Gmail messages, or on every message of whole conversations via thread_ids.
message_ids are sent in one users.messages.batchModify call (Gmail accepts up to 1000 ids per call). That endpoint returns no per-message result and silently ignores ids it does not recognise, so by default the messages are read back afterwards to report which ids actually changed.
thread_ids are modified one at a time with users.threads.modify, e.g. archive a conversation with remove_label_ids=["INBOX"] or mark it read with remove_label_ids=["UNREAD"]. Each thread reports its own outcome. message_ids and thread_ids can be combined; at least one is required, as is at least one of add_label_ids or remove_label_ids.
Inputs: user_google_email (required), verify, thread_ids, message_ids, +2 more. Returns: result
batch_update_docBatch Update DocADestructive
Executes multiple low-level document operations in a single atomic batch update.
For normal header/footer text, prefer update_doc_headers_footers. Only use create_header_footer here for advanced section-break layouts.
RECOMMENDED WORKFLOW FOR BUILDING DOCUMENTS:
To avoid index calculation errors, build documents in phases:
PHASE 1 - INSERT ALL CONTENT (use end_of_segment=true, no index math): Append text, section breaks, and page breaks sequentially. Each operation appends to the end of the body. No index needed. Example batch: [ {"type": "insert_text", "end_of_segment": true, "text": "Report Title\n"}, {"type": "insert_text", "end_of_segment": true, "text": "\nExecutive Summary\n"}, {"type": "insert_text", "end_of_segment": true, "text": "Revenue grew 15%.\n"}, {"type": "insert_section_break", "end_of_segment": true, "section_type": "NEXT_PAGE"}, {"type": "insert_text", "end_of_segment": true, "text": "Detailed Analysis\n"} ]
PHASE 2 - CREATE HEADERS/FOOTERS (if needed): For normal header/footer text, use update_doc_headers_footers (it auto-creates if missing and writes the content for you). Only include create_header_footer operations in a batch when you are intentionally managing advanced section-break-specific layouts.
Inputs: operations (required), document_id (required), user_google_email (required). Returns: result
batch_update_formBatch Update FormADestructive
Apply batch updates to a Google Form.
Supports adding, updating, and deleting form items, as well as updating form metadata and settings. This is the primary method for modifying form content after creation.
Inputs: form_id (required), requests (required), user_google_email (required). Returns: result
batch_update_presentationBatch Update PresentationCDestructive
Apply batch updates to a Google Slides presentation.
Inputs: requests (required), presentation_id (required), user_google_email (required). Returns: result
check_drive_file_public_accessCheck Drive File Public AccessARead-onlyIdempotent
Searches for a file by name and checks if it has public link sharing enabled.
Inputs: file_name (required), user_google_email (required), drive_id. Returns: result
copy_drive_fileCopy Drive FileB
Creates a copy of an existing Google Drive file.
This tool copies the template document to a new location with an optional new name. The copy maintains all formatting and content from the original file.
Inputs: file_id (required), user_google_email (required), new_name, copy_comments, +1 more. Returns: result
create_docCreate DocA
Creates a new Google Doc and optionally inserts initial content.
content is inserted as plain text (Markdown is not rendered); use
import_to_google_doc to create a doc from Markdown.
After creation, the document body starts at index 1. A new empty doc has total length 2 (one section break at index 0, one newline at index 1).
To build a rich document after creation, use batch_update_doc with insert_text operations using end_of_segment=true to append content sequentially without calculating indices. Then call inspect_doc_structure to get exact positions before applying formatting in a separate batch call.
Inputs: title (required), user_google_email (required), content, folder_id. Returns: result
create_drive_fileCreate Drive FileA
Creates a new file in Google Drive, supporting creation within shared drives. Accepts direct text content, inline base64 bytes, or a fileUrl to fetch content from. Where local file access is disabled it can instead return an upload URL for the caller to PUT file bytes to. With shortcut_target_id it creates a Drive shortcut to an existing file or folder instead. This stores the supplied bytes without converting them to Google Docs, Sheets, or Slides. Use the matching import_to_google_* tool for Google-native conversion.
Inputs: file_name (required), user_google_email (required), content, fileUrl, +6 more. Returns: result
create_drive_folderCreate Drive FolderA
Creates a new folder in Google Drive, supporting creation within shared drives.
Inputs: folder_name (required), user_google_email (required), parent_folder_id. Returns: result
create_formCreate FormB
Create a new form using the title given in the provided form message in the request.
Inputs: title (required), user_google_email (required), description, document_title. Returns: result
create_presentationCreate PresentationB
Create a new Google Slides presentation.
Inputs: user_google_email (required), title. Returns: result
create_reactionCreate ReactionA
Adds an emoji reaction to a Google Chat message.
Inputs: message_id (required), emoji_unicode (required), user_google_email (required). Returns: result
create_sheetCreate SheetC
Creates a new sheet or duplicates an existing sheet, into destination_spreadsheet_id when given (user_google_email: str, spreadsheet_id: str, sheet_name: Optional[str] = None, source_sheet_name: Optional[str] = None, insert_sheet_index: Optional[int] = None, destination_spreadsheet_id: Optional[str] = None).
Inputs: spreadsheet_id (required), user_google_email (required), sheet_name, source_sheet_name, +2 more. Returns: result
create_spreadsheetCreate SpreadsheetC
Creates a new Google Spreadsheet.
Inputs: title (required), user_google_email (required), folder_id, sheet_names. Returns: result
create_table_with_dataCreate Table with DataA
Creates a table and populates it with data in one reliable operation.
CRITICAL: YOU MUST CALL inspect_doc_structure FIRST TO GET THE INDEX!
MANDATORY WORKFLOW - DO THESE STEPS IN ORDER:
Step 1: ALWAYS call inspect_doc_structure first Step 2: Use the 'total_length' value from inspect_doc_structure as your index Step 3: Format data as 2D list: [["col1", "col2"], ["row1col1", "row1col2"]] Step 4: Call this function with the correct index and data
EXAMPLE DATA FORMAT: table_data = [ ["Header1", "Header2", "Header3"], # Row 0 - headers ["Data1", "Data2", "Data3"], # Row 1 - first data row ["Data4", "Data5", "Data6"] # Row 2 - second data row ]
CRITICAL INDEX REQUIREMENTS:
NEVER use index values like 1, 2, 10 without calling inspect_doc_structure first
ALWAYS get index from inspect_doc_structure 'total_length' field
Index must be a valid insertion point in the document
DATA FORMAT REQUIREMENTS:
Must be 2D list of strings only
Each inner list = one table row
All rows MUST have same number of columns
Use empty strings "" for empty cells, never None
Use debug_table_structure after creation to verify results
Inputs: index (required), table_data (required), document_id (required), user_google_email (required), +3 more. Returns: result
debug_table_structureDebug Table StructureARead-onlyIdempotent
ESSENTIAL DEBUGGING TOOL - Use this whenever tables don't work as expected.
USE THIS IMMEDIATELY WHEN:
Table population put data in wrong cells
You get "table not found" errors
Data appears concatenated in first cell
Need to understand existing table structure
Planning to fill existing cells with modify_doc_text at their insertion_index
WHAT THIS SHOWS YOU:
Exact table dimensions (rows × columns)
Each cell's position coordinates (row,col)
Current content in each cell
Insertion indices for each cell
Table boundaries and ranges
HOW TO READ THE OUTPUT:
"dimensions": "2x3" = 2 rows, 3 columns
"position": "(0,0)" = first row, first column
"current_content": What's actually in each cell right now
"insertion_index": Where new text would be inserted in that cell
WORKFLOW INTEGRATION:
After creating table → Use this to verify structure
Before populating → Use this to plan your data format
After population fails → Use this to see what went wrong
When debugging → Compare your data array to actual table structure
Inputs: document_id (required), user_google_email (required), tab_id, table_index. Returns: result
download_chat_attachmentDownload Chat AttachmentA
Downloads an attachment from a Google Chat message and saves it to local disk.
In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour).
Inputs: message_id (required), user_google_email (required), attachment_index. Returns: result
draft_gmail_messageDraft Gmail MessageA
Creates a draft email in the user's Gmail account. Supports new, reply, and forward drafts with optional attachments. Supports Gmail's "Send As" feature to draft from configured alias addresses.
To save a forward as a draft for review, pass forward_message_id. The original subject, body (quoted with a "Forwarded message" header), and attachments are carried over. In forward mode, body (if any) is prepended as a note, subject is optional, and threading, reply, and signature options do not apply.
SCHEDULED SEND IS NOT AVAILABLE. Gmail's REST API exposes no send-time parameter; the Schedule send feature is web-UI only, and a message cannot be placed in the Scheduled folder through the API. Do not claim a message was scheduled. To deliver at a chosen time, create a draft with draft_gmail_message. An external scheduler must retain the message data to create and send a new message via send_gmail_message then, or call users.drafts.send with the draft ID returned by draft_gmail_message. Alternatively, let the user schedule the draft in the Gmail UI.
Inputs: user_google_email (required), cc, to, bcc, +15 more. Returns: result
export_doc_to_pdfExport Doc to PDFA
Exports a Google Doc to PDF format and saves it to Google Drive.
Inputs: document_id (required), user_google_email (required), folder_id, pdf_filename. Returns: result
find_and_replace_docFind and Replace DocADestructive
Finds and replaces text throughout a Google Doc. No index calculation required.
This is the safest way to update specific text in a document because it does not require knowing any indices. Use this tool when you need to:
Replace placeholder text (e.g., {{TITLE}}) with real content
Update specific words or phrases throughout the document
Make targeted text changes without risk of index errors
For building documents from scratch, consider inserting text with unique placeholders via batch_update_doc, then using this tool to replace them.
Inputs: find_text (required), document_id (required), replace_text (required), user_google_email (required), +2 more. Returns: result
format_sheet_rangeFormat Sheet RangeBDestructive
Applies formatting to a range: colors, number formats, text wrapping, alignment, text styling, cell merging/unmerging, borders, and dropdown lists.
Colors accept hex strings (#RRGGBB). Number formats follow Sheets types (e.g., NUMBER, CURRENCY, DATE, PERCENT). If no sheet name is provided, the first sheet is used.
Inputs: range_name (required), spreadsheet_id (required), user_google_email (required), bold, +17 more. Returns: result
generate_trigger_codeGenerate Trigger CodeARead-onlyIdempotent
Generates Apps Script code for creating triggers.
The Apps Script API cannot create triggers directly - they must be created
from within Apps Script itself. This tool generates the code you need.
To list or remove existing triggers without opening the editor, use
manage_script_trigger (action="list" / action="delete") instead.
Inputs: trigger_type (required), function_name (required), schedule. Returns: result
get_contactGet ContactARead-onlyIdempotent
Get detailed information about a specific contact.
Inputs: contact_id (required), user_google_email (required). Returns: result
get_contact_groupGet Contact GroupARead-onlyIdempotent
Get details of a specific contact group including its members.
Inputs: group_id (required), user_google_email (required), max_members. Returns: result
get_doc_as_markdownGet Doc as MarkdownARead-onlyIdempotent
Reads a Google Doc and returns it as clean Markdown with optional comment context.
Unlike get_doc_content which returns plain text, this tool preserves document formatting as Markdown: headings, bold/italic/strikethrough, links, code spans, ordered/unordered lists with nesting, and tables.
When comments are included (the default), each comment's anchor text — the specific text the comment was attached to — is preserved, giving full context for the discussion.
Inputs: document_id (required), user_google_email (required), tab_id, heading, +6 more. Returns: result
get_doc_contentGet Doc ContentARead-onlyIdempotent
Retrieves content of a Google Doc or a Drive file (like .docx) identified by document_id.
Native Google Docs: Fetches content via Docs API.
Office files (.docx, etc.) stored in Drive: Downloads via Drive API and extracts text.
By default, native Google Docs text is index-aligned with the document: empty paragraphs are preserved and every non-text element that occupies an index (inline object, page break, footnote reference, ...) is rendered as one U+FFFC placeholder per index. The document body starts at index 1, so an offset n into the text that follows "--- CONTENT ---" is document index n + 1, and that index can be passed straight to format_text or delete_text. Tables and multi-tab documents interleave separators, so alignment holds up to the first table or tab header.
Set preserve_context=True for readable link destinations, internal targets, smart-chip values, table boundaries, headers, footers, footnotes, and object context exposed by the Docs API. This output is plain text, not Markdown, and its offsets must not be used as document editing indices. Comments, revision history, exact visual layout, and chip details hidden by the API are not included. Use get_doc_as_markdown for formatting or comments.
Inputs: document_id (required), user_google_email (required), tab_id, heading, +3 more. Returns: result
get_drive_file_contentGet Drive File ContentARead-onlyIdempotent
Retrieves the content of a specific Google Drive file by ID, supporting files in shared drives.
• Native Google Docs, Sheets, Slides → exported as text / CSV. • Office files (.docx, .xlsx, .pptx) → unzipped & parsed with std-lib to extract readable text. • PDFs → text extracted with pypdf when possible; scanned/image-only PDFs fall back to a download hint. • Images (PNG, JPEG, GIF, WebP) → returned as MCP image content after the metadata header. SVG → returned as its markup; raster images it embeds as base64 are attached as image content, numbered to match their place in the markup. BMP and TIFF → base64 text, or a download hint when over the default page size. • Any other file → downloaded; tries UTF-8 decode, else notes binary.
Inputs: file_id (required), user_google_email (required), offset, full_content. Returns: result
get_drive_file_download_urlGet Drive File Download URLARead-onlyIdempotent
Downloads a Google Drive file and saves it to local disk.
In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour). In stateless mode (no file storage), returns the file itself as an embedded resource, up to WORKSPACE_MCP_STATELESS_INLINE_MAX_BYTES (default 10 MiB, and never more than WORKSPACE_MCP_MAX_FILE_BYTES when that is set).
For Google native files (Docs, Sheets, Slides, Drawings), exports to a useful format:
Google Docs -> PDF (default) or DOCX if export_format='docx'
Google Sheets -> XLSX (default), PDF if export_format='pdf', or CSV if export_format='csv'
Google Slides -> PDF (default) or PPTX if export_format='pptx'
Google Drawings -> PNG (default), or PDF, JPG or SVG if export_format='pdf', 'jpg' or 'svg'
For other files, downloads the original file format.
Inputs: file_id (required), user_google_email (required), export_format. Returns: result
get_drive_file_permissionsGet Drive File PermissionsARead-onlyIdempotent
Gets detailed metadata about a Google Drive file including sharing permissions, parent folder IDs, ownership, and lifecycle timestamps.
Inputs: file_id (required), user_google_email (required). Returns: result
get_eventsGet EventsARead-onlyIdempotent
Retrieves events from a specified Google Calendar. Can retrieve a single event by ID or multiple events within a time range. You can also search for events by keyword by supplying the optional "query" param.
Inputs: user_google_email (required), query, detailed, event_id, +7 more. Returns: result
get_formGet FormCRead-onlyIdempotent
Get a form.
Inputs: form_id (required), user_google_email (required). Returns: result
get_form_responseGet Form ResponseBRead-onlyIdempotent
Get one response from the form.
Inputs: form_id (required), response_id (required), user_google_email (required). Returns: result
get_gmail_attachment_contentGet Gmail Attachment ContentA
Downloads an email attachment and saves it to local disk.
In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour). May re-fetch message metadata to resolve filename and MIME type.
Inputs: message_id (required), attachment_id (required), user_google_email (required), return_base64, +1 more. Returns: result
get_gmail_message_contentGet Gmail Message ContentARead-onlyIdempotent
Retrieves the full content (subject, sender, recipients, body) of a specific Gmail message.
Set page_offset=0 to read the complete rendered body, excluding attachments and attached messages, as JSON pages of at most page_size characters. Follow next_offset until complete=true, passing body_sha256 as expected_sha256 and keeping body_format and include_links unchanged.
Bodies are returned inline and truncated at 20,000 characters. Set full=True to get the complete, untruncated message instead: it is exported to storage and the response carries a short-lived download URL (HTTP transport) or file path (stdio transport) rather than the body, so large messages never stream through the model context. Stateless deployments without GCS staging have no storage, so there full=True returns the untruncated body inline; with GCS staging configured it returns a signed download URL like any other HTTP deployment.
Inputs: message_id (required), user_google_email (required), full, format, +6 more. Returns: result
get_gmail_messages_content_batchGet Gmail Messages Content BatchARead-onlyIdempotent
Retrieves the content of multiple Gmail messages in a single batch request. Supports up to 25 messages per batch to prevent SSL connection exhaustion.
Inputs: message_ids (required), user_google_email (required), format, body_format, +1 more. Returns: result
get_gmail_thread_contentGet Gmail Thread ContentARead-onlyIdempotent
Retrieves the complete content of a Gmail conversation thread, including all messages.
Optionally also returns structured ownership analysis so a caller can determine who sent the last message and who owes whom a response without re-parsing the formatted string or making a second tool call.
Inputs: thread_id (required), user_google_email (required), body_format, include_links, +1 more. Returns: result
get_gmail_threads_content_batchGet Gmail Threads Content BatchARead-onlyIdempotent
Retrieves the content of multiple Gmail threads in a single batch request. Supports up to 25 threads per batch to prevent SSL connection exhaustion.
Inputs: thread_ids (required), user_google_email (required), body_format, include_links. Returns: result
get_messagesGet MessagesCRead-onlyIdempotent
Retrieves messages from a Google Chat space.
Inputs: space_id (required), user_google_email (required), order_by, page_size, +2 more. Returns: result
get_pageGet PageCRead-onlyIdempotent
Get details about a specific page (slide) in a presentation.
Inputs: page_object_id (required), presentation_id (required), user_google_email (required), raw, +2 more. Returns: result
get_presentationGet PresentationCRead-onlyIdempotent
Get details about a Google Slides presentation.
Inputs: presentation_id (required), user_google_email (required), raw, include_styles, +2 more. Returns: result
get_script_activityGet Script ActivityARead-onlyIdempotent
Read execution activity for scripts: recent processes or aggregate metrics.
Inputs: action (required), user_google_email (required), page_size, script_id, +1 more. Returns: result
get_script_projectGet Script ProjectARead-onlyIdempotent
Read Apps Script projects and their source files.
Inputs: action (required), user_google_email (required), file_name, page_size, +2 more. Returns: result
get_script_versionGet Script VersionCRead-onlyIdempotent
List or retrieve immutable version snapshots of a script project.
Inputs: action (required), script_id (required), user_google_email (required), version_number. Returns: result
get_search_engine_infoGet Search Engine InfoBRead-onlyIdempotent
Retrieves metadata about a Programmable Search Engine.
Inputs: user_google_email (required). Returns: result
get_spreadsheet_infoGet Spreadsheet InfoARead-onlyIdempotent
Gets information about a specific spreadsheet including its sheets.
Inputs: spreadsheet_id (required), user_google_email (required). Returns: result
get_taskGet TaskBRead-onlyIdempotent
Get details of a specific task.
Inputs: task_id (required), task_list_id (required), user_google_email (required). Returns: result
get_task_listGet Task ListBRead-onlyIdempotent
Get details of a specific task list.
Inputs: task_list_id (required), user_google_email (required). Returns: result
import_to_google_docImport to Google DocA
Imports a file (Markdown, DOCX, TXT, HTML, RTF, ODT) into Google Docs format with automatic conversion.
Google Drive automatically converts the source file to native Google Docs format, preserving formatting like headings, lists, bold, italic, etc. Binary sources may be passed directly as base64_content. On a local server a file on disk can also be passed by path (preferred for batch operations, so callers do not need to load full file contents into their context).
Inputs: file_name (required), user_google_email (required), content, file_url, +5 more. Returns: result
import_to_google_sheetsImport to Google SheetsA
Imports a spreadsheet (XLSX, XLS, ODS, CSV, TSV) into Google Sheets format with automatic conversion.
Google Drive automatically converts the source spreadsheet to native Google Sheets format, preserving rows, columns, sheets, and values. Binary sources may be passed directly as base64_content. On a local server a file on disk can also be passed by path (preferred for batch operations, so callers do not need to load full file contents into their context).
Inputs: file_name (required), user_google_email (required), content, file_url, +5 more. Returns: result
import_to_google_slidesImport to Google SlidesA
Imports a presentation (PPTX, PPT, ODP) into Google Slides format with automatic conversion.
Google Drive automatically converts the source presentation to native Google Slides format, preserving slides, layouts, text, and images. Binary sources may be passed directly as base64_content. On a local server a file on disk can also be passed by path (preferred for batch operations, so callers do not need to load full file contents into their context).
Inputs: file_name (required), user_google_email (required), file_url, file_path, +4 more. Returns: result
insert_doc_elementsInsert Doc ElementsC
Inserts structural elements like tables, lists, or page breaks into a Google Doc.
Inputs: index (required), document_id (required), element_type (required), user_google_email (required), +4 more. Returns: result
insert_doc_imageInsert Doc ImageA
Inserts an image into a Google Doc from Drive or a URL.
Inputs: index (required), document_id (required), image_source (required), user_google_email (required), +2 more. Returns: result
inspect_doc_structureInspect Doc StructureARead-onlyIdempotent
Essential tool for finding safe insertion points and understanding document structure.
USE THIS FOR:
Finding the correct index for table insertion
Understanding document layout before making changes
Locating existing tables and their positions
Getting document statistics and complexity info
Inspecting structure of specific tabs
CRITICAL FOR TABLE OPERATIONS: ALWAYS call this BEFORE creating tables to get a safe insertion index.
WHAT THE OUTPUT SHOWS:
total_elements: Number of document elements
total_length: Maximum safe index for insertion
tables: Number of existing tables
table_details: Position and dimensions of each table
headers / footers: Real segment IDs and previews for header/footer editing
tabs: List of available tabs in the document (if no tab_id specified)
empty_paragraphs: newline-only count, excluding existing/suggested object anchors
empty_paragraph_ranges: start/end extents, capped at 100
empty_paragraph_ranges_truncated: whether ranges were omitted
last_paragraph: is_list_item and is_empty, or null if no body paragraphs
Paragraph statistics cover top-level body paragraphs and appear at the top level in basic mode or under "statistics" in detailed mode. Ranges can include required empty paragraphs. Before cleanup, use detailed=true to check adjacent elements, formatting, and object anchors. Preserve the final newline and newlines before tables, tables of contents, or section breaks. If the body ends with an empty paragraph, that paragraph's range has end == total_length; truncation may omit that range.
WORKFLOW FOR TABLE INSERTION: Step 1: Call this function Step 2: Note the "total_length" value Step 3: Use an index < total_length for table insertion Step 4: Create your table
FORMATTING WORKFLOW: After inserting all text via batch_update_doc with end_of_segment=true, call this tool with detailed=true to get exact start_index and end_index for every paragraph. Use those indices directly in format_text and update_paragraph_style operations in a second batch_update_doc call.
HEADER/FOOTER WORKFLOW: For ordinary header/footer text, use update_doc_headers_footers. If you need low-level segment editing, call this tool first and use the real segment_id values returned under headers/footers. Do not invent IDs.
The detailed output includes elements[].start_index and elements[].end_index with text_preview for each paragraph, making it easy to identify which ranges to format.
SUB-PARAGRAPH FORMATTING: text_preview is truncated to 100 characters by default. To compute the index of a token inside a longer paragraph, pass preview_chars=0 or None for untruncated text, then add the token's UTF-16 offset within that text to the paragraph's start_index (non-BMP characters such as emoji occupy two UTF-16 units).
Inputs: document_id (required), user_google_email (required), tab_id, detailed, +1 more. Returns: result
list_calendarsList CalendarsARead-onlyIdempotent
Retrieves a list of calendars accessible to the authenticated user.
Inputs: user_google_email (required), page_token, max_results. Returns: result
list_contact_groupsList Contact GroupsBRead-onlyIdempotent
List contact groups (labels) for the user.
Inputs: user_google_email (required), page_size, page_token. Returns: result
list_contactsList ContactsARead-onlyIdempotent
List contacts for the authenticated user, optionally as a full or incremental sync.
Inputs: user_google_email (required), page_size, page_token, sort_order, +2 more. Returns: result
list_docs_in_folderList Docs in FolderCRead-onlyIdempotent
Lists Google Docs within a specific Drive folder.
Inputs: user_google_email (required), folder_id, page_size, page_token. Returns: result
list_document_commentsList Document CommentsARead-onlyIdempotent
List all comments from a Google Document (optional max_comments to limit results).
Inputs: document_id (required), user_google_email (required), max_comments. Returns: result
list_drive_itemsList Drive ItemsARead-onlyIdempotent
Lists files/folders or shared drive containers, supporting shared drives.
If drive_id is specified, lists items within that shared drive. folder_id is then relative to that drive (or use drive_id as folder_id for root).
If drive_id is not specified, lists items from user's "My Drive" and accessible shared drives (if include_items_from_all_drives is True).
Set resource_type to "shared_drives" to list shared drive containers instead of folder contents.
Inputs: user_google_email (required), query, corpora, detailed, +9 more. Returns: result
list_form_responsesList Form ResponsesARead-onlyIdempotent
List a form's responses.
Inputs: form_id (required), user_google_email (required), page_size, page_token. Returns: result
list_gmail_filtersList Gmail FiltersARead-onlyIdempotent
Lists all Gmail filters configured in the user's mailbox.
Inputs: user_google_email (required). Returns: result
list_gmail_labelsList Gmail LabelsBRead-onlyIdempotent
Lists labels in the user's Gmail account.
Inputs: user_google_email (required), prefix, compact, include_system. Returns: result
list_presentation_commentsList Presentation CommentsARead-onlyIdempotent
List all comments from a Google Presentation (optional max_comments to limit results).
Inputs: presentation_id (required), user_google_email (required), max_comments. Returns: result
list_script_deploymentsList Script DeploymentsCRead-onlyIdempotent
List deployments for an Apps Script project.
Inputs: script_id (required), user_google_email (required). Returns: result
list_sheet_tablesList Sheet TablesARead-onlyIdempotent
Lists all structured tables in a spreadsheet with their IDs, names, ranges, and column details. Use this to find table IDs for append_table_rows.
Inputs: spreadsheet_id (required), user_google_email (required). Returns: result
list_spacesList SpacesBRead-onlyIdempotent
Lists Google Chat spaces (rooms and direct messages) accessible to the user, or the members of one space.
Inputs: user_google_email (required), space_id, page_size, space_type. Returns: result
list_spreadsheet_commentsList Spreadsheet CommentsARead-onlyIdempotent
List all comments from a Google Spreadsheet (optional max_comments to limit results).
Inputs: spreadsheet_id (required), user_google_email (required), max_comments. Returns: result
list_spreadsheetsList SpreadsheetsBRead-onlyIdempotent
Lists spreadsheets from Google Drive that the user has access to.
Inputs: user_google_email (required), corpora, drive_id, page_token, +1 more. Returns: result
list_task_listsList Task ListsARead-onlyIdempotent
List all task lists for the user.
Inputs: user_google_email (required), page_token, max_results. Returns: result
list_tasksList TasksARead-onlyIdempotent
List all tasks in a specific task list.
Inputs: task_list_id (required), user_google_email (required), due_max, due_min, +9 more. Returns: result
manage_calendarManage CalendarBDestructive
Creates secondary Google Calendars and manages who a calendar is shared with (its access control rules).
Inputs: action (required), user_google_email (required), role, rule_id, +8 more. Returns: result
manage_conditional_formattingManage Conditional FormattingADestructive
Manages conditional formatting rules on a Google Sheet. Supports adding, updating, and deleting conditional formatting rules via a single tool.
Inputs: action (required), spreadsheet_id (required), user_google_email (required), range_name, +7 more. Returns: result
manage_contactManage ContactBDestructive
Create, update, or delete a contact. Consolidated tool replacing create_contact, update_contact, and delete_contact.
Inputs: action (required), user_google_email (required), urls, email, +22 more. Returns: result
manage_contact_groupManage Contact GroupADestructive
Create, update, delete a contact group, or modify its members. Consolidated tool replacing create_contact_group, update_contact_group, delete_contact_group, and modify_contact_group_members.
Inputs: action (required), user_google_email (required), name, group_id, +3 more. Returns: result
manage_contacts_batchManage Contacts BatchBDestructive
Batch create, update, or delete contacts. Consolidated tool replacing batch_create_contacts, batch_update_contacts, and batch_delete_contacts.
Inputs: action (required), user_google_email (required), field, updates, +2 more. Returns: result
manage_deploymentManage DeploymentBDestructive
Create, update, or delete Apps Script deployments.
Inputs: action (required), script_id (required), user_google_email (required), description, +3 more. Returns: result
manage_doc_tabManage Doc TabBDestructive
Manage document tabs: create, rename, delete, or populate from Markdown.
Inputs: action (required), document_id (required), user_google_email (required), index, +5 more. Returns: result
manage_document_commentManage Document CommentCDestructive
Manage comments on a Google Document.
Inputs: action (required), document_id (required), user_google_email (required), comment_id, +1 more. Returns: result
manage_drive_accessManage Drive AccessBDestructive
Consolidated tool for managing Google Drive file and folder access permissions.
Supports granting, batch-granting, updating, revoking permissions, and transferring file ownership -- all through a single entry point.
Inputs: action (required), file_id (required), user_google_email (required), role, +10 more. Returns: result
manage_eventManage EventCDestructive
Manages calendar events. Supports creating, updating, deleting, and RSVP.
Inputs: action (required), user_google_email (required), summary, color_id, +29 more. Returns: result
manage_focus_timeManage Focus TimeADestructive
Manages Focus Time events on Google Calendar. These special events auto-decline meeting invitations and, by default, set the user's chat status to Do Not Disturb, helping protect blocks of uninterrupted work time.
Inputs: action (required), user_google_email (required), summary, end_time, +13 more. Returns: result
manage_gmail_filterManage Gmail FilterADestructive
Manages Gmail filters: create, delete, update, and apply to existing mail.
update: Gmail has no filter update API, so the filter is recreated (new one first, then the old one is deleted) and its ID changes. A passed criteria or filter_action replaces that whole object; omit one to keep the old filter's.
apply: runs a filter's label actions on mail ALREADY in the mailbox (Gmail filters only act on new mail). Only matching messages change, not whole conversations as in the web UI. Use filter_id, or criteria + filter_action for an ad-hoc run. Forwarding is never applied. Use dry_run=true first to see the search query and the match count. Needs the gmail.modify scope in addition to gmail.settings.basic.
Inputs: action (required), user_google_email (required), dry_run, criteria, +3 more. Returns: result
manage_gmail_labelManage Gmail LabelADestructive
Manages Gmail labels: create, update, or delete labels.
Inputs: action (required), user_google_email (required), name, label_id, +5 more. Returns: result
manage_named_rangeManage Named RangeADestructive
Manages the lifecycle of named ranges in a Google Sheet: list, create, update, or delete.
Inputs: action (required), spreadsheet_id (required), user_google_email (required), name, +4 more. Returns: result
manage_out_of_officeManage Out of OfficeADestructive
Manages Out of Office events on Google Calendar. These special events auto-decline meeting invitations and set the user's status to "Out of office" across Google Workspace.
Inputs: action (required), user_google_email (required), summary, end_time, +11 more. Returns: result
manage_presentation_commentManage Presentation CommentCDestructive
Manage comments on a Google Presentation.
Inputs: action (required), presentation_id (required), user_google_email (required), comment_id, +1 more. Returns: result
manage_script_contentManage Script ContentADestructive
Update the source files of an Apps Script project.
Inputs: action (required), script_id (required), user_google_email (required), files, +1 more. Returns: result
manage_script_projectManage Script ProjectCDestructive
Create or delete an Apps Script project.
Inputs: action (required), user_google_email (required), title, parent_id, +1 more. Returns: result
manage_script_triggerManage Script TriggerADestructive
List or delete the current user's installable triggers on a script project.
The Apps Script REST API has no triggers resource, so in dev_mode both actions
provision (or refresh) a small helper file and run it via the Execution
API - the only way to inspect or change trigger state without opening the
editor. Neither action is read-only: the helper file may be written into the
project on first use. To create a trigger, use generate_trigger_code to
produce the setup code, add it with manage_script_content, then run it with
run_script_function.
Inputs: action (required), script_id (required), user_google_email (required), dev_mode, +3 more. Returns: result
manage_script_versionManage Script VersionA
Create immutable version snapshots of a script project.
Versions capture a snapshot of the current script code; once created they cannot be modified.
Inputs: action (required), script_id (required), user_google_email (required), description. Returns: result
manage_sheet_tabManage Sheet TabADestructive
Manages an existing sheet tab: rename, delete, hide, unhide, reorder, or style (tab color and gridlines).
Use create_sheet to add a tab, and resize_sheet_dimensions for row and column level changes. This tool operates on the tab itself.
Inputs: action (required), sheet_name (required), spreadsheet_id (required), user_google_email (required), +4 more. Returns: result
manage_spreadsheet_commentManage Spreadsheet CommentCDestructive
Manage comments on a Google Spreadsheet.
Inputs: action (required), spreadsheet_id (required), user_google_email (required), cell, +2 more. Returns: result
manage_taskManage TaskADestructive
Manage tasks: create, update, delete, or move tasks within task lists.
Inputs: action (required), task_list_id (required), user_google_email (required), due, +7 more. Returns: result
manage_task_listManage Task ListBDestructive
Manage task lists: create, update, delete, or clear completed tasks.
Inputs: action (required), user_google_email (required), title, task_list_id. Returns: result
modify_doc_textModify Doc TextADestructive
Modifies text in a Google Doc - can insert/replace text and/or apply formatting in a single operation.
TIP: To append text to the end of the document without calculating indices, set end_of_segment=true. This avoids index calculation errors.
HEADING MODE: Pass heading instead of start_index to edit the body below a heading, up to the next heading of equal or shallower level. text is rendered as Markdown and replaces that body; end_of_segment=true appends instead. Formatting parameters without text format the whole body.
For ordinary header/footer text, prefer update_doc_headers_footers. Only pass segment_id when you already have a real header/footer/footnote segment ID from inspect_doc_structure output. Do not guess IDs such as "kix.header" or "kix.footer".
Inputs: document_id (required), user_google_email (required), bold, text, +19 more. Returns: result
modify_gmail_message_labelsModify Gmail Message LabelsADestructive
Adds or removes labels from a Gmail message. To archive an email, remove the INBOX label. To delete an email, add the TRASH label.
Inputs: message_id (required), user_google_email (required), add_label_ids, remove_label_ids. Returns: result
modify_sheet_valuesModify Sheet ValuesADestructive
Modifies values in a specific range of a Google Sheet - can write, update, or clear values, insert Smart Chips (Drive files/folders or People), or copy another range into it.
Inputs: range_name (required), spreadsheet_id (required), user_google_email (required), chips, +6 more. Returns: result
move_sheet_rowsMove Sheet RowsADestructive
Moves rows from one sheet to another within the same spreadsheet. The move is performed in a single batchUpdate (copyPaste followed by deleteDimension). Note: batchUpdate executes requests sequentially but does not roll back on partial failure — if the copy succeeds but the delete fails, rows may be duplicated. Formulas, data types, and formatting are preserved (unlike a values.get/append round-trip). Row numbers are 1-based (matching the spreadsheet UI).
Inputs: end_row (required), start_row (required), source_sheet (required), spreadsheet_id (required), +2 more. Returns: result
query_freebusyQuery FreebusyBRead-onlyIdempotent
Returns free/busy information for a set of calendars.
Inputs: time_max (required), time_min (required), user_google_email (required), calendar_ids, +2 more. Returns: result
read_sheet_valuesRead Sheet ValuesBRead-onlyIdempotent
Reads values from a specific range in a Google Sheet, one line per row: the sheet row number, then the row's cells separated by tabs.
Inputs: spreadsheet_id (required), user_google_email (required), range_name, include_notes, +3 more. Returns: result
render_page_to_imageRender Page to ImageBRead-onlyIdempotent
Render a slide (or any page, including notes pages) to an image and return it as image content, for looking at a slide's layout and visuals.
Inputs: page_object_id (required), presentation_id (required), user_google_email (required), size. Returns: result
resize_sheet_dimensionsResize Sheet DimensionsADestructive
Manages sheet-level dimension properties: resize columns/rows, auto-resize to fit content, freeze rows/columns, hide/unhide rows/columns, and insert/delete rows/columns.
Every row number and column letter refers to the sheet as it was before the call, even when one call both inserts and deletes. Deletes are applied before inserts, and an insert position inside a deleted span lands where that span was.
Inputs: spreadsheet_id (required), user_google_email (required), hide_rows, row_sizes, +16 more. Returns: result
run_script_functionRun Script FunctionCDestructive
Executes a function in a deployed script.
Inputs: script_id (required), function_name (required), user_google_email (required), dev_mode, +2 more. Returns: result
search_contactsSearch ContactsBRead-onlyIdempotent
Search contacts by name, email, phone number, or other fields.
Inputs: query (required), user_google_email (required), page_size. Returns: result
search_customSearch CustomARead-onlyIdempotent
Performs a search using Google Custom Search JSON API.
Inputs: q (required), user_google_email (required), num, safe, +9 more. Returns: result
search_docsSearch DocsBRead-onlyIdempotent
Searches for Google Docs by name using Drive API (mimeType filter).
Inputs: query (required), user_google_email (required), corpora, drive_id, +2 more. Returns: result
search_drive_filesSearch Drive FilesBRead-onlyIdempotent
Searches for files and folders within a user's Google Drive, including shared drives.
Inputs: query (required), user_google_email (required), corpora, detailed, +7 more. Returns: result
search_gmail_messagesSearch Gmail MessagesARead-onlyIdempotent
Searches messages in a user's Gmail account based on a query. Returns both Message IDs and Thread IDs for each found message, along with Gmail web interface links for manual verification. Supports pagination via page_token parameter.
Inputs: query (required), user_google_email (required), page_size, page_token, +1 more. Returns: result
search_messagesSearch MessagesARead-onlyIdempotent
Searches for messages in Google Chat spaces by text content and/or time range.
Inputs: user_google_email (required), query, space_id, page_size, +2 more. Returns: result
send_gmail_messageSend Gmail MessageADestructive
Sends an email using the user's Gmail account. Supports new emails, replies, and forwards, with optional attachments. Supports Gmail's "Send As" feature to send from configured alias addresses.
To forward an existing message, pass forward_message_id. The original subject, body (quoted with a "Forwarded message" header), and attachments are carried over. In forward mode, body (if any) is prepended as a note and subject is optional. Threading, reply, and signature options do not apply when forwarding.
THIS TOOL SENDS IMMEDIATELY AND CANNOT SCHEDULE. Gmail's REST API exposes no send-time parameter; Schedule send is a web-UI feature with no API equivalent, so no argument to this tool can defer delivery. Never tell a user a message was scheduled. For "prepare now, deliver later", create a draft with draft_gmail_message. An external scheduler must retain the message data to create and send a new message via send_gmail_message at the chosen time, or call users.drafts.send with the draft ID returned by draft_gmail_message. Alternatively, let the user schedule that draft in the Gmail UI.
Inputs: user_google_email (required), cc, to, bcc, +15 more. Returns: result
send_messageSend MessageADestructive
Sends a message to a Google Chat space, or edits a message already sent there.
Inputs: space_id (required), message_text (required), user_google_email (required), thread_key, +2 more. Returns: result
set_drive_file_permissionsSet Drive File PermissionsADestructive
Sets file-level sharing settings and controls link sharing for a Google Drive file or folder.
This is a high-level tool for the most common permission changes. Use this to toggle "anyone with the link" access or configure file-level sharing behavior. For managing individual user/group permissions, use share_drive_file or update_drive_permission instead.
Inputs: file_id (required), user_google_email (required), link_sharing, writers_can_share, +1 more. Returns: result
set_publish_settingsSet Publish SettingsB
Updates the publish settings of a form.
Inputs: form_id (required), user_google_email (required), is_published, is_accepting_responses. Returns: result
start_google_authStart Google AuthA
Manually initiate Google OAuth authentication flow.
NOTE: This is a legacy OAuth 2.0 tool and is disabled when OAuth 2.1 is enabled. The authentication system automatically handles credential checks and prompts for authentication when needed. Only use this tool if:
You need to re-authenticate with different credentials
You want to proactively authenticate before using other tools
The automatic authentication flow failed and you need to retry
In most cases, simply try calling the Google Workspace tool you need - it will automatically handle authentication if required.
Inputs: service_name (required), user_google_email. Returns: result
update_drive_fileUpdate Drive FileADestructive
Updates metadata, properties, and/or content of a Google Drive file.
Providing new content (inline as content, fetched from file_url, or on a
local server read from a file path) replaces the file's content in place,
preserving the existing file ID, sharing, comments, and links.
For native Google Docs/Sheets/Slides the source is uploaded with its source MIME
type so the Drive API applies the same format conversion as import_to_google_doc
(markdown headings, tables, bold, etc.). For any other file (.md, .txt, .pdf, ...)
there is nothing to convert, so the bytes are written back as-is under the file's
own MIME type. Metadata and content can be updated in a single call.
mode='append'/'prepend' splice content onto the file's existing text
server-side, so only the new text has to be supplied — no need to send the whole
file back to rewrite it.
Drive shortcuts are handled according to the kind of update: supported resource-local metadata changes (rename, move, trash, star, description, and custom properties) apply to the supplied shortcut, while content replacement follows the shortcut and updates its target. To avoid applying metadata to the wrong resource, a shortcut call cannot combine content with resource-local metadata. Update the shortcut metadata and target content in separate calls.
Inputs: file_id (required), user_google_email (required), mode, name, +13 more. Returns: result
update_paragraph_styleUpdate Paragraph StyleC
Apply paragraph-level formatting, heading styles, and/or list formatting to a range in a Google Doc.
This tool can apply named heading styles (H1-H6) for semantic document structure, create bulleted or numbered lists with nested indentation, and customize paragraph properties like alignment, spacing, and indentation. All operations can be applied in a single call.
Inputs: end_index (required), document_id (required), start_index (required), user_google_email (required), +26 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 119 tools
The tools are grouped by Google product and most have distinct resource/action targets, but there is meaningful overlap in several areas: Drive permission tools (manage_drive_access vs set_drive_file_permissions), document editing tools (modify_doc_text vs batch_update_doc vs find_and_replace_doc), and paired list/manage comment tools. Detailed descriptions help resolve many cases, but selecting the right tool among 119 still requires careful reading.
Almost all tools use snake_case with a verb-first pattern (get_, list_, create_, update_, manage_, search_, send_, batch_), which is highly predictable. Minor deviations exist: product prefixes are inconsistent (gmail-specific tools often include gmail, while Docs/Sheets tools usually do not), and consolidated manage_* tools sit alongside specific create_/update_/delete_ tools.
119 tools is an extreme mismatch for a usable MCP tool surface. While the server spans many Google Workspace products, this volume forces agents to choose among numerous closely related operations and increases the chance of misselection. The count alone makes the set unwieldy regardless of individual tool quality.
Coverage is very broad across Gmail, Calendar, Drive, Docs, Sheets, Slides, Chat, Forms, Tasks, Contacts, Apps Script, and Custom Search, with most lifecycle operations represented. There are still minor gaps and stale cross-references: descriptions mention tools like format_text, delete_text, share_drive_file, and update_drive_permission that are not present in the exposed set, and some product-level delete operations are only indirectly available.
Maintenance
Related MCP Connectors
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
Your Gmail, Calendar, Drive, GitHub, Oura, wallet and confirmed profile facts in any MCP client.
Streamable HTTP MCP server for Google Calendar and Sheets with OAuth login.
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for Google Workspace APIs - Docs, Sheets, Drive, Gmail, and Calendar. Enables reading, creating, and editing Google Docs and Sheets, managing comments, reading emails, and viewing calendar events.3426 npm17MIT
- AlicenseBqualityDmaintenanceProduction-ready MCP server for Google Workspace providing broad coverage across Gmail, Drive, Calendar, Docs, Sheets, and more, with safe-by-default write operations and markdown-to-Google-Docs support.100MIT
- FlicenseBqualityDmaintenanceMCP server providing full access to Google Workspace services (Gmail, Drive, Calendar, Docs, Sheets, Slides, Forms, Tasks, Contacts) using OAuth authentication.1001-
- AlicenseBqualityDmaintenanceComprehensive Google Workspace MCP server with Gmail, Drive, Calendar, and Contacts integration.2615 npmMIT