{"id":"5226780a-0159-4171-ac00-b222a4c2ca80","shortId":"ctT6YJ","kind":"skill","title":"slack","tagline":"Send messages, search history, and manage channels via Slack's Web API. Use when the user mentions Slack, a channel, a DM, or wants to post to a specific user/group.","description":"There is no first-party Slack CLI fit for daily use, so we drive the\n[Slack Web API](https://api.slack.com/methods) with `curl + jq`. The\nuser's OAuth bearer token is in `$SLACK_TOKEN`; every call needs it as\n`Authorization: Bearer $SLACK_TOKEN`.\n\nThe Slack API ALWAYS returns 200 — check the JSON `ok` field for success.\nA failed call has `{\"ok\": false, \"error\": \"<reason>\"}`. Surface the\n`error` value verbatim to the user when it occurs.\n\n**Always start with `auth.test`** to confirm the connection works AND\nto learn what bot user / team you're posting as. Many subsequent calls\nneed the bot's user id (`auth.test` returns `user_id`).\n\n## Recipes\n\n### Verify auth (always run first)\n\n```sh\ncurl -sS -H \"Authorization: Bearer $SLACK_TOKEN\" \\\n  https://slack.com/api/auth.test\n# {\"ok\": true, \"team\": \"...\", \"team_id\": \"...\", \"user\": \"<bot>\", \"user_id\": \"U...\"}\n```\n\n### Resolve a channel name to its ID (you'll need this a lot)\n\n```sh\ncurl -sS -H \"Authorization: Bearer $SLACK_TOKEN\" \\\n  \"https://slack.com/api/conversations.list?limit=1000&types=public_channel,private_channel\" \\\n  | jq -r --arg name \"general\" '.channels[] | select(.name == $name) | .id'\n```\n\n### Post a message\n\n```sh\ncurl -sS -X POST https://slack.com/api/chat.postMessage \\\n  -H \"Authorization: Bearer $SLACK_TOKEN\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  -d \"$(jq -nc \\\n        --arg ch \"C0123456789\" \\\n        --arg text \"Deploy complete.\" \\\n        '{channel:$ch, text:$text}')\"\n```\n\n### Reply in a thread\n\n```sh\ncurl -sS -X POST https://slack.com/api/chat.postMessage \\\n  -H \"Authorization: Bearer $SLACK_TOKEN\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  -d \"$(jq -nc \\\n        --arg ch \"C0123456789\" \\\n        --arg ts \"1777656720.123456\" \\\n        --arg text \"Thanks!\" \\\n        '{channel:$ch, thread_ts:$ts, text:$text}')\"\n```\n\n### Search messages\n\n```sh\ncurl -sS -G \\\n  -H \"Authorization: Bearer $SLACK_TOKEN\" \\\n  \"https://slack.com/api/search.messages\" \\\n  --data-urlencode \"query=in:#engineering deploy\" \\\n  --data-urlencode \"count=20\"\n```\n\n### Send a DM to a user (by email)\n\n```sh\nUSER_ID=$(curl -sS -G -H \"Authorization: Bearer $SLACK_TOKEN\" \\\n  \"https://slack.com/api/users.lookupByEmail\" \\\n  --data-urlencode \"email=alice@example.com\" \\\n  | jq -r '.user.id')\n\n# DM channels are auto-created the first time you postMessage to a user id.\ncurl -sS -X POST https://slack.com/api/chat.postMessage \\\n  -H \"Authorization: Bearer $SLACK_TOKEN\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  -d \"$(jq -nc --arg ch \"$USER_ID\" --arg text \"Hi from the bot.\" '{channel:$ch, text:$text}')\"\n```\n\n### Upload a file to a channel\n\nTwo-step: create an upload URL, then complete.\n\n```sh\nUPLOAD=$(curl -sS -G -H \"Authorization: Bearer $SLACK_TOKEN\" \\\n  \"https://slack.com/api/files.getUploadURLExternal\" \\\n  --data-urlencode \"filename=report.pdf\" \\\n  --data-urlencode \"length=$(wc -c < report.pdf)\")\nURL=$(echo \"$UPLOAD\" | jq -r '.upload_url')\nID=$(echo \"$UPLOAD\" | jq -r '.file_id')\n\ncurl -sS -T report.pdf \"$URL\"\n\ncurl -sS -X POST https://slack.com/api/files.completeUploadExternal \\\n  -H \"Authorization: Bearer $SLACK_TOKEN\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  -d \"$(jq -nc --arg fid \"$ID\" --arg ch \"C0123456789\" \\\n        '{files:[{id:$fid, title:\"report.pdf\"}], channel_id:$ch}')\"\n```\n\n## Notes\n\n- **`chat.postMessage` to a public channel requires the bot to be a\n  member of that channel.** If you get `not_in_channel`, call\n  `conversations.join` first (which also takes the channel id), then\n  retry. Private channels and DMs need a manual invite — ask the user.\n- Always check `.ok` on the JSON response. `not_authed` / `invalid_auth`\n  → ask the user to re-authorize at `auth.acedata.cloud/user/connections`.\n- Channel ids start with `C` (channels), `D` (DMs), `G` (private). Don't\n  invent ids — always look them up via `conversations.list` or\n  `users.lookupByEmail`.\n- Slack rate-limits aggressively; `Retry-After` is in the response\n  headers if you get a 429. Sleep and retry rather than parallelizing.","tags":["slack","skills","acedatacloud","acedata-cloud","agent-skills","agentskills","ai-image","ai-music","ai-tools","ai-video","claude-code","cursor"],"capabilities":["skill","source-acedatacloud","skill-slack","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/slack","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 (4,055 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:03.815Z","embedding":null,"createdAt":"2026-05-18T13:21:34.823Z","updatedAt":"2026-05-18T19:14:03.815Z","lastSeenAt":"2026-05-18T19:14:03.815Z","tsv":"'-8':223,262,372,468 '/api/auth.test':156 '/api/chat.postmessage':210,249,359 '/api/conversations.list?limit=1000&types=public_channel,private_channel':189 '/api/files.completeuploadexternal':455 '/api/files.getuploadurlexternal':417 '/api/search.messages':295 '/api/users.lookupbyemail':329 '/methods)':53 '/user/connections':551 '1777656720.123456':271 '20':307 '200':81 '429':591 'aggress':578 'alice@example.com':334 'also':512 'alway':79,107,143,530,566 'api':13,50,78 'api.slack.com':52 'api.slack.com/methods)':51 'application/json':220,259,369,465 'arg':192,227,230,266,269,272,376,380,472,475 'ask':527,541 'auth':142,538,540 'auth.acedata.cloud':550 'auth.acedata.cloud/user/connections':549 'auth.test':110,136 'author':72,150,183,212,251,289,323,361,411,457,547 'auto':342 'auto-cr':341 'bearer':61,73,151,184,213,252,290,324,362,412,458 'bot':120,132,385,494 'c':428,556 'c0123456789':229,268,477 'call':68,91,129,508 'ch':228,235,267,276,377,387,476,485 'channel':8,21,168,195,234,275,339,386,395,483,491,501,507,515,520,552,557 'charset':221,260,370,466 'chat.postmessage':487 'check':82,531 'cli':39 'complet':233,404 'confirm':112 'connect':114 'content':218,257,367,463 'content-typ':217,256,366,462 'conversations.join':509 'conversations.list':571 'count':306 'creat':343,399 'curl':55,147,180,204,243,285,319,353,407,444,449 'd':224,263,373,469,558 'daili':42 'data':297,304,331,419,424 'data-urlencod':296,303,330,418,423 'deploy':232,302 'dm':23,310,338 'dms':522,559 'drive':46 'echo':431,438 'email':315,333 'engin':301 'error':95,98 'everi':67 'fail':90 'fals':94 'fid':473,480 'field':86 'file':392,442,478 'filenam':421 'first':36,145,345,510 'first-parti':35 'fit':40 'g':287,321,409,560 'general':194 'get':504,589 'h':149,182,211,216,250,255,288,322,360,365,410,456,461 'header':586 'hi':382 'histori':5 'id':135,139,161,164,172,199,318,352,379,437,443,474,479,484,516,553,565 'invalid':539 'invent':564 'invit':526 'jq':56,190,225,264,335,374,433,440,470 'json':84,535 'learn':118 'length':426 'limit':577 'll':174 'look':567 'lot':178 'manag':7 'mani':127 'manual':525 'member':498 'mention':18 'messag':3,202,283 'name':169,193,197,198 'nc':226,265,375,471 'need':69,130,175,523 'note':486 'oauth':60 'occur':106 'ok':85,93,157,532 'parallel':597 'parti':37 'post':27,125,200,207,246,356,452 'postmessag':348 'privat':519,561 'public':490 'queri':299 'r':191,336,434,441 'rate':576 'rate-limit':575 'rather':595 're':124,546 're-author':545 'recip':140 'repli':238 'report.pdf':422,429,447,482 'requir':492 'resolv':166 'respons':536,585 'retri':518,580,594 'retry-aft':579 'return':80,137 'run':144 'search':4,282 'select':196 'send':2,308 'sh':146,179,203,242,284,316,405 'skill' 'skill-slack' 'slack':1,10,19,38,48,65,74,77,152,185,214,253,291,325,363,413,459,574 'slack.com':155,188,209,248,294,328,358,416,454 'slack.com/api/auth.test':154 'slack.com/api/chat.postmessage':208,247,357 'slack.com/api/conversations.list?limit=1000&types=public_channel,private_channel':187 'slack.com/api/files.completeuploadexternal':453 'slack.com/api/files.getuploadurlexternal':415 'slack.com/api/search.messages':293 'slack.com/api/users.lookupbyemail':327 'sleep':592 'source-acedatacloud' 'specif':30 'ss':148,181,205,244,286,320,354,408,445,450 'start':108,554 'step':398 'subsequ':128 'success':88 'surfac':96 'take':513 'team':122,159,160 'text':231,236,237,273,280,281,381,388,389 'thank':274 'thread':241,277 'time':346 'titl':481 'token':62,66,75,153,186,215,254,292,326,364,414,460 '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' 'true':158 'ts':270,278,279 'two':397 'two-step':396 'type':219,258,368,464 'u':165 'upload':390,401,406,432,435,439 'url':402,430,436,448 'urlencod':298,305,332,420,425 'use':14,43 'user':17,58,103,121,134,138,162,163,313,317,351,378,529,543 'user.id':337 'user/group':31 'users.lookupbyemail':573 'utf':222,261,371,467 'valu':99 'verbatim':100 'verifi':141 'via':9,570 'want':25 'wc':427 'web':12,49 'work':115 'x':206,245,355,451","prices":[{"id":"9b6b9669-a6c3-4c42-a37c-73cf2cfff5fc","listingId":"5226780a-0159-4171-ac00-b222a4c2ca80","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:34.823Z"}],"sources":[{"listingId":"5226780a-0159-4171-ac00-b222a4c2ca80","source":"github","sourceId":"AceDataCloud/Skills/slack","sourceUrl":"https://github.com/AceDataCloud/Skills/tree/main/skills/slack","isPrimary":false,"firstSeenAt":"2026-05-18T13:21:34.823Z","lastSeenAt":"2026-05-18T19:14:03.815Z"}],"details":{"listingId":"5226780a-0159-4171-ac00-b222a4c2ca80","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"AceDataCloud","slug":"slack","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":"3f9f6ee3fd8ba0674915d7403b7799a8880886e5","skill_md_path":"skills/slack/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/AceDataCloud/Skills/tree/main/skills/slack"},"layout":"multi","source":"github","category":"Skills","frontmatter":{"name":"slack","license":"Apache-2.0","description":"Send messages, search history, and manage channels via Slack's Web API. Use when the user mentions Slack, a channel, a DM, or wants to post to a specific user/group."},"skills_sh_url":"https://skills.sh/AceDataCloud/Skills/slack"},"updatedAt":"2026-05-18T19:14:03.815Z"}}