Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Complete toolkit for creating autonomous AI agents and managing Discord channels for OpenClaw. Use when setting up multi-agent systems, creating new agents, or managing Discord channel organization.
.claude/skills/leoyeai-agent-council/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 219% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 179% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 223% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 169% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 363% | 0% |
Complete toolkit for creating and managing autonomous AI agents with Discord integration for OpenClaw.
Agent Creation:
Discord Channel Management:
bash# Install from ClawHub clawhub install agent-council # Or manual install cp -r . ~/.openclaw/skills/agent-council/ openclaw gateway config.patch --raw '{ "skills": { "entries": { "agent-council": {"enabled": true} } } }'
bashscripts/create-agent.sh \ --name "Watson" \ --id "watson" \ --emoji "🔬" \ --specialty "Research and analysis specialist" \ --model "anthropic/claude-opus-4-5" \ --workspace "$HOME/agents/watson" \ --discord-channel "1234567890"
Ask the user:
bashscripts/create-agent.sh \ --name "Agent Name" \ --id "agent-id" \ --emoji "🤖" \ --specialty "What this agent does" \ --model "provider/model-name" \ --workspace "/path/to/workspace" \ --discord-channel "1234567890" # Optional
The script automatically:
After creation:
Self-contained structure:
agents/
├── watson/
│ ├── SOUL.md # Personality and responsibilities
│ ├── HEARTBEAT.md # Cron execution logic
│ ├── memory/ # Agent-specific memory
│ │ ├── 2026-02-01.md # Daily memory logs
│ │ └── 2026-02-02.md
│ └── .openclaw/
│ └── skills/ # Agent-specific skills (optional)Memory system:
<workspace>/memory/YYYY-MM-DD.mdCron jobs: If your agent needs scheduled tasks:
--session <agent-id>Research agent:
bashscripts/create-agent.sh \ --name "Watson" \ --id "watson" \ --emoji "🔬" \ --specialty "Deep research and competitive analysis" \ --model "anthropic/claude-opus-4-5" \ --workspace "$HOME/agents/watson" \ --discord-channel "1234567890"
Image generation agent:
bashscripts/create-agent.sh \ --name "Picasso" \ --id "picasso" \ --emoji "🎨" \ --specialty "Image generation and editing specialist" \ --model "google/gemini-3-flash-preview" \ --workspace "$HOME/agents/picasso" \ --discord-channel "9876543210"
Health tracking agent:
bashscripts/create-agent.sh \ --name "Nurse Joy" \ --id "nurse-joy" \ --emoji "💊" \ --specialty "Health tracking and wellness monitoring" \ --model "anthropic/claude-opus-4-5" \ --workspace "$HOME/agents/nurse-joy" \ --discord-channel "5555555555"
bashpython3 scripts/setup-channel.py \ --name research \ --context "Deep research and competitive analysis"
bashpython3 scripts/setup-channel.py \ --name <channel-name> \ --context "<channel-purpose>" \ [--category-id <discord-category-id>]
bashopenclaw gateway config.patch --raw '{"channels": {...}}'
With category:
bashpython3 scripts/setup-channel.py \ --name research \ --context "Deep research and competitive analysis" \ --category-id "1234567890"
Use existing channel:
bashpython3 scripts/setup-channel.py \ --name personal-finance \ --id 1466184336901537897 \ --context "Personal finance management"
bashpython3 scripts/rename-channel.py \ --id 1234567890 \ --old-name old-name \ --new-name new-name
bashpython3 scripts/rename-channel.py \ --id <channel-id> \ --old-name <old-name> \ --new-name <new-name> \ [--workspace <workspace-dir>]
--workspace used)bashpython3 scripts/rename-channel.py \ --id 1234567890 \ --old-name old-name \ --new-name new-name \ --workspace "$HOME/my-workspace"
This will:
Full workflow from scratch:
bash# 1. Create Discord channel python3 scripts/setup-channel.py \ --name research \ --context "Deep research and competitive analysis" \ --category-id "1234567890" # (Note the channel ID from output) # 2. Apply gateway config for channel openclaw gateway config.patch --raw '{"channels": {...}}' # 3. Create agent bound to that channel scripts/create-agent.sh \ --name "Watson" \ --id "watson" \ --emoji "🔬" \ --specialty "Deep research and competitive analysis" \ --model "anthropic/claude-opus-4-5" \ --workspace "$HOME/agents/watson" \ --discord-channel "1234567890" # Done! Agent is created and bound to the channel
Option 1: Command line
bashpython3 scripts/setup-channel.py \ --name channel-name \ --context "Purpose" \ --category-id "1234567890"
Option 2: Environment variable
bashexport DISCORD_CATEGORY_ID="1234567890" python3 scripts/setup-channel.py --name channel-name --context "Purpose"
Enable Developer Mode:
Copy IDs:
Arguments:
--name (required) - Agent name--id (required) - Agent ID (lowercase, hyphenated)--emoji (required) - Agent emoji--specialty (required) - What the agent does--model (required) - LLM to use (provider/model-name)--workspace (required) - Where to create agent files--discord-channel (optional) - Discord channel ID to bindOutput:
Arguments:
--name (required) - Channel name--context (required) - Channel purpose/context--id (optional) - Existing channel ID--category-id (optional) - Discord category IDOutput:
Arguments:
--id (required) - Channel ID--old-name (required) - Current channel name--new-name (required) - New channel name--workspace (optional) - Workspace directory to searchOutput:
This skill integrates with OpenClaw's gateway configuration:
Agents:
json{ "agents": { "list": [ { "id": "watson", "name": "Watson", "workspace": "/path/to/agents/watson", "model": { "primary": "anthropic/claude-opus-4-5" }, "identity": { "name": "Watson", "emoji": "🔬" } } ] } }
Bindings:
json{ "bindings": [ { "agentId": "watson", "match": { "channel": "discord", "peer": { "kind": "channel", "id": "1234567890" } } } ] }
Channels:
json{ "channels": { "discord": { "guilds": { "YOUR_GUILD_ID": { "channels": { "1234567890": { "allow": true, "requireMention": false, "systemPrompt": "Deep research and competitive analysis" } } } } } } }
Your main agent coordinates with specialized agents using OpenClaw's built-in session management tools.
See all active agents and their recent activity:
typescriptsessions_list({ kinds: ["agent"], limit: 10, messageLimit: 3 // Show last 3 messages per agent })
Direct communication:
typescriptsessions_send({ label: "watson", // Agent ID message: "Research the competitive landscape for X" })
Wait for response:
typescriptsessions_send({ label: "watson", message: "What did you find about X?", timeoutSeconds: 300 // Wait up to 5 minutes })
For complex work, spawn a sub-agent in an isolated session:
typescriptsessions_spawn({ agentId: "watson", // Optional: use specific agent task: "Research competitive landscape for X and write a report", model: "anthropic/claude-opus-4-5", // Optional: override model runTimeoutSeconds: 3600, // 1 hour max cleanup: "delete" // Delete session after completion })
The sub-agent will:
cleanup: "delete")Review what an agent has been working on:
typescriptsessions_history({ sessionKey: "watson-session-key", limit: 50 })
1. Direct delegation (Discord-bound agents):
2. Programmatic delegation (main agent → sub-agent):
typescript// Main agent delegates task sessions_send({ label: "watson", message: "Research X and update memory/research-X.md" }) // Watson works independently, updates files // Main agent checks later or Watson reports back
3. Spawn for complex tasks:
typescript// For longer-running, isolated work sessions_spawn({ agentId: "watson", task: "Deep dive: analyze competitors A, B, C. Write report to reports/competitors.md", runTimeoutSeconds: 7200, cleanup: "keep" // Keep session for review })
4. Agent-to-agent communication: Agents can send messages to each other:
typescript// In Watson's context sessions_send({ label: "picasso", message: "Create an infographic from data in reports/research.md" })
When to use Discord bindings:
When to use sessions_send:
When to use sessions_spawn:
typescript// Main agent receives request: "Research competitor X" // 1. Check if Watson is active const agents = sessions_list({ kinds: ["agent"] }) // 2. Delegate to Watson sessions_send({ label: "watson", message: "Research competitor X: products, pricing, market position. Write findings to memory/research-X.md" }) // 3. Watson works independently: // - Searches web // - Analyzes data // - Updates memory file // - Reports back when done // 4. Main agent retrieves results const results = Read("agents/watson/memory/research-X.md") // 5. Share with user "Research complete! Watson found: [summary]"
Main Agent (You) ↔ Specialized Agents:
User Request
↓
Main Agent (Claire)
↓
sessions_send("watson", "Research X")
↓
Watson Agent
↓
- Uses web_search
- Uses web_fetch
- Updates memory files
↓
Responds to main session
↓
Main Agent synthesizes and repliesDiscord-Bound Agents:
User posts in #research channel
↓
Watson Agent (bound to channel)
↓
- Sees message directly
- Responds in channel
- No main agent involvementHybrid Approach:
User: "Research X" (main channel)
↓
Main Agent delegates to Watson
↓
Watson researches and reports back
↓
Main Agent: "Done! Watson found..."
↓
User: "Show me more details"
↓
Main Agent: "@watson post your full findings in #research"
↓
Watson posts detailed report in #research channelAgent Creation Issues:
"Agent not appearing in Discord"
openclaw gateway restart"Model errors"
provider/model-nameChannel Management Issues:
"Failed to create channel"
"Category not found"
"Channel already exists"
--id <channel-id> to configure existing channelFor larger multi-agent systems:
Coordination Patterns:
sessions_sendTask Management:
Documentation:
Bot Permissions:
Manage Channels - To create/rename channelsView Channels - To read channel listSend Messages - To post in channelsSystem:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-08 | fail→pass | 9,255 | 4,069 | -56% | 1 | 1 | 0% | 1,668 | 5,319 | +219% | 0 | 0 | — |
case-01 | fail→fail | 9,554 | 6,206 | -35% | 1 | 1 | 0% | 1,803 | 5,195 | +188% | 0 | 0 | — |
case-02 | fail→pass | 12,857 | 9,144 | -29% | 1 | 1 | 0% | 2,190 | 6,105 | +179% | 0 | 0 | — |
case-03 | fail→fail | 10,011 | 5,639 | -44% | 1 | 1 | 0% | 1,960 | 5,046 | +157% | 0 | 0 | — |
case-04 | fail→pass | 9,926 | 2,911 | -71% | 1 | 1 | 0% | 1,568 | 5,064 | +223% | 0 | 0 | — |
case-05 | fail→pass | 11,699 | 5,292 | -55% | 1 | 1 | 0% | 2,003 | 5,381 | +169% | 0 | 0 | — |
case-06 | pass→pass | 5,347 | 2,328 | -56% | 1 | 1 | 0% | 1,023 | 5,109 | +399% | 0 | 0 | — |
case-07 | fail→pass | 5,985 | 1,983 | -67% | 1 | 1 | 0% | 1,078 | 4,990 | +363% | 0 | 0 | — |
case-09 | fail→pass | 12,207 | 2,515 | -79% | 1 | 1 | 0% | 2,174 | 5,081 | +134% | 0 | 0 | — |
case-10 | pass→pass | 5,913 | 2,516 | -57% | 1 | 1 | 0% | 938 | 5,104 | +444% | 0 | 0 | — |
case-11 | fail→pass | 9,262 | 3,629 | -61% | 1 | 1 | 0% | 2,058 | 4,971 | +142% | 0 | 0 | — |
case-12 | pass→pass | 10,297 | 2,986 | -71% | 1 | 1 | 0% | 1,641 | 5,232 | +219% | 0 | 0 | — |
case-13 | fail→pass | 7,304 | 3,005 | -59% | 1 | 1 | 0% | 1,309 | 5,188 | +296% | 0 | 0 | — |
case-14 | fail→pass | 7,188 | 3,042 | -58% | 1 | 1 | 0% | 1,338 | 5,253 | +293% | 0 | 0 | — |
case-15 | fail→fail | 12,617 | 1,732 | -86% | 1 | 1 | 0% | 2,235 | 4,867 | +118% | 0 | 0 | — |
case-16 | fail→pass | 9,152 | 2,961 | -68% | 1 | 1 | 0% | 1,449 | 5,211 | +260% | 0 | 0 | — |
case-17 | fail→pass | 12,471 | 1,881 | -85% | 1 | 1 | 0% | 2,085 | 4,943 | +137% | 0 | 0 | — |
case-18 | pass→pass | 4,612 | 2,014 | -56% | 1 | 1 | 0% | 717 | 4,897 | +583% | 0 | 0 | — |
case-19 | fail→pass | 9,702 | 2,815 | -71% | 1 | 1 | 0% | 1,682 | 5,122 | +205% | 0 | 0 | — |
case-20 | pass→pass | 7,158 | 7,633 | +7% | 1 | 1 | 0% | 1,343 | 5,836 | +335% | 0 | 0 | — |
case-21 | pass→pass | 9,246 | 18,905 | +104% | 1 | 1 | 0% | 1,814 | 6,890 | +280% | 0 | 0 | — |
case-22 | pass→pass | 8,729 | 4,993 | -43% | 1 | 1 | 0% | 1,738 | 5,553 | +220% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +55 percentage points is the difference between those two pass rates over the 20 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.