{"id":"e6a68b33-c0a2-4658-a71a-8f4980156ff7","entityType":"agent","slug":"clawhub-chrischall-gogcli-mcp-gmail","name":"gogcli-mcp-gmail","canonicalUrl":"https://www.xpersona.co/agent/clawhub-chrischall-gogcli-mcp-gmail","canonicalPath":"/agent/clawhub-chrischall-gogcli-mcp-gmail","generatedAt":"2026-10-09T22:49:33.399Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T09:16:32.151Z","emptyReason":null},"description":"Use when the user asks to read, organize, draft, forward, autoreply, or otherwise work with Gmail in depth. Triggers for requests involving threads, labels, drafts, attachments, bulk archive/trash/mark-read operations, forwarding messages, or any Gmail operation beyond simple search/get/send. Includes auth and Gmail tools only.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 3.2K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:gogcli-mcp-gmail","sourceUrl":"https://clawhub.ai/chrischall/gogcli-mcp-gmail","homepage":"https://clawhub.ai/chrischall/skills/gogcli-mcp-gmail","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/chrischall/gogcli-mcp-gmail","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/chrischall/skills/gogcli-mcp-gmail","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":70,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"gogcli-mcp-gmail technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T09:16:32.151Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T09:16:32.151Z","emptyReason":null},"stars":null,"forks":null,"downloads":3187,"packageName":null,"latestVersion":"4.7.0","tractionLabel":"3.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T09:16:32.151Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T09:16:32.151Z","lastCrawledAt":"2026-10-09T09:16:32.151Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T09:16:32.151Z","lastVerifiedAt":null,"highlights":[{"version":"4.7.0","createdAt":"2026-10-07T13:40:37.242Z","changelog":"- Removed the skill README file (skill-card.md). - Updated distribution files and package metadata. - No changes to functionality or toolset.","fileCount":22,"zipByteSize":492243},{"version":"4.6.3","createdAt":"2026-10-05T16:45:10.671Z","changelog":"- Internal documentation file skill-card.md removed. - No user-facing features or tool changes. - Manifest and distribution files updated for version 4.6.3.","fileCount":22,"zipByteSize":491824},{"version":"4.6.2","createdAt":"2026-10-05T02:55:09.369Z","changelog":"- Updated build and metadata files: dist/index.js, manifest.json, package.json. - Removed the skill-card.md file. - No changes to tool functionality or documentation in SKILL.md.","fileCount":22,"zipByteSize":491819},{"version":"4.6.1","createdAt":"2026-10-03T01:46:21.415Z","changelog":"- Maintenance update: documentation file removed. - Removed redundant skill-card.md file. - No changes to functionality or features.","fileCount":22,"zipByteSize":490788},{"version":"4.6.0","createdAt":"2026-10-02T12:21:45.450Z","changelog":"- Updated package and manifest files for version 4.6.0. - Minor maintenance updates to core distribution files. - Removed the skill-card.md file. - No user-facing feature or tool changes.","fileCount":22,"zipByteSize":488573},{"version":"4.5.2","createdAt":"2026-09-28T05:20:53.486Z","changelog":"- Added a maximum value (10 MiB) clamp for the `inlineMaxBytes` parameter in the `gog_gmail_attachment` tool, preventing larger values. - Updated documentation to reflect the new attachment size limit and clarify parameter behavior. - Removed outdated `skill-card.md` file. - Various documentation and test updates for clarity and accuracy.","fileCount":22,"zipByteSize":488509},{"version":"4.5.1","createdAt":"2026-09-25T15:42:04.649Z","changelog":"- Added new test file: `tests/tools/gmail-extra-gates.test.ts`. - Updated several files, including `dist/index.js`, `manifest.json`, `package.json`, `src/tools/gmail-extra.ts`, and existing tests for Gmail tools. - Removed deprecated documentation file: `skill-card.md`. - No user-facing feature changes. This release focuses on internal testing and maintenance.","fileCount":22,"zipByteSize":485394},{"version":"4.5.0","createdAt":"2026-09-24T15:24:16.776Z","changelog":"- Removed the skill-card.md documentation file. - Updated dependencies and build outputs (dist/index.js, package.json). - No changes to tool functions or SKILL.md content (feature set remains the same). - Minor test updates (tests/tools/gmail-confirm-token.test.ts) for maintenance and compatibility.","fileCount":21,"zipByteSize":479371}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:gogcli-mcp-gmail","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:gogcli-mcp-gmail` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/chrischall/gogcli-mcp-gmail before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-gogcli-mcp-gmail/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-gogcli-mcp-gmail/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-gogcli-mcp-gmail/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-gogcli-mcp-gmail/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-gogcli-mcp-gmail/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-gogcli-mcp-gmail/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T22:49:33.394Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-gogcli-mcp-gmail/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-gogcli-mcp-gmail/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-gogcli-mcp-gmail/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-gogcli-mcp-gmail/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T09:16:32.151Z","emptyReason":null},"readme":"Skill: gogcli-mcp-gmail\n\nOwner: chrischall\n\nSummary: Use when the user asks to read, organize, draft, forward, autoreply, or otherwise work with Gmail in depth. Triggers for requests involving threads, labels, drafts, attachments, bulk archive/trash/mark-read operations, forwarding messages, or any Gmail operation beyond simple search/get/send. Includes auth and Gmail tools only.\n\nTags: latest:4.7.0\n\nVersion history:\n\nv4.7.0 | 2026-10-07T13:40:37.242Z | auto\n\n- Removed the skill README file (skill-card.md).\n- Updated distribution files and package metadata.\n- No changes to functionality or toolset.\n\nv4.6.3 | 2026-10-05T16:45:10.671Z | auto\n\n- Internal documentation file skill-card.md removed.\n- No user-facing features or tool changes.\n- Manifest and distribution files updated for version 4.6.3.\n\nv4.6.2 | 2026-10-05T02:55:09.369Z | auto\n\n- Updated build and metadata files: dist/index.js, manifest.json, package.json.\n- Removed the skill-card.md file.\n- No changes to tool functionality or documentation in SKILL.md.\n\nv4.6.1 | 2026-10-03T01:46:21.415Z | auto\n\n- Maintenance update: documentation file removed.\n- Removed redundant skill-card.md file.\n- No changes to functionality or features.\n\nv4.6.0 | 2026-10-02T12:21:45.450Z | auto\n\n- Updated package and manifest files for version 4.6.0.\n- Minor maintenance updates to core distribution files.\n- Removed the skill-card.md file. \n- No user-facing feature or tool changes.\n\nv4.5.2 | 2026-09-28T05:20:53.486Z | auto\n\n- Added a maximum value (10 MiB) clamp for the `inlineMaxBytes` parameter in the `gog_gmail_attachment` tool, preventing larger values.\n- Updated documentation to reflect the new attachment size limit and clarify parameter behavior.\n- Removed outdated `skill-card.md` file.\n- Various documentation and test updates for clarity and accuracy.\n\nv4.5.1 | 2026-09-25T15:42:04.649Z | auto\n\n- Added new test file: `tests/tools/gmail-extra-gates.test.ts`.\n- Updated several files, including `dist/index.js`, `manifest.json`, `package.json`, `src/tools/gmail-extra.ts`, and existing tests for Gmail tools.\n- Removed deprecated documentation file: `skill-card.md`.\n- No user-facing feature changes. This release focuses on internal testing and maintenance.\n\nv4.5.0 | 2026-09-24T15:24:16.776Z | auto\n\n- Removed the skill-card.md documentation file.\n- Updated dependencies and build outputs (dist/index.js, package.json).\n- No changes to tool functions or SKILL.md content (feature set remains the same).\n- Minor test updates (tests/tools/gmail-confirm-token.test.ts) for maintenance and compatibility.\n\nv4.4.0 | 2026-09-24T12:56:17.888Z | auto\n\n- Added tests for Gmail token confirmation logic.\n- Removed the legacy skill-card documentation file.\n- Updated dependencies and build outputs.\n- Improved handling in gmail-extra tools.\n\nv4.3.0 | 2026-09-23T15:50:11.097Z | auto\n\n- The `gog_gmail_drafts_send` tool now sends drafts only after the user confirms a preview.\n- Documentation updated: clarified draft sending flow requiring user confirmation.\n- Removed deprecated `skill-card.md` file.\n- Test coverage and configuration files updated to reflect new draft-send behavior and ensure consistency.\n\nv4.2.5 | 2026-09-22T14:07:47.232Z | auto\n\n- Updated distribution files and package metadata.\n- Removed the skill-card.md documentation file.\n- No changes to toolset or user-facing features.\n\nv4.2.4 | 2026-09-21T04:17:19.258Z | auto\n\n- Internal packaging and manifest files updated.\n- Documentation cleanup: removed the skill-card.md file.\n- No functional changes to commands or skill operation.\n\nv4.2.3 | 2026-09-20T23:43:35.389Z | auto\n\n- Internal updates to codebase and packaging files.\n- Removed the skill-card.md file.\n- No user-facing changes to functionality or features.\n\nv4.2.2 | 2026-09-20T20:39:03.215Z | auto\n\n- Internal/package updates across source and distribution files.\n- Removed obsolete documentation file: skill-card.md.\n- No functional or API/tooling changes noted.\n\nv4.2.1 | 2026-09-20T19:46:28.833Z | auto\n\n- Updated build artifacts and dependency versions.\n- Removed the skill-card.md documentation file.\n- No changes to core functionality or toolset.\n\nv4.2.0 | 2026-09-20T18:32:11.290Z | auto\n\n- Removed the skill-card.md file.\n- Updated build and manifest files (dist/index.js, manifest.json, package.json).\n\nv4.1.0 | 2026-09-20T02:53:42.168Z | auto\n\n- Minimum Node.js version increased from 18 to 22.\n- Setup instructions updated to require Node.js 22 or later.\n- skill-card.md file removed.\n- Internal documentation cleanup and dependency/version updates.\n\nv4.0.1 | 2026-09-18T15:51:50.878Z | auto\n\n- Maintenance release: no user-facing changes.\n- No new features or tools added.\n- No changes to documented functionality.\n- Internal or package file updates only.\n\nv4.0.0 | 2026-09-18T15:22:17.919Z | auto\n\n- Attachment delivery now returns a server-side file path when not hosted (was Drive link or inline only); clarify \"url\"/\"drive\"/\"inline\" modes.\n- \"url\" delivery option for attachments only enabled on hosted deployments; description updated for clarity.\n- Documentation in SKILL.md is more explicit about attachment retrieval behavior and options.\n- No changes to the toolset—still 61 tools (8 auth, 4 base Gmail, 49 Gmail extras).\n\nv3.0.0 | 2026-09-17T12:11:28.004Z | auto\n\nVersion 3.0.0\n\n- Removed the skill card documentation file (skill-card.md).\n- Updated code distribution, manifest, and package definitions.\n- Made changes to Gmail extra tools source and associated tests.\n- No changes to user-facing features or documented toolset.\n\nv2.30.0 | 2026-09-14T12:48:49.739Z | auto\n\n- Added support for `deliver=\"url\"` to the `gog_gmail_attachment` tool, providing a signed link for downloading attachments without credentials (valid for one hour, hosted connector only).\n- Updated documentation to describe the new `deliver=url` option and clarify behavior for attachment delivery.\n- Removed obsolete documentation file: `skill-card.md`.\n- General documentation cleanup and improvement in SKILL.md.\n\nv2.29.1 | 2026-09-07T19:13:07.284Z | auto\n\n- Updated package and distribution files to version 2.29.1.\n- Removed the skill-card.md documentation file.\n- No changes to toolset or user-facing features.\n\nv2.29.0 | 2026-09-04T15:30:32.549Z | auto\n\nMajor expansion and enhancement of Gmail toolset.\n\n- Expanded from 32 to 61 tools, with feature-rich coverage: 8 auth, 4 base Gmail, 49 extra Gmail tools.\n- Added advanced draft handling: forking, threading preservation, loss detection, and detailed diffing between draft versions.\n- Introduced new settings commands: manage vacation responder, filters, and send-as aliases.\n- Improved attachment handling: fetch by index or legacy ID, with option to deliver inline or upload to Drive.\n- Broadened bulk, label, and message tools; new options for searching, importing, and nuanced replies.\n- Switched documentation from skill-card.md to comprehensive, detailed SKILL.md and supporting docs (README, CHANGELOG, LICENSE).\n\nv2.8.0 | 2026-06-12T13:45:30.058Z | auto\n\n- Removed the skill-card.md file.\n- No changes to functionality or user-facing features.\n\nv2.7.1 | 2026-06-11T15:37:48.996Z | auto\n\n- Removed the skill-card.md file.\n- No changes to features or functionality.\n\nv2.7.0 | 2026-06-11T13:30:25.092Z | auto\n\n- Removed the skill-card.md file from the project.\n- No changes to code or functionality; this update is limited to documentation cleanup.\n\nv2.6.1 | 2026-06-09T14:23:53.700Z | auto\n\n- Removed the file: skill-card.md\n- No changes to skill features or functionality.\n\nv2.6.0 | 2026-06-09T02:37:12.518Z | auto\n\n- Removed the skill-card.md file.\n- No user-facing functionality changes.\n\nv2.5.0 | 2026-06-07T16:53:59.488Z | auto\n\n- Removed the file: skill-card.md\n- No functional or feature changes in the tools or documentation\n\nv2.4.1 | 2026-06-02T11:56:52.890Z | auto\n\n- Removed the skill-card.md file.\n- No changes to functionality or available tools.\n\nv2.4.0 | 2026-06-01T18:41:16.909Z | auto\n\n- Removed the skill-card.md file.\n\nv2.3.0 | 2026-05-30T17:16:10.835Z | auto\n\nNo changes detected in this release.\n\n- Version bumped to 2.3.0 without any file modifications or feature updates.\n\nv2.2.0 | 2026-05-30T14:41:51.811Z | auto\n\n- Removed the sample file skill-card.md.\n- No changes to functionality or documentation content.\n- Version bump to 2.2.0.\n\nv2.0.12 | 2026-05-22T02:37:59.698Z | auto\n\n- No file changes detected in this version.\n- Documentation and tool list remain the same as previous version. No new features, fixes, or updates introduced.\n\nv2.0.11 | 2026-05-19T16:03:05.370Z | auto\n\n- Updated gogcli links and references from steipete/gogcli to openclaw/gogcli in documentation.\n- No changes to functionality or tools; documentation update only.\n\nv2.0.10 | 2026-05-19T14:21:58.235Z | auto\n\nVersion 2.0.10\n\n- No file changes detected in this release.\n- No user-visible changes or updates.\n\nv2.0.9 | 2026-05-15T20:51:28.089Z | auto\n\nVersion 2.0.9\n\n- No file changes detected in this release.\n- Documentation and tool listing remain unchanged.\n- No new features, bug fixes, or updates included.\n\nv2.0.8 | 2026-05-14T18:39:16.974Z | auto\n\nVersion 2.0.8 (no file changes detected):\n\n- No changes to source files.\n- Functionality, features, and documentation remain unchanged from the previous version.\n\nv2.0.7 | 2026-05-14T18:26:14.728Z | auto\n\nVersion 2.0.7 of gogcli-mcp-gmail\n\n- No file changes detected in this release.\n- Functionality and documentation remain the same as in the previous version.\n\nv2.0.4 | 2026-05-12T10:32:44.928Z | auto\n\n- Expanded description clarifies triggers and supported Gmail operations.\n- Updated overview of tools: now includes 32 total tools (5 auth, 4 base Gmail, 23 extra Gmail tools).\n- Detailed tool list added, organized by category (Read, Threads, Labels, Bulk operations, Drafts, Write).\n- Setup instructions and requirements are clearly specified.\n- Usage guidance notes when to use the skill and highlights advanced tool support.\n\nArchive index:\n\nArchive v4.7.0: 22 files, 492243 bytes\n\nFiles: CHANGELOG.md (781b), dist/index.js (1660559b), LICENSE (1067b), manifest.json (11668b), mint.yaml (4732b), package.json (1131b), README.md (14035b), skill-card.md (2010b), SKILL.md (7909b), src/index.ts (510b), src/tools/gmail-extra.ts (236612b), tests/tools/attachment-index-resolve.test.ts (3845b), tests/tools/draft-diff-arithmetic.test.ts (2714b), tests/tools/draft-fork-signature.test.ts (3365b), tests/tools/draft-fork.test.ts (47558b), tests/tools/draft-write-vs-refetch.test.ts (6443b), tests/tools/gmail-confirm-token.test.ts (16291b), tests/tools/gmail-extra-gates.test.ts (11389b), tests/tools/gmail-extra.test.ts (215754b), tsconfig.json (209b), vitest.config.ts (523b), _meta.json (135b)\n\nFile v4.7.0:SKILL.md\n\n---\nname: gogcli-mcp-gmail\ndescription: Use when the user asks to read, organize, draft, forward, autoreply, or otherwise work with Gmail in depth. Triggers for requests involving threads, labels, drafts, attachments, bulk archive/trash/mark-read operations, forwarding messages, or any Gmail operation beyond simple search/get/send. Includes auth and Gmail tools only.\n---\n\n# gogcli-mcp-gmail\n\nExtended Gmail MCP server via [gogcli](https://github.com/openclaw/gogcli) — 61 tools: 8 auth + 4 base Gmail + 49 extra dedicated Gmail tools.\n\n- **Source:** [github.com/chrischall/gogcli-mcp](https://github.com/chrischall/gogcli-mcp)\n\n## Requirements\n\n- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated\n- Node.js 22 or later\n\n## Setup\n\n```json\n{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"gogcli-mcp-gmail\"],\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}\n```\n\n## Extra Gmail Tools\n\n### Read\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_raw` | Raw Gmail API JSON for a message |\n| `gog_gmail_attachment` | Download an attachment by `attachmentIndex` (or legacy `attachmentId`) and deliver its contents — inline when within `inlineMaxBytes` (3 MiB default, 10 MiB max — larger values are clamped), else a server-side file path — use `url`/`drive` when hosted (`deliver`: auto/inline/drive/url/off). `deliver=\"url\"` gives a signed link `curl` can fetch with no credential, for an hour — hosted deployments only |\n| `gog_gmail_url` | Print web URLs for threads |\n| `gog_gmail_history` | List history events since a historyId |\n| `gog_gmail_messages_search` | Search individual messages, not threads — one row per message |\n\n### Threads\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_thread_get` | Get a thread with all messages |\n| `gog_gmail_thread_modify` | Modify labels on a thread |\n| `gog_gmail_thread_attachments` | List/download all attachments in a thread |\n\n### Labels\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_labels_list` | List all labels |\n| `gog_gmail_labels_get` | Get a label's details and counts |\n| `gog_gmail_labels_create` | Create a new label |\n| `gog_gmail_labels_rename` | Rename a label |\n| `gog_gmail_labels_delete` | Delete a label |\n| `gog_gmail_labels_modify` | Modify labels on one or more threads |\n| `gog_gmail_labels_style` | Change a label's color or visibility |\n\n### Bulk operations\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_archive` | Archive by IDs or query |\n| `gog_gmail_mark_read` | Mark read by IDs or query |\n| `gog_gmail_mark_unread` | Mark unread by IDs or query |\n| `gog_gmail_trash` | Trash by IDs or query |\n| `gog_gmail_message_modify` | Modify labels on a single message |\n| `gog_gmail_batch_delete` | Permanently delete multiple messages |\n| `gog_gmail_batch_modify` | Modify labels on multiple messages |\n\n### Drafts\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_drafts_list` | List drafts (+ free `origin`/`rootsOwnThread`) |\n| `gog_gmail_drafts_get` | Get a draft |\n| `gog_gmail_drafts_create` | Create a draft |\n| `gog_gmail_drafts_update` | Update a draft; `replyToThreadId` re-threads it in place (same id) + `threadingVerification`; `forkSiblingDraftId` blocks a body overwrite that would drop the other copy's text |\n| `gog_gmail_drafts_delete` | Delete a draft |\n| `gog_gmail_drafts_send` | Send a draft after the user confirms a preview of it (404 → `DRAFT_FORKED`, or `GOOGLE_404_NOT_THE_DRAFT` if the draft is still listed) |\n| `gog_gmail_drafts_diff` | Diff two drafts (body divergence, threading loss, fork verdict) |\n| `gog_gmail_drafts_reply` | Save a reply as a draft — inherited recipients, subject and quote; never sends |\n| `gog_gmail_drafts_reply_all` | Save a reply-all as a draft; never sends |\n| `gog_gmail_drafts_forward` | Save a forward as a draft; recipients optional, so it can be staged without any |\n\nA draft edited in a mail client is replaced, not updated: the old id 404s. `drafts_update` / `drafts_send` answer that\n404 with a `DRAFT_FORKED` report (what happened, the drafts that exist, what to do) instead of a bare `notFound`, at a\nbounded cost of ≤2 extra gog calls. It never names a replacement — the 404'd draft cannot be fetched, so no lineage\nsignal can exist; use `drafts_diff` on a named pair for that. The 404 is attributed first: `replyToThreadId` and\n`replyToMessageId` resolve their own entities and 404 identically, so if the draft id is still in the listing the answer\nis `GOOGLE_404_NOT_THE_DRAFT` — no fork claimed, reply target named. That listing is capped at 20, so `listingEvidence`\nsays what it can carry: only a `complete-listing` (the window came back short, i.e. it covered the folder) claims the\ndraft is gone; `capped-listing` and `listing-unavailable` say in words that they establish nothing. A reply target, when\none was passed, is echoed and explained first.\n\n`drafts_diff` confirms a pairing only on a link from the candidate **to the original** (its `Message-Id` in the\ncandidate's `In-Reply-To`/`References`) or on agreement over text **neither draft quoted and neither client generated**\n— the salutation, closing formula, name and signature block are excluded alongside quoting, because a client writes them\nidentically on every message (`Hi Jennifer,` + `Thanks,` + `Chris` + `Sent from my iPhone` is 4 lines and 43 characters\nof pure apparatus). A shared reply root is corroboration only — every reply in a thread has one — and `none` means no\nevidence was found, not \"unrelated\". To adopt the survivor back onto the thread, call\n`drafts_update` with `replyToThreadId`: same draft id, gog resolves the reply headers, `threadingVerification` reports\nwhether it worked. It rewrites the whole body, so diff and merge first.\n\ngog requires a body on every update, so there is no header-only edit and every adoption overwrites the body. Pass\n`forkSiblingDraftId` (the other copy's id) and the update reads that draft first — one extra gog call, zero when the param\nis absent — and refuses to write (`DRAFT_CONTENT_LOSS`, nothing changed) if your body drops a line the sibling holds,\nnaming the lines; `acceptContentLoss: true` overrides, and `contentLossCheck.written` then reports whether the write it\nauthorised actually succeeded — a failed write says so and says nothing was saved. A check that could not run refuses too\n(`DRAFT_CONTENT_LOSS_UNCHECKED`). It compares text only and never claims one draft replaced another — that is\n`drafts_diff`'s job.\n\n### Write\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_import` | Import an RFC822/EML message into the mailbox (keeps its headers/date; does not send) |\n| `gog_gmail_forward` | Forward a message |\n| `gog_gmail_reply` | Reply to the original sender |\n| `gog_gmail_reply_all` | Reply to sender plus every To/Cc recipient |\n| `gog_gmail_autoreply` | Reply once to all messages matching a query |\n\n### Settings\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_vacation_get` | Get the vacation responder settings |\n| `gog_gmail_vacation_update` | Enable/disable the vacation responder |\n| `gog_gmail_filters_list` | List all filters |\n| `gog_gmail_filters_get` | Get a filter by ID |\n| `gog_gmail_filters_create` | Create a filter |\n| `gog_gmail_filters_delete` | Delete a filter |\n| `gog_gmail_sendas_list` | List send-as aliases |\n| `gog_gmail_sendas_get` | Get one send-as alias |\n| `gog_gmail_sendas_create` | Create a send-as alias |\n| `gog_gmail_sendas_update` | Update a send-as alias |\n| `gog_gmail_sendas_delete` | Delete a send-as alias |\n| `gog_gmail_sendas_verify` | Resend an alias verification email |\n\nPlus 8 auth tools and 4 base Gmail tools (search, get, send, run). Use `gog_gmail_run` for the settings with no dedicated tool (`delegates`, `forwarding`, `watch`) and email tracking (`track`).\n\nFile v4.7.0:README.md\n\n# gogcli-mcp-gmail\n\n> [!WARNING]\n> **AI-developed project.** This codebase was built and is actively maintained by [Claude Code](https://www.anthropic.com/claude). Review all code and tool permissions before use.\n\nExtended Gmail [MCP](https://modelcontextprotocol.io) server via [gogcli](https://github.com/openclaw/gogcli). Includes auth tools plus 49 additional dedicated Gmail tools for threads, labels, drafts, attachments, forwarding, autoreply, and bulk operations.\n\n## Requirements\n\n- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated\n- Node.js 22+\n\n```bash\nbrew install gogcli\ngog auth add your@gmail.com --services gmail\n```\n\n## Installation\n\n```bash\nnpm install -g gogcli-mcp-gmail\n```\n\n### Claude Desktop\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"gogcli-mcp-gmail\",\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}\n```\n\n### Claude Code\n\n```bash\nclaude mcp add gogcli-gmail -- gogcli-mcp-gmail\n```\n\n## Extra Gmail Tools (49)\n\nPlus 8 auth tools and 4 base Gmail tools (search, get, send, run) — 61 in all.\n\n### Read\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_raw` | Dump the raw Gmail API JSON for a message (lossless, for scripting) |\n| `gog_gmail_attachment` | Download an attachment (by `attachmentIndex`, or the legacy opaque `attachmentId`) and deliver its contents — by default an image inline and anything else as a server-side file path (`deliver`: auto/inline/drive/url/off; `inline` forces bytes within `inlineMaxBytes`, 3 MiB by default and at most 10 MiB — a larger value is clamped, since the hosted runtime caps one result at 14 MiB; `drive` uploads to Google Drive). On a hosted deployment, where that path is unreadable, use `url` or `drive`. `deliver=\"url\"` returns a **signed download link** — fetchable with `curl`, no credential and no Google session, valid for an hour, nothing written to your Drive and not blocked by `GOG_READONLY`; it needs the blob store a hosted deployment lends this server, so a local stdio install is told to use another mode |\n| `gog_gmail_url` | Print Gmail web URLs for one or more threads |\n| `gog_gmail_history` | List Gmail history events since a given historyId |\n| `gog_gmail_messages_search` | Search individual messages rather than threads — one result per matching message |\n\n### Threads\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_thread_get` | Get a thread with all messages, optionally with sanitized content and attachments |\n| `gog_gmail_thread_modify` | Modify labels on all messages in a thread |\n| `gog_gmail_thread_attachments` | List or download all attachments in a thread |\n\n### Labels\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_labels_list` | List all labels |\n| `gog_gmail_labels_get` | Get label details and counts |\n| `gog_gmail_labels_create` | Create a new label |\n| `gog_gmail_labels_rename` | Rename a label |\n| `gog_gmail_labels_delete` | Delete a label |\n| `gog_gmail_labels_modify` | Modify labels on one or more threads |\n| `gog_gmail_labels_style` | Change a user label's color or visibility |\n\n### Bulk Operations\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_archive` | Archive messages by ID or by query |\n| `gog_gmail_mark_read` | Mark messages as read by ID or by query |\n| `gog_gmail_mark_unread` | Mark messages as unread by ID or by query |\n| `gog_gmail_trash` | Move messages to trash by ID or by query |\n| `gog_gmail_message_modify` | Modify labels on a single message |\n| `gog_gmail_batch_delete` | Permanently delete multiple messages (irreversible) |\n| `gog_gmail_batch_modify` | Modify labels on multiple messages at once |\n\n### Drafts\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_drafts_list` | List drafts (free `origin` + `rootsOwnThread`; `enrich` adds subject/from/date for one extra call) |\n| `gog_gmail_drafts_get` | Get a draft by ID |\n| `gog_gmail_drafts_create` | Create a new draft |\n| `gog_gmail_drafts_update` | Update a draft — and re-thread it in place with `replyToThreadId`, keeping the same id, with a `threadingVerification` block reporting what gog actually wrote. `forkSiblingDraftId` refuses the write when the new body would drop text the other copy still holds |\n| `gog_gmail_drafts_delete` | Delete a draft |\n| `gog_gmail_drafts_send` | Send an existing draft (a 404 comes back diagnosed — `DRAFT_FORKED`, or `GOOGLE_404_NOT_THE_DRAFT` when the draft is still listed) |\n| `gog_gmail_drafts_diff` | Diff two named drafts — divergent body lines (with untruncated `onlyInACount`/`onlyInBCount`), threading loss, and a conservative fork verdict (2 gog calls) |\n| `gog_gmail_drafts_reply` | Save a reply as a draft — inherited recipients, subject and quote; never sends |\n| `gog_gmail_drafts_reply_all` | Save a reply-all as a draft; never sends |\n| `gog_gmail_drafts_forward` | Save a forward as a draft; recipients optional, so it can be staged without any |\n\n#### When a draft you created stops resolving\n\nA draft edited in a real mail client is not updated in place: the client writes a **new** draft and abandons the\noriginal, so the id you were given starts returning `Google API error (404 notFound)` — indistinguishable, at first\nglance, from \"someone deleted it\".\n\n`gog_gmail_drafts_update` and `gog_gmail_drafts_send` turn that 404 into a `DRAFT_FORKED` report: what happened, the\ndrafts that *do* exist (with the free `origin` / `rootsOwnThread` fields, plus subject/from/date), the other\nexplanations that produce the same 404 (deleted, already sent), and what to do next. It **names no replacement** — the\n404'd draft can no longer be fetched, so there is nothing to establish lineage against, and without lineage no pairing\nverdict is possible. Naming a pair and running `gog_gmail_drafts_diff` is the only path here that issues a fork verdict.\n\n**\"Not listed\" is not \"does not exist\".** That listing is capped at 20 drafts by construction — it is a failure path and\nmust not grow with the mailbox — so the report states, under `listingEvidence`, what its own evidence can carry. Only a\nlisting that came back *short* of the window covered the whole Drafts folder and earns the sentence \"draft X no longer\nresolves\" (`basis: complete-listing`, `establishesTheDraftIsGone: true`). A window that came back *full*\n(`capped-listing`) or a listing that *failed* (`listing-unavailable`) says so in words and claims nothing about the\ndraft: on a mailbox with more than 20 drafts, absence of evidence must not become the fork story by default. Widen it\nwith `gog_gmail_drafts_list` before concluding anything. When the call named a reply target, that target is echoed on\nthe report and its explanation is listed **first** — the branch with the least evidence about the draft is the last one\nthat should stay silent about the leading alternative.\n\n**The 404 is attributed, not assumed.** `gmail drafts update` resolves up to three Google entities — the draft, the\nthread behind `replyToThreadId`, and the message behind `replyToMessageId` — and gog renders all three 404s with the\nsame string. The listing the report already pays for settles it: if the draft id is still listed, the answer is\n`GOOGLE_404_NOT_THE_DRAFT`, which claims no fork, names the reply target as the remaining explanation, and tells you\nnot to go hunting for a replacement draft. `DRAFT_FORKED` is only used when the draft really has stopped resolving.\n\n**What counts as lineage** (`gog_gmail_drafts_diff`): only a link from the candidate *to the original* — the original\ndraft's own `Message-Id` inside the candidate's `In-Reply-To`/`References`, or agreement on text **neither draft\nquoted**. A **shared reply root is not lineage**: it links both drafts to a common *ancestor*, which every reply in a\nthread has, so it is reported as corroboration and can raise the answer no higher than an explicitly weak `candidate`.\nQuoted lines are excluded from the agreement metric because Apple Mail quotes on every reply — two unrelated replies\ninto one thread carry the same 30-line block, which scores 0.79 on a whole-body line metric while proving nothing.\n\n**Client boilerplate is excluded for the same reason.** The salutation, the closing formula, the name under it and the\nsignature block are reproduced identically on every message a client composes, whatever the message says —\n`Sent from my iPhone` is Apple Mail's own default. `Hi Jennifer,` + `Thanks,` + `Chris` + `Sent from my iPhone` is 4\nlines and 43 characters, enough on its own to clear a line-and-character threshold, so counting it paired two genuinely\nunrelated one-sentence notes as `confirmed` — and short confirmation plus a signature is the dominant shape of this\nmailbox. `bodyAgreement` reports `quotedLinesIgnored` and `boilerplateLinesIgnored` separately so the arithmetic can be\nredone. The divergence report still counts those lines: a merge that drops the signature really did drop it. The cost\nof the tighter metric is that a genuine fork of a *one-sentence* note now comes back `candidate` rather than\n`confirmed`, with `missing` naming the shortfall — the deliberate direction, since a missed fork costs a re-check and a\nwrong one sends the wrong text to the wrong thread.\n\nCost is bounded and constant: **at most 2 extra gog invocations**, only on a call that already failed, never scaling\nwith the number of drafts. A non-404 failure spends nothing.\n\nOnce you know which draft survived, `gog_gmail_drafts_update` with `replyToThreadId` adopts it back onto the original\nconversation **in one call, keeping its draft id** — gog resolves `In-Reply-To`/`References` from that thread's latest\nmessage and reports them back under `threadingVerification` (`ok`, the effective headers, and a note). Two things that\nblock make that safe to rely on: an explicit reply target *replaces* the draft's stored lineage rather than merging with\nit, and gog requires a body on every update, so the call **overwrites the whole body**. Diff first, merge by hand, then\nwrite.\n\n#### Guarding the merge: `forkSiblingDraftId`\n\nBecause gog requires a body on every update there is **no header-only edit**, so adopting a draft back onto its thread is\nalways a full body overwrite — the exact operation that destroys the paragraph living only in the other copy. In the\nobserved fork *neither* copy was a superset: the mail-client copy had lost a paragraph and the Gmail copy had gained\nsentences.\n\nThe line-based comparison cuts the other way too: a paragraph re-wrapped at a different width no longer matches line\nfor line, so `none` means *no evidence was found*, never *proven unrelated*, and the notes say so.\n\nPass `forkSiblingDraftId` (the id of the other copy) and `gog_gmail_drafts_update` reads that draft **before** writing and\nrefuses the write — `DRAFT_CONTENT_LOSS`, nothing changed — if your body omits any line the sibling still holds, naming the\nexact lines. Merge them in and retry, or pass `acceptContentLoss: true` to write anyway (the lines are still reported, and\nthe sibling itself is never touched). A check that cannot be *run* — sibling unfetchable, unparseable, or with no readable\nbody — refuses too, as `DRAFT_CONTENT_LOSS_UNCHECKED`: an unrun check is not a passed check.\n\nAn override reports the write that **actually happened**, never a predicted one: `contentLossCheck.written` is set from\nthe result, so a write that failed comes back saying it was attempted and saved nothing, and says the listed lines are\nstill in the sibling. Believing the opposite is the destructive case — a caller who thinks the merged body is stored may\ndelete or overwrite the copy that now holds the only version of those lines.\n\nIt **makes no fork claim**. You name the sibling; nothing searches for it, identical bodies would not prove a pairing and\ndivergent ones would not disprove one. `contentLossCheck.forkClaim` is always `null` and points at\n`gog_gmail_drafts_diff`, which is the only tool here that weighs identity, lineage and ordering.\n\n**Cost:** opt-in, exactly **one** extra gog invocation (a `drafts get` on the id you named — never a scan, never scaling\nwith the mailbox), and **zero** when the param is absent. A refusal spends that one call and skips the write entirely.\n\n### Write\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_import` | Import an RFC822/EML message into the mailbox, keeping its original headers and date (does not send) |\n| `gog_gmail_forward` | Forward a message to new recipients (with optional note) |\n| `gog_gmail_reply` | Reply to a message (original sender only) |\n| `gog_gmail_reply_all` | Reply to every participant (sender plus all To/Cc recipients) |\n| `gog_gmail_autoreply` | Reply once to all messages matching a query (with dedupe label) |\n\n### Settings\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_vacation_get` | Get the vacation responder (auto-reply) settings |\n| `gog_gmail_vacation_update` | Enable or disable the vacation responder, with optional start/end and audience limits |\n| `gog_gmail_filters_list` | List all Gmail filters |\n| `gog_gmail_filters_get` | Get a filter's criteria and actions by ID |\n| `gog_gmail_filters_create` | Create a filter from match criteria plus one or more actions |\n| `gog_gmail_filters_delete` | Delete a filter by ID |\n| `gog_gmail_sendas_list` | List all send-as aliases |\n| `gog_gmail_sendas_get` | Get one send-as alias by address |\n| `gog_gmail_sendas_create` | Create a send-as alias (usually needs verification before use) |\n| `gog_gmail_sendas_update` | Update an alias (display name, reply-to, signature, default) |\n| `gog_gmail_sendas_delete` | Delete a send-as alias |\n| `gog_gmail_sendas_verify` | Resend the verification email for a pending alias |\n\nEmail tracking (`track`) and the remaining admin settings (`delegates`, `forwarding`, `watch`) have no dedicated tool — reach them through the base `gog_gmail_run` escape hatch.\n\n## License\n\nMIT\n\nFile v4.7.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"gogcli-mcp-gmail\",\n  \"version\": \"4.7.0\",\n  \"publishedAt\": 1791380437242\n}\n\nFile v4.7.0:CHANGELOG.md\n\n# Changelog\n\n## [2.1.0](https://github.com/chrischall/gogcli-mcp/compare/v2.0.13...v2.1.0) (2026-05-25)\n\n\n### Features\n\n* **gmail:** add gogcli-mcp-gmail sub-package ([fac0f51](https://github.com/chrischall/gogcli-mcp/commit/fac0f515fd2ea587c570d7ac70c080cb8dc486ac))\n\n\n### Refactor\n\n* aggressive cleanup pass (audit findings) ([e635b39](https://github.com/chrischall/gogcli-mcp/commit/e635b391cf611e9c102a422ffbce5ebe28687b80))\n* review-pass cleanup (enums, shared schemas, test harness) ([ea851de](https://github.com/chrischall/gogcli-mcp/commit/ea851deb30b9cfef3f07ed506a011fc363b34018))\n\n\n### Documentation\n\n* update gogcli repo URLs to openclaw/gogcli (was steipete/gogcli) ([951a181](https://github.com/chrischall/gogcli-mcp/commit/951a1818ebc269f203aee723ccbea32c13817d8b))\n\nFile v4.7.0:skill-card.md\n\n## Description:\n\nHelps agents read, organize, draft, and send Gmail messages through tools for threads, labels, attachments, bulk actions, and account settings.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nPeople and teams using an agent to manage Gmail can search mail, work with threads and attachments, prepare replies or forwards, organize messages, and manage mailbox settings.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Broad Gmail read/write and settings access can expose or change sensitive mail and account settings.\n\nMitigation: Grant access only to an appropriate account; use a dedicated account or enable GOG_READONLY when only reads are needed.\n\nRisk: Some destructive Gmail and settings deletions can be forced without a separate user-confirmation flow.\n\nMitigation: Review and explicitly approve destructive actions, especially deletion of labels, filters, drafts, and send-as aliases.\n\nRisk: Stored Gmail credentials could be exposed on an insufficiently isolated host.\n\nMitigation: Use a secure keyring backend and strong host isolation.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/chrischall/skills/gogcli-mcp-gmail)\n- [gogcli dependency documentation](https://github.com/openclaw/gogcli)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Configuration guidance]\n\n**Output Format:** [Structured Gmail data and text guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include message contents, attachment links, and local file paths.]\n\n## Skill Version(s):\n\n4.7.0 (source: server release and package.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v4.7.0:manifest.json\n\n{\n  \"$schema\": \"https://raw.githubusercontent.com/anthropics/dxt/main/dist/mcpb-manifest.schema.json\",\n  \"manifest_version\": \"0.3\",\n  \"name\": \"gogcli-mcp-gmail\",\n  \"display_name\": \"gogcli (Gmail)\",\n  \"version\": \"4.7.0\",\n  \"description\": \"Extended Gmail for Claude via gogcli — auth + full Gmail support (threads, labels, drafts, attachments, forward, autoreply, bulk operations)\",\n  \"author\": {\n    \"name\": \"Chris Hall\",\n    \"email\": \"chris.c.hall@gmail.com\",\n    \"url\": \"https://github.com/chrischall\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/chrischall/gogcli-mcp\"\n  },\n  \"homepage\": \"https://github.com/chrischall/gogcli-mcp\",\n  \"support\": \"https://github.com/chrischall/gogcli-mcp/issues\",\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"google\",\n    \"gmail\",\n    \"email\",\n    \"gogcli\",\n    \"gog\",\n    \"threads\",\n    \"labels\",\n    \"drafts\",\n    \"autoreply\"\n  ],\n  \"server\": {\n    \"type\": \"node\",\n    \"entry_point\": \"dist/index.js\",\n    \"mcp_config\": {\n      \"command\": \"node\",\n      \"args\": [\n        \"${__dirname}/dist/index.js\"\n      ],\n      \"env\": {\n        \"GOG_ACCOUNT\": \"${user_config.gog_account}\",\n        \"GOG_PATH\": \"${user_config.gog_path}\",\n        \"GOG_FILE_ROOTS\": \"${user_config.gog_file_roots}\"\n      }\n    }\n  },\n  \"user_config\": {\n    \"gog_account\": {\n      \"type\": \"string\",\n      \"title\": \"Google Account\",\n      \"description\": \"Default Google account email (optional — uses gogcli's configured default if omitted)\",\n      \"required\": false\n    },\n    \"gog_path\": {\n      \"type\": \"string\",\n      \"title\": \"gog Executable Path\",\n      \"description\": \"Path to the gog executable (optional — defaults to 'gog' on your PATH)\",\n      \"required\": false\n    },\n    \"gog_file_roots\": {\n      \"type\": \"string\",\n      \"title\": \"Allowed file directories\",\n      \"description\": \"Directories tools may read files from (attachments, uploads) or write files to (exports, downloads), separated by ':' (';' on Windows). Optional — defaults to ~/gogcli-mcp-files\",\n      \"required\": false\n    }\n  },\n  \"tools\": [\n    {\n      \"name\": \"gog_auth_add\",\n      \"description\": \"Authorize a Google account via browser-based OAuth\"\n    },\n    {\n      \"name\": \"gog_auth_health\",\n      \"description\": \"Live per-account token health: validity, age, and pre-expiry warnings (detects invalid_grant)\"\n    },\n    {\n      \"name\": \"gog_auth_add_url\",\n      \"description\": \"Begin remote/headless OAuth (step 1): return a sign-in URL to open in any browser\"\n    },\n    {\n      \"name\": \"gog_auth_add_complete\",\n      \"description\": \"Complete remote/headless OAuth (step 2): exchange the pasted redirect URL and store the token\"\n    },\n    {\n      \"name\": \"gog_auth_list\",\n      \"description\": \"List all Google accounts stored in gogcli\"\n    },\n    {\n      \"name\": \"gog_auth_status\",\n      \"description\": \"Show gogcli auth configuration\"\n    },\n    {\n      \"name\": \"gog_auth_services\",\n      \"description\": \"List Google services and OAuth scopes supported by gogcli\"\n    },\n    {\n      \"name\": \"gog_auth_run\",\n      \"description\": \"Run any gog auth subcommand (escape hatch)\"\n    },\n    {\n      \"name\": \"gog_gmail_search\",\n      \"description\": \"Search Gmail threads using Gmail query syntax; newest-first, and flags a truncated result set\"\n    },\n    {\n      \"name\": \"gog_gmail_get\",\n      \"description\": \"Get a Gmail message by ID\"\n    },\n    {\n      \"name\": \"gog_gmail_send\",\n      \"description\": \"Send an email, with attachments from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem)\"\n    },\n    {\n      \"name\": \"gog_gmail_run\",\n      \"description\": \"Run any gog gmail subcommand (escape hatch)\"\n    },\n    {\n      \"name\": \"gog_gmail_raw\",\n      \"description\": \"Dump raw Gmail API JSON for a message\"\n    },\n    {\n      \"name\": \"gog_gmail_attachment\",\n      \"description\": \"Download a Gmail attachment by 0-based attachmentIndex (or legacy attachmentId) and deliver its contents: an image inline, anything else as a server-side file path — or, on a hosted deployment, deliver=\\\"url\\\" for a signed link any HTTP client can fetch with no credential, or deliver=\\\"drive\\\" for a Drive link\"\n    },\n    {\n      \"name\": \"gog_gmail_url\",\n      \"description\": \"Print Gmail web URLs for one or more threads\"\n    },\n    {\n      \"name\": \"gog_gmail_history\",\n      \"description\": \"List Gmail history events since a historyId\"\n    },\n    {\n      \"name\": \"gog_gmail_archive\",\n      \"description\": \"Archive messages by IDs or by query\"\n    },\n    {\n      \"name\": \"gog_gmail_mark_read\",\n      \"description\": \"Mark messages as read by IDs or by query\"\n    },\n    {\n      \"name\": \"gog_gmail_mark_unread\",\n      \"description\": \"Mark messages as unread by IDs or by query\"\n    },\n    {\n      \"name\": \"gog_gmail_trash\",\n      \"description\": \"Move messages to trash by IDs or by query\"\n    },\n    {\n      \"name\": \"gog_gmail_message_modify\",\n      \"description\": \"Modify labels on a single message\"\n    },\n    {\n      \"name\": \"gog_gmail_batch_delete\",\n      \"description\": \"Permanently delete multiple messages (irreversible; requires force:true) (asks the user to confirm)\"\n    },\n    {\n      \"name\": \"gog_gmail_batch_modify\",\n      \"description\": \"Modify labels on multiple messages at once\"\n    },\n    {\n      \"name\": \"gog_gmail_thread_get\",\n      \"description\": \"Get a Gmail thread with all messages — the right tool when the threadId is already known\"\n    },\n    {\n      \"name\": \"gog_gmail_thread_modify\",\n      \"description\": \"Modify labels on all messages in a thread\"\n    },\n    {\n      \"name\": \"gog_gmail_thread_attachments\",\n      \"description\": \"List or download all attachments in a thread\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_list\",\n      \"description\": \"List all Gmail labels\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_get\",\n      \"description\": \"Get label details and counts\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_create\",\n      \"description\": \"Create a new Gmail label\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_rename\",\n      \"description\": \"Rename a Gmail label\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_delete\",\n      \"description\": \"Delete a Gmail label\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_modify\",\n      \"description\": \"Modify labels on one or more threads\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_list\",\n      \"description\": \"List Gmail drafts, annotated free with origin (api / non-api) and rootsOwnThread\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_get\",\n      \"description\": \"Get a Gmail draft by ID\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_create\",\n      \"description\": \"Create a new Gmail draft, with attachments from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem)\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_update\",\n      \"description\": \"Update an existing Gmail draft; re-thread it in place with replyToThreadId (same draft id) and verify the result via threadingVerification; forkSiblingDraftId refuses the write when the new body would drop text the named sibling copy still holds; a 404 is attributed to the draft id or to the reply target before it is reported Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_delete\",\n      \"description\": \"Delete a Gmail draft\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_send\",\n      \"description\": \"Send an existing Gmail draft after the user confirms a preview of it; a 404 comes back diagnosed (DRAFT_FORKED, or GOOGLE_404_NOT_THE_DRAFT when the draft is still listed)\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_diff\",\n      \"description\": \"Diff two named drafts: what each body has that the other lost, how their threading differs, and (only on a link back to the original or on agreement over unquoted text, with evidence) whether one replaced the other\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_reply\",\n      \"description\": \"Save a reply to a Gmail message as a draft (inherited recipients, subject and quote; never sends) Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_reply_all\",\n      \"description\": \"Save a reply-all to a Gmail message as a draft (never sends) Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_forward\",\n      \"description\": \"Save a forward of a Gmail message as a draft; recipients are optional (never sends)\"\n    },\n    {\n      \"name\": \"gog_gmail_import\",\n      \"description\": \"Import an RFC822/EML message into the mailbox (keeps its original headers and date; does not send)\"\n    },\n    {\n      \"name\": \"gog_gmail_forward\",\n      \"description\": \"Forward a Gmail message to new recipients\"\n    },\n    {\n      \"name\": \"gog_gmail_reply\",\n      \"description\": \"Reply to a Gmail message (sender only) Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_reply_all\",\n      \"description\": \"Reply to all participants of a Gmail message Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_autoreply\",\n      \"description\": \"Reply once to all messages matching a Gmail search query\"\n    },\n    {\n      \"name\": \"gog_gmail_messages_search\",\n      \"description\": \"Search individual messages; newest-first, and flags a truncated result set\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_style\",\n      \"description\": \"Change a user label's color or visibility\"\n    },\n    {\n      \"name\": \"gog_gmail_vacation_get\",\n      \"description\": \"Get the current vacation responder settings\"\n    },\n    {\n      \"name\": \"gog_gmail_vacation_update\",\n      \"description\": \"Enable, disable, or update the vacation responder (enabling asks the user to confirm)\"\n    },\n    {\n      \"name\": \"gog_gmail_filters_list\",\n      \"description\": \"List all Gmail filters\"\n    },\n    {\n      \"name\": \"gog_gmail_filters_get\",\n      \"description\": \"Get a single Gmail filter's criteria and actions\"\n    },\n    {\n      \"name\": \"gog_gmail_filters_create\",\n      \"description\": \"Create a Gmail filter with match criteria and actions (a forwarding filter asks the user to confirm)\"\n    },\n    {\n      \"name\": \"gog_gmail_filters_delete\",\n      \"description\": \"Delete a Gmail filter by ID\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_list\",\n      \"description\": \"List all send-as aliases for the account\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_get\",\n      \"description\": \"Get details of a single send-as alias\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_create\",\n      \"description\": \"Create a send-as alias (asks the user to confirm)\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_update\",\n      \"description\": \"Update a send-as alias or make it the default\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_delete\",\n      \"description\": \"Delete a send-as alias\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_verify\",\n      \"description\": \"Resend the verification email for a send-as alias\"\n    }\n  ],\n  \"compatibility\": {\n    \"platforms\": [\n      \"darwin\",\n      \"linux\",\n      \"win32\"\n    ],\n    \"runtimes\": {\n      \"node\": \">=22.0.0\"\n    }\n  }\n}\n\nFile v4.7.0:package.json\n\n{\n  \"name\": \"gogcli-mcp-gmail\",\n  \"version\": \"4.7.0\",\n  \"mcpName\": \"io.github.chrischall/gogcli-mcp-gmail\",\n  \"description\": \"Extended Gmail MCP server via gogcli — auth + full Gmail support (threads, labels, drafts, attachments, forward, autoreply, bulk operations)\",\n  \"author\": \"Claude Code (AI) <https://www.anthropic.com/claude>\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/chrischall/gogcli-mcp\"\n  },\n  \"type\": \"module\",\n  \"bin\": {\n    \"gogcli-mcp-gmail\": \"dist/index.js\"\n  },\n  \"exports\": {\n    \".\": \"./dist/index.js\"\n  },\n  \"scripts\": {\n    \"build\": \"tsc --noEmit && npm run bundle\",\n    \"bundle\": \"node ../../scripts/bundle.js src/index.ts dist/index.js\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"test\": \"vitest run --coverage\",\n    \"test:watch\": \"vitest\",\n    \"test:coverage\": \"vitest run --coverage\"\n  },\n  \"dependencies\": {\n    \"@chrischall/mcp-utils\": \"^2.15.0\",\n    \"@modelcontextprotocol/server\": \"^2.3.0\",\n    \"zod\": \"^4.6.1\"\n  },\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"mcp\",\n    \"model-context-protocol\",\n    \"claude\",\n    \"ai\",\n    \"google\",\n    \"gogcli\",\n    \"gmail\",\n    \"email\"\n  ]\n}\n\nFile v4.7.0:tsconfig.json\n\n{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"../\"\n  },\n  \"include\": [\"src/**/*\", \"../gogcli-mcp/src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n\nFile v4.7.0:mint.yaml\n\nversion: 1\nname: Google Gmail (gogcli)\nslug: gogcli-mcp-gmail\nsummary: >-\n  Extended Gmail MCP server via gogcli — auth + full Gmail support (threads,\n  labels, drafts, attachments, forward, autoreply, bulk operations)\ncommand:\n  # This package publishes a single bin; naming it keeps the install\n  # unambiguous alongside its eight sibling packages.\n  bin: gogcli-mcp-gmail\nenv:\n  - name: GOG_CLIENT_ID\n    required: false\n    help: >-\n      Google OAuth client id. Read by the Node wrapper at startup\n      (bootstrap-auth.ts), which imports it into gog's keyring via a temp file\n      together with GOG_CLIENT_SECRET, GOG_REFRESH_TOKEN and GOG_ACCOUNT — set\n      all four or none. Not a secret, so unlike GOG_CLIENT_SECRET and\n      GOG_REFRESH_TOKEN it is not stripped from the spawned `gog`'s\n      environment; gog authenticates from its keyring under $HOME (see\n      state.dataDir).\n  - name: GOG_CLIENT_SECRET\n    secret: true\n    required: false\n    help: >-\n      Google OAuth client secret. Imported into gog's keyring at startup with\n      GOG_CLIENT_ID; stripped from the spawned CLI's environment by runner.ts's\n      *_SECRET rule.\n  - name: GOG_REFRESH_TOKEN\n    secret: true\n    required: false\n    help: >-\n      Google OAuth refresh token (`gog auth tokens export` prints one). Imported\n      into gog's keyring at startup with GOG_CLIENT_ID; stripped from the\n      spawned CLI's environment by runner.ts's *_TOKEN rule. Changing it\n      re-imports on the next start; an in-connector re-auth\n      (gog_auth_add_url/complete) stays in effect until it changes.\n  - name: GOG_ACCESS_TOKEN\n    secret: true\n    required: false\n    help: >-\n      Deliberately removed from the spawned CLI's environment by runner.ts, so\n      that a stale directly-passed token cannot shadow gog's stored refresh\n      credential. Leave unset.\n  - name: GOG_ACCOUNT\n    required: false\n    help: >-\n      The Google account to act as. Required for the startup auth bootstrap\n      (the refresh token is imported under this email); otherwise defaults to\n      gog's single/most recent account.\n  - name: GOG_KEYRING_BACKEND\n    required: false\n    help: >-\n      gog's credential store. Set to \"file\" on a headless host — there is no OS\n      keychain — so the keyring lives on the persistent data dir.\n  - name: GOG_KEYRING_PASSWORD\n    secret: true\n    required: false\n    help: >-\n      Encrypts gog's file keyring on the data dir. Required with\n      GOG_KEYRING_BACKEND=file. Deliberately not stripped from the spawned\n      CLI's environment — it is the one credential gog itself reads.\n  - name: GOG_READONLY\n    required: false\n    help: >-\n      Set to 1 to refuse every mutating operation. Recommended when the\n      connector is shared or you only need reads.\n  - name: GOG_PATH\n    required: false\n    help: >-\n      Path to the `gog` binary. Leave unset when the dependency below supplies\n      it; set it only to point at a binary you manage yourself.\n  - name: GOG_TIMEZONE\n    required: false\n    help: >-\n      The IANA zone gog formats its naive timestamps in. The wrapper passes\n      it to every spawned gog and reads it back (naiveSourceTimeZone) to\n      re-attach the offset, so the two always agree. Unset or invalid, both\n      use DISPLAY_TZ, then America/New_York — never the host's local zone.\n  - name: DISPLAY_TZ\n    required: false\n    help: >-\n      The IANA zone every rendered *Display field uses (displayTimeZone,\n      default America/New_York). It does not read GOG_TIMEZONE — the fallback\n      runs the other way, so this is also what GOG_TIMEZONE falls back to. An\n      invalid value degrades to the default rather than throwing.\ndependencies:\n  # Every tool shells out to the `gog` CLI; without it the server starts and\n  # then fails on the first call. This tag must track\n  # packages/gogcli-mcp/src/runner.ts's MIN_GOG_VERSION (the floor the tools\n  # assume). See CLAUDE.md \"Required gog version\" — bumping the floor means\n  # bumping these nine pins, and the pin stored on each mcp-host registration.\n  - kind: github-release\n    repo: openclaw/gogcli\n    tag: v0.43.0\n    asset: \"gogcli_*_linux_amd64.tar.gz\"\n    bin: [gog]\nstate:\n  dataDir: true\n  reason: >-\n    `gog` keeps its authorised-account state and file keyring under $HOME, and\n    the wrapper keeps its auth-bootstrap marker (~/.gogcli-mcp) there, so a\n    restart neither re-imports an unchanged secret nor discards an\n    in-connector re-auth. Without a persistent data dir every cold start has\n    only what the env secrets can re-seed.\negress:\n  allow:\n    # Google OAuth token exchange and the Google REST APIs the CLI calls.\n    - oauth2.googleapis.com\n    - www.googleapis.com\n    - googleapis.com\n\nFile v4.7.0:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Chris Hall\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v4.6.3: 22 files, 491824 bytes\n\nFiles: CHANGELOG.md (781b), dist/index.js (1658938b), LICENSE (1067b), manifest.json (11668b), mint.yaml (4732b), package.json (1131b), README.md (14035b), skill-card.md (1941b), SKILL.md (7909b), src/index.ts (510b), src/tools/gmail-extra.ts (236612b), tests/tools/attachment-index-resolve.test.ts (3845b), tests/tools/draft-diff-arithmetic.test.ts (2714b), tests/tools/draft-fork-signature.test.ts (3365b), tests/tools/draft-fork.test.ts (47558b), tests/tools/draft-write-vs-refetch.test.ts (6443b), tests/tools/gmail-confirm-token.test.ts (16291b), tests/tools/gmail-extra-gates.test.ts (11389b), tests/tools/gmail-extra.test.ts (215754b), tsconfig.json (209b), vitest.config.ts (523b), _meta.json (135b)\n\nFile v4.6.3:SKILL.md\n\n---\nname: gogcli-mcp-gmail\ndescription: Use when the user asks to read, organize, draft, forward, autoreply, or otherwise work with Gmail in depth. Triggers for requests involving threads, labels, drafts, attachments, bulk archive/trash/mark-read operations, forwarding messages, or any Gmail operation beyond simple search/get/send. Includes auth and Gmail tools only.\n---\n\n# gogcli-mcp-gmail\n\nExtended Gmail MCP server via [gogcli](https://github.com/openclaw/gogcli) — 61 tools: 8 auth + 4 base Gmail + 49 extra dedicated Gmail tools.\n\n- **Source:** [github.com/chrischall/gogcli-mcp](https://github.com/chrischall/gogcli-mcp)\n\n## Requirements\n\n- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated\n- Node.js 22 or later\n\n## Setup\n\n```json\n{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"gogcli-mcp-gmail\"],\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}\n```\n\n## Extra Gmail Tools\n\n### Read\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_raw` | Raw Gmail API JSON for a message |\n| `gog_gmail_attachment` | Download an attachment by `attachmentIndex` (or legacy `attachmentId`) and deliver its contents — inline when within `inlineMaxBytes` (3 MiB default, 10 MiB max — larger values are clamped), else a server-side file path — use `url`/`drive` when hosted (`deliver`: auto/inline/drive/url/off). `deliver=\"url\"` gives a signed link `curl` can fetch with no credential, for an hour — hosted deployments only |\n| `gog_gmail_url` | Print web URLs for threads |\n| `gog_gmail_history` | List history events since a historyId |\n| `gog_gmail_messages_search` | Search individual messages, not threads — one row per message |\n\n### Threads\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_thread_get` | Get a thread with all messages |\n| `gog_gmail_thread_modify` | Modify labels on a thread |\n| `gog_gmail_thread_attachments` | List/download all attachments in a thread |\n\n### Labels\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_labels_list` | List all labels |\n| `gog_gmail_labels_get` | Get a label's details and counts |\n| `gog_gmail_labels_create` | Create a new label |\n| `gog_gmail_labels_rename` | Rename a label |\n| `gog_gmail_labels_delete` | Delete a label |\n| `gog_gmail_labels_modify` | Modify labels on one or more threads |\n| `gog_gmail_labels_style` | Change a label's color or visibility |\n\n### Bulk operations\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_archive` | Archive by IDs or query |\n| `gog_gmail_mark_read` | Mark read by IDs or query |\n| `gog_gmail_mark_unread` | Mark unread by IDs or query |\n| `gog_gmail_trash` | Trash by IDs or query |\n| `gog_gmail_message_modify` | Modify labels on a single message |\n| `gog_gmail_batch_delete` | Permanently delete multiple messages |\n| `gog_gmail_batch_modify` | Modify labels on multiple messages |\n\n### Drafts\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_drafts_list` | List drafts (+ free `origin`/`rootsOwnThread`) |\n| `gog_gmail_drafts_get` | Get a draft |\n| `gog_gmail_drafts_create` | Create a draft |\n| `gog_gmail_drafts_update` | Update a draft; `replyToThreadId` re-threads it in place (same id) + `threadingVerification`; `forkSiblingDraftId` blocks a body overwrite that would drop the other copy's text |\n| `gog_gmail_drafts_delete` | Delete a draft |\n| `gog_gmail_drafts_send` | Send a draft after the user confirms a preview of it (404 → `DRAFT_FORKED`, or `GOOGLE_404_NOT_THE_DRAFT` if the draft is still listed) |\n| `gog_gmail_drafts_diff` | Diff two drafts (body divergence, threading loss, fork verdict) |\n| `gog_gmail_drafts_reply` | Save a reply as a draft — inherited recipients, subject and quote; never sends |\n| `gog_gmail_drafts_reply_all` | Save a reply-all as a draft; never sends |\n| `gog_gmail_drafts_forward` | Save a forward as a draft; recipients optional, so it can be staged without any |\n\nA draft edited in a mail client is replaced, not updated: the old id 404s. `drafts_update` / `drafts_send` answer that\n404 with a `DRAFT_FORKED` report (what happened, the drafts that exist, what to do) instead of a bare `notFound`, at a\nbounded cost of ≤2 extra gog calls. It never names a replacement — the 404'd draft cannot be fetched, so no lineage\nsignal can exist; use `drafts_diff` on a named pair for that. The 404 is attributed first: `replyToThreadId` and\n`replyToMessageId` resolve their own entities and 404 identically, so if the draft id is still in the listing the answer\nis `GOOGLE_404_NOT_THE_DRAFT` — no fork claimed, reply target named. That listing is capped at 20, so `listingEvidence`\nsays what it can carry: only a `complete-listing` (the window came back short, i.e. it covered the folder) claims the\ndraft is gone; `capped-listing` and `listing-unavailable` say in words that they establish nothing. A reply target, when\none was passed, is echoed and explained first.\n\n`drafts_diff` confirms a pairing only on a link from the candidate **to the original** (its `Message-Id` in the\ncandidate's `In-Reply-To`/`References`) or on agreement over text **neither draft quoted and neither client generated**\n— the salutation, closing formula, name and signature block are excluded alongside quoting, because a client writes them\nidentically on every message (`Hi Jennifer,` + `Thanks,` + `Chris` + `Sent from my iPhone` is 4 lines and 43 characters\nof pure apparatus). A shared reply root is corroboration only — every reply in a thread has one — and `none` means no\nevidence was found, not \"unrelated\". To adopt the survivor back onto the thread, call\n`drafts_update` with `replyToThreadId`: same draft id, gog resolves the reply headers, `threadingVerification` reports\nwhether it worked. It rewrites the whole body, so diff and merge first.\n\ngog requires a body on every update, so there is no header-only edit and every adoption overwrites the body. Pass\n`forkSiblingDraftId` (the other copy's id) and the update reads that draft first — one extra gog call, zero when the param\nis absent — and refuses to write (`DRAFT_CONTENT_LOSS`, nothing changed) if your body drops a line the sibling holds,\nnaming the lines; `acceptContentLoss: true` overrides, and `contentLossCheck.written` then reports whether the write it\nauthorised actually succeeded — a failed write says so and says nothing was saved. A check that could not run refuses too\n(`DRAFT_CONTENT_LOSS_UNCHECKED`). It compares text only and never claims one draft replaced another — that is\n`drafts_diff`'s job.\n\n### Write\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_import` | Import an RFC822/EML message into the mailbox (keeps its headers/date; does not send) |\n| `gog_gmail_forward` | Forward a message |\n| `gog_gmail_reply` | Reply to the original sender |\n| `gog_gmail_reply_all` | Reply to sender plus every To/Cc recipient |\n| `gog_gmail_autoreply` | Reply once to all messages matching a query |\n\n### Settings\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_vacation_get` | Get the vacation responder settings |\n| `gog_gmail_vacation_update` | Enable/disable the vacation responder |\n| `gog_gmail_filters_list` | List all filters |\n| `gog_gmail_filters_get` | Get a filter by ID |\n| `gog_gmail_filters_create` | Create a filter |\n| `gog_gmail_filters_delete` | Delete a filter |\n| `gog_gmail_sendas_list` | List send-as aliases |\n| `gog_gmail_sendas_get` | Get one send-as alias |\n| `gog_gmail_sendas_create` | Create a send-as alias |\n| `gog_gmail_sendas_update` | Update a send-as alias |\n| `gog_gmail_sendas_delete` | Delete a send-as alias |\n| `gog_gmail_sendas_verify` | Resend an alias verification email |\n\nPlus 8 auth tools and 4 base Gmail tools (search, get, send, run). Use `gog_gmail_run` for the settings with no dedicated tool (`delegates`, `forwarding`, `watch`) and email tracking (`track`).\n\nFile v4.6.3:README.md\n\n# gogcli-mcp-gmail\n\n> [!WARNING]\n> **AI-developed project.** This codebase was built and is actively maintained by [Claude Code](https://www.anthropic.com/claude). Review all code and tool permissions before use.\n\nExtended Gmail [MCP](https://modelcontextprotocol.io) server via [gogcli](https://github.com/openclaw/gogcli). Includes auth tools plus 49 additional dedicated Gmail tools for threads, labels, drafts, attachments, forwarding, autoreply, and bulk operations.\n\n## Requirements\n\n- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated\n- Node.js 22+\n\n```bash\nbrew install gogcli\ngog auth add your@gmail.com --services gmail\n```\n\n## Installation\n\n```bash\nnpm install -g gogcli-mcp-gmail\n```\n\n### Claude Desktop\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"gogcli-mcp-gmail\",\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}\n```\n\n### Claude Code\n\n```bash\nclaude mcp add gogcli-gmail -- gogcli-mcp-gmail\n```\n\n## Extra Gmail Tools (49)\n\nPlus 8 auth tools and 4 base Gmail tools (search, get, send, run) — 61 in all.\n\n### Read\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_raw` | Dump the raw Gmail API JSON for a message (lossless, for scripting) |\n| `gog_gmail_attachment` | Download an attachment (by `attachmentIndex`, or the legacy opaque `attachmentId`) and deliver its contents — by default an image inline and anything else as a server-side file path (`deliver`: auto/inline/drive/url/off; `inline` forces bytes within `inlineMaxBytes`, 3 MiB by default and at most 10 MiB — a larger value is clamped, since the hosted runtime caps one result at 14 MiB; `drive` uploads to Google Drive). On a hosted deployment, where that path is unreadable, use `url` or `drive`. `deliver=\"url\"` returns a **signed download link** — fetchable with `curl`, no credential and no Google session, valid for an hour, nothing written to your Drive and not blocked by `GOG_READONLY`; it needs the blob store a hosted deployment lends this server, so a local stdio install is told to use another mode |\n| `gog_gmail_url` | Print Gmail web URLs for one or more threads |\n| `gog_gmail_history` | List Gmail history events since a given historyId |\n| `gog_gmail_messages_search` | Search individual messages rather than threads — one result per matching message |\n\n### Threads\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_thread_get` | Get a thread with all messages, optionally with sanitized content and attachments |\n| `gog_gmail_thread_modify` | Modify labels on all messages in a thread |\n| `gog_gmail_thread_attachments` | List or download all attachments in a thread |\n\n### Labels\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_labels_list` | List all labels |\n| `gog_gmail_labels_get` | Get label details and counts |\n| `gog_gmail_labels_create` | Create a new label |\n| `gog_gmail_labels_rename` | Rename a label |\n| `gog_gmail_labels_delete` | Delete a label |\n| `gog_gmail_labels_modify` | Modify labels on one or more threads |\n| `gog_gmail_labels_style` | Change a user label's color or visibility |\n\n### Bulk Operations\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_archive` | Archive messages by ID or by query |\n| `gog_gmail_mark_read` | Mark messages as read by ID or by query |\n| `gog_gmail_mark_unread` | Mark messages as unread by ID or by query |\n| `gog_gmail_trash` | Move messages to trash by ID or by query |\n| `gog_gmail_message_modify` | Modify labels on a single message |\n| `gog_gmail_batch_delete` | Permanently delete multiple messages (irreversible) |\n| `gog_gmail_batch_modify` | Modify labels on multiple messages at once |\n\n### Drafts\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_drafts_list` | List drafts (free `origin` + `rootsOwnThread`; `enrich` adds subject/from/date for one extra call) |\n| `gog_gmail_drafts_get` | Get a draft by ID |\n| `gog_gmail_drafts_create` | Create a new draft |\n| `gog_gmail_drafts_update` | Update a draft — and re-thread it in place with `replyToThreadId`, keeping the same id, with a `threadingVerification` block reporting what gog actually wrote. `forkSiblingDraftId` refuses the write when the new body would drop text the other copy still holds |\n| `gog_gmail_drafts_delete` | Delete a draft |\n| `gog_gmail_drafts_send` | Send an existing draft (a 404 comes back diagnosed — `DRAFT_FORKED`, or `GOOGLE_404_NOT_THE_DRAFT` when the draft is still listed) |\n| `gog_gmail_drafts_diff` | Diff two named drafts — divergent body lines (with untruncated `onlyInACount`/`onlyInBCount`), threading loss, and a conservative fork verdict (2 gog calls) |\n| `gog_gmail_drafts_reply` | Save a reply as a draft — inherited recipients, subject and quote; never sends |\n| `gog_gmail_drafts_reply_all` | Save a reply-all as a draft; never sends |\n| `gog_gmail_drafts_forward` | Save a forward as a draft; recipients optional, so it can be staged without any |\n\n#### When a draft you created stops resolving\n\nA draft edited in a real mail client is not updated in place: the client writes a **new** draft and abandons the\noriginal, so the id you were given starts returning `Google API error (404 notFound)` — indistinguishable, at first\nglance, from \"someone deleted it\".\n\n`gog_gmail_drafts_update` and `gog_gmail_drafts_send` turn that 404 into a `DRAFT_FORKED` report: what happened, the\ndrafts that *do* exist (with the free `origin` / `rootsOwnThread` fields, plus subject/from/date), the other\nexplanations that produce the same 404 (deleted, already sent), and what to do next. It **names no replacement** — the\n404'd draft can no longer be fetched, so there is nothing to establish lineage against, and without lineage no pairing\nverdict is possible. Naming a pair and running `gog_gmail_drafts_diff` is the only path here that issues a fork verdict.\n\n**\"Not listed\" is not \"does not exist\".** That listing is capped at 20 drafts by construction — it is a failure path and\nmust not grow with the mailbox — so the report states, under `listingEvidence`, what its own evidence can carry. Only a\nlisting that came back *short* of the window covered the whole Drafts folder and earns the sentence \"draft X no longer\nresolves\" (`basis: complete-listing`, `establishesTheDraftIsGone: true`). A window that came back *full*\n(`capped-listing`) or a listing that *failed* (`listing-unavailable`) says so in words and claims nothing about the\ndraft: on a mailbox with more than 20 drafts, absence of evidence must not become the fork story by default. Widen it\nwith `gog_gmail_drafts_list` before concluding anything. When the call named a reply target, that target is echoed on\nthe report and its explanation is listed **first** — the branch with the least evidence about the draft is the last one\nthat should stay silent about the leading alternative.\n\n**The 404 is attributed, not assumed.** `gmail drafts update` resolves up to three Google entities — the draft, the\nthread behind `replyToThreadId`, and the message behind `replyToMessageId` — and gog renders all three 404s with the\nsame string. The listing the report already pays for settles it: if the draft id is still listed, the answer is\n`GOOGLE_404_NOT_THE_DRAFT`, which claims no fork, names the reply target as the remaining explanation, and tells you\nnot to go hunting for a replacement draft. `DRAFT_FORKED` is only used when the draft really has stopped resolving.\n\n**What counts as lineage** (`gog_gmail_drafts_diff`): only a link from the candidate *to the original* — the original\ndraft's own `Message-Id` inside the candidate's `In-Reply-To`/`References`, or agreement on text **neither draft\nquoted**. A **shared reply root is not lineage**: it links both drafts to a common *ancestor*, which every reply in a\nthread has, so it is reported as corroboration and can raise the answer no higher than an explicitly weak `candidate`.\nQuoted lines are excluded from the agreement metric because Apple Mail quotes on every reply — two unrelated replies\ninto one thread carry the same 30-line block, which scores 0.79 on a whole-body line metric while proving nothing.\n\n**Client boilerplate is excluded for the same reason.** The salutation, the closing formula, the name under it and the\nsignature block are reproduced identically on every message a client composes, whatever the message says —\n`Sent from my iPhone` is Apple Mail's own default. `Hi Jennifer,` + `Thanks,` + `Chris` + `Sent from my iPhone` is 4\nlines and 43 characters, enough on its own to clear a line-and-character threshold, so counting it paired two genuinely\nunrelated one-sentence notes as `confirmed` — and short confirmation plus a signature is the dominant shape of this\nmailbox. `bodyAgreement` reports `quotedLinesIgnored` and `boilerplateLinesIgnored` separately so the arithmetic can be\nredone. The divergence report still counts those lines: a merge that drops the signature really did drop it. The cost\nof the tighter metric is that a genuine fork of a *one-sentence* note now comes back `candidate` rather than\n`confirmed`, with `missing` naming the shortfall — the deliberate direction, since a missed fork costs a re-check and a\nwrong one sends the wrong text to the wrong thread.\n\nCost is bounded and constant: **at most 2 extra gog invocations**, only on a call that already failed, never scaling\nwith the number of drafts. A non-404 failure spends nothing.\n\nOnce you know which draft survived, `gog_gmail_drafts_update` with `replyToThreadId` adopts it back onto the original\nconversation **in one call, keeping its draft id** — gog resolves `In-Reply-To`/`References` from that thread's latest\nmessage and reports them back under `threadingVerification` (`ok`, the effective headers, and a note). Two things that\nblock make that safe to rely on: an explicit reply target *replaces* the draft's stored lineage rather than merging with\nit, and gog requires a body on every update, so the call **overwrites the whole body**. Diff first, merge by hand, then\nwrite.\n\n#### Guarding the merge: `forkSiblingDraftId`\n\nBecause gog requires a body on every update there is **no header-only edit**, so adopting a draft back onto its thread is\nalways a full body overwrite — the exact operation that destroys the paragraph living only in the other copy. In the\nobserved fork *neither* copy was a superset: the mail-client copy had lost a paragraph and the Gmail copy had gained\nsentences.\n\nThe line-based comparison cuts the other way too: a paragraph re-wrapped at a different width no longer matches line\nfor line, so `none` means *no evidence was found*, never *proven unrelated*, and the notes say so.\n\nPass `forkSiblingDraftId` (the id of the other copy) and `gog_gmail_drafts_update` reads that draft **before** writing and\nrefuses the write — `DRAFT_CONTENT_LOSS`, nothing changed — if your body omits any line the sibling still holds, naming the\nexact lines. Merge them in and retry, or pass `acceptContentLoss: true` to write anyway (the lines are still reported, and\nthe sibling itself is never touched). A check that cannot be *run* — sibling unfetchable, unparseable, or with no readable\nbody — refuses too, as `DRAFT_CONTENT_LOSS_UNCHECKED`: an unrun check is not a passed check.\n\nAn override reports the write that **actually happened**, never a predicted one: `contentLossCheck.written` is set from\nthe result, so a write that failed comes back saying it was attempted and saved nothing, and says the listed lines are\nstill in the sibling. Believing the opposite is the destructive case — a caller who thinks the merged body is stored may\ndelete or overwrite the copy that now holds the only version of those lines.\n\nIt **makes no fork claim**. You name the sibling; nothing searches for it, identical bodies would not prove a pairing and\ndivergent ones would not disprove one. `contentLossCheck.forkClaim` is always `null` and points at\n`gog_gmail_drafts_diff`, which is the only tool here that weighs identity, lineage and ordering.\n\n**Cost:** opt-in, exactly **one** extra gog invocation (a `drafts get` on the id you named — never a scan, never scaling\nwith the mailbox), and **zero** when the param is absent. A refusal spends that one call and skips the write entirely.\n\n### Write\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_import` | Import an RFC822/EML message into the mailbox, keeping its original headers and date (does not send) |\n| `gog_gmail_forward` | Forward a message to new recipients (with optional note) |\n| `gog_gmail_reply` | Reply to a message (original sender only) |\n| `gog_gmail_reply_all` | Reply to every participant (sender plus all To/Cc recipients) |\n| `gog_gmail_autoreply` | Reply once to all messages matching a query (with dedupe label) |\n\n### Settings\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_vacation_get` | Get the vacation responder (auto-reply) settings |\n| `gog_gmail_vacation_update` | Enable or disable the vacation responder, with optional start/end and audience limits |\n| `gog_gmail_filters_list` | List all Gmail filters |\n| `gog_gmail_filters_get` | Get a filter's criteria and actions by ID |\n| `gog_gmail_filters_create` | Create a filter from match criteria plus one or more actions |\n| `gog_gmail_filters_delete` | Delete a filter by ID |\n| `gog_gmail_sendas_list` | List all send-as aliases |\n| `gog_gmail_sendas_get` | Get one send-as alias by address |\n| `gog_gmail_sendas_create` | Create a send-as alias (usually needs verification before use) |\n| `gog_gmail_sendas_update` | Update an alias (display name, reply-to, signature, default) |\n| `gog_gmail_sendas_delete` | Delete a send-as alias |\n| `gog_gmail_sendas_verify` | Resend the verification email for a pending alias |\n\nEmail tracking (`track`) and the remaining admin settings (`delegates`, `forwarding`, `watch`) have no dedicated tool — reach them through the base `gog_gmail_run` escape hatch.\n\n## License\n\nMIT\n\nFile v4.6.3:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"gogcli-mcp-gmail\",\n  \"version\": \"4.6.3\",\n  \"publishedAt\": 1791218710671\n}\n\nFile v4.6.3:CHANGELOG.md\n\n# Changelog\n\n## [2.1.0](https://github.com/chrischall/gogcli-mcp/compare/v2.0.13...v2.1.0) (2026-05-25)\n\n\n### Features\n\n* **gmail:** add gogcli-mcp-gmail sub-package ([fac0f51](https://github.com/chrischall/gogcli-mcp/commit/fac0f515fd2ea587c570d7ac70c080cb8dc486ac))\n\n\n### Refactor\n\n* aggressive cleanup pass (audit findings) ([e635b39](https://github.com/chrischall/gogcli-mcp/commit/e635b391cf611e9c102a422ffbce5ebe28687b80))\n* review-pass cleanup (enums, shared schemas, test harness) ([ea851de](https://github.com/chrischall/gogcli-mcp/commit/ea851deb30b9cfef3f07ed506a011fc363b34018))\n\n\n### Documentation\n\n* update gogcli repo URLs to openclaw/gogcli (was steipete/gogcli) ([951a181](https://github.com/chrischall/gogcli-mcp/commit/951a1818ebc269f203aee723ccbea32c13817d8b))\n\nFile v4.6.3:skill-card.md\n\n## Description:\n\nEnables agents to read, organize, draft, send, and manage Gmail messages, threads, labels, and attachments.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nPeople using an agent with Gmail can search and read mail, manage threads and labels, prepare and send replies, and handle attachments or bulk mailbox actions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Some destructive Gmail delete actions may run without separate confirmation of the specific target.\n\nMitigation: Review the exact message or draft targets before permitting delete tools, especially on important accounts.\n\nRisk: Write tools can change mailbox contents or send messages when only read access is needed.\n\nMitigation: Set GOG_READONLY=1 for read-only use and keep GOG_FILE_ROOTS narrow.\n\nRisk: Signed attachment URLs allow access without a Google login, while Drive delivery creates files.\n\nMitigation: Treat attachment URLs as temporary bearer secrets and choose Drive delivery only when file creation is intended.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/chrischall/skills/gogcli-mcp-gmail)\n- [gogcli documentation](https://github.com/openclaw/gogcli)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Files, Links]\n\n**Output Format:** [Structured Gmail tool responses, attachment files, or download links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Signed attachment links expire after one hour.]\n\n## Skill Version(s):\n\n4.6.3 (source: ClawHub release and package.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v4.6.3:manifest.json\n\n{\n  \"$schema\": \"https://raw.githubusercontent.com/anthropics/dxt/main/dist/mcpb-manifest.schema.json\",\n  \"manifest_version\": \"0.3\",\n  \"name\": \"gogcli-mcp-gmail\",\n  \"display_name\": \"gogcli (Gmail)\",\n  \"version\": \"4.6.3\",\n  \"description\": \"Extended Gmail for Claude via gogcli — auth + full Gmail support (threads, labels, drafts, attachments, forward, autoreply, bulk operations)\",\n  \"author\": {\n    \"name\": \"Chris Hall\",\n    \"email\": \"chris.c.hall@gmail.com\",\n    \"url\": \"https://github.com/chrischall\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/chrischall/gogcli-mcp\"\n  },\n  \"homepage\": \"https://github.com/chrischall/gogcli-mcp\",\n  \"support\": \"https://github.com/chrischall/gogcli-mcp/issues\",\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"google\",\n    \"gmail\",\n    \"email\",\n    \"gogcli\",\n    \"gog\",\n    \"threads\",\n    \"labels\",\n    \"drafts\",\n    \"autoreply\"\n  ],\n  \"server\": {\n    \"type\": \"node\",\n    \"entry_point\": \"dist/index.js\",\n    \"mcp_config\": {\n      \"command\": \"node\",\n      \"args\": [\n        \"${__dirname}/dist/index.js\"\n      ],\n      \"env\": {\n        \"GOG_ACCOUNT\": \"${user_config.gog_account}\",\n        \"GOG_PATH\": \"${user_config.gog_path}\",\n        \"GOG_FILE_ROOTS\": \"${user_config.gog_file_roots}\"\n      }\n    }\n  },\n  \"user_config\": {\n    \"gog_account\": {\n      \"type\": \"string\",\n      \"title\": \"Google Account\",\n      \"description\": \"Default Google account email (optional — uses gogcli's configured default if omitted)\",\n      \"required\": false\n    },\n    \"gog_path\": {\n      \"type\": \"string\",\n      \"title\": \"gog Executable Path\",\n      \"description\": \"Path to the gog executable (optional — defaults to 'gog' on your PATH)\",\n      \"required\": false\n    },\n    \"gog_file_roots\": {\n      \"type\": \"string\",\n      \"title\": \"Allowed file directories\",\n      \"description\": \"Directories tools may read files from (attachments, uploads) or write files to (exports, downloads), separated by ':' (';' on Windows). Optional — defaults to ~/gogcli-mcp-files\",\n      \"required\": false\n    }\n  },\n  \"tools\": [\n    {\n      \"name\": \"gog_auth_add\",\n      \"description\": \"Authorize a Google account via browser-based OAuth\"\n    },\n    {\n      \"name\": \"gog_auth_health\",\n      \"description\": \"Live per-account token health: validity, age, and pre-expiry warnings (detects invalid_grant)\"\n    },\n    {\n      \"name\": \"gog_auth_add_url\",\n      \"description\": \"Begin remote/headless OAuth (step 1): return a sign-in URL to open in any browser\"\n    },\n    {\n      \"name\": \"gog_auth_add_complete\",\n      \"description\": \"Complete remote/headless OAuth (step 2): exchange the pasted redirect URL and store the token\"\n    },\n    {\n      \"name\": \"gog_auth_list\",\n      \"description\": \"List all Google accounts stored in gogcli\"\n    },\n    {\n      \"name\": \"gog_auth_status\",\n      \"description\": \"Show gogcli auth configuration\"\n    },\n    {\n      \"name\": \"gog_auth_services\",\n      \"description\": \"List Google services and OAuth scopes supported by gogcli\"\n    },\n    {\n      \"name\": \"gog_auth_run\",\n      \"description\": \"Run any gog auth subcommand (escape hatch)\"\n    },\n    {\n      \"name\": \"gog_gmail_search\",\n      \"description\": \"Search Gmail threads using Gmail query syntax; newest-first, and flags a truncated result set\"\n    },\n    {\n      \"name\": \"gog_gmail_get\",\n      \"description\": \"Get a Gmail message by ID\"\n    },\n    {\n      \"name\": \"gog_gmail_send\",\n      \"description\": \"Send an email, with attachments from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem)\"\n    },\n    {\n      \"name\": \"gog_gmail_run\",\n      \"description\": \"Run any gog gmail subcommand (escape hatch)\"\n    },\n    {\n      \"name\": \"gog_gmail_raw\",\n      \"description\": \"Dump raw Gmail API JSON for a message\"\n    },\n    {\n      \"name\": \"gog_gmail_attachment\",\n      \"description\": \"Download a Gmail attachment by 0-based attachmentIndex (or legacy attachmentId) and deliver its contents: an image inline, anything else as a server-side file path — or, on a hosted deployment, deliver=\\\"url\\\" for a signed link any HTTP client can fetch with no credential, or deliver=\\\"drive\\\" for a Drive link\"\n    },\n    {\n      \"name\": \"gog_gmail_url\",\n      \"description\": \"Print Gmail web URLs for one or more threads\"\n    },\n    {\n      \"name\": \"gog_gmail_history\",\n      \"description\": \"List Gmail history events since a historyId\"\n    },\n    {\n      \"name\": \"gog_gmail_archive\",\n      \"description\": \"Archive messages by IDs or by query\"\n    },\n    {\n      \"name\": \"gog_gmail_mark_read\",\n      \"description\": \"Mark messages as read by IDs or by query\"\n    },\n    {\n      \"name\": \"gog_gmail_mark_unread\",\n      \"description\": \"Mark messages as unread by IDs or by query\"\n    },\n    {\n      \"name\": \"gog_gmail_trash\",\n      \"description\": \"Move messages to trash by IDs or by query\"\n    },\n    {\n      \"name\": \"gog_gmail_message_modify\",\n      \"description\": \"Modify labels on a single message\"\n    },\n    {\n      \"name\": \"gog_gmail_batch_delete\",\n      \"description\": \"Permanently delete multiple messages (irreversible; requires force:true) (asks the user to confirm)\"\n    },\n    {\n      \"name\": \"gog_gmail_batch_modify\",\n      \"description\": \"Modify labels on multiple messages at once\"\n    },\n    {\n      \"name\": \"gog_gmail_thread_get\",\n      \"description\": \"Get a Gmail thread with all messages — the right tool when the threadId is already known\"\n    },\n    {\n      \"name\": \"gog_gmail_thread_modify\",\n      \"description\": \"Modify labels on all messages in a thread\"\n    },\n    {\n      \"name\": \"gog_gmail_thread_attachments\",\n      \"description\": \"List or download all attachments in a thread\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_list\",\n      \"description\": \"List all Gmail labels\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_get\",\n      \"description\": \"Get label details and counts\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_create\",\n      \"description\": \"Create a new Gmail label\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_rename\",\n      \"description\": \"Rename a Gmail label\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_delete\",\n      \"description\": \"Delete a Gmail label\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_modify\",\n      \"description\": \"Modify labels on one or more threads\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_list\",\n      \"description\": \"List Gmail drafts, annotated free with origin (api / non-api) and rootsOwnThread\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_get\",\n      \"description\": \"Get a Gmail draft by ID\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_create\",\n      \"description\": \"Create a new Gmail draft, with attachments from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem)\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_update\",\n      \"description\": \"Update an existing Gmail draft; re-thread it in place with replyToThreadId (same draft id) and verify the result via threadingVerification; forkSiblingDraftId refuses the write when the new body would drop text the named sibling copy still holds; a 404 is attributed to the draft id or to the reply target before it is reported Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_delete\",\n      \"description\": \"Delete a Gmail draft\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_send\",\n      \"description\": \"Send an existing Gmail draft after the user confirms a preview of it; a 404 comes back diagnosed (DRAFT_FORKED, or GOOGLE_404_NOT_THE_DRAFT when the draft is still listed)\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_diff\",\n      \"description\": \"Diff two named drafts: what each body has that the other lost, how their threading differs, and (only on a link back to the original or on agreement over unquoted text, with evidence) whether one replaced the other\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_reply\",\n      \"description\": \"Save a reply to a Gmail message as a draft (inherited recipients, subject and quote; never sends) Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_reply_all\",\n      \"description\": \"Save a reply-all to a Gmail message as a draft (never sends) Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_forward\",\n      \"description\": \"Save a forward of a Gmail message as a draft; recipients are optional (never sends)\"\n    },\n    {\n      \"name\": \"gog_gmail_import\",\n      \"description\": \"Import an RFC822/EML message into the mailbox (keeps its original headers and date; does not send)\"\n    },\n    {\n      \"name\": \"gog_gmail_forward\",\n      \"description\": \"Forward a Gmail message to new recipients\"\n    },\n    {\n      \"name\": \"gog_gmail_reply\",\n      \"description\": \"Reply to a Gmail message (sender only) Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_reply_all\",\n      \"description\": \"Reply to all participants of a Gmail message Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_autoreply\",\n      \"description\": \"Reply once to all messages matching a Gmail search query\"\n    },\n    {\n      \"name\": \"gog_gmail_messages_search\",\n      \"description\": \"Search individual messages; newest-first, and flags a truncated result set\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_style\",\n      \"description\": \"Change a user label's color or visibility\"\n    },\n    {\n      \"name\": \"gog_gmail_vacation_get\",\n      \"description\": \"Get the current vacation responder settings\"\n    },\n    {\n      \"name\": \"gog_gmail_vacation_update\",\n      \"description\": \"Enable, disable, or update the vacation responder (enabling asks the user to confirm)\"\n    },\n    {\n      \"name\": \"gog_gmail_filters_list\",\n      \"description\": \"List all Gmail filters\"\n    },\n    {\n      \"name\": \"gog_gmail_filters_get\",\n      \"description\": \"Get a single Gmail filter's criteria and actions\"\n    },\n    {\n      \"name\": \"gog_gmail_filters_create\",\n      \"description\": \"Create a Gmail filter with match criteria and actions (a forwarding filter asks the user to confirm)\"\n    },\n    {\n      \"name\": \"gog_gmail_filters_delete\",\n      \"description\": \"Delete a Gmail filter by ID\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_list\",\n      \"description\": \"List all send-as aliases for the account\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_get\",\n      \"description\": \"Get details of a single send-as alias\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_create\",\n      \"description\": \"Create a send-as alias (asks the user to confirm)\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_update\",\n      \"description\": \"Update a send-as alias or make it the default\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_delete\",\n      \"description\": \"Delete a send-as alias\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_verify\",\n      \"description\": \"Resend the verification email for a send-as alias\"\n    }\n  ],\n  \"compatibility\": {\n    \"platforms\": [\n      \"darwin\",\n      \"linux\",\n      \"win32\"\n    ],\n    \"runtimes\": {\n      \"node\": \">=22.0.0\"\n    }\n  }\n}\n\nFile v4.6.3:package.json\n\n{\n  \"name\": \"gogcli-mcp-gmail\",\n  \"version\": \"4.6.3\",\n  \"mcpName\": \"io.github.chrischall/gogcli-mcp-gmail\",\n  \"description\": \"Extended Gmail MCP server via gogcli — auth + full Gmail support (threads, labels, drafts, attachments, forward, autoreply, bulk operations)\",\n  \"author\": \"Claude Code (AI) <https://www.anthropic.com/claude>\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/chrischall/gogcli-mcp\"\n  },\n  \"type\": \"module\",\n  \"bin\": {\n    \"gogcli-mcp-gmail\": \"dist/index.js\"\n  },\n  \"exports\": {\n    \".\": \"./dist/index.js\"\n  },\n  \"scripts\": {\n    \"build\": \"tsc --noEmit && npm run bundle\",\n    \"bundle\": \"node ../../scripts/bundle.js src/index.ts dist/index.js\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"test\": \"vitest run --coverage\",\n    \"test:watch\": \"vitest\",\n    \"test:coverage\": \"vitest run --coverage\"\n  },\n  \"dependencies\": {\n    \"@chrischall/mcp-utils\": \"^2.14.0\",\n    \"@modelcontextprotocol/server\": \"^2.3.0\",\n    \"zod\": \"^4.6.1\"\n  },\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"mcp\",\n    \"model-context-protocol\",\n    \"claude\",\n    \"ai\",\n    \"google\",\n    \"gogcli\",\n    \"gmail\",\n    \"email\"\n  ]\n}\n\nFile v4.6.3:tsconfig.json\n\n{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"../\"\n  },\n  \"include\": [\"src/**/*\", \"../gogcli-mcp/src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n\nFile v4.6.3:mint.yaml\n\nversion: 1\nname: Google Gmail (gogcli)\nslug: gogcli-mcp-gmail\nsummary: >-\n  Extended Gmail MCP server via gogcli — auth + full Gmail support (threads,\n  labels, drafts, attachments, forward, autoreply, bulk operations)\ncommand:\n  # This package publishes a single bin; naming it keeps the install\n  # unambiguous alongside its eight sibling packages.\n  bin: gogcli-mcp-gmail\nenv:\n  - name: GOG_CLIENT_ID\n    required: false\n    help: >-\n      Google OAuth client id. Read by the Node wrapper at startup\n      (bootstrap-auth.ts), which imports it into gog's keyring via a temp file\n      together with GOG_CLIENT_SECRET, GOG_REFRESH_TOKEN and GOG_ACCOUNT — set\n      all four or none. Not a secret, so unlike GOG_CLIENT_SECRET and\n      GOG_REFRESH_TOKEN it is not stripped from the spawned `gog`'s\n      environment; gog authenticates from its keyring under $HOME (see\n      state.dataDir).\n  - name: GOG_CLIENT_SECRET\n    secret: true\n    required: false\n    help: >-\n      Google OAuth client secret. Imported into gog's keyring at startup with\n      GOG_CLIENT_ID; stripped from the spawned CLI's environment by runner.ts's\n      *_SECRET rule.\n  - name: GOG_REFRESH_TOKEN\n    secret: true\n    required: false\n    help: >-\n      Google OAuth refresh token (`gog auth tokens export` prints one). Imported\n      into gog's keyring at startup with GOG_CLIENT_ID; stripped from the\n      spawned CLI's environment by runner.ts's *_TOKEN rule. Changing it\n      re-imports on the next start; an in-connector re-auth\n      (gog_auth_add_url/complete) stays in effect until it changes.\n  - name: GOG_ACCESS_TOKEN\n    secret: true\n    required: false\n    help: >-\n      Deliberately removed from the spawned CLI's environment by runner.ts, so\n      that a stale directly-passed token cannot shadow gog's stored refresh\n      credential. Leave unset.\n  - name: GOG_ACCOUNT\n    required: false\n    help: >-\n      The Google account to act as. Required for the startup auth bootstrap\n      (the refresh token is imported under this email); otherwise defaults to\n      gog's single/most recent account.\n  - name: GOG_KEYRING_BACKEND\n    required: false\n    help: >-\n      gog's credential store. Set to \"file\" on a headless host — there is no OS\n      keychain — so the keyring lives on the persistent data dir.\n  - name: GOG_KEYRING_PASSWORD\n    secret: true\n    required: false\n    help: >-\n      Encrypts gog's file keyring on the data dir. Required with\n      GOG_KEYRING_BACKEND=file. Deliberately not stripped from the spawned\n      CLI's environment — it is the one credential gog itself reads.\n  - name: GOG_READONLY\n    required: false\n    help: >-\n      Set to 1 to refuse every mutating operation. Recommended when the\n      connector is shared or you only need reads.\n  - name: GOG_PATH\n    required: false\n    help: >-\n      Path to the `gog` binary. Leave unset when the dependency below supplies\n      it; set it only to point at a binary you manage yourself.\n  - name: GOG_TIMEZONE\n    required: false\n    help: >-\n      The IANA zone gog formats its naive timestamps in. The wrapper passes\n      it to every spawned gog and reads it back (naiveSourceTimeZone) to\n      re-attach the offset, so the two always agree. Unset or invalid, both\n      use DISPLAY_TZ, then America/New_York — never the host's local zone.\n  - name: DISPLAY_TZ\n    required: false\n    help: >-\n      The IANA zone every rendered *Display field uses (displayTimeZone,\n      default America/New_York). It does not read GOG_TIMEZONE — the fallback\n      runs the other way, so this is also what GOG_TIMEZONE falls back to. An\n      invalid value degrades to the default rather than throwing.\ndependencies:\n  # Every tool shells out to the `gog` CLI; without it the server starts and\n  # then fails on the first call. This tag must track\n  # packages/gogcli-mcp/src/runner.ts's MIN_GOG_VERSION (the floor the tools\n  # assume). See CLAUDE.md \"Required gog version\" — bumping the floor means\n  # bumping these nine pins, and the pin stored on each mcp-host registration.\n  - kind: github-release\n    repo: openclaw/gogcli\n    tag: v0.43.0\n    asset: \"gogcli_*_linux_amd64.tar.gz\"\n    bin: [gog]\nstate:\n  dataDir: true\n  reason: >-\n    `gog` keeps its authorised-account state and file keyring under $HOME, and\n    the wrapper keeps its auth-bootstrap marker (~/.gogcli-mcp) there, so a\n    restart neither re-imports an unchanged secret nor discards an\n    in-connector re-auth. Without a persistent data dir every cold start has\n    only what the env secrets can re-seed.\negress:\n  allow:\n    # Google OAuth token exchange and the Google REST APIs the CLI calls.\n    - oauth2.googleapis.com\n    - www.googleapis.com\n    - googleapis.com\n\nFile v4.6.3:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Chris Hall\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v4.6.2: 22 files, 491819 bytes\n\nFiles: CHANGELOG.md (781b), dist/index.js (1658752b), LICENSE (1067b), manifest.json (11668b), mint.yaml (4732b), package.json (1131b), README.md (14035b), skill-card.md (2127b), SKILL.md (7909b), src/index.ts (510b), src/tools/gmail-extra.ts (236612b), tests/tools/attachment-index-resolve.test.ts (3845b), tests/tools/draft-diff-arithmetic.test.ts (2714b), tests/tools/draft-fork-signature.test.ts (3365b), tests/tools/draft-fork.test.ts (47558b), tests/tools/draft-write-vs-refetch.test.ts (6443b), tests/tools/gmail-confirm-token.test.ts (16291b), tests/tools/gmail-extra-gates.test.ts (11389b), tests/tools/gmail-extra.test.ts (215754b), tsconfig.json (209b), vitest.config.ts (523b), _meta.json (135b)\n\nFile v4.6.2:SKILL.md\n\n---\nname: gogcli-mcp-gmail\ndescription: Use when the user asks to read, organize, draft, forward, autoreply, or otherwise work with Gmail in depth. Triggers for requests involving threads, labels, drafts, attachments, bulk archive/trash/mark-read operations, forwarding messages, or any Gmail operation beyond simple search/get/send. Includes auth and Gmail tools only.\n---\n\n# gogcli-mcp-gmail\n\nExtended Gmail MCP server via [gogcli](https://github.com/openclaw/gogcli) — 61 tools: 8 auth + 4 base Gmail + 49 extra dedicated Gmail tools.\n\n- **Source:** [github.com/chrischall/gogcli-mcp](https://github.com/chrischall/gogcli-mcp)\n\n## Requirements\n\n- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated\n- Node.js 22 or later\n\n## Setup\n\n```json\n{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"gogcli-mcp-gmail\"],\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}\n```\n\n## Extra Gmail Tools\n\n### Read\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_raw` | Raw Gmail API JSON for a message |\n| `gog_gmail_attachment` | Download an attachment by `attachmentIndex` (or legacy `attachmentId`) and deliver its contents — inline when within `inlineMaxBytes` (3 MiB default, 10 MiB max — larger values are clamped), else a server-side file path — use `url`/`drive` when hosted (`deliver`: auto/inline/drive/url/off). `deliver=\"url\"` gives a signed link `curl` can fetch with no credential, for an hour — hosted deployments only |\n| `gog_gmail_url` | Print web URLs for threads |\n| `gog_gmail_history` | List history events since a historyId |\n| `gog_gmail_messages_search` | Search individual messages, not threads — one row per message |\n\n### Threads\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_thread_get` | Get a thread with all messages |\n| `gog_gmail_thread_modify` | Modify labels on a thread |\n| `gog_gmail_thread_attachments` | List/download all attachments in a thread |\n\n### Labels\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_labels_list` | List all labels |\n| `gog_gmail_labels_get` | Get a label's details and counts |\n| `gog_gmail_labels_create` | Create a new label |\n| `gog_gmail_labels_rename` | Rename a label |\n| `gog_gmail_labels_delete` | Delete a label |\n| `gog_gmail_labels_modify` | Modify labels on one or more threads |\n| `gog_gmail_labels_style` | Change a label's color or visibility |\n\n### Bulk operations\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_archive` | Archive by IDs or query |\n| `gog_gmail_mark_read` | Mark read by IDs or query |\n| `gog_gmail_mark_unread` | Mark unread by IDs or query |\n| `gog_gmail_trash` | Trash by IDs or query |\n| `gog_gmail_message_modify` | Modify labels on a single message |\n| `gog_gmail_batch_delete` | Permanently delete multiple messages |\n| `gog_gmail_batch_modify` | Modify labels on multiple messages |\n\n### Drafts\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_drafts_list` | List drafts (+ free `origin`/`rootsOwnThread`) |\n| `gog_gmail_drafts_get` | Get a draft |\n| `gog_gmail_drafts_create` | Create a draft |\n| `gog_gmail_drafts_update` | Update a draft; `replyToThreadId` re-threads it in place (same id) + `threadingVerification`; `forkSiblingDraftId` blocks a body overwrite that would drop the other copy's text |\n| `gog_gmail_drafts_delete` | Delete a draft |\n| `gog_gmail_drafts_send` | Send a draft after the user confirms a preview of it (404 → `DRAFT_FORKED`, or `GOOGLE_404_NOT_THE_DRAFT` if the draft is still listed) |\n| `gog_gmail_drafts_diff` | Diff two drafts (body divergence, threading loss, fork verdict) |\n| `gog_gmail_drafts_reply` | Save a reply as a draft — inherited recipients, subject and quote; never sends |\n| `gog_gmail_drafts_reply_all` | Save a reply-all as a draft; never sends |\n| `gog_gmail_drafts_forward` | Save a forward as a draft; recipients optional, so it can be staged without any |\n\nA draft edited in a mail client is replaced, not updated: the old id 404s. `drafts_update` / `drafts_send` answer that\n404 with a `DRAFT_FORKED` report (what happened, the drafts that exist, what to do) instead of a bare `notFound`, at a\nbounded cost of ≤2 extra gog calls. It never names a replacement — the 404'd draft cannot be fetched, so no lineage\nsignal can exist; use `drafts_diff` on a named pair for that. The 404 is attributed first: `replyToThreadId` and\n`replyToMessageId` resolve their own entities and 404 identically, so if the draft id is still in the listing the answer\nis `GOOGLE_404_NOT_THE_DRAFT` — no fork claimed, reply target named. That listing is capped at 20, so `listingEvidence`\nsays what it can carry: only a `complete-listing` (the window came back short, i.e. it covered the folder) claims the\ndraft is gone; `capped-listing` and `listing-unavailable` say in words that they establish nothing. A reply target, when\none was passed, is echoed and explained first.\n\n`drafts_diff` confirms a pairing only on a link from the candidate **to the original** (its `Message-Id` in the\ncandidate's `In-Reply-To`/`References`) or on agreement over text **neither draft quoted and neither client generated**\n— the salutation, closing formula, name and signature block are excluded alongside quoting, because a client writes them\nidentically on every message (`Hi Jennifer,` + `Thanks,` + `Chris` + `Sent from my iPhone` is 4 lines and 43 characters\nof pure apparatus). A shared reply root is corroboration only — every reply in a thread has one — and `none` means no\nevidence was found, not \"unrelated\". To adopt the survivor back onto the thread, call\n`drafts_update` with `replyToThreadId`: same draft id, gog resolves the reply headers, `threadingVerification` reports\nwhether it worked. It rewrites the whole body, so diff and merge first.\n\ngog requires a body on every update, so there is no header-only edit and every adoption overwrites the body. Pass\n`forkSiblingDraftId` (the other copy's id) and the update reads that draft first — one extra gog call, zero when the param\nis absent — and refuses to write (`DRAFT_CONTENT_LOSS`, nothing changed) if your body drops a line the sibling holds,\nnaming the lines; `acceptContentLoss: true` overrides, and `contentLossCheck.written` then reports whether the write it\nauthorised actually succeeded — a failed write says so and says nothing was saved. A check that could not run refuses too\n(`DRAFT_CONTENT_LOSS_UNCHECKED`). It compares text only and never claims one draft replaced another — that is\n`drafts_diff`'s job.\n\n### Write\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_import` | Import an RFC822/EML message into the mailbox (keeps its headers/date; does not send) |\n| `gog_gmail_forward` | Forward a message |\n| `gog_gmail_reply` | Reply to the original sender |\n| `gog_gmail_reply_all` | Reply to sender plus every To/Cc recipient |\n| `gog_gmail_autoreply` | Reply once to all messages matching a query |\n\n### Settings\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_vacation_get` | Get the vacation responder settings |\n| `gog_gmail_vacation_update` | Enable/disable the vacation responder |\n| `gog_gmail_filters_list` | List all filters |\n| `gog_gmail_filters_get` | Get a filter by ID |\n| `gog_gmail_filters_create` | Create a filter |\n| `gog_gmail_filters_delete` | Delete a filter |\n| `gog_gmail_sendas_list` | List send-as aliases |\n| `gog_gmail_sendas_get` | Get one send-as alias |\n| `gog_gmail_sendas_create` | Create a send-as alias |\n| `gog_gmail_sendas_update` | Update a send-as alias |\n| `gog_gmail_sendas_delete` | Delete a send-as alias |\n| `gog_gmail_sendas_verify` | Resend an alias verification email |\n\nPlus 8 auth tools and 4 base Gmail tools (search, get, send, run). Use `gog_gmail_run` for the settings with no dedicated tool (`delegates`, `forwarding`, `watch`) and email tracking (`track`).\n\nFile v4.6.2:README.md\n\n# gogcli-mcp-gmail\n\n> [!WARNING]\n> **AI-developed project.** This codebase was built and is actively maintained by [Claude Code](https://www.anthropic.com/claude). Review all code and tool permissions before use.\n\nExtended Gmail [MCP](https://modelcontextprotocol.io) server via [gogcli](https://github.com/openclaw/gogcli). Includes auth tools plus 49 additional dedicated Gmail tools for threads, labels, drafts, attachments, forwarding, autoreply, and bulk operations.\n\n## Requirements\n\n- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated\n- Node.js 22+\n\n```bash\nbrew install gogcli\ngog auth add your@gmail.com --services gmail\n```\n\n## Installation\n\n```bash\nnpm install -g gogcli-mcp-gmail\n```\n\n### Claude Desktop\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"gogcli-mcp-gmail\",\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}\n```\n\n### Claude Code\n\n```bash\nclaude mcp add gogcli-gmail -- gogcli-mcp-gmail\n```\n\n## Extra Gmail Tools (49)\n\nPlus 8 auth tools and 4 base Gmail tools (search, get, send, run) — 61 in all.\n\n### Read\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_raw` | Dump the raw Gmail API JSON for a message (lossless, for scripting) |\n| `gog_gmail_attachment` | Download an attachment (by `attachmentIndex`, or the legacy opaque `attachmentId`) and deliver its contents — by default an image inline and anything else as a server-side file path (`deliver`: auto/inline/drive/url/off; `inline` forces bytes within `inlineMaxBytes`, 3 MiB by default and at most 10 MiB — a larger value is clamped, since the hosted runtime caps one result at 14 MiB; `drive` uploads to Google Drive). On a hosted deployment, where that path is unreadable, use `url` or `drive`. `deliver=\"url\"` returns a **signed download link** — fetchable with `curl`, no credential and no Google session, valid for an hour, nothing written to your Drive and not blocked by `GOG_READONLY`; it needs the blob store a hosted deployment lends this server, so a local stdio install is told to use another mode |\n| `gog_gmail_url` | Print Gmail web URLs for one or more threads |\n| `gog_gmail_history` | List Gmail history events since a given historyId |\n| `gog_gmail_messages_search` | Search individual messages rather than threads — one result per matching message |\n\n### Threads\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_thread_get` | Get a thread with all messages, optionally with sanitized content and attachments |\n| `gog_gmail_thread_modify` | Modify labels on all messages in a thread |\n| `gog_gmail_thread_attachments` | List or download all attachments in a thread |\n\n### Labels\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_labels_list` | List all labels |\n| `gog_gmail_labels_get` | Get label details and counts |\n| `gog_gmail_labels_create` | Create a new label |\n| `gog_gmail_labels_rename` | Rename a label |\n| `gog_gmail_labels_delete` | Delete a label |\n| `gog_gmail_labels_modify` | Modify labels on one or more threads |\n| `gog_gmail_labels_style` | Change a user label's color or visibility |\n\n### Bulk Operations\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_archive` | Archive messages by ID or by query |\n| `gog_gmail_mark_read` | Mark messages as read by ID or by query |\n| `gog_gmail_mark_unread` | Mark messages as unread by ID or by query |\n| `gog_gmail_trash` | Move messages to trash by ID or by query |\n| `gog_gmail_message_modify` | Modify labels on a single message |\n| `gog_gmail_batch_delete` | Permanently delete multiple messages (irreversible) |\n| `gog_gmail_batch_modify` | Modify labels on multiple messages at once |\n\n### Drafts\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_drafts_list` | List drafts (free `origin` + `rootsOwnThread`; `enrich` adds subject/from/date for one extra call) |\n| `gog_gmail_drafts_get` | Get a draft by ID |\n| `gog_gmail_drafts_create` | Create a new draft |\n| `gog_gmail_drafts_update` | Update a draft — and re-thread it in place with `replyToThreadId`, keeping the same id, with a `threadingVerification` block reporting what gog actually wrote. `forkSiblingDraftId` refuses the write when the new body would drop text the other copy still holds |\n| `gog_gmail_drafts_delete` | Delete a draft |\n| `gog_gmail_drafts_send` | Send an existing draft (a 404 comes back diagnosed — `DRAFT_FORKED`, or `GOOGLE_404_NOT_THE_DRAFT` when the draft is still listed) |\n| `gog_gmail_drafts_diff` | Diff two named drafts — divergent body lines (with untruncated `onlyInACount`/`onlyInBCount`), threading loss, and a conservative fork verdict (2 gog calls) |\n| `gog_gmail_drafts_reply` | Save a reply as a draft — inherited recipients, subject and quote; never sends |\n| `gog_gmail_drafts_reply_all` | Save a reply-all as a draft; never sends |\n| `gog_gmail_drafts_forward` | Save a forward as a draft; recipients optional, so it can be staged without any |\n\n#### When a draft you created stops resolving\n\nA draft edited in a real mail client is not updated in place: the client writes a **new** draft and abandons the\noriginal, so the id you were given starts returning `Google API error (404 notFound)` — indistinguishable, at first\nglance, from \"someone deleted it\".\n\n`gog_gmail_drafts_update` and `gog_gmail_drafts_send` turn that 404 into a `DRAFT_FORKED` report: what happened, the\ndrafts that *do* exist (with the free `origin` / `rootsOwnThread` fields, plus subject/from/date), the other\nexplanations that produce the same 404 (deleted, already sent), and what to do next. It **names no replacement** — the\n404'd draft can no longer be fetched, so there is nothing to establish lineage against, and without lineage no pairing\nverdict is possible. Naming a pair and running `gog_gmail_drafts_diff` is the only path here that issues a fork verdict.\n\n**\"Not listed\" is not \"does not exist\".** That listing is capped at 20 drafts by construction — it is a failure path and\nmust not grow with the mailbox — so the report states, under `listingEvidence`, what its own evidence can carry. Only a\nlisting that came back *short* of the window covered the whole Drafts folder and earns the sentence \"draft X no longer\nresolves\" (`basis: complete-listing`, `establishesTheDraftIsGone: true`). A window that came back *full*\n(`capped-listing`) or a listing that *failed* (`listing-unavailable`) says so in words and claims nothing about the\ndraft: on a mailbox with more than 20 drafts, absence of evidence must not become the fork story by default. Widen it\nwith `gog_gmail_drafts_list` before concluding anything. When the call named a reply target, that target is echoed on\nthe report and its explanation is listed **first** — the branch with the least evidence about the draft is the last one\nthat should stay silent about the leading alternative.\n\n**The 404 is attributed, not assumed.** `gmail drafts update` resolves up to three Google entities — the draft, the\nthread behind `replyToThreadId`, and the message behind `replyToMessageId` — and gog renders all three 404s with the\nsame string. The listing the report already pays for settles it: if the draft id is still listed, the answer is\n`GOOGLE_404_NOT_THE_DRAFT`, which claims no fork, names the reply target as the remaining explanation, and tells you\nnot to go hunting for a replacement draft. `DRAFT_FORKED` is only used when the draft really has stopped resolving.\n\n**What counts as lineage** (`gog_gmail_drafts_diff`): only a link from the candidate *to the original* — the original\ndraft's own `Message-Id` inside the candidate's `In-Reply-To`/`References`, or agreement on text **neither draft\nquoted**. A **shared reply root is not lineage**: it links both drafts to a common *ancestor*, which every reply in a\nthread has, so it is reported as corroboration and can raise the answer no higher than an explicitly weak `candidate`.\nQuoted lines are excluded from the agreement metric because Apple Mail quotes on every reply — two unrelated replies\ninto one thread carry the same 30-line block, which scores 0.79 on a whole-body line metric while proving nothing.\n\n**Client boilerplate is excluded for the same reason.** The salutation, the closing formula, the name under it and the\nsignature block are reproduced identically on every message a client composes, whatever the message says —\n`Sent from my iPhone` is Apple Mail's own default. `Hi Jennifer,` + `Thanks,` + `Chris` + `Sent from my iPhone` is 4\nlines and 43 characters, enough on its own to clear a line-and-character threshold, so counting it paired two genuinely\nunrelated one-sentence notes as `confirmed` — and short confirmation plus a signature is the dominant shape of this\nmailbox. `bodyAgreement` reports `quotedLinesIgnored` and `boilerplateLinesIgnored` separately so the arithmetic can be\nredone. The divergence report still counts those lines: a merge that drops the signature really did drop it. The cost\nof the tighter metric is that a genuine fork of a *one-sentence* note now comes back `candidate` rather than\n`confirmed`, with `missing` naming the shortfall — the deliberate direction, since a missed fork costs a re-check and a\nwrong one sends the wrong text to the wrong thread.\n\nCost is bounded and constant: **at most 2 extra gog invocations**, only on a call that already failed, never scaling\nwith the number of drafts. A non-404 failure spends nothing.\n\nOnce you know which draft survived, `gog_gmail_drafts_update` with `replyToThreadId` adopts it back onto the original\nconversation **in one call, keeping its draft id** — gog resolves `In-Reply-To`/`References` from that thread's latest\nmessage and reports them back under `threadingVerification` (`ok`, the effective headers, and a note). Two things that\nblock make that safe to rely on: an explicit reply target *replaces* the draft's stored lineage rather than merging with\nit, and gog requires a body on every update, so the call **overwrites the whole body**. Diff first, merge by hand, then\nwrite.\n\n#### Guarding the merge: `forkSiblingDraftId`\n\nBecause gog requires a body on every update there is **no header-only edit**, so adopting a draft back onto its thread is\nalways a full body overwrite — the exact operation that destroys the paragraph living only in the other copy. In the\nobserved fork *neither* copy was a superset: the mail-client copy had lost a paragraph and the Gmail copy had gained\nsentences.\n\nThe line-based comparison cuts the other way too: a paragraph re-wrapped at a different width no longer matches line\nfor line, so `none` means *no evidence was found*, never *proven unrelated*, and the notes say so.\n\nPass `forkSiblingDraftId` (the id of the other copy) and `gog_gmail_drafts_update` reads that draft **before** writing and\nrefuses the write — `DRAFT_CONTENT_LOSS`, nothing changed — if your body omits any line the sibling still holds, naming the\nexact lines. Merge them in and retry, or pass `acceptContentLoss: true` to write anyway (the lines are still reported, and\nthe sibling itself is never touched). A check that cannot be *run* — sibling unfetchable, unparseable, or with no readable\nbody — refuses too, as `DRAFT_CONTENT_LOSS_UNCHECKED`: an unrun check is not a passed check.\n\nAn override reports the write that **actually happened**, never a predicted one: `contentLossCheck.written` is set from\nthe result, so a write that failed comes back saying it was attempted and saved nothing, and says the listed lines are\nstill in the sibling. Believing the opposite is the destructive case — a caller who thinks the merged body is stored may\ndelete or overwrite the copy that now holds the only version of those lines.\n\nIt **makes no fork claim**. You name the sibling; nothing searches for it, identical bodies would not prove a pairing and\ndivergent ones would not disprove one. `contentLossCheck.forkClaim` is always `null` and points at\n`gog_gmail_drafts_diff`, which is the only tool here that weighs identity, lineage and ordering.\n\n**Cost:** opt-in, exactly **one** extra gog invocation (a `drafts get` on the id you named — never a scan, never scaling\nwith the mailbox), and **zero** when the param is absent. A refusal spends that one call and skips the write entirely.\n\n### Write\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_import` | Import an RFC822/EML message into the mailbox, keeping its original headers and date (does not send) |\n| `gog_gmail_forward` | Forward a message to new recipients (with optional note) |\n| `gog_gmail_reply` | Reply to a message (original sender only) |\n| `gog_gmail_reply_all` | Reply to every participant (sender plus all To/Cc recipients) |\n| `gog_gmail_autoreply` | Reply once to all messages matching a query (with dedupe label) |\n\n### Settings\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_vacation_get` | Get the vacation responder (auto-reply) settings |\n| `gog_gmail_vacation_update` | Enable or disable the vacation responder, with optional start/end and audience limits |\n| `gog_gmail_filters_list` | List all Gmail filters |\n| `gog_gmail_filters_get` | Get a filter's criteria and actions by ID |\n| `gog_gmail_filters_create` | Create a filter from match criteria plus one or more actions |\n| `gog_gmail_filters_delete` | Delete a filter by ID |\n| `gog_gmail_sendas_list` | List all send-as aliases |\n| `gog_gmail_sendas_get` | Get one send-as alias by address |\n| `gog_gmail_sendas_create` | Create a send-as alias (usually needs verification before use) |\n| `gog_gmail_sendas_update` | Update an alias (display name, reply-to, signature, default) |\n| `gog_gmail_sendas_delete` | Delete a send-as alias |\n| `gog_gmail_sendas_verify` | Resend the verification email for a pending alias |\n\nEmail tracking (`track`) and the remaining admin settings (`delegates`, `forwarding`, `watch`) have no dedicated tool — reach them through the base `gog_gmail_run` escape hatch.\n\n## License\n\nMIT\n\nFile v4.6.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"gogcli-mcp-gmail\",\n  \"version\": \"4.6.2\",\n  \"publishedAt\": 1791168909369\n}\n\nFile v4.6.2:CHANGELOG.md\n\n# Changelog\n\n## [2.1.0](https://github.com/chrischall/gogcli-mcp/compare/v2.0.13...v2.1.0) (2026-05-25)\n\n\n### Features\n\n* **gmail:** add gogcli-mcp-gmail sub-package ([fac0f51](https://github.com/chrischall/gogcli-mcp/commit/fac0f515fd2ea587c570d7ac70c080cb8dc486ac))\n\n\n### Refactor\n\n* aggressive cleanup pass (audit findings) ([e635b39](https://github.com/chrischall/gogcli-mcp/commit/e635b391cf611e9c102a422ffbce5ebe28687b80))\n* review-pass cleanup (enums, shared schemas, test harness) ([ea851de](https://github.com/chrischall/gogcli-mcp/commit/ea851deb30b9cfef3f07ed506a011fc363b34018))\n\n\n### Documentation\n\n* update gogcli repo URLs to openclaw/gogcli (was steipete/gogcli) ([951a181](https://github.com/chrischall/gogcli-mcp/commit/951a1818ebc269f203aee723ccbea32c13817d8b))\n\nFile v4.6.2:skill-card.md\n\n## Description:\n\nConnects an agent to Gmail to read and organize messages, manage threads, labels, drafts and attachments, and perform forwarding, sending and bulk actions.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nPeople and teams with an authenticated Gmail account use this skill to let an agent search and read mail, manage drafts and attachments, organize messages, and carry out requested Gmail actions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Broad Gmail access exposes private messages and permits changes to the account.\n\nMitigation: Grant access only to a trusted agent; use GOG_READONLY for read-only tasks and a dedicated Google account where possible.\n\nRisk: Deleting drafts, labels, filters or send-as aliases may cause irreversible changes without a consistent user-bound confirmation prompt.\n\nMitigation: Require explicit user review before destructive or account-settings actions.\n\nRisk: Attachment handling may expose sensitive files outside intended locations.\n\nMitigation: Restrict GOG_FILE_ROOTS to approved directories and review attachments before sharing them.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/chrischall/skills/gogcli-mcp-gmail)\n- [gogcli documentation](https://github.com/openclaw/gogcli)\n- [Model Context Protocol](https://modelcontextprotocol.io)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Files, Links]\n\n**Output Format:** [Gmail data and action confirmations in text or JSON; attachments as files or links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Results may include message contents and attachment data.]\n\n## Skill Version(s):\n\n4.6.2 (source: ClawHub release, package.json, manifest.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v4.6.2:manifest.json\n\n{\n  \"$schema\": \"https://raw.githubusercontent.com/anthropics/dxt/main/dist/mcpb-manifest.schema.json\",\n  \"manifest_version\": \"0.3\",\n  \"name\": \"gogcli-mcp-gmail\",\n  \"display_name\": \"gogcli (Gmail)\",\n  \"version\": \"4.6.2\",\n  \"description\": \"Extended Gmail for Claude via gogcli — auth + full Gmail support (threads, labels, drafts, attachments, forward, autoreply, bulk operations)\",\n  \"author\": {\n    \"name\": \"Chris Hall\",\n    \"email\": \"chris.c.hall@gmail.com\",\n    \"url\": \"https://github.com/chrischall\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/chrischall/gogcli-mcp\"\n  },\n  \"homepage\": \"https://github.com/chrischall/gogcli-mcp\",\n  \"support\": \"https://github.com/chrischall/gogcli-mcp/issues\",\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"google\",\n    \"gmail\",\n    \"email\",\n    \"gogcli\",\n    \"gog\",\n    \"threads\",\n    \"labels\",\n    \"drafts\",\n    \"autoreply\"\n  ],\n  \"server\": {\n    \"type\": \"node\",\n    \"entry_point\": \"dist/index.js\",\n    \"mcp_config\": {\n      \"command\": \"node\",\n      \"args\": [\n        \"${__dirname}/dist/index.js\"\n      ],\n      \"env\": {\n        \"GOG_ACCOUNT\": \"${user_config.gog_account}\",\n        \"GOG_PATH\": \"${user_config.gog_path}\",\n        \"GOG_FILE_ROOTS\": \"${user_config.gog_file_roots}\"\n      }\n    }\n  },\n  \"user_config\": {\n    \"gog_account\": {\n      \"type\": \"string\",\n      \"title\": \"Google Account\",\n      \"description\": \"Default Google account email (optional — uses gogcli's configured default if omitted)\",\n      \"required\": false\n    },\n    \"gog_path\": {\n      \"type\": \"string\",\n      \"title\": \"gog Executable Path\",\n      \"description\": \"Path to the gog executable (optional — defaults to 'gog' on your PATH)\",\n      \"required\": false\n    },\n    \"gog_file_roots\": {\n      \"type\": \"string\",\n      \"title\": \"Allowed file directories\",\n      \"description\": \"Directories tools may read files from (attachments, uploads) or write files to (exports, downloads), separated by ':' (';' on Windows). Optional — defaults to ~/gogcli-mcp-files\",\n      \"required\": false\n    }\n  },\n  \"tools\": [\n    {\n      \"name\": \"gog_auth_add\",\n      \"description\": \"Authorize a Google account via browser-based OAuth\"\n    },\n    {\n      \"name\": \"gog_auth_health\",\n      \"description\": \"Live per-account token health: validity, age, and pre-expiry warnings (detects invalid_grant)\"\n    },\n    {\n      \"name\": \"gog_auth_add_url\",\n      \"description\": \"Begin remote/headless OAuth (step 1): return a sign-in URL to open in any browser\"\n    },\n    {\n      \"name\": \"gog_auth_add_complete\",\n      \"description\": \"Complete remote/headless OAuth (step 2): exchange the pasted redirect URL and store the token\"\n    },\n    {\n      \"name\": \"gog_auth_list\",\n      \"description\": \"List all Google accounts stored in gogcli\"\n    },\n    {\n      \"name\": \"gog_auth_status\",\n      \"description\": \"Show gogcli auth configuration\"\n    },\n    {\n      \"name\": \"gog_auth_services\",\n      \"description\": \"List Google services and OAuth scopes supported by gogcli\"\n    },\n    {\n      \"name\": \"gog_auth_run\",\n      \"description\": \"Run any gog auth subcommand (escape hatch)\"\n    },\n    {\n      \"name\": \"gog_gmail_search\",\n      \"description\": \"Search Gmail threads using Gmail query syntax; newest-first, and flags a truncated result set\"\n    },\n    {\n      \"name\": \"gog_gmail_get\",\n      \"description\": \"Get a Gmail message by ID\"\n    },\n    {\n      \"name\": \"gog_gmail_send\",\n      \"description\": \"Send an email, with attachments from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem)\"\n    },\n    {\n      \"name\": \"gog_gmail_run\",\n      \"description\": \"Run any gog gmail subcommand (escape hatch)\"\n    },\n    {\n      \"name\": \"gog_gmail_raw\",\n      \"description\": \"Dump raw Gmail API JSON for a message\"\n    },\n    {\n      \"name\": \"gog_gmail_attachment\",\n      \"description\": \"Download a Gmail attachment by 0-based attachmentIndex (or legacy attachmentId) and deliver its contents: an image inline, anything else as a server-side file path — or, on a hosted deployment, deliver=\\\"url\\\" for a signed link any HTTP client can fetch with no credential, or deliver=\\\"drive\\\" for a Drive link\"\n    },\n    {\n      \"name\": \"gog_gmail_url\",\n      \"description\": \"Print Gmail web URLs for one or more threads\"\n    },\n    {\n      \"name\": \"gog_gmail_history\",\n      \"description\": \"List Gmail history events since a historyId\"\n    },\n    {\n      \"name\": \"gog_gmail_archive\",\n      \"description\": \"Archive messages by IDs or by query\"\n    },\n    {\n      \"name\": \"gog_gmail_mark_read\",\n      \"description\": \"Mark messages as read by IDs or by query\"\n    },\n    {\n      \"name\": \"gog_gmail_mark_unread\",\n      \"description\": \"Mark messages as unread by IDs or by query\"\n    },\n    {\n      \"name\": \"gog_gmail_trash\",\n      \"description\": \"Move messages to trash by IDs or by query\"\n    },\n    {\n      \"name\": \"gog_gmail_message_modify\",\n      \"description\": \"Modify labels on a single message\"\n    },\n    {\n      \"name\": \"gog_gmail_batch_delete\",\n      \"description\": \"Permanently delete multiple messages (irreversible; requires force:true) (asks the user to confirm)\"\n    },\n    {\n      \"name\": \"gog_gmail_batch_modify\",\n      \"description\": \"Modify labels on multiple messages at once\"\n    },\n    {\n      \"name\": \"gog_gmail_thread_get\",\n      \"description\": \"Get a Gmail thread with all messages — the right tool when the threadId is already known\"\n    },\n    {\n      \"name\": \"gog_gmail_thread_modify\",\n      \"description\": \"Modify labels on all messages in a thread\"\n    },\n    {\n      \"name\": \"gog_gmail_thread_attachments\",\n      \"description\": \"List or download all attachments in a thread\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_list\",\n      \"description\": \"List all Gmail labels\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_get\",\n      \"description\": \"Get label details and counts\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_create\",\n      \"description\": \"Create a new Gmail label\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_rename\",\n      \"description\": \"Rename a Gmail label\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_delete\",\n      \"description\": \"Delete a Gmail label\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_modify\",\n      \"description\": \"Modify labels on one or more threads\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_list\",\n      \"description\": \"List Gmail drafts, annotated free with origin (api / non-api) and rootsOwnThread\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_get\",\n      \"description\": \"Get a Gmail draft by ID\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_create\",\n      \"description\": \"Create a new Gmail draft, with attachments from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem)\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_update\",\n      \"description\": \"Update an existing Gmail draft; re-thread it in place with replyToThreadId (same draft id) and verify the result via threadingVerification; forkSiblingDraftId refuses the write when the new body would drop text the named sibling copy still holds; a 404 is attributed to the draft id or to the reply target before it is reported Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_delete\",\n      \"description\": \"Delete a Gmail draft\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_send\",\n      \"description\": \"Send an existing Gmail draft after the user confirms a preview of it; a 404 comes back diagnosed (DRAFT_FORKED, or GOOGLE_404_NOT_THE_DRAFT when the draft is still listed)\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_diff\",\n      \"description\": \"Diff two named drafts: what each body has that the other lost, how their threading differs, and (only on a link back to the original or on agreement over unquoted text, with evidence) whether one replaced the other\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_reply\",\n      \"description\": \"Save a reply to a Gmail message as a draft (inherited recipients, subject and quote; never sends) Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_reply_all\",\n      \"description\": \"Save a reply-all to a Gmail message as a draft (never sends) Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_drafts_forward\",\n      \"description\": \"Save a forward of a Gmail message as a draft; recipients are optional (never sends)\"\n    },\n    {\n      \"name\": \"gog_gmail_import\",\n      \"description\": \"Import an RFC822/EML message into the mailbox (keeps its original headers and date; does not send)\"\n    },\n    {\n      \"name\": \"gog_gmail_forward\",\n      \"description\": \"Forward a Gmail message to new recipients\"\n    },\n    {\n      \"name\": \"gog_gmail_reply\",\n      \"description\": \"Reply to a Gmail message (sender only) Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_reply_all\",\n      \"description\": \"Reply to all participants of a Gmail message Attachments come from server-side paths (attach) or from base64 bytes sent with the call (attachInline, for remote deployments with no shared filesystem).\"\n    },\n    {\n      \"name\": \"gog_gmail_autoreply\",\n      \"description\": \"Reply once to all messages matching a Gmail search query\"\n    },\n    {\n      \"name\": \"gog_gmail_messages_search\",\n      \"description\": \"Search individual messages; newest-first, and flags a truncated result set\"\n    },\n    {\n      \"name\": \"gog_gmail_labels_style\",\n      \"description\": \"Change a user label's color or visibility\"\n    },\n    {\n      \"name\": \"gog_gmail_vacation_get\",\n      \"description\": \"Get the current vacation responder settings\"\n    },\n    {\n      \"name\": \"gog_gmail_vacation_update\",\n      \"description\": \"Enable, disable, or update the vacation responder (enabling asks the user to confirm)\"\n    },\n    {\n      \"name\": \"gog_gmail_filters_list\",\n      \"description\": \"List all Gmail filters\"\n    },\n    {\n      \"name\": \"gog_gmail_filters_get\",\n      \"description\": \"Get a single Gmail filter's criteria and actions\"\n    },\n    {\n      \"name\": \"gog_gmail_filters_create\",\n      \"description\": \"Create a Gmail filter with match criteria and actions (a forwarding filter asks the user to confirm)\"\n    },\n    {\n      \"name\": \"gog_gmail_filters_delete\",\n      \"description\": \"Delete a Gmail filter by ID\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_list\",\n      \"description\": \"List all send-as aliases for the account\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_get\",\n      \"description\": \"Get details of a single send-as alias\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_create\",\n      \"description\": \"Create a send-as alias (asks the user to confirm)\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_update\",\n      \"description\": \"Update a send-as alias or make it the default\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_delete\",\n      \"description\": \"Delete a send-as alias\"\n    },\n    {\n      \"name\": \"gog_gmail_sendas_verify\",\n      \"description\": \"Resend the verification email for a send-as alias\"\n    }\n  ],\n  \"compatibility\": {\n    \"platforms\": [\n      \"darwin\",\n      \"linux\",\n      \"win32\"\n    ],\n    \"runtimes\": {\n      \"node\": \">=22.0.0\"\n    }\n  }\n}\n\nFile v4.6.2:package.json\n\n{\n  \"name\": \"gogcli-mcp-gmail\",\n  \"version\": \"4.6.2\",\n  \"mcpName\": \"io.github.chrischall/gogcli-mcp-gmail\",\n  \"description\": \"Extended Gmail MCP server via gogcli — auth + full Gmail support (threads, labels, drafts, attachments, forward, autoreply, bulk operations)\",\n  \"author\": \"Claude Code (AI) <https://www.anthropic.com/claude>\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/chrischall/gogcli-mcp\"\n  },\n  \"type\": \"module\",\n  \"bin\": {\n    \"gogcli-mcp-gmail\": \"dist/index.js\"\n  },\n  \"exports\": {\n    \".\": \"./dist/index.js\"\n  },\n  \"scripts\": {\n    \"build\": \"tsc --noEmit && npm run bundle\",\n    \"bundle\": \"node ../../scripts/bundle.js src/index.ts dist/index.js\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"test\": \"vitest run --coverage\",\n    \"test:watch\": \"vitest\",\n    \"test:coverage\": \"vitest run --coverage\"\n  },\n  \"dependencies\": {\n    \"@chrischall/mcp-utils\": \"^2.14.0\",\n    \"@modelcontextprotocol/server\": \"^2.3.0\",\n    \"zod\": \"^4.6.1\"\n  },\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"mcp\",\n    \"model-context-protocol\",\n    \"claude\",\n    \"ai\",\n    \"google\",\n    \"gogcli\",\n    \"gmail\",\n    \"email\"\n  ]\n}\n\nFile v4.6.2:tsconfig.json\n\n{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"../\"\n  },\n  \"include\": [\"src/**/*\", \"../gogcli-mcp/src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n\nFile v4.6.2:mint.yaml\n\nversion: 1\nname: Google Gmail (gogcli)\nslug: gogcli-mcp-gmail\nsummary: >-\n  Extended Gmail MCP server via gogcli — auth + full Gmail support (threads,\n  labels, drafts, attachments, forward, autoreply, bulk operations)\ncommand:\n  # This package publishes a single bin; naming it keeps the install\n  # unambiguous alongside its eight sibling packages.\n  bin: gogcli-mcp-gmail\nenv:\n  - name: GOG_CLIENT_ID\n    required: false\n    help: >-\n      Google OAuth client id. Read by the Node wrapper at startup\n      (bootstrap-auth.ts), which imports it into gog's keyring via a temp file\n      together with GOG_CLIENT_SECRET, GOG_REFRESH_TOKEN and GOG_ACCOUNT — set\n      all four or none. Not a secret, so unlike GOG_CLIENT_SECRET and\n      GOG_REFRESH_TOKEN it is not stripped from the spawned `gog`'s\n      environment; gog authenticates from its keyring under $HOME (see\n      state.dataDir).\n  - name: GOG_CLIENT_SECRET\n    secret: true\n    required: false\n    help: >-\n      Google OAuth client secret. Imported into gog's keyring at startup with\n      GOG_CLIENT_ID; stripped from the spawned CLI's environment by runner.ts's\n      *_SECRET rule.\n  - name: GOG_REFRESH_TOKEN\n    secret: true\n    required: false\n    help: >-\n      Google OAuth refresh token (`gog auth tokens export` prints one). Imported\n      into gog's keyring at startup with GOG_CLIENT_ID; stripped from the\n      spawned CLI's environment by runner.ts's *_TOKEN rule. Changing it\n      re-imports on the next start; an in-connector re-auth\n      (gog_auth_add_url/complete) stays in effect until it changes.\n  - name: GOG_ACCESS_TOKEN\n    secret: true\n    required: false\n    help: >-\n      Deliberately removed from the spawned CLI's environment by runner.ts, so\n      that a stale directly-passed token cannot shadow gog's stored refresh\n      credential. Leave unset.\n  - name: GOG_ACCOUNT\n    required: false\n    help: >-\n      The Google account to act as. Required for the startup auth bootstrap\n      (the refresh token is imported under this email); otherwise defaults to\n      gog's single/most recent account.\n  - name: GOG_KEYRING_BACKEND\n    required: false\n    help: >-\n      gog's credential store. Set to \"file\" on a headless host — there is no OS\n      keychain — so the keyring lives on the persistent data dir.\n  - name: GOG_KEYRING_PASSWORD\n    secret: true\n    required: false\n    help: >-\n      Encrypts gog's file keyring on the data dir. Required with\n      GOG_KEYRING_BACKEND=file. Deliberately not stripped from the spawned\n      CLI's environment — it is the one credential gog itself reads.\n  - name: GOG_READONLY\n    required: false\n    help: >-\n      Set to 1 to refuse every mutating operation. Recommended when the\n      connector is shared or you only need reads.\n  - name: GOG_PATH\n    required: false\n    help: >-\n      Path to the `gog` binary. Leave unset when the dependency below supplies\n      it; set it only to point at a binary you manage yourself.\n  - name: GOG_TIMEZONE\n    required: false\n    help: >-\n      The IANA zone gog formats its naive timestamps in. The wrapper passes\n      it to every spawned gog and reads it back (naiveSourceTimeZone) to\n      re-attach the offset, so the two always agree. Unset or invalid, both\n      use DISPLAY_TZ, then America/New_York — never the host's local zone.\n  - name: DISPLAY_TZ\n    required: false\n    help: >-\n      The IANA zone every rendered *Display field uses (displayTimeZone,\n      default America/New_York). It does not read GOG_TIMEZONE — the fallback\n      runs the other way, so this is also what GOG_TIMEZONE falls back to. An\n      invalid value degrades to the default rather than throwing.\ndependencies:\n  # Every tool shells out to the `gog` CLI; without it the server starts and\n  # then fails on the first call. This tag must track\n  # packages/gogcli-mcp/src/runner.ts's MIN_GOG_VERSION (the floor the tools\n  # assume). See CLAUDE.md \"Required gog version\" — bumping the floor means\n  # bumping these nine pins, and the pin stored on each mcp-host registration.\n  - kind: github-release\n    repo: openclaw/gogcli\n    tag: v0.43.0\n    asset: \"gogcli_*_linux_amd64.tar.gz\"\n    bin: [gog]\nstate:\n  dataDir: true\n  reason: >-\n    `gog` keeps its authorised-account state and file keyring under $HOME, and\n    the wrapper keeps its auth-bootstrap marker (~/.gogcli-mcp) there, so a\n    restart neither re-imports an unchanged secret nor discards an\n    in-connector re-auth. Without a persistent data dir every cold start has\n    only what the env secrets can re-seed.\negress:\n  allow:\n    # Google OAuth token exchange and the Google REST APIs the CLI calls.\n    - oauth2.googleapis.com\n    - www.googleapis.com\n    - googleapis.com\n\nFile v4.6.2:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Chris Hall\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v4.6.1: 22 files, 490788 bytes\n\nFiles: CHANGELOG.md (781b), dist/index.js (1655667b), LICENSE (1067b), manifest.json (11668b), mint.yaml (4732b), package.json (1131b), README.md (14035b), skill-card.md (1816b), SKILL.md (7909b), src/index.ts (510b), src/tools/gmail-extra.ts (236612b), tests/tools/attachment-index-resolve.test.ts (3845b), tests/tools/draft-diff-arithmetic.test.ts (2714b), tests/tools/draft-fork-signature.test.ts (3365b), tests/tools/draft-fork.test.ts (47558b), tests/tools/draft-write-vs-refetch.test.ts (6443b), tests/tools/gmail-confirm-token.test.ts (16291b), tests/tools/gmail-extra-gates.test.ts (11389b), tests/tools/gmail-extra.test.ts (215754b), tsconfig.json (209b), vitest.config.ts (523b), _meta.json (135b)\n\nFile v4.6.1:SKILL.md\n\n---\nname: gogcli-mcp-gmail\ndescription: Use when the user asks to read, organize, draft, forward, autoreply, or otherwise work with Gmail in depth. Triggers for requests involving threads, labels, drafts, attachments, bulk archive/trash/mark-read operations, forwarding messages, or any Gmail operation beyond simple search/get/send. Includes auth and Gmail tools only.\n---\n\n# gogcli-mcp-gmail\n\nExtended Gmail MCP server via [gogcli](https://github.com/openclaw/gogcli) — 61 tools: 8 auth + 4 base Gmail + 49 extra dedicated Gmail tools.\n\n- **Source:** [github.com/chrischall/gogcli-mcp](https://github.com/chrischall/gogcli-mcp)\n\n## Requirements\n\n- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated\n- Node.js 22 or later\n\n## Setup\n\n```json\n{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"gogcli-mcp-gmail\"],\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}\n```\n\n## Extra Gmail Tools\n\n### Read\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_raw` | Raw Gmail API JSON for a message |\n| `gog_gmail_attachment` | Download an attachment by `attachmentIndex` (or legacy `attachmentId`) and deliver its contents — inline when within `inlineMaxBytes` (3 MiB default, 10 MiB max — larger values are clamped), else a server-side file path — use `url`/`drive` when hosted (`deliver`: auto/inline/drive/url/off). `deliver=\"url\"` gives a signed link `curl` can fetch with no credential, for an hour — hosted deployments only |\n| `gog_gmail_url` | Print web URLs for threads |\n| `gog_gmail_history` | List history events since a historyId |\n| `gog_gmail_messages_search` | Search individual messages, not threads — one row per message |\n\n### Threads\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_thread_get` | Get a thread with all messages |\n| `gog_gmail_thread_modify` | Modify labels on a thread |\n| `gog_gmail_thread_attachments` | List/download all attachments in a thread |\n\n### Labels\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_labels_list` | List all labels |\n| `gog_gmail_labels_get` | Get a label's details and counts |\n| `gog_gmail_labels_create` | Create a new label |\n| `gog_gmail_labels_rename` | Rename a label |\n| `gog_gmail_labels_delete` | Delete a label |\n| `gog_gmail_labels_modify` | Modify labels on one or more threads |\n| `gog_gmail_labels_style` | Change a label's color or visibility |\n\n### Bulk operations\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_archive` | Archive by IDs or query |\n| `gog_gmail_mark_read` | Mark read by IDs or query |\n| `gog_gmail_mark_unread` | Mark unread by IDs or query |\n| `gog_gmail_trash` | Trash by IDs or query |\n| `gog_gmail_message_modify` | Modify labels on a single message |\n| `gog_gmail_batch_delete` | Permanently delete multiple messages |\n| `gog_gmail_batch_modify` | Modify labels on multiple messages |\n\n### Drafts\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_drafts_list` | List drafts (+ free `origin`/`rootsOwnThread`) |\n| `gog_gmail_drafts_get` | Get a draft |\n| `gog_gmail_drafts_create` | Create a draft |\n| `gog_gmail_drafts_update` | Update a draft; `replyToThreadId` re-threads it in place (same id) + `threadingVerification`; `forkSiblingDraftId` blocks a body overwrite that would drop the other copy's text |\n| `gog_gmail_drafts_delete` | Delete a draft |\n| `gog_gmail_drafts_send` | Send a draft after the user confirms a preview of it (404 → `DRAFT_FORKED`, or `GOOGLE_404_NOT_THE_DRAFT` if the draft is still listed) |\n| `gog_gmail_drafts_diff` | Diff two drafts (body divergence, threading loss, fork verdict) |\n| `gog_gmail_drafts_reply` | Save a reply as a draft — inherited recipients, subject and quote; never sends |\n| `gog_gmail_drafts_reply_all` | Save a reply-all as a draft; never sends |\n| `gog_gmail_drafts_forward` | Save a forward as a draft; recipients optional, so it can be staged without any |\n\nA draft edited in a mail client is replaced, not updated: the old id 404s. `drafts_update` / `drafts_send` answer that\n404 with a `DRAFT_FORKED` report (what happened, the drafts that exist, what to do) instead of a bare `notFound`, at a\nbounded cost of ≤2 extra gog calls. It never names a replacement — the 404'd draft cannot be fetched, so no lineage\nsignal can exist; use `drafts_diff` on a named pair for that. The 404 is attributed first: `replyToThreadId` and\n`replyToMessageId` resolve their own entities and 404 identically, so if the draft id is still in the listing the answer\nis `GOOGLE_404_NOT_THE_DRAFT` — no fork claimed, reply target named. That listing is capped at 20, so `listingEvidence`\nsays what it can carry: only a `complete-listing` (the window came back short, i.e. it covered the folder) claims the\ndraft is gone; `capped-listing` and `listing-unavailable` say in words that they establish nothing. A reply target, when\none was passed, is echoed and explained first.\n\n`drafts_diff` confirms a pairing only on a link from the candidate **to the original** (its `Message-Id` in the\ncandidate's `In-Reply-To`/`References`) or on agreement over text **neither draft quoted and neither client generated**\n— the salutation, closing formula, name and signature block are excluded alongside quoting, because a client writes them\nidentically on every message (`Hi Jennifer,` + `Thanks,` + `Chris` + `Sent from my iPhone` is 4 lines and 43 characters\nof pure apparatus). A shared reply root is corroboration only — every reply in a thread has one — and `none` means no\nevidence was found, not \"unrelated\". To adopt the survivor back onto the thread, call\n`drafts_update` with `replyToThreadId`: same draft id, gog resolves the reply headers, `threadingVerification` reports\nwhether it worked. It rewrites the whole body, so diff and merge first.\n\ngog requires a body on every update, so there is no header-only edit and every adoption overwrites the body. Pass\n`forkSiblingDraftId` (the other copy's id) and the update reads that draft first — one extra gog call, zero when the param\nis absent — and refuses to write (`DRAFT_CONTENT_LOSS`, nothing changed) if your body drops a line the sibling holds,\nnaming the lines; `acceptContentLoss: true` overrides, and `contentLossCheck.written` then reports whether the write it\nauthorised actually succeeded — a failed write says so and says nothing was saved. A check that could not run refuses too\n(`DRAFT_CONTENT_LOSS_UNCHECKED`). It compares text only and never claims one draft replaced another — that is\n`drafts_diff`'s job.\n\n### Write\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_import` | Import an RFC822/EML message into the mailbox (keeps its headers/date; does not send) |\n| `gog_gmail_forward` | Forward a message |\n| `gog_gmail_reply` | Reply to the original sender |\n| `gog_gmail_reply_all` | Reply to sender plus every To/Cc recipient |\n| `gog_gmail_autoreply` | Reply once to all messages matching a query |\n\n### Settings\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_vacation_get` | Get the vacation responder settings |\n| `gog_gmail_vacation_update` | Enable/disable the vacation responder |\n| `gog_gmail_filters_list` | List all filters |\n| `gog_gmail_filters_get` | Get a filter by ID |\n| `gog_gmail_filters_create` | Create a filter |\n| `gog_gmail_filters_delete` | Delete a filter |\n| `gog_gmail_sendas_list` | List send-as aliases |\n| `gog_gmail_sendas_get` | Get one send-as alias |\n| `gog_gmail_sendas_create` | Create a send-as alias |\n| `gog_gmail_sendas_update` | Update a send-as alias |\n| `gog_gmail_sendas_delete` | Delete a send-as alias |\n| `gog_gmail_sendas_verify` | Resend an alias verification email |\n\nPlus 8 auth tools and 4 base Gmail tools (search, get, send, run). Use `gog_gmail_run` for the settings with no dedicated tool (`delegates`, `forwarding`, `watch`) and email tracking (`track`).\n\nFile v4.6.1:README.md\n\n# gogcli-mcp-gmail\n\n> [!WARNING]\n> **AI-developed project.** This codebase was built and is actively maintained by [Claude Code](https://www.anthropic.com/claude). Review all code and tool permissions before use.\n\nExtended Gmail [MCP](https://modelcontextprotocol.io) server via [gogcli](https://github.com/openclaw/gogcli). Includes auth tools plus 49 additional dedicated Gmail tools for threads, labels, drafts, attachments, forwarding, autoreply, and bulk operations.\n\n## Requirements\n\n- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated\n- Node.js 22+\n\n```bash\nbrew install gogcli\ngog auth add your@gmail.com --services gmail\n```\n\n## Installation\n\n```bash\nnpm install -g gogcli-mcp-gmail\n```\n\n### Claude Desktop\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"gogcli-mcp-gmail\",\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}\n```\n\n### Claude Code\n\n```bash\nclaude mcp add gogcli-gmail -- gogcli-mcp-gmail\n```\n\n## Extra Gmail Tools (49)\n\nPlus 8 auth tools and 4 base Gmail tools (search, get, send, run) — 61 in all.\n\n### Read\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_raw` | Dump the raw Gmail API JSON for a message (lossless, for scripting) |\n| `gog_gmail_attachment` | Download an attachment (by `attachmentIndex`, or the legacy opaque `attachmentId`) and deliver its contents — by de\n\nArchive v4.6.0: 22 files, 488573 bytes\n\nFiles: CHANGELOG.md (781b), dist/index.js (1647642b), LICENSE (1067b), manifest.json (11668b), mint.yaml (4732b), package.json (1130b), README.md (14035b), skill-card.md (2233b), SKILL.md (7909b), src/index.ts (510b), src/tools/gmail-extra.ts (236612b), tests/tools/attachment-index-resolve.test.ts (3845b), tests/tools/draft-diff-arithmetic.test.ts (2714b), tests/tools/draft-fork-signature.test.ts (3365b), tests/tools/draft-fork.test.ts (47558b), tests/tools/draft-write-vs-refetch.test.ts (6443b), tests/tools/gmail-confirm-token.test.ts (16291b), tests/tools/gmail-extra-gates.test.ts (11389b), tests/tools/gmail-extra.test.ts (215754b), tsconfig.json (209b), vitest.config.ts (523b), _meta.json (135b)\n\nArchive v4.5.2: 22 files, 488509 bytes\n\nFiles: CHANGELOG.md (781b), dist/index.js (1647642b), LICENSE (1067b), manifest.json (11668b), mint.yaml (4732b), package.json (1130b), README.md (14035b), skill-card.md (2067b), SKILL.md (7909b), src/index.ts (510b), src/tools/gmail-extra.ts (236612b), tests/tools/attachment-index-resolve.test.ts (3845b), tests/tools/draft-diff-arithmetic.test.ts (2714b), tests/tools/draft-fork-signature.test.ts (3365b), tests/tools/draft-fork.test.ts (47558b), tests/tools/draft-write-vs-refetch.test.ts (6443b), tests/tools/gmail-confirm-token.test.ts (16291b), tests/tools/gmail-extra-gates.test.ts (11389b), tests/tools/gmail-extra.test.ts (215754b), tsconfig.json (209b), vitest.config.ts (523b), _meta.json (135b)\n\nArchive v4.5.1: 22 files, 485394 bytes\n\nFiles: CHANGELOG.md (781b), dist/index.js (1641878b), LICENSE (1067b), manifest.json (11668b), mint.yaml (4732b), package.json (1130b), README.md (13934b), skill-card.md (1787b), SKILL.md (7867b), src/index.ts (510b), src/tools/gmail-extra.ts (234698b), tests/tools/attachment-index-resolve.test.ts (3845b), tests/tools/draft-diff-arithmetic.test.ts (2714b), tests/tools/draft-fork-signature.test.ts (3365b), tests/tools/draft-fork.test.ts (47558b), tests/tools/draft-write-vs-refetch.test.ts (6443b), tests/tools/gmail-confirm-token.test.ts (16291b), tests/tools/gmail-extra-gates.test.ts (11389b), tests/tools/gmail-extra.test.ts (213082b), tsconfig.json (209b), vitest.config.ts (523b), _meta.json (135b)\n\nArchive v4.5.0: 21 files, 479371 bytes\n\nFiles: CHANGELOG.md (781b), dist/index.js (1633131b), LICENSE (1067b), manifest.json (11578b), mint.yaml (4732b), package.json (1130b), README.md (13934b), skill-card.md (2524b), SKILL.md (7867b), src/index.ts (510b), src/tools/gmail-extra.ts (229878b), tests/tools/attachment-index-resolve.test.ts (3845b), tests/tools/draft-diff-arithmetic.test.ts (2714b), tests/tools/draft-fork-signature.test.ts (3365b), tests/tools/draft-fork.test.ts (47558b), tests/tools/draft-write-vs-refetch.test.ts (6443b), tests/tools/gmail-confirm-token.test.ts (16291b), tests/tools/gmail-extra.test.ts (213020b), tsconfig.json (209b), vitest.config.ts (523b), _meta.json (135b)\n\nArchive v4.4.0: 21 files, 478540 bytes\n\nFiles: CHANGELOG.md (781b), dist/index.js (1629725b), LICENSE (1067b), manifest.json (11578b), mint.yaml (4732b), package.json (1130b), README.md (13934b), skill-card.md (2517b), SKILL.md (7867b), src/index.ts (510b), src/tools/gmail-extra.ts (229878b), tests/tools/attachment-index-resolve.test.ts (3845b), tests/tools/draft-diff-arithmetic.test.ts (2714b), tests/tools/draft-fork-signature.test.ts (3365b), tests/tools/draft-fork.test.ts (47558b), tests/tools/draft-write-vs-refetch.test.ts (6443b), tests/tools/gmail-confirm-token.test.ts (16272b), tests/tools/gmail-extra.test.ts (213020b), tsconfig.json (209b), vitest.config.ts (523b), _meta.json (135b)\n\nArchive v4.3.0: 20 files, 467515 bytes\n\nFiles: CHANGELOG.md (781b), dist/index.js (1611153b), LICENSE (1067b), manifest.json (11578b), mint.yaml (4732b), package.json (1130b), README.md (13934b), skill-card.md (2280b), SKILL.md (7867b), src/index.ts (510b), src/tools/gmail-extra.ts (222415b), tests/tools/attachment-index-resolve.test.ts (3845b), tests/tools/draft-diff-arithmetic.test.ts (2714b), tests/tools/draft-fork-signature.test.ts (3365b), tests/tools/draft-fork.test.ts (47558b), tests/tools/draft-write-vs-refetch.test.ts (6443b), tests/tools/gmail-extra.test.ts (213020b), tsconfig.json (209b), vitest.config.ts (523b), _meta.json (135b)","readmeExcerpt":"Skill: gogcli-mcp-gmail Owner: chrischall Summary: Use when the user asks to read, organize, draft, forward, autoreply, or otherwise work with Gmail in depth. Triggers for requests involving threads, labels, drafts, attachments, bulk archive/trash/mark-read operations, forwarding messages, or any Gmail operation beyond simple search/get/send. Includes auth and Gmail tools only. Tags: latest:4.7.0 Version history: v4.","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"gogcli-mcp-gmail\"],\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}"},{"language":"bash","snippet":"brew install gogcli\ngog auth add your@gmail.com --services gmail"},{"language":"bash","snippet":"npm install -g gogcli-mcp-gmail"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"gogcli-mcp-gmail\",\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}"},{"language":"bash","snippet":"claude mcp add gogcli-gmail -- gogcli-mcp-gmail"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"gogcli-mcp-gmail\"],\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: gogcli-mcp-gmail\ndescription: Use when the user asks to read, organize, draft, forward, autoreply, or otherwise work with Gmail in depth. Triggers for requests involving threads, labels, drafts, attachments, bulk archive/trash/mark-read operations, forwarding messages, or any Gmail operation beyond simple search/get/send. Includes auth and Gmail tools only.\n---\n\n# gogcli-mcp-gmail\n\nExtended Gmail MCP server via [gogcli](https://github.com/openclaw/gogcli) — 61 tools: 8 auth + 4 base Gmail + 49 extra dedicated Gmail tools.\n\n- **Source:** [github.com/chrischall/gogcli-mcp](https://github.com/chrischall/gogcli-mcp)\n\n## Requirements\n\n- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated\n- Node.js 22 or later\n\n## Setup\n\n```json\n{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"gogcli-mcp-gmail\"],\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}\n```\n\n## Extra Gmail Tools\n\n### Read\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_raw` | Raw Gmail API JSON for a message |\n| `gog_gmail_attachment` | Download an attachment by `attachmentIndex` (or legacy `attachmentId`) and deliver its contents — inline when within `inlineMaxBytes` (3 MiB default, 10 MiB max — larger values are clamped), else a server-side file path — use `url`/`drive` when hosted (`deliver`: auto/inline/drive/url/off). `deliver=\"url\"` gives a signed link `curl` can fetch with no credential, for an hour — hosted deployments only |\n| `gog_gmail_url` | Print web URLs for threads |\n| `gog_gmail_history` | List history events since a historyId |\n| `gog_gmail_messages_search` | Search individual messages, not threads — one row per message |\n\n### Threads\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_thread_get` | Get a thread with all messages |\n| `gog_gmail_thread_modify` | Modify labels on a thread |\n| `gog_gmail_thread_attachments` | List/download all attachments in a thread |\n\n### Labels\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_labels_list` | List all labels |\n| `gog_gmail_labels_get` | Get a label's details and counts |\n| `gog_gmail_labels_create` | Create a new label |\n| `gog_gmail_labels_rename` | Rename a label |\n| `gog_gmail_labels_delete` | Delete a label |\n| `gog_gmail_labels_modify` | Modify labels on one or more threads |\n| `gog_gmail_labels_style` | Change a label's color or visibility |\n\n### Bulk operations\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_archive` | Archive by IDs or query |\n| `gog_gmail_mark_read` | Mark read by IDs or query |\n| `gog_gmail_mark_unread` | Mark unread by IDs or query |\n| `gog_gmail_trash` | Trash by IDs or query |\n| `gog_gmail_message_modify` | Modify labels on a single message |\n| `gog_gmail_batch_delete` | Permanently delete multiple messages |\n| `gog_gmail_batch_modify` | Modify labels on multiple messages |\n\n### Drafts\n| Tool | What it does |\n|------|-------------|\n| `gog_gmail_drafts_list` | List "},{"path":"README.md","content":"# gogcli-mcp-gmail\n\n> [!WARNING]\n> **AI-developed project.** This codebase was built and is actively maintained by [Claude Code](https://www.anthropic.com/claude). Review all code and tool permissions before use.\n\nExtended Gmail [MCP](https://modelcontextprotocol.io) server via [gogcli](https://github.com/openclaw/gogcli). Includes auth tools plus 49 additional dedicated Gmail tools for threads, labels, drafts, attachments, forwarding, autoreply, and bulk operations.\n\n## Requirements\n\n- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated\n- Node.js 22+\n\n```bash\nbrew install gogcli\ngog auth add your@gmail.com --services gmail\n```\n\n## Installation\n\n```bash\nnpm install -g gogcli-mcp-gmail\n```\n\n### Claude Desktop\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"gogcli-gmail\": {\n      \"command\": \"gogcli-mcp-gmail\",\n      \"env\": {\n        \"GOG_ACCOUNT\": \"you@gmail.com\"\n      }\n    }\n  }\n}\n```\n\n### Claude Code\n\n```bash\nclaude mcp add gogcli-gmail -- gogcli-mcp-gmail\n```\n\n## Extra Gmail Tools (49)\n\nPlus 8 auth tools and 4 base Gmail tools (search, get, send, run) — 61 in all.\n\n### Read\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_raw` | Dump the raw Gmail API JSON for a message (lossless, for scripting) |\n| `gog_gmail_attachment` | Download an attachment (by `attachmentIndex`, or the legacy opaque `attachmentId`) and deliver its contents — by default an image inline and anything else as a server-side file path (`deliver`: auto/inline/drive/url/off; `inline` forces bytes within `inlineMaxBytes`, 3 MiB by default and at most 10 MiB — a larger value is clamped, since the hosted runtime caps one result at 14 MiB; `drive` uploads to Google Drive). On a hosted deployment, where that path is unreadable, use `url` or `drive`. `deliver=\"url\"` returns a **signed download link** — fetchable with `curl`, no credential and no Google session, valid for an hour, nothing written to your Drive and not blocked by `GOG_READONLY`; it needs the blob store a hosted deployment lends this server, so a local stdio install is told to use another mode |\n| `gog_gmail_url` | Print Gmail web URLs for one or more threads |\n| `gog_gmail_history` | List Gmail history events since a given historyId |\n| `gog_gmail_messages_search` | Search individual messages rather than threads — one result per matching message |\n\n### Threads\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_thread_get` | Get a thread with all messages, optionally with sanitized content and attachments |\n| `gog_gmail_thread_modify` | Modify labels on all messages in a thread |\n| `gog_gmail_thread_attachments` | List or download all attachments in a thread |\n\n### Labels\n\n| Tool | Description |\n|------|-------------|\n| `gog_gmail_labels_list` | List all labels |\n| `gog_gmail_labels_get` | Get label details and counts |\n| `gog_gmail_labels_create` | Create a new label |\n| `gog_gmail_labels_rename` | Rename a label |\n| `g"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"gogcli-mcp-gmail\",\n  \"version\": \"4.7.0\",\n  \"publishedAt\": 1791380437242\n}"},{"path":"CHANGELOG.md","content":"# Changelog\n\n## [2.1.0](https://github.com/chrischall/gogcli-mcp/compare/v2.0.13...v2.1.0) (2026-05-25)\n\n\n### Features\n\n* **gmail:** add gogcli-mcp-gmail sub-package ([fac0f51](https://github.com/chrischall/gogcli-mcp/commit/fac0f515fd2ea587c570d7ac70c080cb8dc486ac))\n\n\n### Refactor\n\n* aggressive cleanup pass (audit findings) ([e635b39](https://github.com/chrischall/gogcli-mcp/commit/e635b391cf611e9c102a422ffbce5ebe28687b80))\n* review-pass cleanup (enums, shared schemas, test harness) ([ea851de](https://github.com/chrischall/gogcli-mcp/commit/ea851deb30b9cfef3f07ed506a011fc363b34018))\n\n\n### Documentation\n\n* update gogcli repo URLs to openclaw/gogcli (was steipete/gogcli) ([951a181](https://github.com/chrischall/gogcli-mcp/commit/951a1818ebc269f203aee723ccbea32c13817d8b))"},{"path":"skill-card.md","content":"## Description:\n\nHelps agents read, organize, draft, and send Gmail messages through tools for threads, labels, attachments, bulk actions, and account settings.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nPeople and teams using an agent to manage Gmail can search mail, work with threads and attachments, prepare replies or forwards, organize messages, and manage mailbox settings.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Broad Gmail read/write and settings access can expose or change sensitive mail and account settings.\n\nMitigation: Grant access only to an appropriate account; use a dedicated account or enable GOG_READONLY when only reads are needed.\n\nRisk: Some destructive Gmail and settings deletions can be forced without a separate user-confirmation flow.\n\nMitigation: Review and explicitly approve destructive actions, especially deletion of labels, filters, drafts, and send-as aliases.\n\nRisk: Stored Gmail credentials could be exposed on an insufficiently isolated host.\n\nMitigation: Use a secure keyring backend and strong host isolation.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/chrischall/skills/gogcli-mcp-gmail)\n- [gogcli dependency documentation](https://github.com/openclaw/gogcli)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Configuration guidance]\n\n**Output Format:** [Structured Gmail data and text guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include message contents, attachment links, and local file paths.]\n\n## Skill Version(s):\n\n4.7.0 (source: server release and package.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1704,"uniquenessScore":39,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T09:16:32.151Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T09:16:32.151Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:49:33.399Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}