Install
$ agentstack add mcp-a-bonus-google-docs-mcp ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Google Docs, Sheets, Drive, Gmail & Calendar MCP Server
Connect Claude Desktop, Cursor, or any MCP client to your Google Docs, Google Sheets, Google Drive, Gmail, and Google Calendar.
Quick Start
1. Create a Google Cloud OAuth Client
- Go to the Google Cloud Console
- Create or select a project
- Enable the Google Docs API, Google Sheets API, Google Drive API, Gmail API, and Google Calendar API
- Configure the OAuth consent screen (External, add your email as a test user, and add the
gmail.modifyandcalendar.eventsscopes alongside the Docs/Sheets/Drive scopes) - Create an OAuth client ID (Desktop app type)
- Copy the Client ID and Client Secret from the confirmation screen
> Need more detail? See [step-by-step instructions](#google-cloud-setup-details) at the bottom of this page.
2. Authorize
GOOGLE_CLIENT_ID="your-client-id" \
GOOGLE_CLIENT_SECRET="your-client-secret" \
npx -y @a-bonus/google-docs-mcp auth
This opens your browser for Google authorization. After you approve, the refresh token is saved to ~/.config/google-docs-mcp/token.json.
3. Add to Your MCP Client
Claude Desktop / Cursor / Windsurf:
{
"mcpServers": {
"google-docs": {
"command": "npx",
"args": ["-y", "@a-bonus/google-docs-mcp"],
"env": {
"GOOGLE_CLIENT_ID": "your-client-id",
"GOOGLE_CLIENT_SECRET": "your-client-secret"
}
}
}
}
The server starts automatically when your MCP client needs it.
Remote Deployment (Cloud Run)
Deploy once for your team -- no local installs required. The server uses MCP OAuth 2.1 so your MCP client handles authentication automatically.
gcloud run deploy google-docs-mcp \
--source . \
--region europe-west3 \
--port 8080 \
--allow-unauthenticated \
--set-env-vars "^|^MCP_TRANSPORT=httpStream|BASE_URL=https://your-service.run.app|GOOGLE_CLIENT_ID=...|GOOGLE_CLIENT_SECRET=...|TOKEN_STORE=firestore|JWT_SIGNING_KEY=your-secret-key"
Then each user just adds the URL to their MCP client -- no npx, no tokens, no local setup:
{
"mcpServers": {
"google-docs": {
"type": "streamableHttp",
"url": "https://your-service.run.app/mcp"
}
}
}
Your MCP client will prompt for Google sign-in on first connection. See [Remote Deployment](#remote-deployment) for details.
What Can It Do?
Tools across Google Docs, Sheets, and Drive:
Google Docs
| Tool | Description | | ----------------------------- | ------------------------------------------------- | | readDocument | Read content as plain text, JSON, or markdown | | appendText | Append text to a document | | insertText | Insert text at a specific position | | deleteRange | Remove content by index range | | modifyText | Replace, prepend, or transform text in a document | | findAndReplace | Find and replace text across a document | | findElement | Locate text occurrences (with index ranges) or list paragraphs/tables | | listTabs | List all tabs in a multi-tab document | | addTab | Add a new tab to a document | | renameTab | Rename a document tab | | replaceDocumentWithMarkdown | Replace entire document content from markdown | | replaceRangeWithMarkdown | Replace a specific range with markdown content | | appendMarkdown | Append markdown-formatted content | | applyTextStyle | Bold, italic, colors, font size, links | | applyParagraphStyle | Alignment, spacing, indentation | | insertTable | Create an empty table | | insertTableWithData | Create a table pre-filled with data | | insertPageBreak | Insert page breaks | | insertSectionBreak | Insert section break (NEXT_PAGE or CONTINUOUS) | | updateSectionStyle | Update section style: flip orientation, margins | | insertImage | Insert images from URLs or local files |
Comments
| Tool | Description | | ---------------- | -------------------------------------- | | listComments | View all comments with author and date | | getComment | Get a specific comment with replies | | addComment | Create a comment anchored to text | | replyToComment | Reply to an existing comment | | resolveComment | Mark a comment as resolved | | deleteComment | Remove a comment |
Google Sheets
| Tool | Description | | ----------------------------- | --------------------------------------------------------------------- | | readSpreadsheet | Read data from a range (A1 notation) | | writeSpreadsheet | Write data to a range | | batchWrite | Write to multiple ranges in one call | | appendRows | Add rows to a sheet | | clearRange | Clear cell values | | createSpreadsheet | Create a new spreadsheet | | addSheet | Add a sheet/tab | | deleteSheet | Remove a sheet/tab | | duplicateSheet | Duplicate a sheet within the same spreadsheet | | copySheetTo | Copy a sheet into another spreadsheet | | renameSheet | Rename a sheet/tab | | getSpreadsheetInfo | Get metadata and sheet list | | listSpreadsheets | Find spreadsheets | | formatCells | Bold, colors, alignment, vertical alignment, wrap strategy on ranges | | copyFormatting | Copy formatting from one range to another | | readCellFormat | Read formatting details of a cell range | | setCellBorders | Set per-side borders (top/bottom/left/right/inner) with style & color | | freezeRowsAndColumns | Pin header rows/columns | | setDropdownValidation | Add/remove dropdown lists on cells | | setColumnWidths | Set column widths in pixels | | setRowHeights | Set row heights in pixels | | autoResizeColumns | Auto-fit column widths to content | | autoResizeRows | Auto-fit row heights to content | | protectRange | Lock a range or entire sheet (warning-only or fully locked) | | addConditionalFormatting | Add a conditional formatting rule | | getConditionalFormatting | List conditional formatting rules with their index (JSON) | | deleteConditionalFormatting | Delete conditional formatting rules by index | | groupRows | Group rows for collapsible sections | | ungroupAllRows | Remove all row groupings | | createSheetsComment | Create a spreadsheet comment, optionally with a direct cell link | | createSheetsCellNote | Create a native cell note attached to a cell or range | | insertChart | Create a chart from data | | deleteChart | Remove a chart |
Google Sheets Tables
| Tool | Description | | ------------------ | ---------------------------------------------- | | createTable | Create a new named table with column types | | listTables | List all tables in a spreadsheet or sheet | | getTable | Get detailed table metadata by name or ID | | deleteTable | Delete a table (optionally clear data) | | updateTableRange | Modify table dimensions (add/remove rows/cols) | | appendTableRows | Append rows to a table (table-aware insertion) |
Google Drive
| Tool | Description | | ---------------------------- | ------------------------------------------- | | listDocuments | List documents, optionally filtered by date | | searchDocuments | Search by name or content | | getDocumentInfo | Get document metadata | | createDocument | Create a new document | | createDocumentFromTemplate | Create from an existing template | | createFolder | Create a folder | | listFolderContents | List folder contents | | getFolderInfo | Get folder metadata | | moveFile | Move a file to another folder | | copyFile | Duplicate a file | | renameFile | Rename a file | | deleteFile | Move to trash or permanently delete | | listDriveFiles | List any file type in Drive with filters | | searchDriveFiles | Search all Drive files by name or content | | downloadFile | Download a file's content |
Gmail
| Tool | Description | | --------------------- | --------------------------------------------------------------------------------------------------------------------------- | | listMessages | List or search messages using Gmail query syntax (is:unread, from:, newer_than:, etc.) | | getMessage | Fetch a single message with decoded headers, plain-text body, HTML body, and attachment metadata | | sendEmail | Send a plain-text email. Supports cc/bcc and threaded replies via replyToMessageId | | trashMessage | Move a message to Trash (reversible, same as clicking Delete in the Gmail UI) | | modifyMessageLabels | Add or remove labels on a message — use to star, archive (remove INBOX), mark read (remove UNREAD) | | listLabels | List all system and custom labels with their IDs | | createDraft | Compose a draft instead of sending immediately — for compose/review/send workflows | | listDrafts | List existing drafts with recipient, subject, and snippet | | getDraft | Fetch a single draft with full headers and body | | updateDraft | Replace the contents of an existing draft (full replace, not patch) | | sendDraft | Send an existing draft by ID | | deleteDraft | Permanently delete a draft (not moved to Trash — gone) | | triageInbox | Composite: fetch unread messages with content + heuristic flags (newsletter, meeting, action) for one-shot inbox triage |
Google Calendar
| Tool | Description | | --------------- | -------------------------------------------------------------------------------------------------- | | listEvents | List or search events with q, timeMin, timeMax, maxResults (defaults to primary calendar) | | createEvent | Create an event with title, start/end, description, location, attendees, optional Google Meet link | | updateEvent | PATCH-style update — only the fields you pass change. Use to reschedule, retitle, change attendees | | deleteEvent | Permanently delete an event. Optional sendUpdates emails cancellations to attendees | | quickAddEvent | Natural-language event creation: "Lunch with Sarah tomorrow 12pm" — Google parses the rest |
Usage Examples
Google Docs
"Read document ABC123 as markdown"
"Append 'Meeting notes for today' to document ABC123"
"Make the text 'Important' bold and red in document ABC123"
"Replace the entire document with this markdown: # Title\n\nNew content here"
"Insert a 3x4 table at index 50 in document ABC123"
Google Sheets
"Read range A1:D10 from spreadsheet XYZ789"
"Write [[Name, Score], [Alice, 95], [Bob, 87]] to range A1 in spreadsheet XYZ789"
"Create a new spreadsheet titled 'Q1 Report'"
"Format row 1 as bold with a light blue background in spreadsheet XYZ789"
"Freeze the first row in spreadsheet XYZ789"
"Add a dropdown with options [Open, In Progress, Done] to range C2:C100"
"Create a table named 'Tasks' in range A1:D10 with columns: Task (TEXT), Status (DROPDOWN: 'Not Started','In Progress','Done'), Priority (NUMBER)"
"Add a medium solid border around A1:D10 in spreadsheet XYZ789"
"Protect the header row so collaborators can't accidentally edit it"
"Auto-fit row heights for rows 2–50 after wrapping text"
Google Drive
"List my 10 most recent Google Docs"
"Search for documents containing 'project proposal'"
"Create a folder called 'Meeting Notes' and move document ABC123 into it"
Gmail
"Show me my 20 most recent unread emails"
"Search Gmail for messages from alice@example.com in the last 7 days"
"Read the full body of message ID 18c3f4a2b1d9"
"Send an email to bob@example.com with the subject 'Weekly update' and this body..."
"Reply to message 18c3f4a2b1d9 with 'Thanks, confirmed.'"
"Star message 18c3f4a2b1d9 and archive it"
"Move message 18c3f4a2b1d9 to Trash"
"List all my Gmail labels"
"Draft a reply to that email but don't send it yet — let me review first"
"Show me my drafts, then send the one to bob@"
"Triage my unread inbox: tell me which 20 emails need attention and which are noise"
Google Calendar
"What's on my calendar this week?"
"Create an event titled 'Project review' tomorrow from 2pm to 3pm Pacific time"
"Quick add: lunch with Alex Friday 12:30"
"Reschedule event abc123 to next M
…
## Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [a-bonus](https://github.com/a-bonus)
- **Source:** [a-bonus/google-docs-mcp](https://github.com/a-bonus/google-docs-mcp)
- **License:** MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.