Agent Council
Create and manage autonomous AI agents with full Discord integration.
Updated for OpenClaw 2026.3.x — uses native CLI commands (openclaw agents add/delete/bind/unbind/bindings/set-identity) where possible, with config patching only for Discord channel-specific routing (which the CLI doesn't support yet).
What It Does
- Creates agent workspace (SOUL.md, HEARTBEAT.md, IDENTITY.md, memory/)
- Registers agent via
openclaw agents add - Creates Discord channel (optional) with topic
- Binds agent to channel (routing via config patch)
- Copies auth profiles (SecretRef-backed, from default agent)
- Sets up cron jobs (optional daily memory)
CLI Quick Reference
These native commands are available without the skill:
# List agents and bindings
openclaw agents list
openclaw agents bindings
# Add/remove agents
openclaw agents add <id> --workspace <dir> --model <model> --non-interactive
openclaw agents delete <id>
# Channel-level routing (telegram, discord — not per-Discord-channel)
openclaw agents bind --agent <id> --bind discord
openclaw agents unbind --agent <id> --bind discord
# Identity
openclaw agents set-identity --agent <id> --name "Name" --emoji "🔬"
Note: openclaw agents bind works at the channel level (discord, telegram), not per-Discord-channel-ID. For routing specific Discord channels to specific agents, the skill's config patching is still needed.
Scripts
| Script | Purpose |
|---|---|
create-agent.sh |
Full agent setup with Discord integration |
bind-channel.sh |
Bind existing agent to additional Discord channel |
list-agents.sh |
Show all agents and their Discord bindings |
remove-agent.sh |
Remove agent (config, crons, optionally workspace/channel) |
claim-category.sh |
Claim a Discord category for an agent |
sync-category.sh |
Sync all channels in a category to its owner |
list-categories.sh |
Show category ownership |
Usage
Create Agent with New Discord Channel
export DISCORD_GUILD_ID="123456789012345678"
~/.openclaw/skills/agent-council/scripts/create-agent.sh \
--id watson \
--name "Watson" \
--emoji "🔬" \
--specialty "Deep research and competitive analysis" \
--create "research" \
--category "987654321098765432"
This will:
- Create
<workspace>/agents/watson/with SOUL.md, HEARTBEAT.md, IDENTITY.md - Register agent via
openclaw agents add - Create Discord #research channel in the specified category
- Bind watson → #research (config patch for channel-specific routing)
- Add #research to guild allowlist
- Copy auth profiles from default agent (SecretRef-backed)
- Create daily memory cron at 11:00 PM (use
--no-cronto skip)
Create Agent with Existing Channel
./create-agent.sh \
--id sage \
--name "Sage" \
--emoji "💰" \
--specialty "Personal finance" \
--channel "234567890123456789"
Bind Agent to Additional Channel
./bind-channel.sh --agent forge --channel "345678901234567890"
./bind-channel.sh --agent forge --create "defi" --category "456789012345678901"
List Current Setup
./list-agents.sh
Remove Agent
# Remove from config only (keeps workspace)
./remove-agent.sh --id test-agent
# Full removal (workspace trashed, channels deleted)
./remove-agent.sh --id test-agent --delete-workspace --delete-channel
Category Ownership
./claim-category.sh --agent chief --category 123456789012345678 --sync
./list-categories.sh
./sync-category.sh --category 123456789012345678
Agent Cron Jobs
Delivery Pattern
Option A: --announce (preferred for simple jobs)
openclaw cron add \
--name "My Task" \
--agent myagent \
--cron "0 9 * * *" \
--session isolated \
--model sonnet \
--announce --channel discord --to "channel:YOUR_CHANNEL_ID" \
--message "Do the task."
Option B: delivery: none + message tool (for custom formatting)
openclaw cron add \
--name "My Task" \
--agent myagent \
--cron "0 9 * * *" \
--session isolated \
--model sonnet \
--message "Do the task. Then send the result to Discord using the message tool (action=send, channel=discord, target=channel:YOUR_CHANNEL_ID)."
⚠️ Common mistake: --channel expects the platform name (discord), --to expects the destination (channel:ID).
Heartbeat vs Cron
- Heartbeat: Multiple checks batched, needs conversation context, timing can drift
- Cron: Exact timing, task isolation, different model, one-shot reminders
Key Rules
delivery.mode="none"when the payload handles its own delivery via message tool- Set
timeoutSecondsto 90-120 for tool-using tasks (default 60 is often too tight) - Always check for duplicate cron names before creating:
cron action=list
Options Reference
create-agent.sh
| Option | Required | Description |
|---|---|---|
--id |
✓ | Agent ID (lowercase, no spaces) |
--name |
✓ | Display name |
--emoji |
✓ | Agent emoji |
--specialty |
✓ | What the agent does |
--model |
Model (default: claude-sonnet-4-6) | |
--channel |
Existing Discord channel ID | |
--create |
Create new channel with this name | |
--category |
Category ID for new channel | |
--topic |
Channel topic (auto-generated if not set) | |
--cron |
Daily memory cron time (default: 23:00) | |
--no-cron |
Skip daily memory cron setup | |
--tz |
Timezone (default: America/New_York) | |
--own-category |
Claim a Discord category (auto-binds all channels) |
Environment Variables
| Variable | Required | Description |
|---|---|---|
DISCORD_GUILD_ID |
For --create |
Your Discord server ID |
AGENT_WORKSPACE_ROOT |
No | Agent workspace root (default: ~/workspace/agents) |