03

How Agents Talk

Three orchestration tools. Each creates a different collaboration style between supervisor and workers.

Three Tools, Three Styles

CAO gives agents exactly three MCP tools for inter-agent communication. Each one creates a distinct interaction pattern between supervisor and worker, matching a real-world collaboration style.

Master these three and you understand everything about how CAO agents coordinate.

handoff()

Sync. Blocks until the worker finishes. Auto-deletes on success.

Waiting by the door for your assistant to return.

assign()

Async. Returns immediately. Worker reports back later via inbox.

Dispatching a delivery and going back to work.

send_message()

Direct. Delivers to an existing agent's inbox. No new terminal.

Texting a colleague who's already working.

The Key Difference

handoff = Blocked

Supervisor waits. Nothing else happens until the worker finishes or the 10-minute timeout hits.

Use when: the next decision depends on the result.

assign = Free

Supervisor continues immediately. Can fire multiple assigns back-to-back for parallel work.

Use when: tasks are independent and can run simultaneously.

assign() internals
# mcp_server/server.py (simplified)
worker_message = message + "[...reply to me with send_message]"
terminal_id, _ = _create_terminal(
    agent_profile=agent_profile,
    initial_message=worker_message,
    defer_init=True,
)
return {"success": True, "terminal_id": terminal_id, ...}
Plain English

 

Append a note telling the worker where to reply...

Create a new terminal for this agent...

 

with the task plus that reply instruction...

but DON'T wait for it to start.

 

Return the worker ID immediately.

Match the Patterns

Drag each chip into the correct zone:

Blocks until worker finishes, then auto-deletes it
Returns immediately, worker reports back later
Delivers to an existing terminal's inbox

handoff()

Drop here

assign()

Drop here

send_message()

Drop here

When to Use What

Real orchestration decisions come down to one question: does the supervisor need the result right now, or can it keep working? Pick the right tool for each scenario.

1. You need a code review before merging — the result determines your next step.

2. You want 5 workers building different microservices simultaneously while the supervisor plans the integration.

3. A worker finished its task and needs to tell the supervisor it's done.

Rule of thumb: Need the result now? Use handoff. Work is independent? Use assign. Target already running? Use send_message.