{"id":"ff70522f-24b2-48d6-95ba-d4663b71e5b6","shortId":"wfphRK","kind":"skill","title":"google-gmail","tagline":"Read, search, triage, label, archive and send Gmail mail / threads / labels / attachments via the Gmail v1 REST API. Use when the user mentions Gmail, \"my inbox\", unread mail, recent emails from someone, summarising a thread, downloading an attachment, finding mail by label / que","description":"Drive Gmail via `curl + jq`. The user's OAuth bearer token is in\n`$GOOGLE_GMAIL_TOKEN`; every call needs it as\n`Authorization: Bearer $GOOGLE_GMAIL_TOKEN`. At minimum the token\ncarries `gmail.readonly` plus the identity scopes\n(`openid email profile`); if the user opted in to write at install\ntime it also carries `gmail.modify` (label / archive / trash) and/or\n`gmail.send` (compose + send). Always assume the narrowest scope\nuntil a write actually fails — don't ask Google for new scopes from\nhere.\n\nThe Gmail API returns standard JSON; failures surface as\n`{\"error\": {\"code\": 401|403|..., \"message\": \"...\"}}` — show that\nerror verbatim. `401` means the token expired (re-install). `403\ninsufficientPermissions` means the user didn't grant the write scope\nthis call needs — explain which scope is missing and suggest\nre-installing the connector with the matching write box checked.\n\n**Before any destructive write** (trashing a thread, sending an email)\nshow the user the exact target / draft and ask them to confirm. Don't\nfan out across many messages without an explicit go-ahead.\n\n**Always start with `users/me/profile`** to confirm the connection works\nAND learn which Gmail account you're operating against. Mailbox payloads\ncan be huge — fetch metadata first, only `format=full` when the user\nactually wants the body of a specific message.\n\n## Optional: Google Workspace CLI (`gws`) for outbound mail\n\n[`gws`](https://github.com/googleworkspace/cli) is Google's official CLI\n(not officially supported — community-maintained on the `googleworkspace`\norg). It dynamically builds its command surface from Google's Discovery\nDocument, exits non-zero on API errors, and ships hand-crafted helper\ncommands (prefixed `+`) that handle the message-encoding boilerplate.\n\n**Use `gws` for sending mail.** The Gmail REST API requires every\noutbound message to be a fully-formed RFC 822 message, base64url-encoded\ninto a `raw` field, with reply / forward threading carried in\n`In-Reply-To` / `References` / `threadId`. The `+send / +reply /\n+reply-all / +forward` helpers do all of that for you. **For everything\nelse** (read, search, labels, attachments) `gws` and curl are equivalent,\nso the curl recipes below are usually shorter — stay on those.\n\n### Install\n\n```sh\nnpm install -g @googleworkspace/cli   # or: brew install googleworkspace-cli\n# Pre-built binaries also at https://github.com/googleworkspace/cli/releases\ngws --version\n```\n\n### Auth\n\n`gws` reads its OAuth bearer token from the `GOOGLE_WORKSPACE_CLI_TOKEN`\nenvironment variable. The Gmail token used in this skill is in\n`$GOOGLE_GMAIL_TOKEN`, so re-export it once at the top of every shell\nblock that calls `gws`:\n\n```sh\nexport GOOGLE_WORKSPACE_CLI_TOKEN=\"$GOOGLE_GMAIL_TOKEN\"\n```\n\nYou can confirm the active account with `gws gmail users getProfile\n--params '{\"userId\":\"me\"}'`.\n\n### Send / reply / forward\n\n```sh\n# New message\ngws gmail +send \\\n  --to alice@example.com \\\n  --cc team@example.com \\\n  --subject \"Q1 status\" \\\n  --body \"Numbers attached.\"\n\n# Reply (handles threadId, In-Reply-To, References automatically;\n# To is the original sender, Subject gets the \"Re: \" prefix)\ngws gmail +reply --message-id MSG_ID --body \"Thanks — looks good.\"\n\n# Reply-all\ngws gmail +reply-all --message-id MSG_ID --body \"+1\"\n\n# Forward to new recipients (preserves the original message body\n# inline; original headers are summarised in the forward block)\ngws gmail +forward --message-id MSG_ID --to bob@example.com\n```\n\nEach helper exits with a non-zero status and a JSON error on stderr if\nGoogle rejects the request — surface that error verbatim. `+send` /\n`+reply` need the `gmail.send` scope; if the user only granted\n`gmail.readonly` you'll see `403 insufficientPermissions` and should ask\nthem to re-install the connector with the send box checked.\n\nAll the read / list / search / label / attachment recipes below are\nintentionally **not** rewritten to `gws` — a one-line `curl ... | jq` is\nshorter and easier to compose with shell pipelines.\n\n## Recipes\n\n### Verify auth (always run first)\n\n```sh\ncurl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/profile\" \\\n  | jq '{email: .emailAddress, totalMessages, totalThreads, historyId}'\n```\n\n### List recent unread inbox\n\n```sh\ncurl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  --get \"https://gmail.googleapis.com/gmail/v1/users/me/messages\" \\\n  --data-urlencode 'q=is:unread in:inbox newer_than:7d' \\\n  --data-urlencode 'maxResults=20' \\\n  | jq '.messages[]'\n```\n\nThe `messages.list` endpoint returns only `{id, threadId}` — you have\nto fan out to `messages.get` for headers / body. Cheap pattern: list\nids → get with `format=metadata&metadataHeaders=From,Subject,Date` for\neach. Use `format=full` only if the user wants the body.\n\n### List + enrich with headers (one-shot inbox triage)\n\n```sh\nIDS=$(curl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  --get \"https://gmail.googleapis.com/gmail/v1/users/me/messages\" \\\n  --data-urlencode 'q=is:unread in:inbox' \\\n  --data-urlencode 'maxResults=10' \\\n  | jq -r '.messages[].id')\n\nfor ID in $IDS; do\n  curl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n    --get \"https://gmail.googleapis.com/gmail/v1/users/me/messages/$ID\" \\\n    --data-urlencode 'format=metadata' \\\n    --data-urlencode 'metadataHeaders=From' \\\n    --data-urlencode 'metadataHeaders=Subject' \\\n    --data-urlencode 'metadataHeaders=Date' \\\n    | jq '{id: .id, snippet: .snippet, headers: (.payload.headers | map({(.name): .value}) | add), labels: .labelIds}'\ndone | jq -s '.'\n```\n\n### Read a single message body (plain text and html)\n\n```sh\nID='18f1a2b3c4d5e6f0'\nRESP=$(curl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  --get \"https://gmail.googleapis.com/gmail/v1/users/me/messages/$ID\" \\\n  --data-urlencode 'format=full')\n\necho \"$RESP\" | jq '{id, snippet, headers: (.payload.headers | map({(.name): .value}) | add)}'\n\n# Body is base64url-encoded inside payload.parts[].body.data — Gmail\n# splits multipart messages, so collect every text/plain or text/html\n# leaf and base64url-decode them.\necho \"$RESP\" | jq -r '\n  def walk(p):\n    if (p.parts // null) then (p.parts | map(walk(.)) | add) else [p] end;\n  walk(.payload)\n  | map(select(.mimeType==\"text/plain\" and (.body.data // \"\") != \"\"))\n  | .[].body.data' \\\n  | tr '_-' '/+' | base64 -d 2>/dev/null\n```\n\nIf the plain-text leaf is empty, fall back to the `text/html` leaf\n(same walk, swap the mimeType filter) and tell the user it's HTML.\n\n### Read a whole thread\n\n```sh\nTHREAD_ID='18f1a2b3c4d5e6f0'\ncurl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  --get \"https://gmail.googleapis.com/gmail/v1/users/me/threads/$THREAD_ID\" \\\n  --data-urlencode 'format=metadata' \\\n  --data-urlencode 'metadataHeaders=From' \\\n  --data-urlencode 'metadataHeaders=Subject' \\\n  --data-urlencode 'metadataHeaders=Date' \\\n  | jq '{id, historyId, messages: [.messages[] | {id, snippet, from: (.payload.headers | from_entries.From), date: (.payload.headers | from_entries.Date)}]}'\n```\n\n### Search by Gmail query\n\n```sh\n# Same query DSL the Gmail UI uses: from:, to:, subject:, has:attachment,\n# is:unread, label:Work, after:2026/04/01, before:2026/05/01, …\nQ='from:boss@example.com subject:OKR newer_than:30d'\ncurl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  --get \"https://gmail.googleapis.com/gmail/v1/users/me/messages\" \\\n  --data-urlencode \"q=$Q\" \\\n  --data-urlencode 'maxResults=20' \\\n  | jq '.messages // []'\n```\n\n`q` syntax reference: <https://support.google.com/mail/answer/7190> —\nthe model-friendly bits are `from:`, `to:`, `cc:`, `subject:`, `label:`,\n`is:unread`, `is:read`, `is:starred`, `has:attachment`, `filename:pdf`,\n`newer_than:7d`, `older_than:30d`, `after:YYYY/MM/DD`, `before:`, `in:inbox`,\n`in:trash`. Combine with `OR` / `()` / `-`.\n\n### List labels (system + user-defined)\n\n```sh\ncurl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/labels\" \\\n  | jq '.labels[] | {id, name, type, color: .color.backgroundColor}'\n```\n\nThe system labels are `INBOX`, `SENT`, `DRAFT`, `IMPORTANT`, `UNREAD`,\n`STARRED`, `SPAM`, `TRASH`, plus `CATEGORY_*` (Personal / Social /\nPromotions / Updates / Forums).\n\n### Filter by label\n\n```sh\nLABEL_ID='Label_4'  # from labels.list above\ncurl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  --get \"https://gmail.googleapis.com/gmail/v1/users/me/messages\" \\\n  --data-urlencode \"labelIds=$LABEL_ID\" \\\n  --data-urlencode 'maxResults=20' \\\n  | jq '.messages // []'\n```\n\nMultiple `labelIds` query params behave like AND.\n\n### Download an attachment\n\n```sh\nMSG_ID='18f1a2b3c4d5e6f0'\n\n# 1. find the attachment leaf\nRESP=$(curl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  --get \"https://gmail.googleapis.com/gmail/v1/users/me/messages/$MSG_ID\" \\\n  --data-urlencode 'format=full')\n\necho \"$RESP\" | jq '\n  def walk(p):\n    if (p.parts // null) then (p.parts | map(walk(.)) | add) else [p] end;\n  walk(.payload)\n  | map(select(.body.attachmentId? != null))\n  | .[] | {filename, mimeType, attachmentId: .body.attachmentId, size: .body.size}'\n\n# 2. fetch the attachment by id\nATT_ID='ANGjdJ-abc123'\nOUT=/tmp/attachment.bin\ncurl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/messages/$MSG_ID/attachments/$ATT_ID\" \\\n  | jq -r .data | tr '_-' '/+' | base64 -d > \"$OUT\"\nfile \"$OUT\"\n```\n\n### Pagination\n\n```sh\nPAGE_TOKEN=''\nwhile : ; do\n  RESP=$(curl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n    --get \"https://gmail.googleapis.com/gmail/v1/users/me/messages\" \\\n    --data-urlencode 'q=in:inbox' \\\n    --data-urlencode 'maxResults=100' \\\n    ${PAGE_TOKEN:+--data-urlencode \"pageToken=$PAGE_TOKEN\"})\n  echo \"$RESP\" | jq -c '.messages[]?'\n  PAGE_TOKEN=$(echo \"$RESP\" | jq -r '.nextPageToken // empty')\n  [ -z \"$PAGE_TOKEN\" ] && break\ndone\n```\n\n## Write recipes\n\nThese all need `gmail.modify` (label / archive / trash) or\n`gmail.send` (compose + send). If the user only granted\n`gmail.readonly` at install you'll get `403 insufficientPermissions`\n— surface that and ask them to re-install with the write boxes\nchecked.\n\n### Mark a message read / unread, star it, archive it (gmail.modify)\n\n```sh\nMSG_ID='18f1a2b3c4d5e6f0'\n\n# Mark as read = remove the UNREAD label\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data '{\"removeLabelIds\":[\"UNREAD\"]}' \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/messages/$MSG_ID/modify\"\n\n# Star it = add the STARRED label\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data '{\"addLabelIds\":[\"STARRED\"]}' \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/messages/$MSG_ID/modify\"\n\n# Archive = remove from INBOX (keeps in All Mail)\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data '{\"removeLabelIds\":[\"INBOX\"]}' \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/messages/$MSG_ID/modify\"\n```\n\nThe `modify` endpoint takes `addLabelIds` and `removeLabelIds`\ntogether — useful for atomic \"archive + label\" moves. Use the same\nshape on `/threads/$THREAD_ID/modify` to apply across a whole thread.\n\n### Apply a custom label\n\n```sh\n# 1. find or remember the label id from labels.list\nLABEL_ID='Label_4'\nMSG_ID='18f1a2b3c4d5e6f0'\n\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data \"{\\\"addLabelIds\\\":[\\\"$LABEL_ID\\\"]}\" \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/messages/$MSG_ID/modify\"\n```\n\nCreating a brand-new label needs the same scope:\n\n```sh\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data '{\"name\":\"Follow up\",\"messageListVisibility\":\"show\",\"labelListVisibility\":\"labelShow\"}' \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/labels\" \\\n  | jq '{id, name}'\n```\n\n### Trash a message or thread\n\n```sh\nMSG_ID='18f1a2b3c4d5e6f0'\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/messages/$MSG_ID/trash\"\n\n# Whole thread:\nTHREAD_ID='18f1a2b3c4d5e6f0'\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/threads/$THREAD_ID/trash\"\n```\n\nUse `/untrash` (same shape) to restore. **Never** use\n`messages.delete` — it permanently deletes and needs a higher scope\nthat we don't request.\n\n### Send a brand-new email (gmail.send)\n\nGmail wants the message as a base64url-encoded RFC 2822 string.\n\n```sh\n# Compose the message\nTO='alice@example.com'\nSUBJECT='Quick hello'\nBODY='Hi Alice,\n\nJust a quick test note from the AceDataCloud Gmail connector.\n\nBest,\nQingcai'\n\n# Multi-line subject lines need MIME encoded-word for non-ASCII; ASCII is fine raw.\nRAW=$(printf 'To: %s\\r\\nSubject: %s\\r\\nContent-Type: text/plain; charset=UTF-8\\r\\nMIME-Version: 1.0\\r\\n\\r\\n%s' \\\n  \"$TO\" \"$SUBJECT\" \"$BODY\" \\\n  | base64 | tr -d '\\n' | tr '+/' '-_' | tr -d '=')\n\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data \"{\\\"raw\\\":\\\"$RAW\\\"}\" \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/messages/send\" \\\n  | jq '{id, threadId, labelIds}'\n```\n\nFor non-ASCII subjects (Chinese / emoji), use MIME encoded-word:\n\n```sh\nSUBJECT_RAW='你好，季度复盘草稿'\nSUBJECT_ENCODED=\"=?UTF-8?B?$(printf %s \"$SUBJECT_RAW\" | base64)?=\"\n```\n\n### Reply in-thread (keeps the thread together)\n\nReply by setting the `In-Reply-To` and `References` headers to the\nMessage-Id of the message you're replying to, **and** pass the\nGmail thread id in the API body:\n\n```sh\nORIG_MSG_ID='18f1a2b3c4d5e6f0'\nORIG=$(curl -sS -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  --get \"https://gmail.googleapis.com/gmail/v1/users/me/messages/$ORIG_MSG_ID\" \\\n  --data-urlencode 'format=metadata' \\\n  --data-urlencode 'metadataHeaders=Message-ID' \\\n  --data-urlencode 'metadataHeaders=Subject' \\\n  --data-urlencode 'metadataHeaders=From')\nMID=$(echo \"$ORIG\" | jq -r '.payload.headers | from_entries | .[\"Message-ID\"] // .[\"Message-Id\"]')\nFROM=$(echo \"$ORIG\" | jq -r '.payload.headers | from_entries | .From')\nSUBJ=$(echo \"$ORIG\" | jq -r '.payload.headers | from_entries | .Subject')\nTID=$(echo \"$ORIG\" | jq -r .threadId)\n\nRAW=$(printf 'To: %s\\r\\nSubject: Re: %s\\r\\nIn-Reply-To: %s\\r\\nReferences: %s\\r\\nContent-Type: text/plain; charset=UTF-8\\r\\nMIME-Version: 1.0\\r\\n\\r\\n%s' \\\n  \"$FROM\" \"$SUBJ\" \"$MID\" \"$MID\" \\\n  'Replying inline — will follow up later today.' \\\n  | base64 | tr -d '\\n' | tr '+/' '-_' | tr -d '=')\n\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data \"{\\\"raw\\\":\\\"$RAW\\\",\\\"threadId\\\":\\\"$TID\\\"}\" \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/messages/send\" \\\n  | jq '{id, threadId}'\n```\n\nWithout the `threadId` in the body Gmail starts a brand-new thread\neven with the right `In-Reply-To` headers.\n\n### Save a draft instead of sending\n\nSame `raw` payload, different endpoint — still costs `gmail.send`\n(`drafts` shares the send scope under the hood for write):\n\n```sh\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_GMAIL_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data \"{\\\"message\\\":{\\\"raw\\\":\\\"$RAW\\\"}}\" \\\n  \"https://gmail.googleapis.com/gmail/v1/users/me/drafts\" \\\n  | jq '{id, message: {id: .message.id, threadId: .message.threadId}}'\n```\n\n## Common error codes\n\n| HTTP | meaning | what to tell the user |\n|---|---|---|\n| `401 UNAUTHENTICATED` | token expired / revoked | \"Reconnect the Gmail connector on the Connections page.\" |\n| `403 insufficientPermissions` | scope missing | identify which scope (`gmail.modify` for label/archive/trash, `gmail.send` for sending) and suggest re-installing the connector with that box checked. |\n| `403 userRateLimitExceeded` / `429` | quota / throttling | back off ~5s, then retry once. |\n| `404 notFound` | wrong message / thread / attachment id | double-check the id, or fall back to `messages.list` with the right query. |\n| `400 invalidQuery` | malformed `q` | print the `q` you sent + the error back to the user. |\n\nNever log or echo `$GOOGLE_GMAIL_TOKEN` — treat it as a secret.","tags":["google","gmail","skills","acedatacloud","acedata-cloud","agent-skills","agentskills","ai-image","ai-music","ai-tools","ai-video","claude-code"],"capabilities":["skill","source-acedatacloud","skill-google-gmail","topic-acedata-cloud","topic-agent-skills","topic-agentskills","topic-ai-image","topic-ai-music","topic-ai-tools","topic-ai-video","topic-claude-code","topic-cursor","topic-gemini-cli","topic-github-copilot","topic-mcp"],"categories":["Skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/AceDataCloud/Skills/google-gmail","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add AceDataCloud/Skills","source_repo":"https://github.com/AceDataCloud/Skills","install_from":"skills.sh"}},"qualityScore":"0.453","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 7 github stars · SKILL.md body (16,235 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:14:02.408Z","embedding":null,"createdAt":"2026-05-18T13:21:32.798Z","updatedAt":"2026-05-18T19:14:02.408Z","lastSeenAt":"2026-05-18T19:14:02.408Z","tsv":"'+1':550 '-8':1756,1822,1972 '/dev/null':954 '/gmail/v1/users/me/drafts':2095 '/gmail/v1/users/me/labels':1152,1615 '/gmail/v1/users/me/messages':705,787,1079,1201,1332 '/gmail/v1/users/me/messages/$id':821,882 '/gmail/v1/users/me/messages/$msg_id':1246 '/gmail/v1/users/me/messages/$msg_id/attachments/$att_id':1304 '/gmail/v1/users/me/messages/$msg_id/modify':1451,1478,1507,1578 '/gmail/v1/users/me/messages/$msg_id/trash':1640 '/gmail/v1/users/me/messages/$orig_msg_id':1887 '/gmail/v1/users/me/messages/send':1797,2023 '/gmail/v1/users/me/profile':682 '/gmail/v1/users/me/threads/$thread_id':1001 '/gmail/v1/users/me/threads/$thread_id/trash':1658 '/googleworkspace/cli)':270 '/googleworkspace/cli/releases':417 '/mail/answer/7190':1097 '/threads':1527 '/tmp/attachment.bin':1293 '/untrash':1660 '1':1229,1541 '1.0':1761,1977 '10':800 '100':1343 '18f1a2b3c4d5e6f0':869,989,1228,1423,1556,1627,1645,1874 '2':953,1281 '20':721,1089,1212 '2026/04/01':1057 '2026/05/01':1059 '2822':1698 '30d':1067,1124 '4':1186,1553 '400':2182 '401':137,144,2113 '403':138,152,618,1394,2126,2150 '404':2161 '429':2152 '5s':2157 '7d':716,1121 '822':339 'abc123':1291 'account':232,477 'acedatacloud':1719 'across':210,1532 'activ':476 'actual':115,251 'add':852,898,937,1265,1454 'addlabelid':1474,1512,1573 'ahead':218 'alic':1711 'alice@example.com':496,1705 'also':97,413 'alway':107,219,668 'and/or':103 'angjdj':1290 'angjdj-abc123':1289 'api':21,128,302,327,1868 'appli':1531,1536 'application/json':1445,1472,1501,1571,1604,1791,2015,2088 'archiv':8,101,1377,1417,1479,1519 'ascii':1737,1738,1805 'ask':119,202,622,1399 'assum':108 'atom':1518 'att':1287 'attach':15,41,380,504,641,1051,1116,1224,1232,1284,2166 'attachmentid':1277 'auth':420,667 'author':68,675,697,779,813,874,993,1071,1145,1193,1238,1297,1324,1436,1463,1492,1562,1595,1633,1651,1782,1879,2006,2079 'automat':513 'b':1823 'back':964,2155,2175,2193 'base64':951,1309,1770,1828,1994 'base64url':342,902,920,1695 'base64url-decode':919 'base64url-encoded':341,901,1694 'bearer':56,69,425,676,698,780,814,875,994,1072,1146,1194,1239,1298,1325,1437,1464,1493,1563,1596,1634,1652,1783,1880,2007,2080 'behav':1219 'best':1722 'binari':412 'bit':1102 'block':459,568 'bob@example.com':578 'bodi':254,502,532,549,559,740,764,862,899,1709,1769,1869,2032 'body.attachmentid':1273,1278 'body.data':906,948,949 'body.size':1280 'boilerpl':318 'boss@example.com':1062 'box':182,633,1408,2148 'brand':1582,1684,2037 'brand-new':1581,1683,2036 'break':1368 'brew':404 'build':288 'built':411 'c':1355 'call':64,164,461 'carri':77,98,352 'categori':1173 'cc':497,1106 'charset':1754,1970 'cheap':741 'check':183,634,1409,2149,2170 'chines':1807 'cli':262,275,408,431,467 'code':136,2105 'collect':912 'color':1158 'color.backgroundcolor':1159 'combin':1132 'command':290,310 'common':2103 'communiti':280 'community-maintain':279 'compos':105,661,1381,1701 'confirm':205,224,474 'connect':226,2124 'connector':177,629,1721,2121,2145 'content':1443,1470,1499,1569,1602,1789,2013,2086 'content-typ':1442,1469,1498,1568,1601,1788,2012,2085 'cost':2061 'craft':308 'creat':1579 'curl':50,383,388,654,672,694,776,810,871,990,1068,1142,1190,1235,1294,1321,1431,1458,1487,1557,1590,1628,1646,1777,1876,2001,2074 'custom':1538 'd':952,1310,1772,1776,1996,2000 'data':707,718,789,797,823,828,833,838,884,1003,1008,1013,1018,1081,1086,1203,1209,1248,1307,1334,1340,1347,1446,1473,1502,1572,1605,1792,1889,1894,1901,1906,2016,2089 'data-urlencod':706,717,788,796,822,827,832,837,883,1002,1007,1012,1017,1080,1085,1202,1208,1247,1333,1339,1346,1888,1893,1900,1905 'date':752,841,1021,1032 'decod':921 'def':927,1255 'defin':1140 'delet':1670 'destruct':186 'didn':157 'differ':2058 'discoveri':295 'document':296 'done':855,1369 'doubl':2169 'double-check':2168 'download':39,1222 'draft':200,1166,2051,2063 'drive':47 'dsl':1042 'dynam':287 'easier':659 'echo':888,923,1252,1352,1359,1911,1925,1934,1943,2200 'els':376,938,1266 'email':33,84,193,684,1686 'emailaddress':685 'emoji':1808 'empti':962,1364 'encod':317,343,903,1696,1732,1812,1820 'encoded-word':1731,1811 'end':940,1268 'endpoint':726,1510,2059 'enrich':766 'entri':1917,1931,1940 'environ':433 'equival':385 'error':135,142,303,591,601,2104,2192 'even':2040 'everi':63,329,457,913 'everyth':375 'exact':198 'exit':297,581 'expir':148,2116 'explain':166 'explicit':215 'export':450,464 'fail':116 'failur':132 'fall':963,2174 'fan':208,734 'fetch':242,1282 'field':347 'file':1312 'filenam':1117,1275 'filter':974,1179 'find':42,1230,1542 'fine':1740 'first':244,670 'follow':1607,1990 'form':337 'format':246,747,756,825,886,1005,1250,1891 'forum':1178 'forward':350,366,488,551,567,571 'friend':1101 'from_entries.date':1034 'from_entries.from':1031 'full':247,757,887,1251 'fulli':336 'fully-form':335 'g':401 'get':520,702,745,784,818,879,998,1076,1198,1243,1329,1393,1884 'getprofil':482 'github.com':269,416 'github.com/googleworkspace/cli)':268 'github.com/googleworkspace/cli/releases':415 'gmail':3,11,18,27,48,61,71,127,231,325,436,445,470,480,493,525,540,570,678,700,782,816,877,907,996,1037,1044,1074,1148,1196,1241,1300,1327,1439,1466,1495,1565,1598,1636,1654,1688,1720,1785,1863,1882,2009,2033,2082,2120,2202 'gmail.googleapis.com':681,704,786,820,881,1000,1078,1151,1200,1245,1303,1331,1450,1477,1506,1577,1614,1639,1657,1796,1886,2022,2094 'gmail.googleapis.com/gmail/v1/users/me/drafts':2093 'gmail.googleapis.com/gmail/v1/users/me/labels':1150,1613 'gmail.googleapis.com/gmail/v1/users/me/messages':703,785,1077,1199,1330 'gmail.googleapis.com/gmail/v1/users/me/messages/$id':819,880 'gmail.googleapis.com/gmail/v1/users/me/messages/$msg_id':1244 'gmail.googleapis.com/gmail/v1/users/me/messages/$msg_id/attachments/$att_id':1302 'gmail.googleapis.com/gmail/v1/users/me/messages/$msg_id/modify':1449,1476,1505,1576 'gmail.googleapis.com/gmail/v1/users/me/messages/$msg_id/trash':1638 'gmail.googleapis.com/gmail/v1/users/me/messages/$orig_msg_id':1885 'gmail.googleapis.com/gmail/v1/users/me/messages/send':1795,2021 'gmail.googleapis.com/gmail/v1/users/me/profile':680 'gmail.googleapis.com/gmail/v1/users/me/threads/$thread_id':999 'gmail.googleapis.com/gmail/v1/users/me/threads/$thread_id/trash':1656 'gmail.modify':99,1375,1419,2133 'gmail.readonly':78,614,1388 'gmail.send':104,607,1380,1687,2062,2136 'go':217 'go-ahead':216 'good':535 'googl':2,60,70,120,260,272,293,429,444,465,469,595,677,699,781,815,876,995,1073,1147,1195,1240,1299,1326,1438,1465,1494,1564,1597,1635,1653,1784,1881,2008,2081,2201 'google-gmail':1 'googleworkspac':284,407 'googleworkspace-c':406 'googleworkspace/cli':402 'grant':159,613,1387 'gws':263,267,320,381,418,421,462,479,492,524,539,569,649 'h':674,696,778,812,873,992,1070,1144,1192,1237,1296,1323,1435,1441,1462,1468,1491,1497,1561,1567,1594,1600,1632,1650,1781,1787,1878,2005,2011,2078,2084 'hand':307 'hand-craft':306 'handl':313,506 'header':562,739,768,847,893,1847,2048 'hello':1708 'helper':309,367,580 'hi':1710 'higher':1674 'historyid':688,1024 'hood':2070 'html':866,981 'http':2106 'huge':241 'id':529,531,546,548,574,576,729,744,775,804,806,808,843,844,868,891,988,1023,1027,1155,1184,1207,1227,1286,1288,1422,1547,1551,1555,1575,1617,1626,1644,1799,1852,1865,1873,1899,1920,1923,2025,2097,2099,2167,2172 'id/modify':1529 'ident':81 'identifi':2130 'import':1167 'in-reply-to':354,508,1841,2044 'in-thread':1830 'inbox':29,692,713,772,795,1129,1164,1338,1482,1504 'inlin':560,1988 'insid':904 'instal':94,151,175,397,400,405,627,1390,1404,2143 'instead':2052 'insufficientpermiss':153,619,1395,2127 'intent':645 'invalidqueri':2183 'jq':51,655,683,722,801,842,856,890,925,1022,1090,1153,1213,1254,1305,1354,1361,1616,1798,1913,1927,1936,1945,2024,2096 'json':131,590 'keep':1483,1833 'label':7,14,45,100,379,640,853,1054,1108,1136,1154,1162,1181,1183,1185,1206,1376,1430,1457,1520,1539,1546,1550,1552,1574,1584 'label/archive/trash':2135 'labelid':854,1205,1216,1801 'labellistvis':1611 'labels.list':1188,1549 'labelshow':1612 'later':1992 'leaf':917,960,968,1233 'learn':229 'like':1220 'line':653,1726,1728 'list':638,689,743,765,1135 'll':616,1392 'log':2198 'look':534 'mail':12,31,43,266,323,1486 'mailbox':237 'maintain':281 'malform':2184 'mani':211 'map':849,895,935,943,1263,1271 'mark':1410,1424 'match':180 'maxresult':720,799,1088,1211,1342 'mean':145,154,2107 'mention':26 'messag':139,212,258,316,331,340,491,528,545,558,573,723,803,861,910,1025,1026,1091,1214,1356,1412,1621,1691,1703,1851,1855,1898,1919,1922,2090,2098,2164 'message-encod':315 'message-id':527,544,572,1850,1897,1918,1921 'message.id':2100 'message.threadid':2102 'messagelistvis':1609 'messages.delete':1667 'messages.get':737 'messages.list':725,2177 'metadata':243,748,826,1006,1892 'metadatahead':749,830,835,840,1010,1015,1020,1896,1903,1908 'mid':1910,1985,1986 'mime':1730,1810 'mimetyp':945,973,1276 'minimum':74 'miss':170,2129 'model':1100 'model-friend':1099 'modifi':1509 'move':1521 'msg':530,547,575,1226,1421,1554,1625,1872 'multi':1725 'multi-lin':1724 'multipart':909 'multipl':1215 'n':1763,1765,1773,1979,1981,1997 'name':850,896,1156,1606,1618 'narrowest':110 'ncontent':1751,1967 'ncontent-typ':1750,1966 'need':65,165,605,1374,1585,1672,1729 'never':1665,2197 'new':122,490,553,1583,1685,2038 'newer':714,1065,1119 'nextpagetoken':1363 'nin':1958 'nin-reply-to':1957 'nmime':1759,1975 'nmime-vers':1758,1974 'non':299,585,1736,1804 'non-ascii':1735,1803 'non-zero':298,584 'note':1716 'notfound':2162 'npm':399 'nrefer':1963 'nsubject':1747,1953 'null':932,1260,1274 'number':503 'oauth':55,424 'offici':274,277 'okr':1064 'older':1122 'one':652,770 'one-lin':651 'one-shot':769 'openid':83 'oper':235 'opt':89 'option':259 'org':285 'orig':1871,1875,1912,1926,1935,1944 'origin':517,557,561 'outbound':265,330 'p':929,939,1257,1267 'p.parts':931,934,1259,1262 'page':1316,1344,1350,1357,1366,2125 'pagetoken':1349 'pagin':1314 'param':483,1218 'pass':1861 'pattern':742 'payload':238,942,1270,2057 'payload.headers':848,894,1030,1033,1915,1929,1938 'payload.parts':905 'pdf':1118 'perman':1669 'person':1174 'pipelin':664 'plain':863,958 'plain-text':957 'plus':79,1172 'post':1434,1461,1490,1560,1593,1631,1649,1780,2004,2077 'pre':410 'pre-built':409 'prefix':311,523 'preserv':555 'print':2186 'printf':1743,1824,1949 'profil':85 'promot':1176 'q':709,791,1060,1083,1084,1092,1336,2185,2188 'q1':500 'qingcai':1723 'que':46 'queri':1038,1041,1217,2181 'quick':1707,1714 'quota':2153 'r':802,926,1306,1362,1746,1749,1757,1762,1764,1914,1928,1937,1946,1952,1956,1962,1965,1973,1978,1980 'raw':346,1741,1742,1793,1794,1816,1827,1948,2017,2018,2056,2091,2092 're':150,174,234,449,522,626,1403,1857,1954,2142 're-export':448 're-instal':149,173,625,1402,2141 'read':4,377,422,637,858,982,1112,1413,1426 'recent':32,690 'recip':389,642,665,1371 'recipi':554 'reconnect':2118 'refer':358,512,1094,1846 'reject':596 'rememb':1544 'remov':1427,1480 'removelabelid':1447,1503,1514 'repli':349,356,362,364,487,505,510,526,537,542,604,1829,1837,1843,1858,1959,1987,2046 'reply-al':363,536,541 'request':598,1680 'requir':328 'resp':870,889,924,1234,1253,1320,1353,1360 'rest':20,326 'restor':1664 'retri':2159 'return':129,727 'revok':2117 'rewritten':647 'rfc':338,1697 'right':2043,2180 'run':669 'save':2049 'scope':82,111,123,162,168,608,1588,1675,2067,2128,2132 'search':5,378,639,1035 'secret':2208 'see':617 'select':944,1272 'send':10,106,191,322,361,486,494,603,632,1382,1681,2054,2066,2138 'sender':518 'sent':1165,2190 'set':1839 'sh':398,463,489,671,693,774,867,986,1039,1141,1182,1225,1315,1420,1540,1589,1624,1700,1814,1870,2073 'shape':1525,1662 'share':2064 'shell':458,663 'ship':305 'shorter':393,657 'shot':771 'show':140,194,1610 'singl':860 'size':1279 'skill':441 'skill-google-gmail' 'snippet':845,846,892,1028 'social':1175 'someon':35 'source-acedatacloud' 'spam':1170 'specif':257 'split':908 'ss':673,695,777,811,872,991,1069,1143,1191,1236,1295,1322,1432,1459,1488,1558,1591,1629,1647,1778,1877,2002,2075 'standard':130 'star':1114,1169,1415,1452,1456,1475 'start':220,2034 'status':501,587 'stay':394 'stderr':593 'still':2060 'string':1699 'subj':1933,1984 'subject':499,519,751,836,1016,1049,1063,1107,1706,1727,1768,1806,1815,1819,1826,1904,1941 'suggest':172,2140 'summaris':36,564 'support':278 'support.google.com':1096 'support.google.com/mail/answer/7190':1095 'surfac':133,291,599,1396 'swap':971 'syntax':1093 'system':1137,1161 'take':1511 'target':199 'team@example.com':498 'tell':976,2110 'test':1715 'text':864,959 'text/html':916,967 'text/plain':914,946,1753,1969 'thank':533 'thread':13,38,190,351,985,987,1528,1535,1623,1642,1643,1832,1835,1864,2039,2165 'threadid':359,507,730,1800,1947,2019,2026,2029,2101 'throttl':2154 'tid':1942,2020 'time':95 'today':1993 'togeth':1515,1836 'token':57,62,72,76,147,426,432,437,446,468,471,679,701,783,817,878,997,1075,1149,1197,1242,1301,1317,1328,1345,1351,1358,1367,1440,1467,1496,1566,1599,1637,1655,1786,1883,2010,2083,2115,2203 'top':455 'topic-acedata-cloud' 'topic-agent-skills' 'topic-agentskills' 'topic-ai-image' 'topic-ai-music' 'topic-ai-tools' 'topic-ai-video' 'topic-claude-code' 'topic-cursor' 'topic-gemini-cli' 'topic-github-copilot' 'topic-mcp' 'totalmessag':686 'totalthread':687 'tr':950,1308,1771,1774,1775,1995,1998,1999 'trash':102,188,1131,1171,1378,1619 'treat':2204 'triag':6,773 'type':1157,1444,1471,1500,1570,1603,1752,1790,1968,2014,2087 'ui':1045 'unauthent':2114 'unread':30,691,711,793,1053,1110,1168,1414,1429,1448 'updat':1177 'urlencod':708,719,790,798,824,829,834,839,885,1004,1009,1014,1019,1082,1087,1204,1210,1249,1335,1341,1348,1890,1895,1902,1907 'use':22,319,438,755,1046,1516,1522,1659,1666,1809 'user':25,53,88,156,196,250,481,611,761,978,1139,1385,2112,2196 'user-defin':1138 'userid':484 'userratelimitexceed':2151 'users/me/profile':222 'usual':392 'utf':1755,1821,1971 'v1':19 'valu':851,897 'variabl':434 'verbatim':143,602 'verifi':666 'version':419,1760,1976 'via':16,49 'walk':928,936,941,970,1256,1264,1269 'want':252,762,1689 'whole':984,1534,1641 'without':213,2027 'word':1733,1813 'work':227,1055 'workspac':261,430,466 'write':92,114,161,181,187,1370,1407,2072 'wrong':2163 'x':1433,1460,1489,1559,1592,1630,1648,1779,2003,2076 'yyyy/mm/dd':1126 'z':1365 'zero':300,586 '你好':1817 '季度复盘草稿':1818","prices":[{"id":"6c6540aa-9aff-4f38-9611-6c07239be002","listingId":"ff70522f-24b2-48d6-95ba-d4663b71e5b6","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"AceDataCloud","category":"Skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:21:32.798Z"}],"sources":[{"listingId":"ff70522f-24b2-48d6-95ba-d4663b71e5b6","source":"github","sourceId":"AceDataCloud/Skills/google-gmail","sourceUrl":"https://github.com/AceDataCloud/Skills/tree/main/skills/google-gmail","isPrimary":false,"firstSeenAt":"2026-05-18T13:21:32.798Z","lastSeenAt":"2026-05-18T19:14:02.408Z"}],"details":{"listingId":"ff70522f-24b2-48d6-95ba-d4663b71e5b6","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"AceDataCloud","slug":"google-gmail","github":{"repo":"AceDataCloud/Skills","stars":7,"topics":["acedata-cloud","agent-skills","agentskills","ai-image","ai-music","ai-tools","ai-video","claude-code","cursor","gemini-cli","github-copilot","mcp","npm","openai-codex","roo-code"],"license":"other","html_url":"https://github.com/AceDataCloud/Skills","pushed_at":"2026-05-18T07:35:03Z","description":"Agent Skills for AceDataCloud AI services — music, image, video generation, web search, and more. Compatible with Claude Code, GitHub Copilot, Gemini CLI, and all agentskills.io-compatible agents.","skill_md_sha":"96073b512cf15aa3f7de74bd67de1c9708fd1eca","skill_md_path":"skills/google-gmail/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/AceDataCloud/Skills/tree/main/skills/google-gmail"},"layout":"multi","source":"github","category":"Skills","frontmatter":{"name":"google-gmail","license":"Apache-2.0","description":"Read, search, triage, label, archive and send Gmail mail / threads / labels / attachments via the Gmail v1 REST API. Use when the user mentions Gmail, \"my inbox\", unread mail, recent emails from someone, summarising a thread, downloading an attachment, finding mail by label / query, archiving or labelling a thread, or drafting and sending a reply / new message."},"skills_sh_url":"https://skills.sh/AceDataCloud/Skills/google-gmail"},"updatedAt":"2026-05-18T19:14:02.408Z"}}