{"name":"io.github.dasasian/gdocs-mcp","slug":"dasasian-gdocs-mcp","title":null,"description":"Treat a Google Doc like a local file: content editing, tracked-changes review, comments, tables.","url":"https://mcp.market/server/dasasian-gdocs-mcp","rating":null,"grade":"A","score":91,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":27,"stars":0,"forks":0,"downloads_week":56,"last_push_at":"2026-09-01T23:20:26.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/dasasian/gdocs-mcp","website":"https://dasasian.com/gdocs-mcp","version":"0.6.0","remotes":[],"packages":[{"registryType":"npm","identifier":"@dasasian/gdocs-mcp","version":"0.6.0","transport":{"type":"stdio"}}],"tools":[{"name":"add_comment","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_tab","description":"Add a new tab to a Google Doc. Returns the new tabId. Optionally set position (index) and parent tab for nesting.","write_action":false,"price_micros":0,"input_schema":null},{"name":"apply_suggestions","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_doc","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_tab","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"download_images","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"drive","description":"Navigate and reorganise Google Drive with shell commands: ls, find, mkdir, cp, mv. Arguments are positional and follow the usual shell forms.","write_action":false,"price_micros":0,"input_schema":null},{"name":"edit_doc","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"edit_table","description":"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`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_doc","description":"Export a Google Doc to a real file on disk \\u2014 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_page_setup","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_project_config","description":"Show the effective .gdocs-mcp.json defaults (account/folder) for the current working directory, and where the file is.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_style","description":"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 thing","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_table_style","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"insert_content","description":"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\\u2019t reach: adding a paragraph after a table that ends the doc (a table\\u2019s cells can\\u2019t anchor an insert outside the table, and the trailing empty paragraph has no te","write_action":true,"price_micros":0,"input_schema":null},{"name":"insert_image","description":"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 direc","write_action":true,"price_micros":0,"input_schema":null},{"name":"insert_table","description":"Insert a rows×columns table, optionally populated from a 2D array of cell text — cell text may use inline markdown (**bold**, *italic*, `code`, [links](url)). Per-column alignment via align. Position via at (top/end/or a unique text anchor, default end). A direct edit, not a tracked suggestion.","write_action":true,"price_micros":0,"input_schema":null},{"name":"list_accounts","description":"List the Google accounts that have been authorized for this server.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_comments","description":"List comments on a Google Doc (author display name, quoted text, body, resolved status, replies). Author email is not available via the Drive API.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_permissions","description":"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> (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 c","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_suggestions","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_tabs","description":"List the tabs in a Google Doc (tabId, title, index, nesting).","write_action":false,"price_micros":0,"input_schema":null},{"name":"overwrite_doc","description":"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 s","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_doc","description":"Read a Google Doc as markdown + inline HTML. mode: clean (committed text, default) · tracked (suggestions shown as <ins>/<del>) · 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 ","write_action":false,"price_micros":0,"input_schema":null},{"name":"rename_tab","description":"Rename a tab by tabId.","write_action":false,"price_micros":0,"input_schema":null},{"name":"resolve_comment","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_page_setup","description":"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 sug","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_project_default","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"set_style","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_table_style","description":"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 tabl","write_action":false,"price_micros":0,"input_schema":null},{"name":"share_doc","description":"Grant access to a Google Doc. With `email`, share with that person as reader/commenter/writer (optionally sending a notification). Without `email`, set anyone-with-link access to that role, or role \"none\" to disable link sharing. (To revoke a specific person’s access, use unshare_doc.)","write_action":false,"price_micros":0,"input_schema":null},{"name":"unshare_doc","description":"Revoke a grant on a Google Doc. Pass `email` for a person or a group. A grant with no email — a domain-wide grant, or anyone-with-link — has no email to pass, so address it by `permissionId` from list_permissions (run that first; it also tells you the role you are about to remove). Refuses to touch the owner. `expectRole` is REQUIRED — run list_permissions first and echo the role back; a permissio","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":91,"grade":"A","scanned_at":"2026-09-22T05:13:27.666Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-22T05:13:27.697Z","components":{"code":{"score":25,"max":25,"notes":["27 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 20 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@dasasian/gdocs-mcp","version":"0.6.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":5,"publishedAt":"2026-08-21T15:56:59.027Z","repositoryUrl":"git+https://github.com/dasasian/gdocs-mcp.git","weeklyDownloads":56}],"repo":{"found":true,"owner":"dasasian","repo":"gdocs-mcp","archived":false,"pushedAt":"2026-09-01T23:20:26Z","stars":0,"forks":0,"openIssues":11,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/267760055?v=4","ownerCreatedAt":"2026-03-12T20:19:14Z","license":"MIT"},"icon":{"url":"https://dasasian.com/favicon.svg","source":"site"},"presence":{"stars":0,"forks":0,"downloadsWeek":56,"license":"MIT","lastPushAt":"2026-09-01T23:20:26.000Z","score":27}}}},"grade_history":[],"reviews":[]}