Use Gmail, Drive, Calendar, Docs and Sheets from an MCP client
console applicationapt install mcp-server-googleofficeModel Context Protocol server for Google Workspace: Gmail, Drive, Calendar, Docs, Sheets, Slides, Forms, Tasks, Contacts, Chat and Apps Script. Supports a read-only mode. Fork of taylorwilsdon/google_workspace_mcp.
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:
mcp-server-googleoffice (VitexSoftware fork)This repository is the VitexSoftware fork of
taylorwilsdon/google_workspace_mcp.
Upstream base: v2.4.1 (+13 commits, b5d4323b), last synced 2026-11-11.
apt install mcp-server-googleoffice # server, /usr/bin/mcp-server-googleoffice
apt install mcprack-mcp-server-googleoffice # registers it in the local mcprack catalog
The server is installed under /usr/share/mcp-server-googleoffice. The
launcher /usr/bin/mcp-server-googleoffice speaks stdio by default and
supports --help and --version. The upstream name workspace-mcp is kept
as a compatibility symlink.
The mcprack companion registers the server with WORKSPACE_MCP_READ_ONLY=true
and MCP_SINGLE_USER_MODE=1. Admins add the OAuth client as secrets in mcprack.
Read-only mode (WORKSPACE_MCP_READ_ONLY=true): the server requests only
read-only Google scopes. In this fork it also drops every tool that is not
annotated readOnlyHint=true. The one exception is start_google_auth,
which is needed to obtain credentials.
The canonical list is debian/server.json, installed as
/usr/share/mcp-server-googleoffice/server.json.
| Variable | Secret | Required | Default | Meaning |
|---|---|---|---|---|
GOOGLE_OAUTH_CLIENT_ID |
yes | yes | OAuth 2.0 client ID (Google Cloud console → Credentials) | |
GOOGLE_OAUTH_CLIENT_SECRET |
yes | yes | OAuth 2.0 client secret | |
USER_GOOGLE_EMAIL |
no | no | Default Google account for tool calls | |
WORKSPACE_MCP_CREDENTIALS_DIR |
no | no | Stored OAuth token directory; use a per-user path | |
GOOGLE_SERVICE_ACCOUNT_KEY_JSON |
yes | no | Service-account key for domain-wide delegation | |
GOOGLE_SERVICE_ACCOUNT_KEY_FILE |
no | no | Path to a service-account key file | |
DWD_ALLOWED_DOMAINS |
no | no | Domains the service account may impersonate | |
MCP_SINGLE_USER_MODE |
no | no | 1 |
Use stored credentials without session mapping |
WORKSPACE_MCP_READ_ONLY |
no | no | true |
Read-only scopes and tools only |
WORKSPACE_MCP_TRANSPORT |
no | no | stdio |
stdio or streamable-http |
WORKSPACE_MCP_TOOLS |
no | no | Comma-separated services to load | |
WORKSPACE_MCP_TOOL_TIER |
no | no | core, extended or complete |
|
WORKSPACE_MCP_PERMISSIONS |
no | no | Granular per-service permissions | |
WORKSPACE_MCP_DISABLED_TOOLS |
no | no | Comma-separated tools to block | |
WORKSPACE_ATTACHMENT_DIR |
no | no | Where downloaded attachments are stored | |
GOOGLE_PSE_API_KEY |
yes | no | Programmable Search Engine API key | |
GOOGLE_PSE_ENGINE_ID |
no | no | Programmable Search Engine ID | |
WORKSPACE_MCP_LOG_LEVEL |
no | no | INFO |
Log level |
On the stdio path, OAuth needs a one-time interactive consent. Run
start_google_auth once, or pre-seed WORKSPACE_MCP_CREDENTIALS_DIR with a
token, or use a service account with domain-wide delegation.
| Service | Tool | Title | Class |
|---|---|---|---|
| core | start_google_auth |
Start Google Auth | create |
| gappsscript | generate_trigger_code |
Generate Trigger Code | read-only |
| gappsscript | get_script_activity |
Get Script Activity | read-only |
| gappsscript | get_script_project |
Get Script Project | read-only |
| gappsscript | get_script_version |
Get Script Version | read-only |
| gappsscript | list_script_deployments |
List Script Deployments | read-only |
| gappsscript | manage_deployment |
Manage Deployment | mutate (destructive, non-idempotent) |
| gappsscript | manage_script_content |
Manage Script Content | mutate (destructive, non-idempotent) |
| gappsscript | manage_script_project |
Manage Script Project | mutate (destructive, non-idempotent) |
| gappsscript | manage_script_trigger |
Manage Script Trigger | mutate (destructive, non-idempotent) |
| gappsscript | manage_script_version |
Manage Script Version | create |
| gappsscript | run_script_function |
Run Script Function | mutate (destructive, non-idempotent) |
| gcalendar | get_events |
Get Events | read-only |
| gcalendar | list_calendars |
List Calendars | read-only |
| gcalendar | manage_calendar |
Manage Calendar | mutate (destructive, non-idempotent) |
| gcalendar | manage_event |
Manage Event | mutate (destructive, non-idempotent) |
| gcalendar | manage_focus_time |
Manage Focus Time | mutate (destructive, non-idempotent) |
| gcalendar | manage_out_of_office |
Manage Out of Office | mutate (destructive, non-idempotent) |
| gcalendar | query_freebusy |
Query Freebusy | read-only |
| gchat | create_reaction |
Create Reaction | create |
| gchat | download_chat_attachment |
Download Chat Attachment | create |
| gchat | get_messages |
Get Messages | read-only |
| gchat | list_spaces |
List Spaces | read-only |
| gchat | search_messages |
Search Messages | read-only |
| gchat | send_message |
Send Message | mutate (destructive, non-idempotent) |
| gcontacts | get_contact |
Get Contact | read-only |
| gcontacts | get_contact_group |
Get Contact Group | read-only |
| gcontacts | list_contact_groups |
List Contact Groups | read-only |
| gcontacts | list_contacts |
List Contacts | read-only |
| gcontacts | manage_contact |
Manage Contact | mutate (destructive, non-idempotent) |
| gcontacts | manage_contact_group |
Manage Contact Group | mutate (destructive, non-idempotent) |
| gcontacts | manage_contacts_batch |
Manage Contacts Batch | mutate (destructive, non-idempotent) |
| gcontacts | search_contacts |
Search Contacts | read-only |
| gdocs | batch_update_doc |
Batch Update Doc | mutate (destructive, non-idempotent) |
| gdocs | create_doc |
Create Doc | create |
| gdocs | create_table_with_data |
Create Table with Data | create |
| gdocs | debug_table_structure |
Debug Table Structure | read-only |
| gdocs | export_doc_to_pdf |
Export Doc to PDF | create |
| gdocs | find_and_replace_doc |
Find and Replace Doc | mutate (destructive, non-idempotent) |
| gdocs | get_doc_as_markdown |
Get Doc as Markdown | read-only |
| gdocs | get_doc_content |
Get Doc Content | read-only |
| gdocs | insert_doc_elements |
Insert Doc Elements | create |
| gdocs | insert_doc_image |
Insert Doc Image | create |
| gdocs | inspect_doc_structure |
Inspect Doc Structure | read-only |
| gdocs | list_docs_in_folder |
List Docs in Folder | read-only |
| gdocs | list_document_comments |
List Document Comments | read-only |
| gdocs | manage_doc_tab |
Manage Doc Tab | mutate (destructive, non-idempotent) |
| gdocs | manage_document_comment |
Manage Document Comment | mutate (destructive, non-idempotent) |
| gdocs | modify_doc_text |
Modify Doc Text | mutate (destructive, non-idempotent) |
| gdocs | search_docs |
Search Docs | read-only |
| gdocs | update_doc_headers_footers |
Update Doc Headers Footers | mutate (destructive, non-idempotent) |
| gdocs | update_paragraph_style |
Update Paragraph Style | create |
| gdrive | check_drive_file_public_access |
Check Drive File Public Access | read-only |
| gdrive | copy_drive_file |
Copy Drive File | create |
| gdrive | create_drive_file |
Create Drive File | create |
| gdrive | create_drive_folder |
Create Drive Folder | create |
| gdrive | get_drive_file_content |
Get Drive File Content | read-only |
| gdrive | get_drive_file_download_url |
Get Drive File Download URL | read-only |
| gdrive | get_drive_file_permissions |
Get Drive File Permissions | read-only |
| gdrive | get_drive_shareable_link |
Get Drive Shareable Link | read-only |
| gdrive | import_to_google_doc |
Import to Google Doc | create |
| gdrive | import_to_google_sheets |
Import to Google Sheets | create |
| gdrive | import_to_google_slides |
Import to Google Slides | create |
| gdrive | list_drive_items |
List Drive Items | read-only |
| gdrive | manage_drive_access |
Manage Drive Access | mutate (destructive, non-idempotent) |
| gdrive | search_drive_files |
Search Drive Files | read-only |
| gdrive | set_drive_file_permissions |
Set Drive File Permissions | mutate (destructive, non-idempotent) |
| gdrive | update_drive_file |
Update Drive File | mutate (destructive, non-idempotent) |
| gforms | batch_update_form |
Batch Update Form | mutate (destructive, non-idempotent) |
| gforms | create_form |
Create Form | create |
| gforms | get_form |
Get Form | read-only |
| gforms | get_form_response |
Get Form Response | read-only |
| gforms | list_form_responses |
List Form Responses | read-only |
| gforms | set_publish_settings |
Set Publish Settings | create |
| gmail | batch_modify_gmail_message_labels |
Batch Modify Gmail Message Labels | mutate (destructive, non-idempotent) |
| gmail | draft_gmail_message |
Draft Gmail Message | create |
| gmail | get_gmail_attachment_content |
Get Gmail Attachment Content | create |
| gmail | get_gmail_message_content |
Get Gmail Message Content | read-only |
| gmail | get_gmail_messages_content_batch |
Get Gmail Messages Content Batch | read-only |
| gmail | get_gmail_thread_content |
Get Gmail Thread Content | read-only |
| gmail | get_gmail_threads_content_batch |
Get Gmail Threads Content Batch | read-only |
| gmail | list_gmail_filters |
List Gmail Filters | read-only |
| gmail | list_gmail_labels |
List Gmail Labels | read-only |
| gmail | manage_gmail_filter |
Manage Gmail Filter | mutate (destructive, non-idempotent) |
| gmail | manage_gmail_label |
Manage Gmail Label | mutate (destructive, non-idempotent) |
| gmail | modify_gmail_message_labels |
Modify Gmail Message Labels | mutate (destructive, non-idempotent) |
| gmail | search_gmail_messages |
Search Gmail Messages | read-only |
| gmail | send_gmail_message |
Send Gmail Message | mutate (destructive, non-idempotent) |
| gsearch | get_search_engine_info |
Get Search Engine Info | read-only |
| gsearch | search_custom |
Search Custom | read-only |
| gsheets | append_table_rows |
Append Table Rows | create |
| gsheets | create_sheet |
Create Sheet | create |
| gsheets | create_spreadsheet |
Create Spreadsheet | create |
| gsheets | format_sheet_range |
Format Sheet Range | mutate (destructive, non-idempotent) |
| gsheets | get_spreadsheet_info |
Get Spreadsheet Info | read-only |
| gsheets | list_sheet_tables |
List Sheet Tables | read-only |
| gsheets | list_spreadsheet_comments |
List Spreadsheet Comments | read-only |
| gsheets | list_spreadsheets |
List Spreadsheets | read-only |
| gsheets | manage_conditional_formatting |
Manage Conditional Formatting | mutate (destructive, non-idempotent) |
| gsheets | manage_named_range |
Manage Named Range | mutate (destructive, non-idempotent) |
| gsheets | manage_sheet_tab |
Manage Sheet Tab | mutate (destructive, non-idempotent) |
| gsheets | manage_spreadsheet_comment |
Manage Spreadsheet Comment | mutate (destructive, non-idempotent) |
| gsheets | modify_sheet_values |
Modify Sheet Values | mutate (destructive, non-idempotent) |
| gsheets | move_sheet_rows |
Move Sheet Rows | mutate (destructive, non-idempotent) |
| gsheets | read_sheet_values |
Read Sheet Values | read-only |
| gsheets | resize_sheet_dimensions |
Resize Sheet Dimensions | mutate (destructive, non-idempotent) |
| gslides | batch_update_presentation |
Batch Update Presentation | mutate (destructive, non-idempotent) |
| gslides | create_presentation |
Create Presentation | create |
| gslides | get_page |
Get Page | read-only |
| gslides | get_presentation |
Get Presentation | read-only |
| gslides | list_presentation_comments |
List Presentation Comments | read-only |
| gslides | manage_presentation_comment |
Manage Presentation Comment | mutate (destructive, non-idempotent) |
| gslides | render_page_to_image |
Render Page to Image | read-only |
| gtasks | get_task |
Get Task | read-only |
| gtasks | get_task_list |
Get Task List | read-only |
| gtasks | list_task_lists |
List Task Lists | read-only |
| gtasks | list_tasks |
List Tasks | read-only |
| gtasks | manage_task |
Manage Task | mutate (destructive, non-idempotent) |
| gtasks | manage_task_list |
Manage Task List | mutate (destructive, non-idempotent) |
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 |
|---|---|
| Quick Start | Google Cloud setup, credentials, and client connection with screenshots |
| Full Documentation | Every tool, parameter, and auth mode |
| Advanced Deployment | Reverse proxy & nginx config, origin validation, credential store backends (GCS/CMEK), trusted-gateway identity, and the complete environment variable reference |
| Client Setup Guides | Claude Desktop/web Connectors, ChatGPT Developer Mode, and more |
| FAQ & Troubleshooting | Enabling Google APIs, OAuth errors, redirect URIs, Google Chat setup, client quirks |
|
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.
Full dependency tree in |
For Legal & Procurement This project is MIT licensed —
|
📧Gmail15 tools - search, send, draft, labels, filters, attachments |
📁Drive16 tools - search, create, share, import Office files |
📅Calendar7 tools - events, sharing, free/busy, Out of Office, Focus Time |
📝Docs19 tools - edit, style, tables, tabs, comments, export |
📊Sheets14 tools - ranges, tables, formatting, conditional rules |
🖼️Slides7 tools - create, batch update, slide images, comments |
📋Forms6 tools - build forms, publish, read responses |
✅Tasks6 tools - tasks & lists with hierarchy |
👤Contacts8 tools - people, groups, batch operations |
💬Chat6 tools - spaces, messages, search, reactions |
🔍Custom Search2 tools - programmable web search |
⚡Apps Script15 tools - write, deploy, run & debug scripts |
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.
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
|
OAuth 2.1 (PKCE)
|
Tool 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.
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-workspace
ChatGPT - 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.
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=5
Install globally with uv tool install . from this repo. ⚠️ Don't use uvx workspace-cli - an abandoned PyPI package squats that name.
Everything you need to run this in production lives in two places. The documentation covers auth modes and server configuration:
docker build -t workspace-mcp . && docker run -p 8000:8000 workspace-mcpThe 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.
WORKSPACE_MCP_GOOGLE_API_WORKERS, WORKSPACE_MCP_GOOGLE_API_TIMEOUT_SECONDSWORKSPACE_MCP_TOKEN_VALIDATION_WORKERS, WORKSPACE_MCP_TOKEN_VALIDATION_CACHE_TTLWORKSPACE_MCP_MAX_FILE_BYTES, WORKSPACE_MCP_STATELESS_INLINE_MAX_BYTES, WORKSPACE_MCP_MAX_OFFICE_XML_BYTESget_drive_file_content returns long content a page at a time by default, so a long file does not fill the model's context. WORKSPACE_MCP_MAX_CONTENT_CHARS sets the page size (default 40000; 0 returns whole content by default). Each page ends with a note giving the offset to read on from. This is only the default: a client can always pass full_content=true to 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, within WORKSPACE_MCP_PAGED_CONTENT_CACHE_BYTES per process (default 33554432, 32 MiB; 0 keeps nothing).WORKSPACE_MCP_SESSION_IDLE_TIMEOUT, WORKSPACE_MCP_READINESS_TIMEOUT_SECONDSWORKSPACE_MCP_ALLOWED_HOSTS, a comma-separated list of hostnames without ports (for example workspace-mcp,10.0.0.5). When set, requests whose Host is not loopback, listed, or the host of WORKSPACE_EXTERNAL_URL or an allowed origin get 403, so include every name clients and health probes use. Unset, any Host is accepted.WORKSPACE_MCP_DISABLE_LOCAL_FILES
With local files disabled, create_drive_file, update_drive_file and the import tools offer return_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..env.oauth21WORKSPACE_MCP_OAUTH_PROXY_REQUIRE_CONSENT=remember shows 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.WORKSPACE_MCP_OAUTH_PROXY_GOOGLE_PROMPT sets the prompt the OAuth proxy sends to Google's authorization endpoint (default consent); external provider mode ignores it. select_account consent shows 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 is consent; 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.
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:
.env, client_secret.json, or .credentials/ to source control.ALLOWED_FILE_DIRS only if you trust the client and its data sources; .env*, ~/.ssh/, ~/.aws/, and similar paths are always blocked.uv sync --group dev # install deps
uv run ruff check . # lint
uv run pytest # test
Single-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.
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.
Tento balíček zatím možná není v naší databázi zaindexován. Zkuste to prosím později, nebo zkontrolujte přímo repozitář balíčků.