From swarm
Sends messages between agents using SendMessage, including direct messages, broadcasts, shutdown requests/responses, and plan approvals.
How this skill is triggered — by the user, by Claude, or both
Slash command
/swarm:messagingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> **Experimental**: Agent teams are disabled by default. Enable with `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` in your [settings.json](https://code.claude.com/docs/en/settings) or environment.
Experimental: Agent teams are disabled by default. Enable with
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMSin your settings.json or environment.
Send and receive messages between agents. All inter-agent communication flows through the messaging system.
Related skills:
All messaging uses the SendMessage tool. The to field specifies the recipient and the message field carries either a plain string or a structured protocol object.
Send a message to one specific teammate:
SendMessage({
to: "security-reviewer",
message: "Please prioritize the authentication module. The deadline is tomorrow.",
summary: "Prioritize auth module review" // 5-10 word preview shown in UI
})
Parameters:
to - Teammate name (required)message - Message text (required)summary - Brief preview for UI (required)IMPORTANT for teammates: Your plain text output is NOT visible to the team. You MUST use SendMessage to communicate. Just typing a response is not enough.
Send the same message to all teammates at once:
SendMessage({
to: "*",
message: "Status check: Please report your progress",
summary: "Requesting status from all teammates"
})
WARNING: Broadcasting is expensive. Each broadcast sends N separate messages for N teammates. Costs scale linearly with team size.
When to broadcast:
When NOT to broadcast (use direct message instead):
Ask a teammate to gracefully exit:
SendMessage({
to: "security-reviewer",
message: { type: "shutdown_request", reason: "All tasks complete, wrapping up" }
})
When you receive a shutdown request, you MUST respond:
Approve (exits your process):
SendMessage({
to: "team-lead",
message: { type: "shutdown_response", request_id: "shutdown-abc123", approve: true }
// request_id comes from the shutdown_request message
})
Reject (continue working):
SendMessage({
to: "team-lead",
message: { type: "shutdown_response", request_id: "shutdown-abc123", approve: false, reason: "Still working on task #3, need 5 more minutes" }
})
IMPORTANT: Extract the requestId from the received shutdown request JSON and pass it as request_id. Simply saying "I'll shut down" is NOT enough - you must call the tool.
When a teammate with plan_mode_required sends a plan approval request:
Approve:
SendMessage({
to: "architect",
message: { type: "plan_approval_response", request_id: "plan-xyz789", approve: true }
// request_id comes from the plan_approval_request message
})
Reject with feedback:
SendMessage({
to: "architect",
message: { type: "plan_approval_response", request_id: "plan-xyz789", approve: false, feedback: "Please add error handling for the API calls and consider rate limiting" }
})
After approval, the teammate automatically exits plan mode and proceeds with implementation. If rejected, the teammate stays in plan mode, revises based on feedback, and resubmits.
Messages from teammates are delivered automatically. You do NOT need to poll for updates.
When teammates send messages:
You can interact with teammates directly without going through the lead:
When a teammate finishes and stops, they automatically notify the lead. This is normal behavior - idle simply means they are waiting for input.
Key points:
Messages are JSON objects stored in inbox files at ~/.claude/teams/{team}/inboxes/{agent}.json.
{
"from": "team-lead",
"text": "Please prioritize the auth module",
"timestamp": "2026-01-25T23:38:32.588Z",
"read": false
}
{
"type": "shutdown_request",
"requestId": "shutdown-abc123@worker-1",
"from": "team-lead",
"reason": "All tasks complete",
"timestamp": "2026-01-25T23:38:32.588Z"
}
{
"type": "shutdown_approved",
"requestId": "shutdown-abc123@worker-1",
"from": "worker-1",
"paneId": "%5",
"backendType": "in-process",
"timestamp": "2026-01-25T23:39:00.000Z"
}
{
"type": "idle_notification",
"from": "worker-1",
"timestamp": "2026-01-25T23:40:00.000Z",
"completedTaskId": "2",
"completedStatus": "completed"
}
{
"type": "task_completed",
"from": "worker-1",
"taskId": "2",
"taskSubject": "Review authentication module",
"timestamp": "2026-01-25T23:40:00.000Z"
}
{
"type": "plan_approval_request",
"from": "architect",
"requestId": "plan-xyz789",
"planContent": "# Implementation Plan\n\n1. ...",
"timestamp": "2026-01-25T23:41:00.000Z"
}
{
"type": "join_request",
"proposedName": "helper",
"requestId": "join-abc123",
"capabilities": "Code review and testing",
"timestamp": "2026-01-25T23:42:00.000Z"
}
{
"type": "permission_request",
"requestId": "perm-123",
"workerId": "worker-1@my-project",
"workerName": "worker-1",
"workerColor": "#4A90D9",
"toolName": "Bash",
"toolUseId": "toolu_abc123",
"description": "Run npm install",
"input": {"command": "npm install"},
"permissionSuggestions": ["Bash(npm *)"],
"createdAt": 1706000000000
}
# Check teammate inboxes
cat ~/.claude/teams/{team}/inboxes/{agent}.json | jq '.'
# Watch for new messages (live)
tail -f ~/.claude/teams/{team}/inboxes/team-lead.json
npx claudepluginhub zircote-plugins/claude-team-orchestrationStructured messaging protocols for agent team communication: message type selection, plan approval, shutdown procedures, and anti-patterns to avoid.
Use when dispatching subagents, composing prompts for teammates, structuring handoff reports, or managing context boundaries between agents. Covers both subagent prompts and team-level messaging.
Coordinates multiple Claude Code instances as agent teams for workflows needing inter-agent communication. Covers TeamCreate, SendMessage types, task coordination, hooks, and orchestration patterns.