FastMCP server with 68 tools for Google Docs, Sheets, Drive, Gmail, and Calendar.
| Category | Count | Examples |
|---|---|---|
| Docs | 5 | readGoogleDoc, appendToGoogleDoc, insertText, deleteRange, listDocumentTabs |
| Markdown | 2 | replaceDocumentWithMarkdown, appendMarkdownToGoogleDoc |
| Formatting | 3 | applyTextStyle, applyParagraphStyle, formatMatchingText |
| Structure | 7 | insertTable, insertPageBreak, insertImageFromUrl, insertLocalImage, editTableCell, findElement, fixListFormatting* |
| Comments | 6 | listComments, getComment, addComment, replyToComment, resolveComment, deleteComment |
| Sheets | 8 | readSpreadsheet, writeSpreadsheet, appendSpreadsheetRows, clearSpreadsheetRange, createSpreadsheet, listGoogleSheets |
| Sheets Tables | 6 | createTable, listTables, getTable, deleteTable, updateTableRange, appendTableRows |
| Drive | 13 | listGoogleDocs, searchGoogleDocs, getDocumentInfo, createFolder, moveFile, copyFile, createDocument |
| Gmail | 13 | listMessages, getMessage, sendEmail, trashMessage, modifyMessageLabels, listLabels, createDraft, listDrafts, getDraft, updateDraft, sendDraft, deleteDraft, triageInbox |
| Calendar | 5 | listEvents, createEvent, updateEvent, deleteEvent, quickAddEvent |
*Not fully implemented
The server supports Google Shared Drives. All Drive file operations (files.list, files.get, files.create, files.update, files.copy, files.delete, permissions.create) use supportsAllDrives: true and includeItemsFromAllDrives: true (for list operations), enabling agents to query, create, and update documents in shared drives.
- Comment anchoring: Programmatically created comments appear in "All Comments" but aren't visibly anchored to text in the UI
- Resolved status: May not persist in Google Docs UI (Drive API limitation)
- fixListFormatting: Experimental, may not work reliably
- Gmail hard delete:
trashMessageonly moves to Trash (reversible). Permanent deletion requires the fullhttps://mail.google.com/scope, which is not requested. - Gmail attachments:
getMessageexposes attachment metadata only — no download of attachment bytes yet. - Gmail send format:
sendEmailis plain-text only. HTML bodies are delivered as literal text. - Calendar scope:
calendar.eventscovers event CRUD only. Cannot create or delete entire calendars. - Calendar recurring events:
updateEventanddeleteEventoperate on the entire series unless you target a specific instance ID fromlistEventswithsingleEvents=true.
- Document ID: Extract from URL:
docs.google.com/document/d/DOCUMENT_ID/edit - Text targeting: Use
textToFind+matchInstanceORstartIndex/endIndex - Colors: Hex format
#RRGGBBor#RGB - Alignment:
START,END,CENTER,JUSTIFIED(not LEFT/RIGHT) - Indices: 1-based, ranges are [start, end)
- Tabs: Optional
tabIdparameter (defaults to first tab)
- Retrieve: Use
readGoogleDocwithformat='markdown'to get document content as markdown - Edit: Modify markdown locally using your preferred editor
- Apply: Use
replaceDocumentWithMarkdownorappendMarkdownToGoogleDocto write changes back
- Headings:
# H1through###### H6 - Bold:
**bold**or__bold__ - Italic:
*italic*or_italic_ - Strikethrough:
~~strikethrough~~ - Links:
[text](url) - Lists: Bullet (
-,*) and numbered (1.,2.) - Code blocks: Fenced code blocks (
```) rendered as styled 1x1 tables (matching Google Docs' native Code Block building block) - Inline code: Backtick code rendered with monospace font + green color + gray background
- Nested formatting:
***bold italic***,**bold [link](url)**
Replaces entire document content with markdown-formatted content.
Parameters:
documentId: The document IDmarkdown: The markdown content to applypreserveTitle(optional): If true, preserves the first heading/titlefirstHeadingAsTitle(optional, default: false): If true, the first# H1is styled as a Google Docs Title instead of Heading 1tabId(optional): Target a specific tab
Example:
# My Document
This is **bold** text with a [link](https://example.com).
- List item 1
- List item 2
- Nested item
## Section 2
More content with _italic_ and ~~strikethrough~~.Appends markdown content to the end of a document with full formatting.
Parameters:
documentId: The document IDmarkdown: The markdown content to appendaddNewlineIfNeeded(optional, default: true): Add spacing before appended contentfirstHeadingAsTitle(optional, default: false): If true, the first# H1is styled as a Google Docs Title instead of Heading 1tabId(optional): Target a specific tab
- Tables not yet supported in markdown-to-docs conversion
- Images not yet supported in markdown-to-docs conversion
- Complex nested lists (3+ levels) may have formatting quirks
- Maximum practical document size: ~10,000 words (due to Google Docs API batch limits)
| File | Contains |
|---|---|
src/types.ts |
Zod schemas, hex color validation, style parameter definitions |
src/googleDocsApiHelpers.ts |
findTextRange, executeBatchUpdate, executeBatchUpdateWithSplitting, style request builders |
src/googleSheetsApiHelpers.ts |
A1 notation parsing, range operations |
src/markdownParser.ts |
Markdown-it configuration, markdown parsing utilities |
src/markdownToGoogleDocs.ts |
Markdown-to-Google-Docs conversion logic |
src/index.ts |
Entry point, CLI handling, and MCP server startup |
README.md- Setup instructions and usage examplesSAMPLE_TASKS.md- 15 example workflows