一键导入
add-meepachat
Add MeepaChat as a channel. Can run alongside WhatsApp or other channels. Connects to MeepaChat Bot Gateway via WebSocket for real-time messaging.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Add MeepaChat as a channel. Can run alongside WhatsApp or other channels. Connects to MeepaChat Bot Gateway via WebSocket for real-time messaging.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | add-meepachat |
| description | Add MeepaChat as a channel. Can run alongside WhatsApp or other channels. Connects to MeepaChat Bot Gateway via WebSocket for real-time messaging. |
This skill adds MeepaChat support to NanoClaw using the skills engine for deterministic code changes, then walks through interactive setup.
MeepaChat is a self-hosted team communication platform similar to Slack/Discord. This integration uses the MeepaChat Bot Gateway (WebSocket API) to enable nano to respond to messages in MeepaChat channels and DMs.
readEnvFile() from NanoClaw's config module instead of process.env. Under launchd (macOS), process.env is empty so credentials won't be found. Make sure your NanoClaw version exports readEnvFile from src/config.ts.message.user.bot === true) to prevent bot spam loops in group chats.Read .nanoclaw/state.yaml. If meepachat is in applied_skills, skip to Phase 3 (Setup). The code changes are already in place.
Use AskUserQuestion to collect configuration:
Question 1: Do you have a MeepaChat bot token, or do you need to create one?
Question 2: What is your MeepaChat instance URL?
https://chat.meepachat.aiQuestion 3: Should the bot require a trigger (e.g. @nano) to respond, or respond to all messages?
If the user chooses "Require trigger", set requireTrigger: true in the channel config. Otherwise default to requireTrigger: false.
Question 4: Should the bot auto-subscribe to all channels it has access to?
data/registered_groups.jsonIf the user chooses "Yes", after the bot connects and receives the ready event, iterate through all discovered channels and add any missing ones to data/registered_groups.json with the mc: prefix.
Run the skills engine to apply this skill's code package.
If .nanoclaw/ directory doesn't exist yet:
npx tsx scripts/apply-skill.ts --init
npx tsx scripts/apply-skill.ts .claude/skills/add-meepachat
This deterministically:
src/channels/meepachat.ts (MeepaChatChannel class implementing Channel interface)src/channels/meepachat.test.ts (unit tests)src/index.ts to initialize MeepaChatChannelsrc/config.ts to add MEEPACHAT_BOT_TOKEN and MEEPACHAT_BASE_URLGuide the user to create a bot in their MeepaChat instance:
<bot_id>.<secret>)Alternatively, via API:
curl -X POST https://your-instance.meepachat.ai/api/bots \
-H "Authorization: Bearer YOUR_USER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "nano"}'
IMPORTANT: Never commit your bot token to version control!
Add your bot token to .env (this file should be in .gitignore):
MEEPACHAT_BOT_TOKEN=your_bot_token_here
MEEPACHAT_BASE_URL=https://your-instance.meepachat.ai # Or use cloud at https://chat.meepachat.ai
The bot token format is <bot_id>.<secret> and is shown only once when you create the bot. Store it securely:
.env to .gitignore if not already presentUnlike WhatsApp/Telegram which use JIDs, MeepaChat uses channel IDs. The bot automatically discovers channels when it connects, but you need to register which ones nano should respond in.
The bot will see:
To register a channel for nano to respond in, you'll need the channel ID. Get it by:
GET /api/servers/{serverID}/channelsThen register in data/registered_groups.json:
{
"mc:6f9aef90-fe88-4521-9c35-92cc8b65b019": {
"name": "MeepaChat #general",
"folder": "meepachat-general",
"trigger": "@nano",
"platform": "meepachat",
"added_at": "2026-03-07T00:00:00.000Z"
}
}
Note: Channel JIDs are prefixed with mc: to distinguish from WhatsApp/Telegram.
npm run dev
The bot should:
In MeepaChat:
@nano in a registered channelMeepaChat implements the standard Channel interface:
interface Channel {
name: string;
connect(): Promise<void>;
sendMessage(jid: string, message: string): Promise<void>;
disconnect(): Promise<void>;
}
message.created event via WebSocketGET /api/bot-gatewayAuthorization: Bot <token> headerPOST /api/servers/{serverID}/channels/{channelID}/messagesBot not receiving messages:
Bot responds twice:
message.created events401 Unauthorized:
POST /api/bots/{botID}/regenerate-tokenAfter successful setup:
groups/{folder}/CLAUDE.md