# io.github.mmedum/google-docs-mcp (mcpb · google-docs-mcp_3.0.0.mcpb)

Google Docs as MCP tools: read, edit, suggest and comment on documents.

- Trust score: 57/100 (low)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-23

## Components

- mcpb · `google-docs-mcp_3.0.0.mcpb`: 57/100 (this document), [markdown](https://verifymcp.io/servers/mmedum-google-docs-mcp/https-github-com-mmedum-google-docs-mcp-releases-download-v1-4-1-google-docs-mcp.md), [page](https://verifymcp.io/servers/mmedum-google-docs-mcp/https-github-com-mmedum-google-docs-mcp-releases-download-v1-4-1-google-docs-mcp)

## Channel facts

- Registry: `mcpb`
- Package: `https://github.com/mmedum/google-docs-mcp/releases/download/v3.0.0/google-docs-mcp_3.0.0.mcpb`
- Version: `3.0.0`
- Transport: `stdio`
- SHA-256: `8621433c5e6122e1a8ce7041adf1499a782ea983d3d89bd444171cf9ea70fe86`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-23.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to mmedum/google-docs-mcp).
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 0 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 58/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 6326 tokens (~301/item across 21 items; 21 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 64/100
  - Stability check failed: the tool surface changed between 2.1.1 and 3.0.0: 0 tool removals, 1 breaking changes, 1 additions.
- **Tool Coverage**: 98/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 91% of tool parameters carry a description.
  - Structured output schemas are declared (52% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 21 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 22 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the io.github.mmedum/google-docs-mcp server?

io.github.mmedum/google-docs-mcp ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, 8621433c5e6122e1a8ce7041adf1499a782ea983d3d89bd444171cf9ea70fe86; the commands to do that are on this page. If it does not match, do not open it.

- Download bundle: `https://github.com/mmedum/google-docs-mcp/releases/download/v3.0.0/google-docs-mcp_3.0.0.mcpb`
- SHA-256: `8621433c5e6122e1a8ce7041adf1499a782ea983d3d89bd444171cf9ea70fe86`

### Verify on macOS / Linux

```bash
echo "8621433c5e6122e1a8ce7041adf1499a782ea983d3d89bd444171cf9ea70fe86  google-docs-mcp_3.0.0.mcpb" | shasum -a 256 -c
```

### Verify on Windows (PowerShell)

```powershell
(Get-FileHash -Algorithm SHA256 .\google-docs-mcp_3.0.0.mcpb).Hash -eq "8621433c5e6122e1a8ce7041adf1499a782ea983d3d89bd444171cf9ea70fe86"
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-23 (score 57, 0)

- [security regression] Stability: 0.63 → fail
- [functional] Package version: 2.4.0 → 3.0.0

### 2026-10-22 (score 57, 0)

- [security regression] Stability: 0.60 → unverified
- [security regression] Tool safety: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional] Package version: 2.3.1 → 2.4.0

### 2026-10-21 (score 57, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-19 (score 56, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-17 (score 55, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-15 (score 54, +34)

- [security improvement] Injection markers: unverified → pass
- [functional regression] Schema quality: 262 → 306
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Stability: unverified → 0.40
- [functional] Schema quality: excellent → good

### 2026-10-14 (score 20, 0)

- [security improvement] Injection markers: unverified → pass
- [functional improvement] Stability: unverified → 0.37
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional] Package version: 2.1.1 → 2.3.1
- [functional] Package version: 2.2.0 → 2.3.0
- [functional] Package version: 2.1.1 → 2.2.0

### 2026-10-13 (score 20, 0)

- [functional] Package version: 2.1.1 → 2.2.0

## MCP tools (21)

### `add_comment` (~275 tokens)

Post a comment on a Google Doc. With a target (exact text, heading_id, handle or cell) the comment is pinned to that passage; if Google refuses the comments view for the document it quotes the text instead and the editor shows it unanchored, which the result says. Without a target it is a comment on the document as a whole. Nothing in the document text changes. To propose an edit as a comment, use edit_document with mode comment. On a Markdown file (.md) the comment is written into the file under the signed-in account's name, the way the Docs editor writes its own, and needs a target. dry_run resolves the target and stops before posting.

Input parameters:

- `assignee` (string): email address to assign the comment to (pinned comments only)
- `content` (string, required): the comment text (plain text, up to 2048 bytes)
- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `dry_run` (boolean): resolve the target and stop before posting
- `expect_revision` (string): fail if the document is no longer at this revision id
- `target` (null|object): the text, section, block or cell to comment on; omit for a comment on the document as a whole

Output parameters:

- `anchored` (boolean)
- `dry_run` (boolean)
- `handle` (string)
- `id` (string)
- `quote` (string)
- `revision_id` (string)
- `warnings` (null|array)

### `create_document` (~250 tokens)

Create a new Google Doc in the signed-in account's Drive, optionally with initial content written as markdown (headings, formatting, lists, tables, images). Returns the id and URL. Initial content is written directly because a new document has nothing to suggest against. With kind markdown_file it makes a Markdown file (.md) instead, holding the content as written; such a file is edited as text. With from_file it makes a working copy of a Markdown file: a Google Doc holding its text, for working in together live with every write mode, which write_markdown_file writes back into the file.

Input parameters:

- `content` (string): initial content as markdown, tables and images included
- `content_format` (string): markdown (default) or text
- `from_file` (string): a Markdown file (id or drive.google.com URL) to make a working copy of: a Google Doc holding its text; title then defaults to the file's
- `kind` (string): document (default: a Google Doc) or markdown_file (a .md file in Drive that Docs opens in place, holding content exactly as given)
- `title` (string): document title; required unless from_file

Output parameters:

- `id` (string)
- `kind` (string)
- `revision_id` (string)
- `title` (string)
- `url` (string)
- `warnings` (null|array)

### `diff_revisions` (~179 tokens)

Show what changed between two revisions of a Google Doc as a unified diff of Google's markdown (or plain text) export, with line counts per hunk. Pass from (older) and optionally to (newer, default current). Use list_revisions to pick ids.

Input parameters:

- `context` (integer): unchanged lines shown around each change; default 2
- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `format` (string): md (default) or txt: which export to compare
- `from` (string, required): the older revision id from list_revisions
- `max_chars` (integer): output budget in characters, cut at a hunk boundary; default 20000
- `to` (string): the newer revision id from list_revisions; default the current content

### `edit_document` (~658 tokens)

Change the text of a Google Doc with one batch of operations. Address content by exact text (quoted from a read), by heading_id or heading (a whole section), by block handle, or by cell; never by position numbers. Ops: insert (at a location), append (end of body), replace (minimal diff, so untouched words keep their formatting and comments), delete, replace_all (find/replace in one tab, by text or regex), insert_break (page break), insert_footnote, create_header, create_footer, delete_header, delete_footer (target: tab and segment), and the named-range ops: create_named_range names a target so later calls can find it again after edits move it, where a handle is only valid for the revision it came from; replace_named_range writes plain text over it; delete_named_range forgets the name and leaves the text. Content is markdown. A table or image in it is placed by later batches once the text has landed, so a failure there leaves the text written and says so. mode chooses how the change lands: suggest = tracked change for a person to accept, direct = edit the text, comment = post each proposed change as a comment and change nothing. Direct edits refuse to delete ranges holding comments, suggestions, images or footnotes unless force is set. Use dry_run to preview the plan. Returns the new revision id, suggestion or comment ids, and a rendered preview of the edited region. On a Markdown file (.md) the ops are insert, append, replace, delete and replace_all, content is written as the file's own markdown, mode is direct or comment (no suggestions), the comments Docs keeps in the file are never touched, and the whole file is uploaded once per call, which makes an editor that has it open reload; the write waits for, then refuses, changes made there and not saved yet. To work in one together live, use a working copy (create_document from_file). On a Word file (.docx) the same ops write its body's text into the file, addressed as on a Google Doc, a suggestion as a tracked chang…

Input parameters:

- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `dry_run` (boolean): resolve and plan everything, show the exact requests and the current text of the region, but send nothing
- `expect_revision` (string): fail if the document is no longer at this revision id
- `force` (boolean): direct mode only: allow deleting ranges that hold comment anchors, pending suggestions, images or footnotes; ask the person first
- `mode` (string): suggest (tracked changes a person accepts), direct (edit the text), or comment (post each change as a comment on the passage, changing nothing); default from get_document capabilities
- `ops` (null|array, required): operations sent together in one batch; the content of a new header, footer or footnote and the tables and images of content follow in later batches. Targets are resolved against the document as it is…

Output parameters:

- `changes` (null|array)
- `comment_ids` (null|array)
- `dry_run` (boolean)
- `followups` (null|array)
- `mode` (string)
- `ops_applied` (integer)
- `preview` (string)
- `request_kinds` (null|array)
- `revision_id` (string)
- `suggestion_ids` (null|array)
- `warnings` (null|array)

### `edit_table` (~346 tokens)

Create and change tables in a Google Doc. Ops: insert_table (rows, columns, optional data grid, at a location), set_cells (write cells by name or as a grid from start_cell; each cell is replaced by minimal diff), insert_rows, delete_rows, insert_columns, delete_columns, merge_cells, unmerge_cells, style_cells (background, vertical alignment, padding), style_columns (fixed width in points, or share the width evenly), style_rows (least height, keep a row off a page break), pin_header_rows (repeat the first n rows on every page). Tables are named by handle (tbl1) from a read with with_handles; cells as r2c3. Text inside cells can also be edited with edit_document (target cell) and styled with format_document. Same mode, dry_run, expect_revision and force semantics as edit_document; deleting rows or columns that hold comments or suggestions is refused in direct mode unless forced.

Input parameters:

- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `dry_run` (boolean)
- `expect_revision` (string)
- `force` (boolean): direct mode only: allow deleting rows or columns that hold comments, suggestions, images or footnotes
- `mode` (string): suggest, direct or comment; default from get_document capabilities
- `ops` (null|array, required): operations applied in order; after an op changes a table's grid (rows, columns, merges) the ops that follow it on that table are applied in a batch of their own, so their row, column and cell numbers…

Output parameters:

- `changes` (null|array)
- `comment_ids` (null|array)
- `dry_run` (boolean)
- `followups` (null|array)
- `mode` (string)
- `ops_applied` (integer)
- `preview` (string)
- `request_kinds` (null|array)
- `revision_id` (string)
- `suggestion_ids` (null|array)
- `warnings` (null|array)

### `export_document` (~169 tokens)

Export a Google Doc through Google's converters. md, txt and html come back inline (budgeted by max_chars); pdf, docx, odt, rtf and epub are written as new files under the server's export directory, never over a file already there, and the path is returned. The markdown export is Google's own rendering, useful for a faithful whole-document dump; read_document is better for working with sections.

Input parameters:

- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `format` (string, required): md, txt or html (returned inline); pdf, docx, odt, rtf or epub (written under GDOCS_EXPORT_DIR)
- `max_chars` (integer): inline formats: character budget, default 20000

### `find_in_document` (~206 tokens)

Find text or a regular expression in a Google Doc and return every match with its block handle, offset and surrounding context. Use it to locate passages before targeting them with edit_document (quote the matched text as the target) and to check how many times a phrase occurs.

Input parameters:

- `context` (integer): characters of context on each side; default 60
- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `limit` (integer): maximum matches to return; default 50
- `match_case` (boolean): match case exactly; default case-insensitive
- `query` (string, required): text to find (normalized exact match) or a regular expression when regex is true
- `regex` (boolean): treat query as an RE2 regular expression
- `segment` (string): body (default), header, footer or footnote
- `tab` (string): tab id, title or number; default the first tab

### `format_document` (~209 tokens)

Change formatting in a Google Doc without changing its text: text_style (bold, italic, underline, strikethrough, small caps, font, size, color, highlight, link, superscript), paragraph_style (named style such as HEADING_2 or NORMAL_TEXT, alignment, line spacing, spacing, indents), bullets (bullet, numbered, checkbox, or none), and clear_formatting. Targets work as in edit_document. This styles the passages you target: to restyle every paragraph carrying a style at once, and everything written with it later, redefine the style itself with layout_document's named_style op. Same mode, dry_run and expect_revision semantics.

Input parameters:

- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `dry_run` (boolean)
- `expect_revision` (string)
- `mode` (string): suggest, direct or comment; default from get_document capabilities
- `ops` (null|array, required)

Output parameters:

- `changes` (null|array)
- `comment_ids` (null|array)
- `dry_run` (boolean)
- `followups` (null|array)
- `mode` (string)
- `ops_applied` (integer)
- `preview` (string)
- `request_kinds` (null|array)
- `revision_id` (string)
- `suggestion_ids` (null|array)
- `warnings` (null|array)

### `get_document` (~236 tokens)

Get metadata and structure counts for a Google Doc: title, tabs, the current revision id, owner, last modification, paragraph and word counts, pending suggestion count, and this server's capabilities (whether suggestion mode is available, the default write mode, read-only). Per tab it also reports what no read of the text shows: page setup, floating images, named ranges, and the named style definitions the tab's paragraphs carry (the font, size, color and spacing every heading or body paragraph inherits, with how many paragraphs of that tab carry each, headers and footnotes included; layout_document's named_style op redefines those definitions). kind says whether it is a Google Doc, a Markdown file (.md) that Docs opens in place, which is read and written as its own text, or a Word file (.docx), read like a Google Doc and written into the file itself. Cheap; call it first when handed a document id or URL. Then use get_outline for the heading tree and read_document for content.

Input parameters:

- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL

### `get_outline` (~137 tokens)

Return the heading tree of a Google Doc per tab: each heading's stable heading_id, block handle, level, text, and the size of its section in blocks and words, plus per-tab counts of paragraphs, tables, headers, footers and footnotes. Use it to pick a section to read with read_document (pass heading_id) instead of reading a long document whole, and to learn block handles. Cheap.

Input parameters:

- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `tab` (string): tab id, title or number to limit the outline to; default all tabs

### `insert_object` (~683 tokens)

Insert, replace or delete a non-text object in a Google Doc. action insert (default) adds an image from a public URL (optionally sized in points), a person chip (email), a rich-link chip to a Google resource (Drive file, Calendar event, YouTube video), or a date chip at a location; objects go inline in a paragraph, so use edit_document for the surrounding text. action replace swaps an existing image's source while it keeps its place and size (crop center-crops the new image instead of resizing the frame). action delete removes an object, including a floating image, which no text range covers and no edit_document delete can reach. Both name the object by the id a read shows, like kix.img1. Same mode, dry_run, expect_revision and force semantics as edit_document; deleting an inline object that also carries a comment or a suggestion is refused in direct mode unless forced. Suggestion mode tracks the insertion.

Input parameters:

- `action` (string): insert (default), replace to swap an image's source in place, or delete to remove an object
- `crop` (boolean): replace: center-crop the new image into the old one's frame instead of resizing the frame to it
- `date` (string): date: the date as YYYY-MM-DD or an RFC 3339 timestamp
- `date_format` (string): date: iso (2026-09-03), full (September 3, 2026), abbreviated (Sep 3, 2026, default), or month_day (Sep 3)
- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `dry_run` (boolean)
- `email` (string): person: the email address of the person chip
- `expect_revision` (string)
- `force` (boolean): delete in direct mode: remove an inline object even though a comment or suggestion sits on it; ask the person first
- `height_pt` (number): image: height in points
- `kind` (string): insert: image, person, rich_link, or date
- `location` (object): insert: where the object goes — after or before a block, start or end of a paragraph, or end of the body
- `mode` (string): suggest, direct or comment; default from get_document capabilities
- `name` (string): person: display name shown on the chip
- `object` (string): replace and delete: the object's id as a read shows it, e.g. kix.img1
- `tab` (string): replace and delete: tab id, title or number; default the first tab
- `time_zone` (string): date: IANA time zone id such as Europe/Copenhagen; default UTC
- `title` (string): rich_link: display title (Google fills it from the resource when omitted)
- `url` (string): image: a publicly fetchable PNG, JPEG or GIF URL (under 50 MB, 25 megapixels); rich_link: the URL of a Google Drive file, Calendar event or YouTube video
- `width_pt` (number): image: width in points; with only one dimension the aspect ratio is kept
- `with_time` (boolean): date: also show the time

Output parameters:

- `changes` (null|array)
- `comment_ids` (null|array)
- `dry_run` (boolean)
- `followups` (null|array)
- `mode` (string)
- `ops_applied` (integer)
- `preview` (string)
- `request_kinds` (null|array)
- `revision_id` (string)
- `suggestion_ids` (null|array)
- `warnings` (null|array)

### `layout_document` (~293 tokens)

Change how a Google Doc is laid out rather than what it says. Ops: page (page size, margins, background color, landscape, where page numbering starts, whether the first and even pages get their own header and footer, pageless), section (the same for one section, plus 1-3 columns with an optional separating line and the gap between them), section_break (start a new section at a location, continuous or on the next page), and named_style (redefine NORMAL_TEXT, TITLE, SUBTITLE or HEADING_1 … HEADING_6 for the whole tab, which restyles every paragraph carrying that style and everything written with it later; get_document reports the definition of each style the tab's paragraphs currently carry, so read it first to see what one looks like today). Lengths are in points: 72 to the inch, so US Letter is 612×792 and A4 is 595×842. Use format_document instead to style one passage. Same mode, dry_run and expect_revision semantics as edit_document.

Input parameters:

- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `dry_run` (boolean)
- `expect_revision` (string)
- `mode` (string): suggest, direct or comment; default from get_document capabilities
- `ops` (null|array, required): operations applied together as one atomic batch

Output parameters:

- `changes` (null|array)
- `comment_ids` (null|array)
- `dry_run` (boolean)
- `followups` (null|array)
- `mode` (string)
- `ops_applied` (integer)
- `preview` (string)
- `request_kinds` (null|array)
- `revision_id` (string)
- `suggestion_ids` (null|array)
- `warnings` (null|array)

### `list_comments` (~195 tokens)

List the comment threads of a Google Doc with their full history: author, time, quoted text, the block handle the comment sits on, resolved state, who it is assigned to, and every reply (including resolve and reopen actions). Resolved threads are included unless hide_resolved is set; deleted ones only with include_deleted. Thread ids feed reply_comment and delete_comment. On a Markdown file (.md) the comments made in the Docs editor live in the file, the line they sit on is shown as [L12], and the id of one written by this server changes each time the file is written until a person saves it in the editor.

Input parameters:

- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `hide_resolved` (boolean): leave out resolved threads; default shows them
- `include_deleted` (boolean): also list deleted threads (their text is gone)

### `list_revisions` (~115 tokens)

List a Google Doc's version history, newest first: revision id, time and who changed it. These ids feed diff_revisions and read_document's revision parameter; they are Drive revision ids, not the revision_id that reads and writes return for concurrency control. Drive may omit older revisions of busy documents.

Input parameters:

- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `limit` (integer): how many of the newest revisions to return; default 20, max 200

### `list_suggestions` (~129 tokens)

List pending suggested edits (tracked changes) in a Google Doc: id, kind (insert, delete, replace, structure, format), the inserted, deleted and restyled text, the block handle, and, where Google includes them, the author and status, and the replies on its thread. A format suggestion changes only formatting and says what it restyles, as "text: bold" or "paragraph: alignment". Ids feed review_suggestion, and reply_comment with suggestion_id.

Input parameters:

- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL

### `manage_tabs` (~237 tokens)

Add, rename or move a tab of a Google Doc. add takes a title, optional position, parent tab, emoji and initial markdown content; rename changes the title or emoji; move changes the position among siblings or nests the tab under a parent. Tab changes are always direct edits (the API cannot suggest them). Other tools address tabs by id, title or number; get_document lists them.

Input parameters:

- `action` (string, required): add, rename, or move
- `content` (string): add: initial content as markdown
- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `emoji` (string): add, rename: a single emoji as the tab icon
- `expect_revision` (string)
- `parent` (string): add, move: nest under this tab (id, title or number)
- `position` (integer): add, move: 1-based position among its sibling tabs
- `tab` (string): rename, move: the tab to change, by id, title or number
- `title` (string): add, rename: the tab title

Output parameters:

- `action` (string)
- `dry_run` (boolean)
- `revision_id` (string)
- `tab_id` (string)
- `title` (string)
- `warnings` (null|array)

### `read_document` (~748 tokens)

Read part or all of a Google Doc as markdown (default), plain text, or raw Docs API JSON. Scope it to one section with heading_id (from get_outline) or heading text, to a block range with from_handle/to_handle, to another tab with tab, or to a header, footer or footnote with segment; with no scope it reads the whole body of the first tab. Output is budgeted by max_chars (default 20000 characters); when truncated the result carries continue_from to pass back. Block handles ([p12]) and heading ids come with the text unless with_handles is false; with_styles adds formatting markdown cannot show, include_suggestions shows pending suggested edits inline as {++inserted++} / {--deleted--}, with a formatting-only suggestion as {==highlighted==} because it adds and removes nothing, and include_comments marks commented passages with {>>c:id<<} and lists those threads below. Empty paragraphs are kept so structure is faithful. Handles are valid for the revision_id returned. A Markdown file (.md) reads as its own text, without handles: scope it by heading_id or heading, and a truncated read continues from a line (continue_from L120).

Input parameters:

- `continue_from` (string): the continue_from handle returned by a truncated read; resumes there
- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `format` (string): markdown (default), text, or raw (Docs API JSON for the scoped blocks)
- `from_handle` (string): first block handle of a range, e.g. p12 (from get_outline or a read with with_handles)
- `heading` (string): read one section by its heading text (whole heading, case-insensitive)
- `heading_id` (string): read one section by its stable heading id from get_outline; overrides tab and segment
- `heading_level` (integer): only match headings of this level (1-6) when using heading
- `include_comments` (boolean): mark commented passages with {>>c:<comment id><<} right after the text they cover and list those threads below the content
- `include_suggestions` (boolean): show pending suggested edits as CriticMarkup: {++inserted++}, {--deleted--} and {==restyled==} for a formatting-only suggestion, each followed by {>>s:<suggestion id><<}; default shows the committed…
- `max_chars` (integer): output budget in characters, cut at a block boundary; default 20000, maximum 400000
- `occurrence` (integer): which match to use when the heading text repeats, 1-based
- `revision` (string): read an old revision by its id from list_revisions: Google's markdown or text export of the whole document at that time, with no handles or scoping
- `segment` (string): body (default), header, footer or footnote, optionally numbered (header2, footnote3)
- `tab` (string): tab id, title or number; default the first tab
- `to_handle` (string): last block handle of the range, inclusive
- `with_handles` (null|boolean): prefix every block with its handle like [p12] and headings with {heading_id}; on by default because handles are what an edit targets; pass false to save about 15% of the tokens
- `with_styles` (boolean): annotate fonts, sizes, colors, underline and alignment that markdown cannot express, e.g. {font: Arial 11pt, color: #c00}

### `reply_comment` (~271 tokens)

Reply to a comment thread, resolve it, reopen it, or rewrite what it says. Resolving and reopening are reversible; both may carry a message. action edit replaces the text of the thread's own comment, or of one reply when reply_id names it; Google allows only the author of a comment to rewrite it. Thread and reply ids come from list_comments. With suggestion_id instead of comment_id it replies on a suggested edit's thread; accepting or rejecting one is review_suggestion. On a Markdown file (.md) a comment the Docs editor keeps takes replies only, written into the file; the person resolves it in the editor.

Input parameters:

- `action` (string): reply (default), resolve, reopen, or edit
- `comment_id` (string): thread id from list_comments or add_comment; pass this or suggestion_id
- `content` (string): reply text; required for a plain reply and for edit, optional with resolve or reopen
- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `reply_id` (string): edit: the reply to rewrite; without it the thread's own comment is rewritten
- `suggestion_id` (string): reply on a suggestion's thread instead; id from list_suggestions. Plain replies only

Output parameters:

- `action` (string)
- `comment_id` (string)
- `reply_id` (string)
- `resolved` (boolean)
- `suggestion_id` (string)

### `review_suggestion` (~169 tokens)

Accept, reject or discard pending suggested edits, each named by its id from list_suggestions. Accepting applies the suggested text; rejecting declines it, which any editor may do; discarding removes the suggestion outright, which Google allows only its author. Pass expect_revision to refuse if the document changed since the list was read. dry_run resolves the suggestions and stops before the write.

Input parameters:

- `action` (string, required): accept, reject, or discard (author only)
- `document` (string, required): document id, or any docs.google.com URL or drive.google.com file URL
- `dry_run` (boolean): resolve the suggestions and stop before the write
- `expect_revision` (string)
- `ids` (null|array, required): the suggestions to review, each by its id from list_suggestions

Output parameters:

- `action` (string)
- `dry_run` (boolean)
- `ids` (null|array)
- `remaining` (integer)
- `revision_id` (string)

### `search_documents` (~193 tokens)

Locate Google Docs the signed-in account can open, by words in the title or the text, optionally limited by owner or modification date, newest first. Returns ids and URLs to pass to the other tools. With no filters it lists recently modified documents. Markdown files (.md) are found with kind markdown_file or any.

Input parameters:

- `kind` (string): document (the default: Google Docs), markdown_file (.md files Docs opens in place), or any
- `limit` (integer): page size, default 20, max 100
- `modified_after` (string): only documents modified after this date (YYYY-MM-DD or RFC 3339)
- `owner` (string): owner email address
- `page_token` (string): next_page_token from a previous result
- `query` (string): words that must appear in the document text
- `title` (string): words that must appear in the title

### `write_markdown_file` (~255 tokens)

Write a working copy back into the Markdown file it was made from (create_document from_file makes one). Only what changed in the copy is carried over, block by block; the rest of the file keeps its own Markdown, its front matter and the comments Docs keeps in it. A change to a block that was also changed in the file since the copy was made is a conflict and is refused, unless force keeps the file's version of those and writes the rest. edit_document's guard applies, and a write waits for, then refuses, changes made in the Docs editor on the file and not saved yet, forced or not: that work is in no revision yet. dry_run shows the diff.

Input parameters:

- `document` (string, required): the working copy: the Google Doc create_document from_file made
- `dry_run` (boolean): plan and show the diff, write nothing
- `file` (string): the Markdown file to write into, when it is not the one the copy was made from
- `force` (boolean): write past conflicts (the file's version of those blocks is kept) and the guard; only when the person chose to. Changes in the Docs editor not saved yet are never written past

Output parameters:

- `changes` (null|array)
- `comment_ids` (null|array)
- `dry_run` (boolean)
- `followups` (null|array)
- `mode` (string)
- `ops_applied` (integer)
- `preview` (string)
- `request_kinds` (null|array)
- `revision_id` (string)
- `suggestion_ids` (null|array)
- `warnings` (null|array)

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/mmedum-google-docs-mcp/https-github-com-mmedum-google-docs-mcp-releases-download-v1-4-1-google-docs-mcp#diagnostics

## Score history

- 2026-10-23: 57
- 2026-10-22: 57
- 2026-10-21: 57
- 2026-10-20: 56
- 2026-10-19: 56
- 2026-10-18: 55
- 2026-10-17: 55
- 2026-10-16: 54
- 2026-10-15: 54
- 2026-10-14: 20
- 2026-10-13: 20
- 2026-10-12: 20
- 2026-10-11: 9
- 2026-10-07: 50
- 2026-10-04: 50
- 2026-10-03: 50
- 2026-10-02: 20
- 2026-10-01: 20
- 2026-09-30: 20
- 2026-09-29: 20
- 2026-09-28: 20
- 2026-09-27: 10
- 2026-09-26: 10

## Common questions

### What is the io.github.mmedum/google-docs-mcp server?

io.github.mmedum/google-docs-mcp is listed in the public MCP registry as io.github.mmedum/google-docs-mcp. Google Docs as MCP tools: read, edit, suggest and comment on documents. This page covers its MCPB bundle (https://github.com/mmedum/google-docs-mcp/releases/download/v3.0.0/google-docs-mcp_3.0.0.mcpb).

### Is the io.github.mmedum/google-docs-mcp server safe to use?

io.github.mmedum/google-docs-mcp scores 57 out of 100 on VerifyMCP. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.github.mmedum/google-docs-mcp server expose?

io.github.mmedum/google-docs-mcp exposes 21 tools: add_comment, create_document, diff_revisions, edit_document, edit_table, and 16 more. Their descriptions and schemas cost roughly 5,953 tokens of context every time the server is loaded.

### What licence is the io.github.mmedum/google-docs-mcp server under?

io.github.mmedum/google-docs-mcp declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- Repository: https://github.com/mmedum/google-docs-mcp
- Changelog RSS feed: https://verifymcp.io/servers/mmedum-google-docs-mcp/https-github-com-mmedum-google-docs-mcp-releases-download-v1-4-1-google-docs-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/mmedum-google-docs-mcp/https-github-com-mmedum-google-docs-mcp-releases-download-v1-4-1-google-docs-mcp.json
- HTML version of this page: https://verifymcp.io/servers/mmedum-google-docs-mcp/https-github-com-mmedum-google-docs-mcp-releases-download-v1-4-1-google-docs-mcp
