Claude To Im
op7418/Claude-to-IM-skill
Bridge THIS Claude Code or Codex session to Telegram, Discord, Feishu/Lark, QQ, or WeChat so the user can chat with Claude from their phone.
Configure IM platform channels (Feishu, WeCom, Weixin, Discord, Telegram, DingTalk) for openclacky.
$ npx skills add clacky-ai/openclacky --skill channel-manager -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install clacky-ai/openclacky channel-manager --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/clacky-ai/openclacky.git skills-src && mkdir -p .claude/skills && cp -r skills-src/lib/clacky/default_skills/channel-manager .claude/skills/channel-manager && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "channel-manager" agent skill from https://github.com/clacky-ai/openclacky/tree/main/lib/clacky/default_skills/channel-manager into .claude/skills/channel-manager/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "channel-manager", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/clacky-ai/openclacky/tree/main/lib/clacky/default_skills/channel-managerType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add clacky-ai/openclacky --skill channel-manager -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install clacky-ai/openclacky channel-manager --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/clacky-ai/openclacky.git skills-src && mkdir -p .agents/skills && cp -r skills-src/lib/clacky/default_skills/channel-manager .agents/skills/channel-manager && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "channel-manager" agent skill from https://github.com/clacky-ai/openclacky/tree/main/lib/clacky/default_skills/channel-manager into .agents/skills/channel-manager/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "channel-manager", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add clacky-ai/openclacky --skill channel-manager -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install clacky-ai/openclacky channel-manager --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/clacky-ai/openclacky.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/lib/clacky/default_skills/channel-manager .cursor/skills/channel-manager && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "channel-manager" agent skill from https://github.com/clacky-ai/openclacky/tree/main/lib/clacky/default_skills/channel-manager into .cursor/skills/channel-manager/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "channel-manager", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/clacky-ai/openclacky.git --path lib/clacky/default_skills/channel-manager--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add clacky-ai/openclacky --skill channel-manager -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install clacky-ai/openclacky channel-manager --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/clacky-ai/openclacky.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/lib/clacky/default_skills/channel-manager .gemini/skills/channel-manager && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "channel-manager" agent skill from https://github.com/clacky-ai/openclacky/tree/main/lib/clacky/default_skills/channel-manager into .gemini/skills/channel-manager/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "channel-manager", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install clacky-ai/openclacky channel-managerInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add clacky-ai/openclacky --skill channel-manager -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/clacky-ai/openclacky.git skills-src && mkdir -p .github/skills && cp -r skills-src/lib/clacky/default_skills/channel-manager .github/skills/channel-manager && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "channel-manager" agent skill from https://github.com/clacky-ai/openclacky/tree/main/lib/clacky/default_skills/channel-manager into .github/skills/channel-manager/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "channel-manager", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add clacky-ai/openclacky --skill channel-manager -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install clacky-ai/openclacky channel-manager --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/clacky-ai/openclacky.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/lib/clacky/default_skills/channel-manager .opencode/skills/channel-manager && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "channel-manager" agent skill from https://github.com/clacky-ai/openclacky/tree/main/lib/clacky/default_skills/channel-manager into .opencode/skills/channel-manager/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "channel-manager", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
channel-managerConfigure IM platform channels (Feishu, WeCom, Weixin, Discord, Telegram, DingTalk) for openclacky.
Channel Manager is an agent skill from clacky-ai/openclacky. Configure IM platform channels (Feishu, WeCom, Weixin, Discord, Telegram, DingTalk) for openclacky. Uses browser automation for navigation; guides the user to paste credentials and perform UI steps. Trigger on: "channel setup", "setup feishu", "setup wecom", "setup weixin", "setup wechat", "setup discord", "setup telegram", "setup dingtalk", "channel config", "channel status", "channel enable", "channel disable", "channel reconfigure", "channel doctor", "send message to weixin", "send message to feishu", "send…
Its SKILL.md is about 6.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files.
It sits in Productivity & Automation, covering Messaging and chat bots. It works with WeChat, Feishu (Lark), Telegram and Discord. The repository describes itself as: The most Token-efficient open-source AI Agent. The licence is MIT.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e16b639. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadWriteEditAskFollowupQuestionGlobBrowserFrom allowed-tools in the SKILL.md frontmatter.
Ships script files (Ruby), which the agent can run.
Shell commands in SKILL.md call:
rubycurlnpmFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.telegram.orgopen.feishu.cnwork.weixin.qq.comilinkai.weixin.qq.comAlso links to:
discord.comt.megithub.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
APP_SECRETBOT_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Channel Manager loads about 6.1k tokens when it runs. Until then it costs about 182 tokens; SKILL.md has 2,721 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Bash, Read, Write, Edit, AskFollowupQuestion, Glob, BrowserAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from clacky-ai/openclacky at commit e16b639, republished under its MIT licence (© clacky-ai). 2,721 words, ~6,117 tokens.
.claude/skills/channel-manager/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.Configure IM platform channels for openclacky.
| User says | Subcommand |
|---|---|
channel setup, setup feishu, setup wecom, setup weixin, setup wechat, setup discord, setup telegram, setup dingtalk | setup |
channel status | status |
channel enable feishu/wecom/weixin/discord/telegram/dingtalk | enable |
channel disable feishu/wecom/weixin/discord/telegram/dingtalk | disable |
channel reconfigure | reconfigure |
channel doctor | doctor |
send <message> to weixin/feishu/wecom/discord/telegram/dingtalk | send |
statusCall the server API:
curl -s http://${CLACKY_SERVER_HOST}:${CLACKY_SERVER_PORT}/api/channelsResponse shape (example):
{"channels":[
{"platform":"feishu","enabled":true,"running":true,"has_config":true,"app_id":"cli_xxx","domain":"https://open.feishu.cn","allowed_users":[]},
{"platform":"wecom","enabled":false,"running":false,"has_config":false,"bot_id":""},
{"platform":"weixin","enabled":true,"running":true,"has_config":true,"has_token":true,"base_url":"https://ilinkai.weixin.qq.com","allowed_users":[]},
{"platform":"discord","enabled":true,"running":true,"has_config":true,"has_token":true,"allowed_users":[]}
{"platform":"telegram","enabled":true,"running":true,"has_config":true,"has_token":true,"base_url":"https://api.telegram.org","parse_mode":"Markdown","allowed_users":[]}
]}Display the result:
Channel Status
─────────────────────────────────────────────────────
Platform Enabled Running Details
feishu ✅ yes ✅ yes app_id: cli_xxx...
wecom ❌ no ❌ no (not configured)
weixin ✅ yes ✅ yes has_token: true
discord ✅ yes ✅ yes has_token: true
telegram ✅ yes ✅ yes has_token: true
dingtalk ✅ yes ✅ yes client_id: ding_xxx...
─────────────────────────────────────────────────────app_id (truncated to 12 chars)bot_id if presenthas_token: true/false (token value is never displayed)has_token: true/false (token value is never displayed)has_token: true/false (bot token is never displayed)client_id (truncated to 12 chars)If the API is unreachable or returns an empty list: "No channels configured yet. Run /channel-manager setup to get started."
setupAsk:
Which platform would you like to connect?
- Feishu
- WeCom (Enterprise WeChat)
- Weixin (Personal WeChat via iLink QR login)
- Discord
- Telegram (Bot API)
- DingTalk
Use the setup script to create the Feishu app automatically via OAuth 2.0 Device Authorization Grant. The user only needs to scan a QR code once.
terminal(command: "ruby SKILL_DIR/feishu_setup.rb", background: true)Keep polling the session. The script will print:
SCAN_URL:<url> — the QR code URLEXPIRE_IN:<seconds> — how long the URL is validOnce you see these lines, tell the user immediately:
<url>"<url>"Continue polling until the response contains an exit_code. When the session ends successfully, stdout will contain:
APP_ID:<app_id>APP_SECRET:<app_secret>Parse both values.
curl -X POST http://${CLACKY_SERVER_HOST}:${CLACKY_SERVER_PORT}/api/channels/feishu \
-H "Content-Type: application/json" \
-d '{"app_id":"<APP_ID>","app_secret":"<APP_SECRET>","domain":"https://open.feishu.cn"}'CRITICAL: This curl call is the ONLY way to save credentials. NEVER write ~/.clacky/channels.yml
or any file under ~/.clacky/channels/ directly. The server API handles persistence, hot-reload,
and establishing the long connection.
On success: tell the user the following (zh), then continue to Step 3 (Feishu CLI):
zh: "✅ 飞书通道已配置成功!现在你可以通过飞书与智能助手进行私聊和群聊,也支持阅读飞书文档。" en: "✅ Feishu channel configured! You can now chat with the assistant via Feishu DMs or group chats, and read Feishu Docs."
Reach here after the channel is configured (Step 2 succeeded). Read app_id and app_secret from ~/.clacky/channels.yml (under channels.feishu) for the install commands below.
Call ask_user:
zh:
{
\"question\": \"是否安装飞书 CLI?安装后将解锁更多飞书能力,例如创建、编辑、删除云文档。\",
"options": ["安装", "跳过"]
}en:
{
"question": "Install Feishu CLI? It unlocks more Feishu capabilities, such as creating, editing, and deleting Docs.",
"options": ["Install", "Skip"]
}If the user picks Skip, stop — setup is complete.
If the user picks Enable, run the following in order:
Step 3a — Install and configure (single terminal call):
lark-cli --version > /dev/null 2>&1 || npm install -g @larksuite/cli
echo -n "<APP_SECRET>" | lark-cli config init --app-id <APP_ID> --app-secret-stdin --brand feishu
ruby "SKILL_DIR/install_feishu_skills.rb"Step 3b — Start authorization as a background session:
terminal(command: "lark-cli auth login --recommend", background: true)This returns a session_id. Keep polling with terminal(session_id: <id>, input: "") every few seconds.
Once you see the authorization URL appear in the output, tell the user immediately (do not wait for their reply):
<URL>"<URL>"Continue polling until the response contains an exit_code (meaning the session has ended). Do not kill the session — restarting invalidates the device code.
When the session ends with exit_code: 0, tell the user:
Stop — setup is fully complete.
open https://work.weixin.qq.com/wework_admin/frame#/aiHelper/create. Pass isolated: true. If the browser is not configured (the open call fails), just give the user the URL and ask them to open it manually in any browser — the rest of the flow is fully manual and does not need browser automation.aib) and secret are not swapped. Run:curl -X POST http://${CLACKY_SERVER_HOST}:${CLACKY_SERVER_PORT}/api/channels/wecom \
-H "Content-Type: application/json" \
-d '{"bot_id":"<BOT_ID>","secret":"<SECRET>"}'On success: "✅ WeCom channel configured. WeCom client → Contacts → Smart Bot to find it."
Weixin uses a QR code login — no app_id/app_secret needed. The token from the QR scan is saved directly in channels.yml.
Run the script in --fetch-qr mode to get the QR URL without blocking:
QR_JSON=$(ruby "SKILL_DIR/weixin_setup.rb" --fetch-qr 2>/dev/null)
echo "$QR_JSON"Parse the JSON output:
qrcode_url — the URL to open in browser (this IS the QR code content)qrcode_id — the session ID needed for pollingIf the output contains "error", show it and stop.
Build the local QR page URL (include current Unix timestamp as since to detect new logins only):
http://${CLACKY_SERVER_HOST}:${CLACKY_SERVER_PORT}/weixin-qr.html?url=<URL-encoded qrcode_url>&since=<current_unix_timestamp>Try browser first — attempt to open the QR page using the browser tool:
browser(action="navigate", url="<qr_page_url>")If browser succeeds: Tell the user:
I've opened the WeChat QR code in your browser. Please scan it with WeChat, then confirm in the app.
If browser fails (not configured or unavailable): Fall back to manual — tell the user:
Please open the following link in your browser to scan the WeChat QR code:
http://${CLACKY_SERVER_HOST}:${CLACKY_SERVER_PORT}/weixin-qr.html?url=<URL-encoded qrcode_url>Scan the QR code with WeChat and confirm in the app. I'm already watching for your scan — no need to reply.
Do NOT wait for the user to reply "done". Immediately proceed to Step 3 and start polling — exactly as in the browser-succeeds path. The polling script must already be running while the user scans, so it can observe the scaned → confirmed transition; otherwise a real scan can be misread as a stale session.
The page renders a proper scannable QR code image. Do NOT open the raw qrcode_url directly — that page shows "请使用微信扫码打开" with no actual QR image.
As soon as the QR page has been presented to the user — whether you opened it via the browser tool or gave the user the manual link — immediately run the polling script in the background. In both cases, do NOT wait for the user to confirm or reply "done" before starting the poll — the script must already be running while the user scans:
ruby "SKILL_DIR/weixin_setup.rb" --qrcode-id "$QRCODE_ID"Where $QRCODE_ID is the qrcode_id from Step 2's JSON output.
Run this command with timeout: 60. If it doesn't succeed, retry up to 3 times with the same $QRCODE_ID — the QR code stays valid for 5 minutes. Only stop retrying if:
Tell the user while waiting:
Waiting for you to scan the QR code and confirm in WeChat... (this may take a moment)
If exit code is 0: "✅ Weixin channel configured! You can now message your bot on WeChat."
If exit code is non-0 or times out: Show the error and offer to retry from Step 2.
Discord requires manual portal interaction (hCaptcha gates Application creation). The browser just navigates the user to the portal; the user clicks through and pastes the bot token + app id back.
Get the portal URL from the script and open it in the browser:
PORTAL_URL=$(ruby "SKILL_DIR/discord_setup.rb" --portal-url)Open it: browser(action="navigate", url="<PORTAL_URL>"). If the browser tool is not configured, invoke browser-setup first, then retry.
Tell the user all of the following in a single message, then call ask_user to collect the values in one reply:
In the Discord Developer Portal I just opened:
- Click New Application (top-right). Name it whatever you like (e.g. "Open Clacky"), check the ToS box, click Create.
- In the left nav click Bot.
- Scroll down to Privileged Gateway Intents and turn on MESSAGE CONTENT INTENT, then click Save Changes.
- Scroll up, click Reset Token → Yes, do it!. Click Copy to copy the bot token. (This is the only time the token is shown — don't navigate away before copying.)
- In the left nav click General Information. Copy the Application ID.
Paste both values back here in this format (one line):
token=YOUR_BOT_TOKEN app_id=YOUR_APPLICATION_ID
If the user is chatting in a non-English language, append the localized label in parens after each bolded English button name (e.g. **Bot**(机器人)). The English label stays primary — it's what they physically click in the portal.
Use ask_user to collect the reply. Parse with tolerant regex (token=\S+, app_id=\d+).
If the reply is malformed (missing either field), apologise briefly and ask again with the exact same format reminder. Up to 3 retries; after that, surface the original message and stop.
Validate the token and save credentials:
ruby "SKILL_DIR/discord_setup.rb" --validate "<BOT_TOKEN>"On success the script prints {"bot_id":"...","username":"..."} and the adapter starts.
Generate the invite URL using the application id from Step 2:
ruby "SKILL_DIR/discord_setup.rb" --invite-url "<APP_ID>"Open it: browser(action="navigate", url="<INVITE_URL>"). Tell the user:
Pick your server from the dropdown → Continue → Authorize. I'll detect when the bot joins.
If the dropdown is empty, you don't have a server yet — open https://discord.com/channels/@me, click Add a Server (the + button on the left sidebar) → Create My Own → For me and my friends → name it → Create, then re-open the invite link.
Wait for the bot to join a guild (long-poll, 10 min timeout). Run with timeout: 620:
ruby "SKILL_DIR/discord_setup.rb" --watch-guildOn exit 0: "✅ Discord channel configured! Bot is in <guild_name>. Mention it or DM it from any channel."
On timeout: offer to re-open the invite URL — the bot token stays valid.
Telegram setup is by far the simplest — no browser automation, no QR. The user creates a bot via @BotFather and pastes the token here.
Tell the user:
Open Telegram and start a chat with @BotFather (https://t.me/BotFather). Send
/newbot, choose a display name and a username ending inbot. BotFather will reply with an HTTP API token that looks like123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ. Paste the token here.Optional: if your network blocks
api.telegram.org, also tell me the base URL of your self-hosted Bot API server (e.g.https://my-tg-proxy.example.com). Otherwise leave it blank.
Wait for the user's reply. Parse the token (matches ^\d+:[\w-]{30,}$).
Call the server API. It calls getMe against the Bot API to validate the token before persisting:
curl -s -X POST http://${CLACKY_SERVER_HOST}:${CLACKY_SERVER_PORT}/api/channels/telegram \
-H "Content-Type: application/json" \
-d '{"bot_token":"<TOKEN>","base_url":"<BASE_URL_OR_OMIT>"}'200 { "ok": true } — token validated and saved. The adapter starts long-polling immediately.422 { "ok": false, "error": "..." } — show the error (commonly "Unauthorized" → wrong token) and offer to retry.On success:
✅ Telegram channel configured. Open your bot in Telegram and send any message to start chatting.
For group chats: You must disable Privacy Mode in @BotFather first (
/mybots → Bot Settings → Group Privacy → Turn off), then remove and re-add the bot to the group. Otherwise the bot cannot receive any messages — including @-mentions.
/mybots → select your bot → Bot Settings → Group Privacy → Turn offbase_url when api.telegram.org is unreachable. See https://github.com/tdlib/telegram-bot-api for the official self-hosted server.allowed_users: restrict which Telegram user IDs the bot will respond to. Find a user's numeric ID by messaging @userinfobot.enableCall the server API to re-enable the platform (this reads from disk, sets enabled, saves, and hot-reloads):
curl -s -X POST http://${CLACKY_SERVER_HOST}:${CLACKY_SERVER_PORT}/api/channels/<platform> \
-H "Content-Type: application/json" \
-d '{"enabled": true}'If the platform has no credentials (404 or error), redirect to setup.
Say: "✅ <platform> channel enabled."
disableCall the server API to disable the platform:
curl -s -X DELETE http://${CLACKY_SERVER_HOST}:${CLACKY_SERVER_PORT}/api/channels/<platform>Say: "❌ <platform> channel disabled."
ruby "SKILL_DIR/dingtalk_setup.rb" --print-qrParse the last line starting with { to get qr_url and device_code. On non-0 exit, show the error and abort.
Show qr_url to the user, ask them to scan with the DingTalk mobile app and tap "Create New Robot", then call ask_user.
ruby "SKILL_DIR/dingtalk_setup.rb" --poll "<device_code>"WAITING_TIMEOUT or expired, restart from Step 1.reconfigureGET /api/channels (mask secrets — show last 4 chars only).POST /api/channels/<platform>).~/.clacky/channels.yml directly — always use the server API.doctorCheck each item, report ✅ / ❌ with remediation:
~/.clacky/channels.yml exist and is it readable?app_id, app_secret present and non-emptybot_id, secret present and non-emptytoken present and non-empty in channels.ymlbot_token present and non-empty in channels.ymlbot_token present and non-emptycode=0.GET /api/channels and check has_token: true for the weixin entry.getMe against the Bot API:BOT_TOKEN=$(ruby -ryaml -e 'puts (YAML.load_file(File.expand_path("~/.clacky/channels.yml"))["channels"]["telegram"]["bot_token"] rescue "")')
BASE_URL=$(ruby -ryaml -e 'puts (YAML.load_file(File.expand_path("~/.clacky/channels.yml"))["channels"]["telegram"]["base_url"] || "https://api.telegram.org" rescue "https://api.telegram.org")')
curl -s "$BASE_URL/bot$BOT_TOKEN/getMe" | grep -q '"ok":true' && echo "✅ Telegram OK" || echo "❌ Telegram credentials rejected by getMe"grep -iE "wecom adapter loop started|WeCom authentication failed|WeCom WS error response|WecomAdapter" \
~/.clacky/logger/clacky-$(date +%Y-%m-%d).logWeCom authentication failed or non-zero errcode → ❌ "WeCom credentials incorrect"adapter loop started with no auth error → ✅GET /api/channels and check has_token: true. Search today's log:grep -iE "DiscordAdapter|discord-gateway|/users/@me failed" \
~/.clacky/logger/clacky-$(date +%Y-%m-%d).log/users/@me failed → ❌ "Discord token invalid or revoked — re-run setup"authenticated as with no error → ✅grep -iE "dingtalk-ws|DingTalk.*error|stream.*error" \
~/.clacky/logger/clacky-$(date +%Y-%m-%d).logWebSocket connected → ✅Stream endpoint error or token error → ❌ "DingTalk credentials invalid — re-run setup"sendProactively send a message to a user via an IM channel adapter.
Extract two things from the user's instruction:
weixin, feishu, wecom, discord, telegram, dingtalkIf the platform cannot be inferred, ask the user to clarify.
If the user specified a user_id, use it directly.
Otherwise, list known users first:
curl -s http://${CLACKY_SERVER_HOST}:${CLACKY_SERVER_PORT}/api/channels/<platform>/users<platform>. The target user must send at least one message to the bot before proactive messaging is possible." Stop here.curl -s -X POST http://${CLACKY_SERVER_HOST}:${CLACKY_SERVER_PORT}/api/channels/<platform>/send \
-H "Content-Type: application/json" \
-d '{"message": "<message>", "user_id": "<user_id>"}'Response handling:
| HTTP status | Meaning | Action |
|---|---|---|
200 { ok: true } | Delivered | Tell user: "✅ Message sent to <platform>." |
400 platform not running | Adapter is stopped | Tell user the platform is not running and suggest channel enable <platform>. |
400 no context_token | Token missing | Explain: "The bot has no active session token for this user. Ask the user to send any message to the bot first, then retry." |
503 no known users | Nobody has messaged the bot | Same guidance as empty user list above. |
| Other error | Unexpected | Show the error message from the response body. |
context_token that is obtained from the most recent inbound message from that user. The token is cached in memory and reset on server restart. If the server was restarted since the user last wrote, the token is gone and the send will fail — the user must message the bot again.user_id / chat_id (or Discord channel/user id) is valid, the message will be delivered. For Telegram specifically, the user_id must be a Telegram chat_id that the bot can write to — the user must have sent at least one message to the bot first.chmod 600.© clacky-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files in lib/clacky/default_skills/channel-manager of clacky-ai/openclacky.
Open the folder on GitHubat commit e16b639
Channel Manager next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Channel Manager this skillclacky-ai/openclacky | 1.2k | — | ~6.1k | Automated safety check: Notes | MIT | |
| Claude To Imop7418/Claude-to-IM-skill | 2.9k | — | ~3.4k | Automated safety check: Notes | MIT | |
| Channel Manageropen-octo/octo-agent | 125 | — | ~6.2k | Automated safety check: Pass | MIT | |
| Use Avibeavibe-bot/avibe | 624 | — | ~2.5k | Automated safety check: Pass | MIT | |
| Easy Openclawdaheiai/easy-openclaw | 112 | — | ~1.7k | Automated safety check: Notes | None | |
| Message Push0xranx/golembot | 322 | — | ~984 | Automated safety check: Pass | MIT |
op7418/Claude-to-IM-skill
Bridge THIS Claude Code or Codex session to Telegram, Discord, Feishu/Lark, QQ, or WeChat so the user can chat with Claude from their phone.
open-octo/octo-agent
Configure IM platform channels (Feishu, Weixin/WeChat, WeCom, DingTalk, Discord, Telegram) for octo.
avibe-bot/avibe
Safely inspect and modify local Avibe configuration, routing, runtime settings, watches, scheduled tasks, Avibe Cloud remote access, and operational state.
daheiai/easy-openclaw
OpenClaw 配置优化向导。采用“第 0 层测试观测(可选)+ 前 3 轮优化 + 第 4 轮接入扩展”流程:基础推荐层(含联网搜索与权限模式)、渠道增强层(Discord/Feishu/Telegram 分支优化)、Skills 推荐层(可执行可跳过)、新增渠道接入引导(可跳过)。用于帮助用户快速完成 OpenClaw 初始化或优化配置。用户说到“优化…
0xranx/golembot
Send proactive messages to IM groups or individual users via the gateway Send API.
nexu-io/nexu
Send feedback to the Nexu team. An agent skill from nexu-io/nexu.
clacky-ai/openclacky
Install skills from a zip URL or local zip file path. An agent skill from clacky-ai/openclacky.
clacky-ai/openclacky
Generate or edit images, videos, or audio in the current task.
clacky-ai/openclacky
Configure the browser tool for Clacky. An agent skill from clacky-ai/openclacky.
clacky-ai/openclacky
Create, manage, and run scheduled automated tasks (cron jobs) in Clacky.
clacky-ai/openclacky
Deploy Rails applications to Railway. An agent skill from clacky-ai/openclacky.
clacky-ai/openclacky
Manage MCP (Model Context Protocol) servers for openclacky: add, list, probe, remove, reconfigure.
Works with
Categories
Configure IM platform channels (Feishu, WeCom, Weixin, Discord, Telegram, DingTalk) for openclacky. Channel Manager is an agent skill from clacky-ai/openclacky. Configure IM platform channels (Feishu, WeCom, Weixin, Discord, Telegram, DingTalk) for openclacky.
Channel Manager fits situations like: : channel setup; channel disable; channel reconfigure; send message to weixin.
Run `npx skills add clacky-ai/openclacky --skill channel-manager -a claude-code`. Or copy the skill folder (lib/clacky/default_skills/channel-manager in clacky-ai/openclacky) into .claude/skills/channel-manager in your project. Claude Code loads it when a task matches its description.
Run `npx skills add clacky-ai/openclacky --skill channel-manager -a codex`. Or copy the skill folder (lib/clacky/default_skills/channel-manager in clacky-ai/openclacky) into .agents/skills/channel-manager in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add clacky-ai/openclacky --skill channel-manager -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/channel-manager, .gemini/skills/channel-manager, .github/skills/channel-manager and .opencode/skills/channel-manager in your project.
Going by SKILL.md and its folder, Channel Manager needs Ruby for the scripts in its folder, the command-line tools its instructions call (ruby, curl and npm) and credentials named APP_SECRET and BOT_TOKEN. Our summary lists: Node.js; A credential in APP_SECRET. Its frontmatter pre-approves these tools: Bash, Read, Write, Edit, AskFollowupQuestion, Glob, Browser.
SKILL.md names 7 domains. In commands or code: api.telegram.org, open.feishu.cn, work.weixin.qq.com and ilinkai.weixin.qq.com; the agent is likely to contact these when it follows the instructions. As links in the text: discord.com, t.me and github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Channel Manager is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.1k tokens (SKILL.md is roughly 24k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Channel Manager: Claude To Im (op7418/Claude-to-IM-skill, 2.9k stars), Channel Manager (open-octo/octo-agent, 125 stars), Use Avibe (avibe-bot/avibe, 624 stars) and Easy Openclaw (daheiai/easy-openclaw, 112 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
clacky-ai (a GitHub organization) maintains it in clacky-ai/openclacky, which has 1,204 GitHub stars. The repository holds 20 skills in this directory. The repository was last updated on October 10, 2026.
Source: clacky-ai/openclacky on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.