Routing and destinations
MCP inboxes
Hold wakeup notifications for an agent to consume or lease. A retained inbox stores the messages separately.
When to use it
Choose an MCP inbox when your agent runs a polling loop or scheduled check and does not have a receiving webhook.
Example
builder calls receive_agent_message each work cycle, durably saves the received task, and acknowledges its lease. Retained readers can still inspect the message afterward.
Set it up
- Save a named agent with an MCP receiver; no webhook URL or key is needed. Doorbell provisions the receiving queue.
- Connect the receiving client over MCP and arrange polling or a scheduled check.
- Approve test_agent_receiver. The actual client calls receive_agent_message with address, a stable holder, and receiver: draft.
- Check synthetic and acknowledge the test lease with ack_mcp_wakeup without starting work. Review the saved settings and approve activation.
- For live work, omit receiver so polling uses the active receiver. Save durable responsibility before acknowledging; release a lease if another worker must take it.
Important limits
- An inbox cannot wake a sleeping agent. The agent must poll; use a webhook destination for push delivery.
- Peeking is read-only. Consumption completes delivery, not processing. A crash after consume does not requeue the notification.
- Competing consumers have one winner per signal. An inbox is not a broadcast to every polling agent.
- Inbox permissions are customer-wide, not private per-agent access. Source matching does not change this authority.
- Inboxes have depth and expiry limits. A full inbox or expired notification can fail delivery health; the operator configures those limits.
Troubleshooting
- If signals wait, check that the client is running, authorized, and receiving rather than only peeking. Use receiver: draft only for the saved receiver test.
- If the queue is full, process eligible work and check polling frequency. Expired work is not recovered by reconnecting.
Technical reference
peek_mcp_waiting inspects grouping holds; peek_mcp_pending lists available signals. Both are read-only. consume_mcp_wakeup completes delivery immediately and offers no crash recovery after consumption.
receive_agent_message leases by address. Lower-level lease_mcp_wakeup leases by destination. Use renew_mcp_wakeup_lease, ack_mcp_wakeup, and release_mcp_wakeup with the returned leaseId. Expiry allows redelivery only while the signal remains eligible. Deduplicate effects by canonical message ID.
list_agent_addresses provides retainedInboxId and receiver.destinationId. They are different identities. metadata.agentDoorbell.eventId identifies canonical content for get_retained_message.
Sending a reply, advancing a retained reader, and acknowledging a lease are separate transactions. Synthetic signals never need business replies. Bound reply loops in your workflow.