Agent-Native Calendar
Agent-Native Google Calendar - manage events, sync, and public booking
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
MCP server for Google Docs with verified writes — every mutation returns before/after proof.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
VERIFIED_GOOGLEDOCS_MCP_CREDENTIALS, VERIFIED_GOOGLEDOCS_MCP_AUDIT_EXCERPTSต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"verified-googledocs": {
"command": "uvx",
"args": [
"verified-googledocs-mcp"
],
"env": {
"VERIFIED_GOOGLEDOCS_MCP_CREDENTIALS": "ใส่ค่าของคุณ",
"VERIFIED_GOOGLEDOCS_MCP_AUDIT_EXCERPTS": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add verified-googledocs --env VERIFIED_GOOGLEDOCS_MCP_CREDENTIALS='ใส่ค่าของคุณ' --env VERIFIED_GOOGLEDOCS_MCP_AUDIT_EXCERPTS='ใส่ค่าของคุณ' -- uvx verified-googledocs-mcpเติมค่าที่เว้นว่างไว้ก่อนรัน
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"verified-googledocs": {
"command": "uvx",
"args": [
"verified-googledocs-mcp"
],
"env": {
"VERIFIED_GOOGLEDOCS_MCP_CREDENTIALS": "ใส่ค่าของคุณ",
"VERIFIED_GOOGLEDOCS_MCP_AUDIT_EXCERPTS": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"verified-googledocs": {
"type": "stdio",
"command": "uvx",
"args": [
"verified-googledocs-mcp"
],
"env": {
"VERIFIED_GOOGLEDOCS_MCP_CREDENTIALS": "ใส่ค่าของคุณ",
"VERIFIED_GOOGLEDOCS_MCP_AUDIT_EXCERPTS": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
VERIFIED_GOOGLEDOCS_MCP_CREDENTIALS envVERIFIED_GOOGLEDOCS_MCP_AUDIT_EXCERPTS envค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 7 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub michaelrobertsutton ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.1.0) เข้า registry 5 เดือนที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Python (uv) ในเครื่องด้วย
ในหมวดเดียวกันมี Agent-Native Calendar, Excel MCP Server, MCP Server for Excel
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
Agent-Native Google Calendar - manage events, sync, and public booking
ให้ AI สร้างและแก้ไฟล์ Excel ได้เอง ทั้งสูตร กราฟ และ PivotTable โดยไม่ต้องมีโปรแกรม Excel ในเครื่อง
Excel automation for AI - Sheets, Power Query, DAX, VBA, Tables, Ranges and more. Windows only.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
An MCP server for Google Docs whose writes carry proof. Every mutating tool re-reads the affected content from the document after it writes and returns evidence of what actually changed: before/after excerpts, the match count, and the document revision before and after. A tool never reports success for an edit that did not land.
Status: all 20 tools are implemented, covered by an offline unit suite, and exercised against the real Google Docs and Drive APIs by the live test suite. The original fourteen passed the formal live acceptance gate; the gate is rerun before each release. Install with
uvx verified-googledocs-mcp. See Status.
Driving Google Docs from an agent through a general Workspace MCP server tends to fail in quiet, expensive ways:
findAndReplace meant for one tab silently edits every tab in the document.Each of these has a procedural workaround: tell the agent to scope to a tab, retry with normalized quotes, re-read after every write, never trust a resolve result. Those instructions work until someone forgets one. This server moves the discipline into the protocol, where it is deterministic.
Every mutating tool runs the same pipeline: read the tab, locate the target, apply the edit under a revision precondition, read the tab again, and return evidence built from the second read. The return value is a claim about the document's state *after* the call, backed by a server-side re-read, not an echo of the API response.
// replace_text(doc_id, tab_id, find="teh", replace="the", expected_matches=1)
{ "applied": true, "match_count": 1, "rung": "exact", // which normalization rung matched "before": "...±200 chars around the edit, pre-write...", "after": "...the same span, re-read after the write...", "revision_before": "ALm37BX...", "revision_after": "ALm37Cy...", "audit_logged": true }
When something is wrong, the tool fails loud and *diagnosed*, with a typed error the agent can act on in one round trip rather than guessing:
{
"error_code": "MATCH_COUNT_MISMATCH", "message": "expected 1 match(es) but found 3 at rung 'exact'", "diagnostics": { "expected": 1, "actual": 3, "spans": [ /* every location */ ] }, "retryable": false }
tab_id. There is no whole-document replace, so a one-tab edit can never leak into a cover letter or an appendix tab.expected_matches defaults to 1. If the real count differs, the tool makes no edit and returns every match location.writeControl.requiredRevisionId from the pre-read, so a document that changed underneath the operation is rejected by the API rather than edited blind. Section ranges from find_sections are stamped with the revision they were computed at and refuse to apply once stale.audit_logged: false).The guarantee is not one universal payload — it is a per-family invariant. Each family re-reads the document after the write and proves the property that family is responsible for. Every mutating tool also carries revision_before, revision_after, and audit_logged.
| Family | Tools | Proves |
|---|---|---|
| Text edit | replace_text | match_count equals expected_matches; rung names the normalization pass that matched; before/after are ±200-char excerpts of the edited span, the after re-read post-write |
| Style edit | format_text | runs_before/runs_after — the actual textRun style flags overlapping each matched span, not a text diff; content_mutated: false proven by compiled_request_kinds containing only updateTextStyle; style_mutated false on an idempotent re-run (no write is issued) |
| Markdown range | replace_range_markdown, replace_tab_markdown, append_markdown | structural_match (the written markdown round-trips — including list nesting depth, ordered-vs-unordered, and link targets), input_blocks vs post_blocks counts, and a structural_diff list naming any mismatch; every response also carries write_status (not_written / written_unverified / written_verified) and retry_safe |
| Structural | insert_image | inline_object_confirmed — a post-write scan found the inline object at the anchor paragraph |
| Comment state | add_anchored_comment, reply_to_comment, resolve_comment | the re-queried resolved flag, reply_count, content, quoted_text, and author — a resolve that didn't land returns COMMENT_STILL_OPEN, never success |
| Table | replace_table_row, insert_table | replace_table_row: row_before/row_after re-read with cells_match; insert_table: table_confirmed plus the confirmed dimensions and first_row |
The read and sync tools (read_document, list_tabs, find_sections, list_open_items, get_comment_thread, diff_tab_vs_file, list_tables, get_table) make no changes and carry no applied/evidence payload. export_pdf is also a read/export tool in this sense — it returns file facts (bytes_written, sha256, page_count) rather than an applied key, since nothing in the document changes.
Eight mutating tools (replace_text, format_text, replace_range_markdown, replace_tab_markdown, append_markdown, insert_image, replace_table_row, insert_table) accept dry_run=true. No API write is issued; the response carries applied: false, an empty revision_after (no write, so no new revision), audit_logged: false, and — for replace_text — a predicted after excerpt computed by splicing the replacement into the pre-read, or — for format_text — a predicted runs_after computed by overlaying the requested style onto the pre-read runs. format_text additionally never issues a write at all when the matched text already carries every requested style value, dry run or not — that's the tool's normal idempotent no-op path, not specific to dry_run. For replace_table_row and insert_table, dry_run is authoritative for index validity: the same assembled request list is index-simulated whether dry_run is true or false, so a passing dry run always means the real write will pass too. Use it to confirm a locate resolves to the right span before committing the edit.
For the three markdown tools, dry_run is *also* authoritative for structure prediction (issue #65): before any batchUpdate, the compiled requests' own predicted block structure — nesting, ordered-vs-unordered, headings, tables — is compared against the parsed input markdown, identically in dry_run and the real write. A mismatch refuses with STRUCTURE_PREDICTION_FAILED *before* the document is touched, rather than mutating it and only then discovering post-write verification would have failed. Every response from these three tools — dry run, refused, or written — carries write_status, one of not_written (dry run, or a pre-flight refusal: INDEX_SIMULATION_FAILED, STRUCTURE_PREDICTION_FAILED, or the structural-loss guardrail), written_unverified (a batchUpdate was sent and accepted, but the post-write re-read did not confirm it matched — VERIFICATION_FAILED), or written_verified (confirmed) — plus a retry_safe boolean (false only for written_unverified, since a caller that retries a call whose mutation status is unconfirmed risks a second mutation on top of an unconfirmed first one; there is no automatic rollback — Docs has no revision-restore endpoint, and a compensating markdown rewrite would itself be lossy, so needs_manual_restore: true still means restoring from Docs version history). write_status/retry_safe are additive: the pre-existing applied field keeps its documented meaning unchanged.
All eight require a suggestion-free target tab. Every mutating tool computes its write indices against a suggestionsViewMode=PREVIEW_WITHOUT_SUGGESTIONS read, but the actual write always lands in the document's real index space, which includes pending suggestions. If the target tab has a pending suggested insertion or deletion, those two index spaces diverge and a write would land at the wrong offset — so every mutating tool refuses with SUGGESTIONS_PRESENT instead (both in dry_run and live), rather than risking a silent, wrong-offset write (issue #56). Accept or reject the pending suggestion in the Docs UI first, then retry.
Twenty focused tools, each described by *when* to reach for it, replace the slice of a 150-tool Workspace server that document workflows actually use.
| Tool | What it does |
|---|---|
read_document | Read a tab as markdown, as structured positions and style runs, or as a headings-only outline |
list_tabs | List tab IDs, titles, and nesting |
find_sections | Find headings and return their ranges, stamped with the document revision |
list_tables | List every top-level table in a tab, with position, size, and preceding-heading context |
get_table | Read one table's full cell grid |
| Tool | What it does |
|---|---|
replace_text | Find/replace within a tab, with the normalization ladder and match guard |
format_text | Apply bold/italic/underline to a matched text span via updateTextStyle only — no content mutation, safe inside merged-cell tables |
replace_range_markdown | Replace a section range with markdown |
replace_tab_markdown | Replace a whole tab's content with markdown |
append_markdown | Append markdown to a tab |
insert_image | Insert an image at a quoted anchor or heading |
replace_table_row | Overwrite one row of an existing table with plain-text cells, in place |
insert_table | Insert a new table populated from rows, anchored like insert_image |
| Tool | What it does |
|---|---|
list_open_items | Open comments and pending suggested edits; pass tab_id or include_all_tabs=true |
get_comment_thread | Read a comment's full reply chain |
add_anchored_comment | Add a comment anchored to quoted text |
reply_to_comment | Reply to a comment |
| `resolve_co
ตัดมาแค่ช่วงต้น อ่านต่อใน repo