gdocs-mcp
This server lets an AI agent work with Google Docs like local files, supporting reading, editing, styling, and managing documents, suggestions, comments, tabs, sharing, and Drive folders across multiple Google accounts.
Document content & structure
Read a Google Doc as markdown + inline HTML, with modes for clean, tracked (
<ins>/<del>), accepted, or rejected changes, and selectable segments (body, header, footer).Edit content by replacing unique text snippets; overwrite an entire doc/tab body; insert content at top, end, or after an anchor.
Create new docs from markdown, rename/move, copy, and export to PDF, DOCX, ODT, RTF, TXT, HTML, EPUB, MD.
Styling & layout
Style text (bold, italic, underline, strikethrough, color, font size/family, link, alignment, paragraph spacing) for selections or whole documents/tabs.
Read computed style; get/set page setup (margins, page size, orientation).
Tables & images
Insert tables with data, column widths, header shading; edit rows/columns; style and inspect tables.
Insert images from URL or local file with sizing/alignment; download embedded images locally.
Suggestions & comments
List pending suggestions as before→after diffs; accept/reject one or more atomically.
List, add, reply to, resolve, or reopen comments.
Tabs
List, add, rename, delete tabs; most content tools can target a specific tab.
Drive, sharing & configuration
List folders, search Drive, create folders.
List permissions, share with people or via link, revoke access.
List authorized accounts; set/get project defaults for account/folder.
Allows treating Google Docs like local files, with capabilities for reading, editing, managing suggestions and comments, handling tabs, and sharing documents.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@gdocs-mcpshow suggestions on the project proposal"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@dasasian/gdocs-mcp
An MCP server that lets an AI agent (like Claude Code) treat a Google Doc like a local file — read it, edit it by content, review and resolve suggestions, manage comments, and work across tabs and multiple Google accounts.
Status: beta. The tool surface is complete and every change is verified against the live API, not just unit tests. Markdown code blocks are the one construct still to render (see Roadmap).
Why this exists
Most Google Docs MCP servers treat a doc as flat text. This one fills the gap nobody else does:
Suggestions as diffs you can act on.
list_suggestionsshows pending tracked-changes asbefore → after;apply_suggestionsaccepts/rejects one or more cleanly.read_doccan render them inline as<ins>/<del>.File-like editing.
edit_docmatches a unique snippet of text (like a localEdit) and rewrites it — indices are never exposed.Comments. Read threads (author, quoted text, replies, resolved status), reply, resolve, add.
Tabs as sub-files. Full create/rename/delete, and every read/edit tool can target a specific tab.
Multiple accounts. Authorize several Google accounts; pick a default per project.
Related MCP server: LLM2Docs (Unofficial)
What you can ask for
You don't call tools. You ask in plain language and the agent drives them.
Fill a template without rebuilding it
"Copy the Proposal Template into /Clients/Acme, name it 'Acme Q3 Proposal', then fill in the client name, the dates, and the pricing table."
The copy keeps the letterhead, the logo at its exact size, the fonts and the page setup — everything a markdown round-trip cannot rebuild. Then only the words that change are edited. The alternative is retyping a document you already have.
A whole review pass in one instruction
"Show me the pending suggestions as a diff, accept the typo fixes, reject anything that changes meaning, then reply to the open comments and resolve the ones that are settled."
Four tools, one sentence, and the judgement in the middle is the part you wanted help with. Most Docs integrations cannot see tracked changes at all, let alone act on them safely.
More: publishing a folder of markdown as a Drive tree, auditing many docs for style drift, pulling a doc back into your repo with its images → docs/recipes.md.
Install
npm install -g @dasasian/gdocs-mcpOr from source:
git clone https://github.com/dasasian/gdocs-mcp && cd gdocs-mcp
npm install && npm run build
npm link # makes `gdocs-mcp` available globally, same as the published packageThen follow the setup below exactly as an installed user would. (npm link symlinks the
gdocs-mcp binary to your build; see CONTRIBUTING.md for the dev workflow.)
Setup
You need a Google Cloud OAuth client (one-time). Each user creates their own — this keeps your credentials yours and avoids Google app-verification for the restricted Drive scope.
Create a project + enable APIs (or use the setup guide):
gcloud projects create my-gdocs-mcp gcloud config set project my-gdocs-mcp gcloud services enable docs.googleapis.com drive.googleapis.comOAuth consent screen (Cloud Console → APIs & Services → OAuth consent screen): User type External, add yourself as a Test user. For long-lived tokens, set publishing status to In production (avoids the 7-day refresh-token expiry).
OAuth client → Create credentials → OAuth client ID → Desktop app. Download the JSON and save it as
~/.config/gdocs-mcp/client_secret.json.Authorize an account (opens a browser):
gdocs-mcp add-accountRepeat for each Google account you want to use.
Configure your MCP client
In a project's .mcp.json (Claude Code) or equivalent:
{
"mcpServers": {
"gdocs": {
"command": "gdocs-mcp",
"env": { "GDOCS_DEFAULT_ACCOUNT": "you@example.com" }
}
}
}GDOCS_DEFAULT_ACCOUNT sets which authorized account this project uses by default — so a work project and a personal project can point at different accounts without re-authorizing. Any tool call can override it with an account argument.
Prefer it available in every project? Register once at user scope: claude mcp add gdocs -s user -e GDOCS_DEFAULT_ACCOUNT=you@example.com -- gdocs-mcp. Then a project can pin its own defaults with a .gdocs-mcp.json — both the account and a default folder for new docs:
{ "account": "work@company.com", "folder": "https://drive.google.com/drive/folders/…" }With a folder set, create_doc files new docs there automatically (an explicit folder argument still overrides). See docs/setup.md for the full resolution order.
You don't have to edit that file by hand — just tell the agent "make damithsc@gmail.com my default account for this project" or "make my Manuscripts folder the default here," and it writes the .gdocs-mcp.json for you via set_project_default (searching for the folder by name if needed).
Tools
The table below is the reference. For what to actually ask for, see What you can ask for above, or the full set in docs/recipes.md.
Tool | Description |
| Read as markdown + inline HTML — text color/size/font come back as |
| Replace a unique text snippet (string-anchored, markup-tolerant; new text supports inline markdown) |
| Style existing text in place — like selecting in Docs and applying formatting: a |
| Read / set document-level page setup: margins, page size (preset or explicit), orientation (File > Page setup) |
| Read the computed (inherited-resolved) style at a text anchor — paragraph spacing, alignment, fonts, colors that markdown can't show (read counterpart to |
| Replace a doc/tab body with markdown-rendered content — guarded against orphaning comments/suggestions |
| Insert new markdown content at a position — |
| Export a doc to a local file — pdf (default), docx, odt, rtf, txt, html, epub, md (rendered server-side by Google) |
| Create a doc from markdown, optionally in a folder |
| Pending suggestions as |
| Accept or reject one or more suggestions atomically — required for overlapping/adjacent "clusters"; |
| Insert an inline image from a URL or a local file — position, size, left/center/right align. |
| Download a doc’s embedded images to a local folder (pairs with |
| Insert a rows×columns table — data fill (cells accept inline markdown), per-column |
| Table structure ops — insert/delete a row or column (surgical — locate the table by cell text); |
| Style an existing table (located by cell text): cell padding, background, cell borders ( |
| Read a table's style (located by cell text): column widths, pinned header rows, and the matched cell's padding, background and per-side borders — the read counterpart to |
| Comment threads ( |
| Tab structure |
| Drive as a filesystem: |
| Sharing ( |
| Authorized Google accounts |
| Set/show this project’s default account + folder (writes |
Every doc tool accepts an optional account (override the default) and, where relevant, a tab (target a tab by id or title).
Drive as a filesystem
Drive navigation is one tool speaking shell, because the model already knows shell. Arguments are positional and differ per command, exactly as they do in a terminal.
{ "cmd": "ls", "args": ["/Work/2026"] }
{ "cmd": "find", "args": ["quarterly report", "-type", "d"] }
{ "cmd": "mkdir", "args": ["-p", "/Work/2027/Q1"] }
{ "cmd": "cp", "args": ["/Work/Template", "/Work/2027/Q1/Report"] }
{ "cmd": "mv", "args": ["/Work/Roof", "/Archive"], "expectName": "Roof" }path | is |
| My Drive |
| a shared drive |
| files others shared with you, which you never filed |
| files you own that are in no folder — see below |
anything else | a Drive id or URL, so ids from any other tool paste straight in |
Flags and operands parse in any order (cp -r a b, cp a b -r, cp a -r b), and -- ends the options.
Three places Drive is not a filesystem. The vocabulary is borrowed only where it is honest, and refuses where it is not:
Two files may share a name in one folder, and matching folds case. No filesystem the model learned from does either, so it would not think to check. A path matching more than one thing is refused with the candidates listed, never guessed — and
cp/mvrefuse to create that state too, rather than manufacturing an ambiguity the resolver would then decline to resolve.cp -rdoes not exist. Drive'sfiles.copyrefuses folders (its own web UI cannot copy one either), socpon a folder explains that rather than half-working.mvinto/shared/…gives the file away. Shellmvacross filesystems leaves you owning the file; moving into a shared drive transfers ownership to that organization and cannot be undone from your side. It requiresacceptOwnershipTransfer: true.
Paths see less than find does. A file with no parent still opens and still turns up in a search, but no path can name it — nothing that browses the tree will ever show it. find is the complete view; /lost+found is where those files surface.
There is no rm. See #47.
Known limitations
These are Google-API constraints, not bugs — the highlights are below; the complete reference (with the API reason and the workaround for each) is in docs/limitations.md.
Can't create suggestions. No API writes in suggestion mode — every edit is direct (live text).
apply_suggestionsonly resolves existing ones. Tools that write say so.No suggestion attribution (author/timestamp) — suggestions are listed in document order.
Comments created via the API aren't anchored to text, and Drive returns author name only (no email).
Images are inline only (no floating/x,y positioning), and Google downscales/re-encodes embedded images, so pulled copies aren't byte-identical.
Headers and footers are separate content trees — not part of the body. Every content tool (
read_doc,edit_doc,set_style,get_style,insert_content,insert_image,insert_table,edit_table,set_table_style,list_suggestions,apply_suggestions) takessegment: "header" | "footer"to reach them, andpagewhen a doc defines more than one.Markdown can't express computed style (spacing, fonts, colors) or deep table styling — read it with
get_style, set it withset_style/set_table_style. Code blocks aren't rendered from markdown yet (roadmap).
See docs/limitations.md for the full table, including how each is mitigated or surfaced.
Roadmap
Code blocks in the markdown writer — the remaining Tier-2 block type (tables and images already render; standalone
insert_table/insert_imagetools exist too).
Suggestion attribution (author/timestamp) is not on the roadmap — it has no API path for typical suggestions (see docs/limitations.md).
The "manuscript sync" use case (chapter files ⇄ tabs, reviewing suggestions, merging) is intentionally not a server feature — an AI agent orchestrates it over these primitives. See DESIGN.md §10b.
Development
npm install
npm run build # tsc
npm test # vitest
npm run typecheckSee DESIGN.md for the full architecture and the empirical findings behind it.
Acknowledgements
Architecture and approach informed by prior open-source Google Docs MCP servers — notably @a-bonus/google-docs-mcp and taylorwilsdon/google_workspace_mcp.
License
MIT © Dasasian
Available Tools
32 toolsadd_commentAdd a comment or replyA
Add a comment to a Google Doc, or reply to an existing comment thread by passing replyTo (a comment id from list_comments). A new comment (no replyTo) is not anchored to specific text — the Docs/Drive API cannot anchor programmatically-created comments.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| content | Yes | ||
| replyTo | No | a comment id (from list_comments) to reply to; omit to start a new top-level comment | |
| documentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses a key behavioral trait: programmatically-created comments are not anchored to specific text. This is valuable context beyond the basic mutation. It doesn't mention permissions or response behavior, but the anchoring limitation is a significant disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary purpose and immediately followed by the critical replyTo parameter explanation and API limitation. No wasted words, all information is relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description sufficiently covers the tool's functionality and key limitations. It addresses the main usage scenarios (comment vs reply) and references the source of replyTo IDs. It doesn't detail error handling or return values, but there is no output schema and the tool's behavior is simple enough that this is not a major gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (only account and replyTo have descriptions). The description compensates by explaining replyTo semantics ('a comment id from list_comments') and the behavior when replyTo is omitted. It does not explicitly describe documentId or content, but these are straightforward and self-evident from the parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Add a comment to a Google Doc, or reply to an existing comment thread'. It distinguishes from siblings like list_comments and resolve_comment by describing both operations (comment and reply) and referencing the companion tool list_comments for obtaining replyTo IDs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool: for adding a comment or replying to an existing thread (by passing replyTo from list_comments). It also explains the limitation of new comments not being anchored. However, it does not explicitly exclude alternatives or state when NOT to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_tabAdd a tabA
Add a new tab to a Google Doc. Returns the new tabId. Optionally set position (index) and parent tab for nesting.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | position among tabs | |
| title | Yes | ||
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| documentId | Yes | ||
| parentTabId | No | nest under this tab |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral details beyond the schema by noting the return of the new tabId and the optional nesting behavior. However, with no annotations provided, it does not disclose any side effects, permission requirements, or default behavior (e.g., tab placed at end unless index specified), leaving some ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the primary purpose, and uses no redundant wording. Every sentence contributes essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters and no output schema, the description provides the core action and return value but omits details such as the 'account' parameter, default placement behavior, and any prerequisites/errors. It is adequate for a simple add operation but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description clarifies the purpose of 'index' and 'parentTabId' by mentioning position and nesting, but these already have descriptions in the schema. It does not add meaning for required parameters 'documentId' and 'title', which lack schema descriptions, leaving a coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Add') and resource ('new tab to a Google Doc'), clearly distinguishing from sibling tools like rename_tab and delete_tab. It also mentions the return value (tabId), which clarifies the operation's outcome.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the tool adds a tab and optionally allows setting position and parent tab for nesting, providing context for how to use it. However, it does not explicitly mention alternatives or when not to use the tool, so it falls short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_suggestionsAccept/reject one or more suggestionsA
Resolve one or more pending suggestions (from list_suggestions) in ONE atomic update: accept keeps the proposed text, reject keeps the original. Pass one resolution to resolve a single suggestion, or several at once — required for suggestions that overlap or adjoin each other (a "cluster"), which cannot be resolved one at a time without corrupting neighbours. You MUST include every suggestion in any cluster you touch; a partially-resolved cluster is refused (status "incomplete"). documentTitle is checked against the live document first (status "wrong_doc" on mismatch, e.g. an id from a different, similarly-titled document). Copy each suggestion's preview from list_suggestions into its expectedChange (verified before applying). If the result includes a conflicts array, two suggestions genuinely conflicted (one inserts text inside another's deletion, both accepted) — it was auto-resolved by keeping the insertion; surface this to the user as NOT a clean merge.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| page | No | which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists. | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| segment | No | which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there. | |
| documentId | Yes | Google Doc id | |
| resolutions | Yes | one entry per suggestion to resolve | |
| documentTitle | Yes | The document's title, from list_suggestions. Shown for confirmation only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses critical behaviors: atomicity, cluster refusal with status 'incomplete', documentTitle verification with 'wrong_doc', expectedChange validation, and the conflicts array with auto-resolution instructions. This is excellent transparency beyond what any schema could convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place, covering the core action, the clustering rule, the document check, expectedChange copying, and conflict behavior. Though longer than a simple tool, the complexity justifies the length, and it is front-loaded with the primary purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no output schema, the description is remarkably complete: it explains all failure statuses, the cluster requirement, the conflicts array, and the workflow from list_suggestions. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers parameter descriptions 100%, but the description adds crucial semantic guidance: how to populate expectedChange from the suggestion's preview and that multiple resolutions are needed for clusters. This goes beyond the schema's basic field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Resolve one or more pending suggestions' and differentiates it from sibling tools like list_suggestions (which lists them). It specifies accept/reject semantics and the atomic nature of the update, making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly connects to list_suggestions as the source and explains when multiple resolutions are required (overlapping/adjoining suggestions), even noting that a partially resolved cluster is refused. It doesn't explicitly name alternatives or when not to use, but the context is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_docCreate a new Google DocA
Create a new Google Doc with a title and optional initial content (rendered as markdown). Optionally place it in a Drive folder (by folder URL or id); otherwise it goes to My Drive root. For long documents, pass contentFile (a local path) instead of content so the server reads the body directly — retyping a long doc inline can silently drop or fuse text.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| folder | No | Drive folder URL or id to create the doc in | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| baseDir | No | absolute dir to resolve relative local image paths against (e.g. the markdown file’s folder) | |
| content | No | ||
| contentFile | No | path to a local markdown/text file to use as the body, read directly by the server — preferred for long documents so the body is passed through mechanically rather than retyped inline (which can silently drop text). Absolute, or relative to baseDir. Mutually exclusive with content. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must carry full behavioral weight. It discloses that content is rendered as markdown, default placement is My Drive root, and warns about a real failure mode (silent text loss) with inline content. It doesn't mention return values or auth, but for a create operation it offers solid transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: core creation purpose, folder placement default, and the critical long-document guidance. Information is front-loaded and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, no output schema, and no annotations, the description covers creation semantics, folder placement, a parameter trade-off, and a behavioral warning. It doesn't describe return values, but that's not required without an output schema. It lacks only minor details like error handling or prerequisites, but remains strong overall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, leaving title and content without descriptions. The description adds meaning to content ('rendered as markdown') and contentFile (server reads directly, preferred for long docs, mutually exclusive with content). It also clarifies folder (URL or id) and default behavior. This compensates well for the schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create a new Google Doc' — a specific verb and resource — and clarifies it supports a title, optional markdown content, and optional folder placement. This clearly distinguishes it from siblings like update_doc, overwrite_doc, and read_doc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly recommends contentFile for long documents to avoid silent text dropping, which is an alternative to content. It also implies creation vs. editing by naming the action 'Create' and describing the default My Drive root. It doesn't explicitly contrast with sibling create/update tools, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_tabDelete a tabA
Delete a tab by tabId (cascades to child tabs). expectTitle (the tab’s title from list_tabs) is REQUIRED — it is shown in the confirmation and verified against the live tab, so an opaque/stale tabId cannot silently delete the wrong tab.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | Yes | ||
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| documentId | Yes | ||
| expectTitle | Yes | the tab’s title (from list_tabs); verified before deleting |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosure. It transparently reveals cascading deletion of child tabs and the safety verification mechanism using expectTitle. It doesn't mention permanence or permission requirements, but covers the most important destructive behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and key detail (cascade), followed by the essential safety constraint. Every word earns its place without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a delete tool with no annotations and no output schema, the description covers the action, the cascade behavior, and a critical prerequisite. It doesn't describe the return value or any cleanup details, but the tool is relatively simple and the provided context is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, and the description compensates by explaining the purpose and criticality of expectTitle, and clarifying that tabId is the identifier. However, documentId and account parameters lack meaningful explanation beyond the schema, so the value added is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Delete a tab') and the specific resource (by tabId), and uniquely distinguishes it from sibling tools like add_tab and rename_tab. It also adds the cascading behavior, which is specific to this delete operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when deleting a tab) and provides a crucial usage requirement: expectTitle must come from list_tabs. However, it doesn't explicitly mention alternatives or when not to use it, such as if child tabs should be preserved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_imagesDownload a doc’s imagesA
Download every embedded image in a Google Doc to a local folder. Returns the objectId→filename mapping, which correlates with read_doc’s <img src="image:<objectId>"> markers so you can rewrite them to local paths (the inverse of publishing).
| Name | Required | Description | Default |
|---|---|---|---|
| dir | Yes | absolute local folder to save images into (created if missing) | |
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| documentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full transparency burden. It discloses the side effect (downloading to local folder), the return value (objectId→filename mapping), and a key integration behavior (correlation with read_doc). It doesn't mention permissions, error behavior, or that the doc itself isn't modified, but 'download' implies non-destructive read from the doc. The transparency is solid without being exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the core action, the second explains the return mapping and a crucial correlation with read_doc. Every sentence adds value with no filler or redundancy. It is front-loaded and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is no output schema and no annotations, the description successfully communicates the tool's purpose, output, and usage context. It covers the main use case (downloading all images and rewriting references). It doesn't address edge cases like 'no images' or error handling, but those are minor for a download tool; overall it's complete enough for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75% (three of four parameters have descriptions), so the schema does most of the work. The tool description says 'local folder' early on, aligning with the `dir` parameter, but doesn't discuss `documentId`, `tab`, or `account`. It adds no new parameter-level meaning beyond the schema, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific, actionable verb phrase 'Download every embedded image in a Google Doc to a local folder', clearly identifying the resource (images in Google Doc), the action (download to local folder), and the output (objectId-to-filename mapping). It also distinguishes itself from siblings by framing itself as the 'inverse of publishing' and referencing read_doc, setting it apart from mere read or insert operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear workflow context: it explains how the return mapping correlates with read_doc's image markers, indicating when you'd use this tool (to replace remote image references with local paths). However, it doesn't explicitly name alternatives or state when not to use it, so it misses the top-tier 'when-not' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
driveDrive as a filesystemA
Navigate and reorganise Google Drive with shell commands: ls, find, mkdir, cp, mv. Arguments are positional and follow the usual shell forms. ls [path] — list a folder (default My Drive root). find [-type d|f] — search everything by name, including files no path can reach. mkdir [-p] — create a folder. cp — duplicate a file (preserves headers/footers, image sizing and exact formatting, which a markdown round-trip cannot rebuild). mv — move and/or rename, as on a filesystem: an existing folder as means "into it", anything else means "to that name". Paths start with / or ~ (My Drive); /shared/ is a shared drive, /shared-with-me the files others shared with you, and /lost+found the files you own that are in no folder at all. Anything not starting with / or ~ is read as a Drive id or URL, so ids from any other tool can be pasted straight in. Drive permits two files with the same name in one folder and folds case when matching, unlike any real filesystem — a path that matches more than one thing is refused with the candidates listed, never guessed. Content is edited with edit_doc/overwrite_doc, not here; there is no rm.
| Name | Required | Description | Default |
|---|---|---|---|
| cmd | Yes | ||
| args | No | positional arguments for cmd, e.g. ["/Work/Roof", "/Archive"] for mv | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| expectName | No | mv only: the name the source is expected to have; the move is refused if it resolved to something else | |
| acceptOwnershipTransfer | No | mv only: required to move into /shared/… , which hands ownership to that drive's organisation and cannot be undone |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behaviors: cp preserves formatting that markdown cannot rebuild, ambiguous paths are refused with candidates listed rather than guessed, duplicate names are allowed, and case folding occurs. These are non-obvious and critical traits beyond what the schema or annotations could convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence contributes unique value. It is well-structured: overview, then per-command details, path conventions, edge cases, and exclusions. No filler or redundancy; it front-loads the core purpose and flows logically. The density is appropriate for a tool with multiple subcommands.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-command filesystem interface with no output schema, the description covers all essential aspects: each command's behavior, path resolution rules, special directories, handling of duplicate names and case folding, disambiguation on ambiguity, and explicit exclusions. It also notes ownership transfer implications indirectly through schema, but the description itself is self-sufficient for a complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds substantial meaning beyond the schema for the primary cmd parameter, detailing each subcommand's syntax, defaults, and special flags (e.g., '-p' for mkdir, '-type' for find). It also clarifies the 'args' parameter as positional and provides concrete examples. Even though schema coverage is 80%, the description enriches the semantics of the two most complex parameters (cmd and args) significantly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb+resource: 'Navigate and reorganise Google Drive with shell commands: ls, find, mkdir, cp, mv.' It immediately distinguishes from sibling tools by stating content editing is done elsewhere ('edit_doc/overwrite_doc, not here') and explicitly notes 'there is no rm.' This precisely defines the tool's scope and differentiates it from sibling content manipulation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides extensive usage context: path syntax ('/shared/<drive name>', '/shared-with-me', '/lost+found'), handling of IDs/URLs ('ids from any other tool can be pasted straight in'), and the nuance of mv with an existing folder. It also explicitly excludes content editing (via edit_doc/overwrite_doc) and warns against expecting rm, making the tool's place among siblings clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_docEdit a Google DocA
Replace an exact unique snippet of text in a Google Doc (like a local file Edit). old_string is matched markup-tolerantly; ambiguous matches return surrounding context to disambiguate. new_string is interpreted as inline markdown and inline HTML (bold, italic, code, text, <u>, <span style="color:…;font-size:…pt">) — the same spelling read_doc emits, so a read can be edited and written back. To restyle text you are NOT otherwise changing, use set_style instead: it needs no copy of the text. NOTE: this is a direct edit — the change is applied as live text, not a tracked suggestion (the Docs API cannot create suggestions). If the doc has pending suggestions from other reviewers, flag to the user that your edit will sit alongside them as an accepted change.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| page | No | which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists. | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| segment | No | which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there. | |
| documentId | Yes | Google Doc id | |
| new_string | Yes | replacement text | |
| old_string | Yes | exact text to replace (quote a unique slice from read_doc) | |
| replace_all | No | replace every occurrence (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and excels: it discloses markup-tolerance, ambiguity handling ('ambiguous matches return surrounding context'), that new_string supports inline markdown/HTML, and the critical limitation that edits are live text, not suggestions. It also instructs flagging pending reviewer suggestions, adding behavioral nuance beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five dense sentences, each earning its place: core action, matching behavior, formatting semantics, alternative tool, and a direct-edit caveat. No fluff, well-structured, front-loaded with the main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no output schema, the description fully covers the essential behavioral aspects: matching, formatting, alternatives, and the suggestions caveat. Remaining parameters are documented in the schema, and the description handles the nontrivial complexities comprehensively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining old_string's markup-tolerant matching and ambiguity handling, and clarifying that new_string uses the same formatting syntax as read_doc. This goes beyond the schema's terse 'replacement text' and enriches parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource phrase 'Replace an exact unique snippet of text in a Google Doc' and distinguishes from the sibling set_style by explicitly noting when to use that alternative instead. It also clarifies the 'like a local file Edit' analogy, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear when-to-use context: quoting a unique slice from read_doc, noting markup-tolerant matching, and stating 'To restyle text you are NOT otherwise changing, use set_style instead.' It also warns about the direct-edit nature versus tracked suggestions, giving practical usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_tableInsert or delete a table row/columnA
Structurally edit the table containing the given cell text: insert or delete a row or column. op picks the operation; side picks which side an insert goes on (for rows: after=below (default)/before=above; for columns: after=right (default)/before=left) and is ignored for deletes. Deletes remove the row/column that contains cell.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | the structural edit to perform | |
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| cell | Yes | text identifying a cell in the target table | |
| page | No | which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists. | |
| side | No | for inserts: which side of `cell` to add on — rows after=below (default)/before=above; columns after=right (default)/before=left. Ignored for deletes. | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| segment | No | which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there. | |
| documentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. It adds meaningful behavioral details: how `op` selects the operation, how `side` controls insert position (with defaults and mapping for rows/columns), and that `side` is ignored for deletes. It also clarifies that deletes remove the row/column containing `cell`. However, it does not discuss side effects like formatting loss or whether insertions copy styles, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: three sentences, front-loaded with the main purpose, then parameter logic, then deletion behavior. No redundant or wordy content; every sentence adds necessary context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 8 parameters, 4 enums, and no output schema. The description covers the core operational logic (op, side, cell targeting) and leaves other parameters (tab, page, segment, account) to the schema, which adequately documents them. It does not mention what happens to the document after the edit, but the absence of an output schema reduces that burden. Overall, it provides enough context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers 88% of parameters with descriptions. The description adds value by explaining the key role of `cell` as the locator for the target row/column, and clarifies the `side` parameter's mapping and default behavior, which goes beyond the schema's basic description. This is especially useful for selecting the correct table.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: "Structurally edit the table containing the given cell text: insert or delete a row or column." This specifies the verb (edit), resource (table), and scope (insert/delete row/column), and distinguishes it from siblings like set_table_style (styling) and insert_table (new table).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when you need to structurally modify an existing table identified by a cell's text. It does not explicitly mention alternatives or exclusions, but the context is clear enough that an agent can infer it is for structural edits rather than content or style changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_docExport a doc to a fileA
Export a Google Doc to a real file on disk — pdf (default), docx, odt, rtf, txt, html, epub, or md. Google renders it server-side (File > Download in the UI), so page setup, pagination and layout match the editor. Returns the local path and byte size. Note: Drive refuses to export files larger than 10 MB.
| Name | Required | Description | Default |
|---|---|---|---|
| dir | Yes | absolute local folder to save the export into (created if missing) | |
| format | No | default pdf | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| filename | No | override the filename (default: the doc’s title + extension) | |
| documentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains that Google renders server-side, lists the return values (local path and byte size), and warns about the 10 MB export restriction. This goes beyond minimal expectations, though it could add details about overwrites or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, and every sentence adds value: format list, rendering fidelity, return values, and a size restriction. There is no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and five parameters, the description covers the key runtime behaviors: server-side rendering, page layout fidelity, return results, and the 10 MB file-size limit. It does not explain overwrite behavior or error handling, but the schema handles parameter definitions, so the description is reasonably complete for an export tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (80%), so the baseline is 3. The description adds little beyond the schema for parameters; it repeats format defaults and lists options but does not clarify ambiguous fields like documentId. It provides marginal context about the directory creation, but that is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Export') and resource ('a Google Doc') and clearly states the output ('real file on disk'), enumerating all supported formats. It also distinguishes this from sibling tools like read_doc or download_images by focusing on the export-to-file operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case (converting a Google Doc to a downloadable file) and gives a helpful note about the 10 MB limit, but it does not explicitly state when to use this tool over alternatives or mention any exclusions. The context is clear but not prescriptive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_setupRead document page setupA
Read a doc’s (or tab’s) page setup — margins, page size (in points, plus a preset name if it matches letter/legal/a4/tabloid), and orientation. The read counterpart to set_page_setup; use it to mirror another document’s layout onto a new doc.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| documentId | Yes | Google Doc id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It clearly indicates a read (non-mutating) operation, and details return specifics: margins, page size in points, preset names (letter/legal/a4/tabloid), and orientation. It doesn't cover auth or error conditions, but the core behavior is well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and resource, followed by a concise use case and sibling relationship. No redundant words, every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with a small parameter set, the description sufficiently covers what it returns (specific formatting details) and how to use it. No output schema exists, but the description compensates by listing return components. Slight gap: no mention of error behavior or authentication, but not expected for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds mild value by framing the tool as applying to a doc or tab, which aligns with the 'tab' parameter, but it doesn't add parameter details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Read' and the resource 'page setup', enumerating specific components (margins, page size, orientation) and noting it works on a doc or tab. It explicitly labels itself as the read counterpart to set_page_setup, distinguishing it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description identifies a specific use case ('mirror another document's layout onto a new doc') and names the complementary tool (set_page_setup). While it doesn't explicitly list when not to use alternatives, the 'read counterpart' framing provides clear placement among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_configShow this project’s gdocs defaultsA
Show the effective .gdocs-mcp.json defaults (account/folder) for the current working directory, and where the file is.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that the tool reads a project configuration file and shows the effective defaults and file location. 'Show' implies no side effects, and the specificity about output (account/folder and file path) is transparent. It doesn't cover edge cases like a missing config, but for a simple getter this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the action and then specifies the resource and additional output (file location). Every word earns its place; there is no redundancy, and it is appropriately sized for a tool with no parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no params, no output schema), the description is complete enough. It explains what the tool does and what it shows (defaults and file location), which serves as a high-level return description. It could mention error behavior or fallback defaults, but this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The input schema is empty and fully covers the parameter surface. The description adds no parameter-specific details because none exist, but it clarifies what the tool returns in context of the project configuration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Show'), the specific resource ('.gdocs-mcp.json defaults'), and the scope ('current working directory'). It also distinguishes itself from siblings like 'set_project_default' by focusing on the read/display side, and from 'list_accounts' by targeting project-level configuration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: when you need to see the effective project defaults (account/folder) and the config file location. It doesn't explicitly name alternatives or exclusions, but the read-only nature is distinguishable from write-style siblings like 'set_project_default'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_styleRead computed style at a text anchorA
Read the effective (inherited-resolved) style at a unique text snippet — read_doc’s markdown can’t express these; the read counterpart to set_style. Returns paragraph style (namedStyleType, alignment, spaceBefore/spaceAfter in pt, lineSpacing %, and whether spacing is inherited) and text style (bold/italic/underline/strikethrough, fontSize pt, fontFamily, color hex, link). Use it to diagnose things markdown hides — e.g. an unexpected gap between paragraphs is spacing (spaceAfter>0), not a blank line, and is fixed with set_style’s spaceAfter, not edit_doc.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| page | No | which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists. | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| segment | No | which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there. | |
| documentId | Yes | ||
| target_string | Yes | exact text to read the style of (quote a unique slice from read_doc) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and performs well: it explains the return shape (paragraph style with namedStyleType, alignment, spacing in pt, lineSpacing %, inheritance; text style with bold/italic/underline/strikethrough, fontSize pt, fontFamily, color hex, link) and reveals the behavioral nuance of 'effective (inherited-resolved)' style. It also implies read-only by calling it 'read counterpart to set_style', and provides a concrete diagnostic example.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, then return details, then a diagnostic use case. Every sentence is informative with no filler. The length is justified given the return value complexity and the need to distinguish from siblings.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description compensates by enumerating return fields. It also provides context on why to use it (read_doc can't express styles), which sibling to compare with (set_style), and an example of unexpected spacing. The description is complete for a read tool with schema-documented parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (83%), so baseline is 3. The description adds little beyond schema: it repeats 'unique text snippet' which the schema already says as 'exact text to read the style of (quote a unique slice from read_doc)'. No new meaning is added for tab, page, segment, or account parameters, so the description does not enhance parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads the effective (inherited-resolved) style at a unique text snippet, differentiating it from read_doc which cannot express such styles, and explicitly identifies it as the read counterpart to set_style. The verb 'Read' and resource 'style at a unique text snippet' are specific, and the mention of sibling tools distinguishes it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: to diagnose things markdown hides, e.g., an unexpected gap between paragraphs is spacing (spaceAfter>0), not a blank line. It also names alternatives and exclusions: it is fixed with set_style's spaceAfter, not edit_doc, and read_doc's markdown can't express these styles. This provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_styleRead an existing table’s styleA
Read the style of the table containing the given cell text: per-column widths (points), how many header rows are pinned, and the matched cell’s padding, background and per-side borders. The read counterpart to set_table_style — use it to check a change took, to preserve a table’s look while rewriting it, or to copy one table’s layout onto another. Column widths come back in the exact shape set_table_style accepts. Table-wide facts (widths, header rows) are reported for the whole table; padding/background/borders are reported for the MATCHED cell, since cells in one table can differ and a table-wide answer would have to guess. Note Docs gives every cell 5pt padding by default, so padding is reported even on a table nobody has styled.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| cell | Yes | text of any cell in the target table (locates the table) | |
| page | No | which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists. | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| segment | No | which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there. | |
| documentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It clearly discloses that table-wide facts apply to the whole table while cell-specific attributes apply to the matched cell, and warns that Docs gives every cell 5pt padding by default. It also promises output shape compatibility with set_table_style, which is a useful behavioral guarantee.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than a minimal one, but every sentence earns its place: the first states the core function, the second gives use cases, the third addresses output shape, the fourth clarifies scope, and the fifth covers a default caveat. It is front-loaded and not repetitive, though slightly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain return values. It does so by listing the specific style attributes and clarifying which are table-wide vs cell-specific. It also handles an edge case (default padding on unstyled tables). For a read tool with nuanced output, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (83%), and the description does not add much parameter-level meaning beyond the schema. The cell parameter's role as a locator is already described in the schema ('text of any cell in the target table (locates the table)'), so the description's added value is mostly about output semantics rather than input parameter clarification.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Read the style of the table containing the given cell text' and enumerates exactly what is read (widths, header rows, cell padding/background/borders). It explicitly positions itself as the read counterpart to set_table_style, distinguishing it from the sibling get_style which likely targets document/paragraph style.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases: 'check a change took, preserve a table’s look while rewriting it, or copy one table’s layout onto another.' It also clarifies that it is the read counterpart to set_table_style, implying when to use the write tool instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_contentInsert content at a positionA
Insert NEW markdown-rendered content at a structural position — no anchor text required. at: "end" (default, the end of the doc/tab) · "top" · a unique text snippet to insert immediately after. Use this where edit_doc can’t reach: adding a paragraph after a table that ends the doc (a table’s cells can’t anchor an insert outside the table, and the trailing empty paragraph has no text to match), or appending to an empty doc. Use edit_doc instead when you are replacing or extending existing text. Content is full markdown (headings, lists, tables, images), same renderer as create_doc. A direct edit, not a tracked suggestion.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | "end" (default) | "top" | a unique text snippet to insert right after | |
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| page | No | which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists. | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| baseDir | No | absolute dir to resolve relative local image paths against | |
| content | No | markdown content to insert (or use contentFile) | |
| segment | No | which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there. | |
| documentId | Yes | ||
| contentFile | No | path to a local markdown/text file to insert, read directly by the server — preferred for long content. Absolute, or relative to baseDir. Mutually exclusive with content. | |
| createSegment | No | when segment is header/footer and the doc has none, create it first (the letterhead case). Only the default header/footer can be created via the API. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that this is a direct edit (not a tracked suggestion), that content is full markdown with the same renderer as create_doc, and that no anchor text is required. It could additionally note behavior like failure on unmatched snippet, but the disclosed traits are useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is five dense sentences with no wasted words. It front-loads the core purpose and packs usage guidance, edge cases, and rendering details efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no annotations and no output schema, the description covers purpose, when to use/not use, behavioral traits, and key parameter semantics. It is sufficiently complete for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (90%), so baseline is 3. The description meaningfully adds to the at parameter by defining 'end', 'top', and 'unique text snippet', and clarifies content supports full markdown. Other parameters rely on schema descriptions, which are adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool inserts new markdown content at a structural position without requiring anchor text. The description distinguishes it from edit_doc by explicitly naming the alternative and defining the at-parameter options (end, top, snippet).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance with edge cases where edit_doc cannot reach (adding after a table at end of doc, appending to empty doc). It also tells when to use edit_doc instead (replacing/extending existing text) and clarifies it is a direct edit, not a suggestion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_imageInsert an imageA
Insert an inline image from a public URL or a local file (uploaded to Drive, embedded, then the temp upload removed). Position via at (top/end/or a unique text anchor), size via width/height (points), and align left/center/right. Set segment:"header" for a letterhead logo — that is where a repeating, correctly-sized logo belongs, and it is why a template’s logo is invisible to a body read. A direct edit, not a tracked suggestion. Note: floating/text-wrapped images are not supported by the Docs API.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | "top", "end", or a unique text snippet to insert after (default top) | |
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| uri | Yes | public image URL, or a path to a local image file (absolute, or relative to baseDir) | |
| page | No | which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists. | |
| align | No | ||
| width | No | points | |
| height | No | points | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| baseDir | No | absolute dir to resolve a relative local `uri` against | |
| segment | No | which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there. | |
| documentId | Yes | ||
| createSegment | No | when segment is header/footer and the doc has none, create it first (the letterhead case). Only the default header/footer can be created via the API. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description fully discloses the local file upload workflow (uploaded to Drive, embedded, temp upload removed), states this is a direct edit not a tracked suggestion, and explains the header invisibility behavior — substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences cover the core behavior, positioning, sizing, alignment, header specifics, edit type, and a limitation — every sentence carries useful information with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters and no output schema, the description addresses the main use cases (body and header images), the local file lifecycle, and the API restriction on floating images, making it sufficient for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, so the baseline is 3, but the description adds meaningful context to `at` (top/end/unique text anchor) and `segment` (letterhead logo example), going beyond the schema's field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Insert') and resource ('inline image'), and clarifies sources (public URL or local file), distinguishing from siblings like insert_table or insert_content. It clearly states the action and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides context for segment header as the place for a letterhead logo and notes that floating/text-wrapped images are not supported, giving implicit guidance on when this tool applies. However, it doesn't explicitly name alternative tools for unsupported cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_tableInsert a tableA
Insert a rows×columns table, optionally populated from a 2D array of cell text — cell text may use inline markdown (bold, italic, code, links). Per-column alignment via align. Position via at (top/end/or a unique text anchor, default end). A direct edit, not a tracked suggestion.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | "top", "end", or a unique text snippet to insert after (default end) | |
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| data | No | row-major cell text, e.g. [["A","B"],["1","2"]] | |
| page | No | which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists. | |
| rows | Yes | ||
| align | No | per-column text alignment, e.g. ["left","right"]; null or "left" leaves a column at the default | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| columns | Yes | ||
| segment | No | which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there. | |
| documentId | Yes | ||
| headerShade | No | hex background color for the first row, e.g. #f1f3f4 | |
| columnWidths | No | fixed width per column, in points | |
| createSegment | No | when segment is header/footer and the doc has none, create it first. Only the default header/footer can be created via the API. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the key behavior 'A direct edit, not a tracked suggestion' and explains markdown processing. It stops short of detailing error scenarios or permission requirements, but covers the most critical behavioral trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, followed by essential parameter details and a closing behavioral note. Every sentence earns its place without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter tool with no output schema, the description covers the fundamental use case and required parameters (rows, columns, documentId implied). It also explains optional data/alignment/position. Advanced options like segment, tab, and account are left to the schema, which is acceptable given the schema's high coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 77%, so a baseline of 3 applies. The description adds value beyond the schema by clarifying rows/columns as dimensions, noting optional population from a 2D array, and specifying 'at' semantics (top/end/anchor). This complements and enriches the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Insert a rows×columns table' with a specific verb and resource. It also distinguishes from siblings by noting 'A direct edit, not a tracked suggestion,' which separates it from suggestion-related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides practical usage context: how to specify position ('via at (top/end/or a unique text anchor, default end)'), data format ('2D array of cell text'), and markdown support. It also gives a when-not via 'not a tracked suggestion,' but does not explicitly name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsList authorized Google accountsA
List the Google accounts that have been authorized for this server.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility. It clearly indicates a read-only action by using 'List,' and there are no side effects or hidden behaviors to disclose. However, it adds no context beyond the obvious purpose—no mention of what the output looks like, whether accounts are returned as emails, or if authorization status has any caveats. This is a baseline acceptable transparency for a simple read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence: 'List the Google accounts that have been authorized for this server.' It is front-loaded with the action verb and resource, contains no filler, and every word earns its place. Properly sized for the tool's trivial parameter surface.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description is complete. It tells the AI agent exactly what the tool does, and because there are no parameters to configure or complex return values to explain, no additional information is needed. The context is fully covered by this single sentence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is trivially complete. The description does not need to explain any parameters. Per the rubric, 0 params receives a baseline of 4, and nothing in the description detracts from this. The description correctly focuses on the tool's purpose rather than inventing parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' with a clear resource: 'Google accounts that have been authorized for this server.' This distinguishes it from sibling list tools like list_folder, list_tabs, or list_comments, which target different resources. The phrasing is unambiguous and matches the title exactly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus the many sibling tools, nor does it mention any exclusions or alternatives. It simply restates the purpose without context about scenarios where checking authorized accounts would be appropriate. There is no 'when to use' or 'instead' language.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_commentsList comments on a docA
List comments on a Google Doc (author display name, quoted text, body, resolved status, replies). Author email is not available via the Drive API.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| documentId | Yes | Google Doc id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses useful behavioral details: it lists the included fields and explicitly notes that author email is unavailable via the Drive API. This limitation is helpful context beyond a simple 'list comments' statement, though it does not cover pagination or ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the core function and field list, followed by a relevant limitation. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description covers the return contents and a key constraint. It lacks explicit pagination or resolved-comment filtering details, but these are not essential for the agent's basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents both parameters (account with default behavior, documentId). The description adds no further parameter semantics, so it meets the baseline for schema-covered parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('List comments') and resource ('a Google Doc'), enumerating the returned fields. It distinguishes itself from sibling comment-related tools like add_comment and resolve_comment by focusing on listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving comments but provides no explicit guidance on when to choose this over siblings like list_suggestions or read_doc. There are no exclusions or alternative recommendations, so it relies on the agent's interpretation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_permissionsList who a doc is shared withA
List the permissions on a Google Doc (people, groups, domain, anyone-with-link) with their roles. Each entry carries a subject naming who it covers — an email, " (domain)", or "anyone with the link" — since a domain or link grant has no email. For those, allowFileDiscovery: true means the file also surfaces in that audience's search, not merely that it opens with the link. Note a doc created under a Workspace domain may already carry a domain grant before you share it.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| documentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does an excellent job. It reveals the structure of each entry (subject), explains the meaning of allowFileDiscovery for non-email subjects, and discloses that a doc may already have a domain grant by default. This is rich behavioral context beyond the basic 'list' operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences long but each sentence adds value: the first states the core purpose, the second explains the subject field format, the third clarifies allowFileDiscovery, and the fourth covers an edge case. It is front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description must explain the return format. It does so thoroughly by describing entry fields, special subject values, the allowFileDiscovery behavior, and the default domain grant caveat. This is a complete picture for a listing tool with no additional schema support.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50% (account is described, documentId is not). The description adds no parameter-specific guidance, leaving documentId's meaning to be inferred from the tool name. For a required parameter, this is a meaningful gap that the description does not fill.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'permissions on a Google Doc', specifying the scope (people, groups, domain, anyone-with-link) and that roles are included. It distinguishes itself from sibling sharing tools like share_doc and unshare_doc by focusing on reading the current state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description frames the tool as a read-only inspection tool but does not explicitly name alternatives or state when-not-to-use. It provides useful context, such as the note about Workspace domain grants, which helps the user anticipate unexpected results and clarifies the tool's purpose in an audit workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_suggestionsList suggestions in a docA
List pending suggestions (tracked changes) in a Google Doc as before→after diffs, in document order. Returns the doc title and, per suggestion, a human-readable preview — pass these verbatim as documentTitle/expectedChange to apply_suggestions. Note: the Docs API exposes no author or timestamp for suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| page | No | which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists. | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| segment | No | which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there. | |
| documentId | Yes | Google Doc id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It discloses that it lists only pending suggestions, returns diffs in document order, and notes the API exposes no author or timestamp — useful limitations. A minor gap is not explicitly stating it is read-only, but 'list' implies that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences (plus a short note) and front-loaded with the core purpose in the first sentence. Every sentence earns its place, providing output format, integration guidance, and an API limitation without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 5 parameters and no output schema, so the description must define the output contract. It adequately explains the return structure (title + per-suggestion preview) and the no-author/timestamp limitation. It could also mention what happens when no suggestions exist, but 'pending' clarifies the scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no extra meaning about parameters (documentId, tab, page, account, segment); it only mentions output fields title and preview, which relate to the response, not parameters. The params are well-documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists pending suggestions (tracked changes) in a Google Doc as before→after diffs in document order. This specific verb+resource+scope distinguishes it from sibling tools like apply_suggestions (which applies them) and list_comments (which handles comments).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by explaining the output includes a preview to pass to apply_suggestions, implying usage as a precursor to applying changes. It does not explicitly mention alternatives or when not to use, but the integration hint gives practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tabsList document tabsA
List the tabs in a Google Doc (tabId, title, index, nesting).
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| documentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It states that the tool lists tabs and returns specific fields, implying a read-only operation, but does not disclose additional behavioral traits such as authentication requirements, errors, or absence of side effects. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that immediately states the purpose and then adds the return fields in parentheses. Every word is informative, and there is no filler or redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one required parameter and no output schema, the description covers the return value and core behavior. It lacks parameter explanation but is otherwise complete, making it well-suited for straightforward tasks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, with 'account' described but 'documentId' lacking any description in either the schema or the tool description. The description does not compensate by explaining parameter usage, leaving the required parameter ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List') and resource ('tabs in a Google Doc'), and enumerates the returned fields (tabId, title, index, nesting). This distinguishes it from sibling tools like add_tab, rename_tab, and delete_tab, which perform different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given on when to use this tool versus alternatives. The description does not mention exclusions or provide context such as 'use before modifying tabs' or 'instead of read_doc'. Usage is only implied by the name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
overwrite_docOverwrite a doc (guarded)A
Replace the entire body of a doc (or one tab) with markdown-rendered content. Refuses if comments/suggestions are present (would orphan them) unless force=true. Pass expectTitle (the doc’s title) — shown for confirmation and verified against the live doc before replacing. For long documents, pass contentFile instead of content so the server reads the body directly (retyping a long doc inline can silently drop text). A direct edit, not a tracked suggestion.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| force | No | proceed even if comments/suggestions would be lost | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| baseDir | No | absolute dir to resolve relative local image paths against (e.g. the markdown file’s folder) | |
| content | No | markdown content (or use contentFile) | |
| documentId | Yes | ||
| contentFile | No | path to a local markdown/text file to use as the new body, read directly by the server — preferred for long documents so the body is passed through mechanically rather than retyped inline (which can silently drop text). Absolute, or relative to baseDir. Mutually exclusive with content. | |
| expectTitle | No | the doc’s title; verified before overwriting so a wrong id is refused |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does it well. It discloses destructive behavior (overwrites the body), the refusal condition for comments/suggestions, the force escape hatch, the expectTitle verification mechanism, the contentFile mechanical-reading advantage, and the direct-edit (not tracked-suggestion) nature. This goes well beyond a simple mutation hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, with the core action and safety guard front-loaded. Every sentence adds critical information: what it does, when it refuses, how to avoid data loss, and the nature of the edit. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's 8 parameters and no output schema, the description provides a solid operational picture: full replacement semantics, safety hooks, and important usage guidance for the most complex parameters. It could mention side effects beyond comment/suggestion loss (e.g., formatting replacement) or account permissions, but the current description is adequate for an agent to invoke it correctly in most scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (88%), so the baseline is 3. The description adds meaningful semantics beyond the schema: it explains why contentFile is preferred for long documents (avoids silent text dropping), what expectTitle is used for (confirmation and live verification), and how force bypasses the comment/suggestion guard. This enhances the schema's bare parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Replace') and resource ('entire body of a doc or one tab') and clarifies the markdown-rendering behavior. It distinguishes itself from sibling tools like edit_doc by explicitly stating this is a full-body replacement and 'a direct edit, not a tracked suggestion.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly communicates when to use this tool (full overwrite, including per-tab) and when to prefer alternatives: contentFile for long documents instead of inline content. It also flags a safety condition (refuses if comments/suggestions unless force=true). However, it does not explicitly name edit_doc as the alternative for targeted edits, though this is strongly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_docRead a Google DocA
Read a Google Doc as markdown + inline HTML. mode: clean (committed text, default) · tracked (suggestions shown as /) · accepted · rejected. segment picks the content tree: body (default), header, footer, or all (body plus every header/footer, each labelled). A body read always reports which headers/footers exist and what they hold, since their content — a letterhead logo, a page number — is NOT part of the body and would otherwise be invisible.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| mode | No | read mode (default clean) | |
| page | No | which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists. | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| segment | No | content tree to read (default body) | |
| documentId | Yes | Google Doc id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses a non-obvious behavior: a body read always reports headers/footers and their content, even though that content is not part of the body. It also clarifies how tracked mode renders suggestions as <ins>/<del>. It doesn't explicitly state read-only, but the verb 'Read' implies it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core purpose, then progressively detailed explanations of modes, segments, and the header/footer quirk. Every sentence earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the most important behavioral nuances for a read tool: output format, mode semantics, segment options, and the invisible-content quirk. The schema already documents parameters like tab, page, and account, so the description needn't repeat them. For a tool without an output schema, this is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds substantial meaning to mode ('clean (committed text, default) · tracked (suggestions shown as <ins>/<del>)') and segment ('body plus every header/footer, each labelled'), beyond the bare enum values. Useful context, but not every parameter is enriched.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Read a Google Doc as markdown + inline HTML' – a specific verb, resource, and output format. The modes and segments clarify scope, distinguishing this from sibling mutation tools like edit_doc or overwrite_doc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains modes and segments, giving implicit guidance on when to use each, but it never names alternatives like export_doc for other formats or list_suggestions for suggestion-only queries. Usage context is implied, not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_tabRename a tabC
Rename a tab by tabId.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | Yes | ||
| title | Yes | ||
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| documentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. 'Rename a tab by tabId' discloses the basic action but omits behavioral details such as side effects, permissions, idempotency, error handling, or return values. For a mutation tool, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence, appropriately sized for a simple operation. However, it is under-specified and does not fully earn its place, as it largely restates the tool's name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and only 25% schema coverage, the description is incomplete. It does not explain the role of required parameters like 'title' and 'documentId', nor what happens after renaming. The operation is simple, but the guidance is too thin for an AI agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25% (only 'account' has a description). The description only mentions tabId, failing to explain that 'title' is the new tab name or that 'documentId' identifies the containing document. It does not compensate for the low schema coverage; it adds minimal meaning beyond the parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Rename a tab by tabId' clearly states the action (rename) and the resource (a tab), with the key identifier (tabId). This distinguishes it from sibling tools like delete_tab, add_tab, and list_tabs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives or any exclusions. The description simply states what it does without contextualizing its use relative to other tab operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_commentResolve or reopen a commentA
Resolve (or reopen) a comment thread by comment id. Pass expectQuote (a snippet of the comment’s quoted text or body, from list_comments) — shown for confirmation and verified against the live comment, so a wrong/stale id is refused instead of resolving the wrong thread.
| Name | Required | Description | Default |
|---|---|---|---|
| reopen | No | reopen instead of resolve | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| commentId | Yes | ||
| documentId | Yes | ||
| expectQuote | No | snippet of the comment’s quoted text/body; verified before resolving |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a key safety behavior: expectQuote is verified against the live comment so a wrong/stale id is refused, preventing accidental resolution of the wrong thread. This goes beyond the basic action, though it does not cover permissions or return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loaded with the core purpose followed by a concise explanation of the verification parameter. No unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the primary action, the verification mechanism, and the prerequisite tool for obtaining the quote. It lacks information about return values or error handling, but with no output schema and moderate complexity, it provides sufficient context for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning to expectQuote by explaining its source (list_comments) and its role in confirmation and verification, which the schema only labels as a snippet. It does not elaborate on commentId/documentId, but these are self-evident from context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Resolve (or reopen) a comment thread by comment id,' clearly stating the action and target. It distinguishes this from sibling tools like list_comments or add_comment by specifying the resolve/reopen action and the required comment id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It instructs the user to pass expectQuote, obtained from list_comments, and explains that it is verified, helping the agent know the expected prerequisite workflow. It warns against wrong/stale ids, but does not explicitly contrast with alternative tools or mention when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_page_setupSet document page setupA
Set document-level page setup for a doc (or tab): page margins, page size, and orientation — the File > Page setup controls, which set_style can’t reach. Margins and explicit page sizes are in points (72 pt = 1 inch). pageSize is a preset (letter/legal/a4/tabloid) or an explicit {width,height} in points; orientation (portrait/landscape) swaps the page dimensions. A direct change, not a tracked suggestion.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| pageSize | No | a preset name, or {width,height} in points | |
| marginTop | No | top margin in points (72 = 1 inch) | |
| documentId | Yes | Google Doc id | |
| marginLeft | No | left margin in points | |
| marginRight | No | right margin in points | |
| orientation | No | portrait or landscape (orders the page width/height) | |
| marginBottom | No | bottom margin in points |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It adds critical context: 'A direct change, not a tracked suggestion', unit conventions ('72 pt = 1 inch'), and that orientation 'swaps the page dimensions'. This goes beyond the schema, though it doesn't mention error handling or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: three sentences, each serving a distinct purpose (scope, units/presets, orientation/behavior). No filler or redundant content; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is remarkably complete for a 9-parameter tool. It covers the core purpose, scope, unit system, preset options, orientation effect, and mutation semantics, making it self-sufficient for an agent to select and invoke.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all 9 parameters (100% coverage), so the baseline is 3. The description adds meaningful value by explaining pageSize presets and explicit dimensions, margin units in points, orientation semantics, and tab defaulting behavior, enriching the parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Set document-level page setup') and scope ('for a doc (or tab)'), while explicitly distinguishing from the sibling tool set_style ('which set_style can’t reach'). This makes the tool's purpose unambiguous and differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear context for when to use this tool by referencing 'the File > Page setup controls' and directly contrasting it with set_style. It doesn't explicitly say when NOT to use it, but the exclusion of the alternative is strongly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_project_defaultSet this project’s default account/folderA
Write this project’s defaults to a .gdocs-mcp.json in the current working directory (or update an existing one up the tree). Set a default account and/or a default folder (URL or id) for new docs. To set a folder by name, find it first with drive({ cmd: 'find' }) and pass its id.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | default Drive folder (URL or id) for new docs | |
| account | No | default Google account email (must be authorized) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite having no annotations, the description discloses the important side effect: writing to `.gdocs-mcp.json` in the current working directory or updating an existing file up the tree. It also clarifies that these are defaults for new docs, which adds meaningful behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with key information front-loaded. The first sentence captures the core behavior, and the follow-ups add useful parameter semantics without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool, the description covers the main side-effect, file location, scope, and folder-id resolution workflow. It does not explicitly say what happens to existing defaults when a parameter is omitted, but overall completeness is good.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema already documents both parameters at 100% coverage, the description adds valuable semantics: folder can be a URL or id, and account must be an authorized Google account email. The folder-by-name workaround also adds practical parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool writes project defaults to a `.gdocs-mcp.json` file, with a default account and/or folder for new docs. This distinguishes it from sibling tools like `get_project_config` and other set-style tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains when the defaults apply (new docs), and gives concrete workaround for setting a folder by name via `drive({ cmd: 'find' })` and passing its id. It does not explicitly mention when to avoid using this tool or name alternatives, but the use case is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_styleStyle text in a docA
Apply styling to existing text in place (no content change), the way you select text in Docs and apply formatting. Pick ONE target: from (+ optional to) to style a selection — from the start of the unique from snippet to the end of the unique to snippet (omit to to style just from); or whole_document: true to style the entire doc/tab (e.g. one font throughout, without per-paragraph calls). Styles: bold/italic/underline/strikethrough, color (hex), fontSize (pt), fontFamily, link, paragraph alignment, and paragraph spacing (spaceBefore/spaceAfter in pt, lineSpacing %). Use get_style first to read current spacing/fonts. Prefer this over rewriting the text with edit_doc and a <span style="…">: that also works, but it makes you restate the whole run, and retyping text is how text gets silently dropped. NOTE: a direct style change, not a tracked suggestion.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | optional end anchor: a unique snippet; styles the whole span from the start of `from` to the end of `to` (a selection). Must appear after `from`. | |
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| from | No | start anchor: a unique text snippet to style from (quote a slice from read_doc). Required unless whole_document is set. | |
| page | No | which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists. | |
| style | Yes | styles to apply | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| segment | No | which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there. | |
| documentId | Yes | Google Doc id | |
| whole_document | No | style the entire document (or tab, or the targeted header/footer) instead of a selection — e.g. to set one font throughout. Mutually exclusive with from/to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that this is a 'direct style change, not a tracked suggestion', which is a key behavioral trait. It also clarifies the span semantics for from/to and the in-place (non-content) nature. However, it does not address failure modes (e.g., non-unique snippet) or reversibility, which would further enhance transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, targeting rules, style list, workflow hint, alternative comparison, and behavioral note. It is front-loaded with the primary action and uses clear structure (semicolons separating the two targeting modes). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with a nested style object and no output schema, the description plus the rich input schema cover the necessary context. It adds sequencing (get_style first) and behavior (direct vs suggestion). It does not explicitly mention segment/page/tab targeting, but those are fully described in the schema, so the description does not need to repeat them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics: the from/to span definition ('from the start of the unique from snippet to the end of the unique to snippet'), the mutual exclusivity with whole_document, and a summary of style properties with units (hex, pt, %). This goes beyond the schema's per-parameter hints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Apply styling to existing text in place (no content change)'. It clearly distinguishes itself from sibling tools by contrasting with edit_doc ('Prefer this over rewriting the text with edit_doc'), and the 'no content change' phrase uniquely scopes the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: 'Use get_style first to read current spacing/fonts' and 'Prefer this over rewriting the text with edit_doc'. It also explains the two targeting modes (selection vs whole_document) and notes that retyping text risks silent drops, giving a clear when-to-use rationale.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_table_styleStyle an existing tableA
Edit style/layout of an existing table (located by any cell’s text): cell padding (pt), background color (hex), cell borders, column widths (pt), and pinned header rows. scope selects which cells padding/background/border hit — table (default), row, column, or cell (the row/column of the matched cell). Fixes e.g. thin left padding that clips the first letter of cells; border {width:0} makes a table borderless; headerRows repeats the top rows on every page. A direct edit, not a tracked suggestion.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Target a specific tab by tabId or title (from list_tabs). Defaults to the first tab. | |
| cell | Yes | text of any cell in the target table (locates the table) | |
| page | No | which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists. | |
| scope | No | default table | |
| border | No | cell borders, over the same scope as padding/background | |
| account | No | Google account email to use. Defaults to GDOCS_DEFAULT_ACCOUNT, or the sole account. | |
| padding | No | cell padding in points | |
| segment | No | which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there. | |
| documentId | Yes | ||
| headerRows | No | repeat the top N rows on every page (Docs’ "pin header rows"); 0 unpins. Independent of scope. | |
| columnWidths | No | set specific column widths (points) by column index | |
| backgroundColor | No | hex, e.g. #f1f3f4 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. It discloses that this is a 'direct edit, not a tracked suggestion' — a key behavioral trait. It also clarifies two important edge behaviors: border width 0 makes the table borderless, and headerRows repeats rows on every page. It does not explicitly mention permission requirements or irreversible overwrites, but the direct-edit caveat provides significant transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, front-loaded with the primary purpose, and every sentence contributes information: the first lists the editable properties, the second clarifies scope semantics, and the third provides concrete examples and the direct-edit caveat. There is no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 12 parameters, nested objects, and no output schema, the description covers the essential context: what the tool does, how scope works, and key behavioral caveats. It does not explain every parameter (the schema handles that), but it gives enough operational context for an agent to use it correctly. Minor gaps like ambiguous table matches or error handling are not addressed, but they are not critical for selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema has high parameter coverage (92%), the description adds meaning beyond the schema. It explains that 'scope selects which cells padding/background/border hit' and elaborates the options (table, row, column, or cell of the matched cell), which the schema only labels as 'default table'. It also gives a practical implication for padding (clipping first letter) and border width, adding contextual value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Edit') with a clear resource ('style/layout of an existing table') and enumerates the exact style properties (padding, background color, borders, column widths, pinned header rows). It also explains how the table is located (by any cell's text), which distinguishes it from generic style tools like set_style or read-style tools like get_table_style.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool — when you need to edit a table's style or layout — and even provides a concrete use-case ('Fixes e.g. thin left padding that clips the first letter of cells'). However, it does not explicitly name alternatives or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
6 tool updates
v0.6.0- Removed
copy_doc - Removed
create_folder - Added
drive - Removed
list_folder - Removed
search_drive - Removed
update_doc
16 tool updates
v0.5.0- Changed
apply_suggestions2 fields changed- added
Input schema / properties / pageAdded value: +{ + "description": "which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists.", + "enum": [ + "default", + "first", + "even" + ], + "type": "string" +} - added
Input schema / properties / segmentAdded value: +{ + "description": "which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there.", + "enum": [ + "body", + "header", + "footer" + ], + "type": "string" +}
- Added
copy_doc - Added
create_folder - Changed
edit_doc2 fields changed- added
Input schema / properties / pageAdded value: +{ + "description": "which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists.", + "enum": [ + "default", + "first", + "even" + ], + "type": "string" +} - added
Input schema / properties / segmentAdded value: +{ + "description": "which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there.", + "enum": [ + "body", + "header", + "footer" + ], + "type": "string" +}
- Changed
edit_table2 fields changed- added
Input schema / properties / pageAdded value: +{ + "description": "which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists.", + "enum": [ + "default", + "first", + "even" + ], + "type": "string" +} - added
Input schema / properties / segmentAdded value: +{ + "description": "which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there.", + "enum": [ + "body", + "header", + "footer" + ], + "type": "string" +}
- Added
export_doc - Changed
get_style2 fields changed- added
Input schema / properties / pageAdded value: +{ + "description": "which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists.", + "enum": [ + "default", + "first", + "even" + ], + "type": "string" +} - added
Input schema / properties / segmentAdded value: +{ + "description": "which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there.", + "enum": [ + "body", + "header", + "footer" + ], + "type": "string" +}
- Added
get_table_style - Added
insert_content - Changed
insert_image5 fields changed- added
Input schema / properties / baseDirAdded value: +{ + "description": "absolute dir to resolve a relative local `uri` against", + "type": "string" +} - added
Input schema / properties / createSegmentAdded value: +{ + "description": "when segment is header/footer and the doc has none, create it first (the letterhead case). Only the default header/footer can be created via the API.", + "type": "boolean" +} - added
Input schema / properties / pageAdded value: +{ + "description": "which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists.", + "enum": [ + "default", + "first", + "even" + ], + "type": "string" +} - added
Input schema / properties / segmentAdded value: +{ + "description": "which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there.", + "enum": [ + "body", + "header", + "footer" + ], + "type": "string" +} - changed
Input schema / properties / uri / descriptionPrevious value: -"public image URL"New value: +"public image URL, or a path to a local image file (absolute, or relative to baseDir)"
- Changed
insert_table4 fields changed- added
Input schema / properties / alignAdded value: +{ + "description": "per-column text alignment, e.g. [\"left\",\"right\"]; null or \"left\" leaves a column at the default", + "items": { + "anyOf": [ + { + "enum": [ + "left", + "center", + "right", + "justify" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "type": "array" +} - added
Input schema / properties / createSegmentAdded value: +{ + "description": "when segment is header/footer and the doc has none, create it first. Only the default header/footer can be created via the API.", + "type": "boolean" +} - added
Input schema / properties / pageAdded value: +{ + "description": "which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists.", + "enum": [ + "default", + "first", + "even" + ], + "type": "string" +} - added
Input schema / properties / segmentAdded value: +{ + "description": "which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there.", + "enum": [ + "body", + "header", + "footer" + ], + "type": "string" +}
- Changed
list_suggestions2 fields changed- added
Input schema / properties / pageAdded value: +{ + "description": "which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists.", + "enum": [ + "default", + "first", + "even" + ], + "type": "string" +} - added
Input schema / properties / segmentAdded value: +{ + "description": "which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there.", + "enum": [ + "body", + "header", + "footer" + ], + "type": "string" +}
- Changed
read_doc2 fields changed- added
Input schema / properties / pageAdded value: +{ + "description": "which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists.", + "enum": [ + "default", + "first", + "even" + ], + "type": "string" +} - added
Input schema / properties / segmentAdded value: +{ + "description": "content tree to read (default body)", + "enum": [ + "body", + "header", + "footer", + "all" + ], + "type": "string" +}
- Changed
set_style3 fields changed- added
Input schema / properties / pageAdded value: +{ + "description": "which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists.", + "enum": [ + "default", + "first", + "even" + ], + "type": "string" +} - added
Input schema / properties / segmentAdded value: +{ + "description": "which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there.", + "enum": [ + "body", + "header", + "footer" + ], + "type": "string" +} - changed
Input schema / properties / whole_document / descriptionPrevious value: -"style the entire document (or tab) instead of a selection — e.g. to set one font throughout. Mutually exclusive with from/to."New value: +"style the entire document (or tab, or the targeted header/footer) instead of a selection — e.g. to set one font throughout. Mutually exclusive with from/to."
- Changed
set_table_style4 fields changed- added
Input schema / properties / borderAdded value: +{ + "additionalProperties": false, + "description": "cell borders, over the same scope as padding/background", + "properties": { + "color": { + "description": "hex, e.g. #cccccc (default #000000)", + "type": "string" + }, + "dashStyle": { + "enum": [ + "SOLID", + "DOT", + "DASH" + ], + "type": "string" + }, + "sides": { + "description": "which edges to set (default all four)", + "items": { + "enum": [ + "top", + "bottom", + "left", + "right" + ], + "type": "string" + }, + "type": "array" + }, + "width": { + "description": "points; 0 hides the border (borders cannot be transparent)", + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / headerRowsAdded value: +{ + "description": "repeat the top N rows on every page (Docs’ \"pin header rows\"); 0 unpins. Independent of scope.", + "type": "number" +} - added
Input schema / properties / pageAdded value: +{ + "description": "which header/footer, when a doc defines more than one (default-page, first-page, even-page). Omit to use whichever exists.", + "enum": [ + "default", + "first", + "even" + ], + "type": "string" +} - added
Input schema / properties / segmentAdded value: +{ + "description": "which content tree to target: body (default), or the page header/footer. Header/footer content is invisible to a body read — a letterhead logo lives there.", + "enum": [ + "body", + "header", + "footer" + ], + "type": "string" +}
- Changed
unshare_doc5 fields changed- added
Input schema / properties / email / descriptionAdded value: +"person or group to revoke; omit when using permissionId" - added
Input schema / properties / expectRoleAdded value: +{ + "description": "REQUIRED — the grant's current role as list_permissions reported it (reader/commenter/writer). Verified first: if it changed since you looked, nothing is removed. Revoking leaves no record anywhere, so this makes you look before you cut.", + "type": "string" +} - added
Input schema / properties / expectTitleAdded value: +{ + "description": "the doc’s title; verified before revoking so a wrong id is refused", + "type": "string" +} - added
Input schema / properties / permissionIdAdded value: +{ + "description": "id from list_permissions — the only way to revoke a domain or anyone-with-link grant", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "documentId", - "email" -]New value: +[ + "documentId", + "expectRole" +]
31 tool updates
v0.1.1- First observed
add_comment - First observed
add_tab - First observed
apply_suggestions - First observed
create_doc - First observed
delete_tab - First observed
download_images - First observed
edit_doc - First observed
edit_table - First observed
get_page_setup - First observed
get_project_config - First observed
get_style - First observed
insert_image - First observed
insert_table - First observed
list_accounts - First observed
list_comments - First observed
list_folder - First observed
list_permissions - First observed
list_suggestions - First observed
list_tabs - First observed
overwrite_doc - First observed
read_doc - First observed
rename_tab - First observed
resolve_comment - First observed
search_drive - First observed
set_page_setup - First observed
set_project_default - First observed
set_style - First observed
set_table_style - First observed
share_doc - First observed
unshare_doc - First observed
update_doc
TDQS
Every tool targets a distinct action or resource: read/write pairs (get_style/set_style), content operations (edit_doc, insert_content, overwrite_doc) are clearly differentiated, table style vs structure tools are separate, and sharing/tab/drive tools are unique. No two tools appear to do the same thing.
Tool names follow a consistent verb_noun pattern (get_, set_, list_, read_, edit_, insert_, export_, overwrite_, share_, etc.). The only exception is 'drive' but it's a command-style tool; all others are predictable and consistent.
32 tools is well above the typical well-scoped range (3-15). While the server covers many aspects of Google Docs, the sheer number, including many read/write pairs, makes the surface feel bloated; many tools could be consolidated or the scope narrowed.
The tool set is nearly comprehensive for document management: create, read, edit, style, insert, export, suggestions, comments, permissions, tabs, and Drive navigation are all covered. However, there is no delete_doc tool (Drive explicitly has no rm), leaving a notable gap in lifecycle coverage.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
An MCP server that gives your AI access to the source code and docs of all public github repos
An agent-first office suite Claude & ChatGPT read and write over one MCP URL.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP (Multi-Agent Conversation Protocol) Server that enables AI agents to interact with Google Docs via natural language, automatically generated using AG2's MCP builder.-
- AlicenseNot gradedqualityDmaintenanceAn unofficial MCP server for Google Docs that lets large language models securely access, read, and interact with documents, enabling smarter workflows and AI-assisted editing.12MIT
- AlicenseNot gradedqualityDmaintenanceA powerful Model Context Protocol (MCP) server implementation for seamless Google Docs API integration, enabling AI assistants to create, read, update, and manage Google Docs.12MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI assistants to interact with Google Docs, Sheets, and Drive using the user's own Google account.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dasasian/gdocs-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server