slack-a2a-rooms

Configure Slack group DMs where multiple NanoClaw bots exchange mention-driven messages under a hop limit.

30.7k|12.8k|Updated Jan 31, 2026
One-click install
npx skills add https://github.com/nanocoai/nanoclaw --skill slack-a2a-rooms
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: slack-a2a-rooms
Source: https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/slack-a2a-rooms
Command: npx skills add https://github.com/nanocoai/nanoclaw --skill slack-a2a-rooms

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes scripts (resource) components.

What problem does it solve?

By default, NanoClaw's Slack channel drops every bot-authored message at the bridge boundary, so sibling bots can never hear each other. This Skill opens that guard selectively, letting two or more NanoClaw Slack bots talk to each other and to a human inside an allowlisted group DM (MPIM) without risking infinite bot loops.

Core Features & Use Cases

  • Allowlisted room admission: Bot-authored inbound passes only in rooms listed in SLACK_A2A_ROOMS, re-attributed as slack:bot:<bot_id>; everywhere else the default drop stays in place.
  • Loop safety via hop limits: After SLACK_A2A_MAX_HOPS consecutive bot messages (default 6) without a human message, further bot messages are dropped until a human speaks, tracked per room and per bot identity.
  • Room opener CLI: scripts/open-a2a-room.ts opens the MPIM via conversations.open, posts an intro message, and appends the room id to .env, picked up within ~30 seconds without a restart.
  • Use Case: You run three NanoClaw agents (dana, eli, and a default bot) in one Slack workspace and want them to collaborate in a shared room with you. Run the opener script with --instances dana,eli,default --user U0AAAAAAA, then @-mention bots to drive a multi-agent conversation that pauses automatically if it runs away.

Quick Start

Ask the agent to apply the slack-a2a-rooms skill and then run scripts/open-a2a-room.ts with your bot instance names and your Slack user id to open the first agent-to-agent room.

Frequently Asked Questions about slack-a2a-rooms

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I let two Slack bots talk to each other in NanoClaw?

Apply this skill, then run pnpm exec tsx scripts/open-a2a-room.ts --instances <name,name> --user <slack user id>. The script opens an MPIM via conversations.open and appends the channel id to SLACK_A2A_ROOMS in .env, which the bridge filter picks up within about 30 seconds.

How do I prevent infinite loops between Slack bots?

The skill enforces a consecutive-hop limit: after SLACK_A2A_MAX_HOPS bot messages (default 6) without a human message, further bot messages are dropped until a human speaks. Conversation is also mention-driven, so bots only reply when @-mentioned.

What Slack scopes are required for agent-to-agent MPIM rooms?

Every participating app needs mpim:write to open the room, mpim:history and mpim:read to see it, and the message.mpim bot event to hear messages. Apps provisioned through the managed manifest flow already include all of these.

Why are my Slack bot messages still dropped after applying the skill?

Bot messages are admitted only in rooms listed in SLACK_A2A_ROOMS; all other rooms keep the guard's default drop. Also verify the installed Slack channel ships src/channels/slack-a2a-guard.ts with the setBotInboundPolicy export, or the policy module import will break the channel barrel.

Can I open a bots-only Slack room without a human user?

Yes, but it needs at least three bot instances, because Slack collapses a two-party conversations.open into a 1:1 IM instead of an MPIM. Pass three or more names to --instances and omit --user.

Does the A2A room setup work across different NanoClaw hosts?

Yes, but each host needs the skill applied with its own SLACK_A2A_ROOMS entry. The opener script only handles co-hosted tokens, so for cross-host rooms you run it where the first bot's token lives and add the room id to the other host's .env manually.