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.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 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": "your-value",
"VERIFIED_GOOGLEDOCS_MCP_AUDIT_EXCERPTS": "your-value"
}
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add verified-googledocs --env VERIFIED_GOOGLEDOCS_MCP_CREDENTIALS=your-value --env VERIFIED_GOOGLEDOCS_MCP_AUDIT_EXCERPTS=your-value -- uvx verified-googledocs-mcp실행하기 전에 빈 값을 채워 주세요.
프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"verified-googledocs": {
"command": "uvx",
"args": [
"verified-googledocs-mcp"
],
"env": {
"VERIFIED_GOOGLEDOCS_MCP_CREDENTIALS": "your-value",
"VERIFIED_GOOGLEDOCS_MCP_AUDIT_EXCERPTS": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"verified-googledocs": {
"type": "stdio",
"command": "uvx",
"args": [
"verified-googledocs-mcp"
],
"env": {
"VERIFIED_GOOGLEDOCS_MCP_CREDENTIALS": "your-value",
"VERIFIED_GOOGLEDOCS_MCP_AUDIT_EXCERPTS": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
VERIFIED_GOOGLEDOCS_MCP_CREDENTIALS envVERIFIED_GOOGLEDOCS_MCP_AUDIT_EXCERPTS env이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 8일 점검
레지스트리 이름이 GitHub 계정 michaelrobertsutton 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.1.0)은 5개월 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Python (uv)도 있어야 해요.
같은 카테고리에는: Agent-Native Calendar, Excel MCP Server, MCP Server for Excel
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
Agent-Native Google Calendar - manage events, sync, and public booking
Create and edit Excel files with AI: charts, PivotTables, formulas. No Excel needed.
Excel automation for AI - Sheets, Power Query, DAX, VBA, Tables, Ranges and more. Windows only.
제작자의 저장소에서 쓰인 그대로 가져왔어요. 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
앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요