Google Drive MCP Server
The Workspace power-editing MCP — formula-aware Sheets, full Slides editing, shared-drive audits the read-only Claude.ai connector deliberately won't ship.
96 tools across Drive (24) + Docs (13) + Sheets (30) + Slides (20) + GWS admin (8) + aggregations (2). Service Account + Domain-Wide Delegation for org-scale automation. GWS-aware capability detection — features auto-unlock for Workspace accounts.
What it does that others don't
- Deep Sheets editing — charts, conditional formats, protected ranges, named ranges, data validation, borders, merge, sort, find/replace, formulas, A1-quote-doubling for CJK tab names. The 1st-party Workspace connector reads Sheets as CSV — formulas don't survive.
- Full Slides editing — presentations, slides, shapes, tables, images, formatting. Not in the connector at all.
- Shared-Drive admin tooling —
list-shared-drives,get-shared-drive,create-shared-drive, list/share/remove permissions, file activity, labels, approvals. Workspace governance surface the connector deliberately doesn't expose. - 3 auth modes — OAuth2 (personal or GWS), Service Account + Domain-Wide Delegation (org-scale), Application Default Credentials (auto-detected).
- Aggregation tools —
audit-shared-drive-permissions(single Shared-Drive audit) +audit-external-shares(cross-drive / My-Drive audit with top external-domain concentration view),summarize-spreadsheet(metadata + per-tab sample + named ranges),summarize-doc(file + content + permissions + comments). - MCP Prompts (3) —
cleanup-shared-with-me,analyze-doc-structure,bulk-format-spreadsheet. - GWS-aware —
capabilities.tsdetects account type on startup; GWS-only tools return clear errors for personal accounts instead of mysterious 403s.
Try this — 5 prompts
Connect the server to Claude Desktop or Claude Code, then paste any of these:
- Shared-drive permission audit — "Audit external shares across all my Shared Drives. List people outside
us-all.co.krwho have access to anything. Group by drive, sort by access level." - Bulk conditional formatting — "Apply this conditional format to column
amountacross everysales-*spreadsheet in my drive: red if <0, yellow if 0–100, green if >100." - Slides from Doc outline — "Convert this Google Doc's outline into a 12-slide presentation: title slide, then 1 slide per H2 with H3 bullet points, end with a Q&A slide. Use the company template."
- Doc structure analysis — "Analyze this Doc's structure: heading hierarchy, internal vs external link health, image alt-text coverage. Suggest 3 concrete improvements."
- Cleanup shared-with-me — "Find files shared with me more than 180 days ago that I never opened. List them with sharer, last modified, and a guess at whether to keep."
When to use this vs alternatives
| Anthropic 1st-party Workspace connector | taylorwilsdon/google_workspace_mcp | xing5/mcp-google-sheets | @us-all/google-drive-mcp (this) |
|
|---|---|---|---|---|
| Stars / availability | n/a (Claude.ai built-in, Feb 2026) | 2.3K★ | 836★ | — |
| Scope | Drive read + Sheets-as-CSV read | Gmail+Calendar+Drive+Docs+Sheets+Slides+Forms+Chat+Tasks+Contacts+Apps Script | Sheets only | Drive + Docs + Sheets + Slides + GWS admin |
| Sheets formula editing | ❌ (CSV round-trip loses formulas) | ✅ basic | ✅ specialist | ✅ deep (charts/conditional/named ranges) |
| Slides editing | ❌ | ✅ | ❌ | ✅ deep |
| Shared-drive admin | partial | ✅ | ❌ | ✅ deep |
| Folder operations | ❌ | ✅ | ❌ | ✅ |
| Aggregation tools | ❌ | ❌ | ❌ | ✅ summarize-spreadsheet, summarize-doc, audit-external-shares |
| MCP Prompts | ❌ | ❌ | ❌ | ✅ 4 |
| Auth modes | managed OAuth | OAuth + SA + stateless | SA / OAuth / ADC | OAuth + SA + DWD + ADC |
| Transport | n/a (Claude.ai-only) | stdio + HTTP | stdio | stdio |
Use the 1st-party connector for zero-config Drive read flows in Claude.ai. Use taylorwilsdon if you need the full Workspace surface (Gmail / Calendar / Forms etc.). Use this server for Drive + Docs + Sheets + Slides power-editing, shared-drive governance, and bulk operations the connector can't do.
Install
Claude Desktop
{
"mcpServers": {
"google-drive": {
"command": "npx",
"args": ["-y", "@us-all/google-drive-mcp"],
"env": {
"GOOGLE_CLIENT_ID": "<your-client-id>",
"GOOGLE_CLIENT_SECRET": "<your-client-secret>",
"GOOGLE_REFRESH_TOKEN": "<your-refresh-token>",
"GOOGLE_DRIVE_ALLOW_WRITE": "true"
}
}
}
}
Claude Code
claude mcp add google-drive -s user -- npx -y @us-all/google-drive-mcp
(Set env vars separately or in .mcp.json.)
Docker
docker run --rm -i --env-file .env ghcr.io/us-all/google-drive-mcp-server
Build from source
git clone https://github.com/us-all/google-drive-mcp-server.git
cd google-drive-mcp-server && pnpm install && pnpm build
node dist/index.js
Auth setup
OAuth2 (personal or GWS)
- Google Cloud Console → create project
- Enable Drive API, Docs API, Sheets API, Slides API, Drive Activity API, Drive Labels API
- Create OAuth2 credentials (Desktop App)
- Get a refresh token (OAuth2 playground or your own flow)
- Set
GOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET,GOOGLE_REFRESH_TOKEN
Service Account + Domain-Wide Delegation (org-scale)
- Create a Service Account in Google Cloud Console
- Download the JSON key
- Workspace Admin Console → Security → API Controls → Domain-Wide Delegation → add the SA's Client ID + grant required scopes
- Set
GOOGLE_SERVICE_ACCOUNT_KEY_PATHandGOOGLE_IMPERSONATE_USER
Application Default Credentials (zero-config)
gcloud auth application-default login --client-id-file=client_secret.json --scopes=... — auto-detected on startup. Windows ADC paths (%APPDATA%\gcloud\) supported.
Configuration
| Variable | Required | Default | Description |
|---|---|---|---|
GOOGLE_CLIENT_ID |
OAuth2 | — | OAuth2 Client ID |
GOOGLE_CLIENT_SECRET |
OAuth2 | — | OAuth2 Client Secret |
GOOGLE_REFRESH_TOKEN |
OAuth2 | — | OAuth2 Refresh Token |
GOOGLE_SERVICE_ACCOUNT_KEY_PATH |
SA | — | Path to service-account JSON key |
GOOGLE_IMPERSONATE_USER |
❌ | — | GWS user email to impersonate (SA only) |
GOOGLE_DRIVE_ALLOW_WRITE |
❌ | false |
Set true to enable mutations |
GOOGLE_DRIVE_SCOPES |
❌ | drive.readonly (or drive if write enabled) |
Comma-sep OAuth scopes override |
GD_TOOLS |
❌ | — | Comma-sep allowlist of categories. Biggest token saver. |
GD_DISABLE |
❌ | — | Comma-sep denylist. Ignored when GD_TOOLS is set. |
MCP_TRANSPORT |
❌ | stdio |
http to enable Streamable HTTP transport |
MCP_HTTP_TOKEN |
conditional | — | Bearer token. Required when MCP_TRANSPORT=http |
MCP_HTTP_PORT |
❌ | 3000 |
HTTP listen port |
MCP_HTTP_HOST |
❌ | 127.0.0.1 |
HTTP bind host (DNS rebinding protection auto-enabled for localhost) |
MCP_HTTP_SKIP_AUTH |
❌ | false |
Skip Bearer auth — e.g. behind a reverse proxy that handles it |
Categories (7): drive, sheets, docs, slides, shared-drives, labels, approvals. Plus always-on meta.
When MCP_TRANSPORT=http: POST /mcp (Bearer-auth JSON-RPC) + GET /health (public liveness).
Token efficiency
| Scenario | Tools | Schema tokens | vs default |
|---|---|---|---|
| default (all categories) | 96 | 18,400 | — |
typical (GD_TOOLS=drive,docs,sheets) |
68 | 13,700 | −25% |
narrow (GD_TOOLS=drive) |
25 | 4,000 | −78% |
extractFields projection on list-files/get-file/sheets-get-spreadsheet/docs-get-document (with tabsCount, rowCount, columnCount, locale, timeZone defaults). list-files slim default trims ~80% (drops capabilities 40-bool object + contentRestrictions).
GWS detection
capabilities.ts detects account type at startup via about.get() + domain check:
| Feature | Personal | GWS Standard+ | GWS Enterprise |
|---|---|---|---|
| File CRUD / Search / Export | ✅ | ✅ | ✅ |
| Docs / Sheets / Slides editing | ✅ | ✅ | ✅ |
| Comments & Revisions | ✅ | ✅ | ✅ |
| Drive Activity | ✅ | ✅ | ✅ |
| Shared Drives | — | ✅ | ✅ |
| Labels (classification) | — | ✅ | ✅ |
| Approvals | — | ✅ | ✅ |
| Domain-Wide Delegation | — | ✅ | ✅ |
GWS-only tools throw GWSFeatureError with a clear message for personal accounts — no mysterious 403s.
MCP Prompts (4)
Workflow templates available via MCP prompts/list:
audit-shared-drive-permissions— fleet-wide external-share audit; flag access-level outliers.cleanup-shared-with-me— find untouched stale shares + suggest cleanup.analyze-doc-structure— heading hierarchy + link health + alt-text coverage.bulk-format-spreadsheet— apply consistent format across many sheets/tabs.
MCP Resources
URI-based read-only access:
gdrive://file/{fileId}gdrive://spreadsheet/{spreadsheetId}gdrive://document/{documentId}gdrive://presentation/{presentationId}gdrive://folder/{folderId}gdrive://shared-drive/{driveId}(GWS-gated)gdrive://about/me
Tools (98)
7 categories. Use search-tools to discover at runtime; full list collapsed below.
| Category | Tools |
|---|---|
| Sheets (data / structure / formatting / advanced) | 30 |
| Drive (files / search / folders / permissions / export / comments / revisions / activity) | 24 |
| Slides (presentation / slide mgmt / content / formatting) | 20 |
| Docs (document / editing / formatting / elements) | 13 |
| GWS-only (shared drives / labels / approvals / audit) | 9 |
Aggregations (summarize-spreadsheet, summarize-doc, audit-external-shares) |
3 |
Meta (search-tools) |
1 |
Drive (24)
get-about, list-files, get-file, read-file, create-file, update-file, copy-file, delete-file, search-files, create-folder, move-file, get-folder-tree, list-permissions, share-file, remove-permission, export-file, get-download-link, list-comments, get-comment, create-comment, resolve-comment, list-revisions, get-revision, get-activity
Google Docs (13)
Document: docs-get-document, docs-create-document, docs-get-content, docs-list-tabsEditing: docs-insert-text, docs-delete-range, docs-replace-text, docs-batch-updateFormatting: docs-format-text, docs-format-paragraphElements: docs-insert-table, docs-insert-image, docs-insert-page-break
Google Sheets (30)
Data: sheets-get-spreadsheet, sheets-get-values, sheets-batch-get-values, sheets-update-values, sheets-batch-update-values, sheets-append-values, sheets-clear-values, sheets-batch-clear-values, sheets-create-spreadsheet, sheets-manage-sheetsStructure: sheets-insert-dimension, sheets-delete-dimension, sheets-duplicate-sheet, sheets-copy-sheet-to, sheets-copy-paste, sheets-sort-range, sheets-find-replaceFormatting: sheets-format-cells, sheets-update-borders, sheets-merge-cells, sheets-unmerge-cells, sheets-auto-resize, sheets-resize-dimensionsAdvanced: sheets-set-data-validation, sheets-add-conditional-format, sheets-add-chart, sheets-delete-chart, sheets-add-protected-range, sheets-delete-protected-range, sheets-manage-named-range
Google Slides (20)
Presentation: slides-get-presentation, slides-create-presentation, slides-duplicate-presentationSlide management: slides-get-slide, slides-add-slide, slides-delete-slide, slides-move-slide, slides-duplicate-slideContent: slides-insert-text, slides-replace-text, slides-insert-text-box, slides-insert-image, slides-insert-table, slides-update-table-cell, slides-insert-shapeFormatting: slides-format-text, slides-format-shape, slides-resize-element, slides-set-slide-background, slides-batch-update
GWS-only (9)
list-shared-drives, get-shared-drive, create-shared-drive, audit-shared-drive-permissions, list-file-labels, apply-label, remove-label, list-approvals, get-approval
Aggregations
summarize-spreadsheet, summarize-doc, audit-external-shares
audit-external-shares complements the GWS-only audit-shared-drive-permissions: it runs across all corpora the caller can see (or just My Drive on personal accounts) and adds a top-external-domains concentration view.
Meta
search-tools — query other tools by keyword; always enabled.
Architecture
Claude → MCP stdio → src/index.ts
├── config.ts (OAuth2 / SA / ADC)
├── capabilities.ts (Personal vs GWS detect)
├── client.ts (Google API auth)
└── tools/{files,search,folders,permissions,export,comments,revisions,
about,activity,docs,sheets,slides,shared-drives,labels,approvals,
aggregations}.ts
↓
Drive API v3 / Docs API v1 / Sheets API v4 /
Slides API v1 / Drive Activity API v2 / Drive Labels API v2
Built on @us-all/mcp-toolkit:
extractFields— token-efficient response projectionsaggregate(fetchers, caveats)— fan-out helper forsummarize-doccreateWrapToolHandler— Google query-stringkey=...redaction +WriteBlockedError/GWSFeatureErrorpassthrough + Google API error extractionsearch-toolsmeta-tool
supportsAllDrives: true is passed to every Drive API call so Shared Drives just work.
Tech stack
Node.js 18+ • TypeScript strict ESM • pnpm • @modelcontextprotocol/sdk • googleapis (Drive v3 / Docs v1 / Sheets v4 / Slides v1 / Activity v2 / Labels v2) • zod • dotenv • vitest.
Limitations
- Approvals API —
googleapisSDK has no typed bindings; uses rawfetchwith auth header extraction. search-files— auto-wraps plain text infullText contains '...'; pass Drive query syntax directly for advanced searches.
License
MIT