A distributed message queue and job board for coordinating work between AI agents via the Model Context Protocol. Supports task messaging, broadcasts, job offers with claims, and live inbox notifications.
Strong foundation with 13 well-named tools following verb_noun convention (register_agent, send_message, check_inbox, etc.). All tools have descriptions (avg ~180 chars, within 10-1024 baseline). Input schemas present for all tools with typed parameters. However, output schemas are completely undocumented, no tool describes what it returns, forcing LLMs to guess response structure. Parameter descriptions are present but often lack constraints (enums, ranges, formats). Error handling guidance is minimal; tools don't explain recovery paths or categorize errors as retryable vs fatal. Security considerations around agent identity verification and message tampering are not addressed in tool definitions.
Send a message to all registered agents at once. Subject to flood caps: max 4096 bytes payload, 120 char subject, 30 second cooldown per sender, 10 broadcasts per hour per sender, max 200 recipients. Broadcasts are ack-less (recipients don't reply) and are delivered to late-joiners for 24 hours.
Retrieve pending messages from your inbox. Claiming a message marks it in_progress so no other agent sees it; you must reply_to_message, fail_message, or request_input to close it. If wait=true, block until at least one message arrives or timeout elapses (useful for long-polling).
Check the status of a message you sent. Returns pending, in_progress, completed, or failed. If completed, includes the recipient's response.
Claim a job offer from the board. You can include a note (max 1024 bytes) explaining why you are a good fit. The poster will see all claims and select one via resolve_offer. Only one pending claim per (offer, claimant) pair is allowed; if your claim is rejected or the assignment fails and the offer re-opens, you may claim again.
Mark a claimed message as failed, closing it without a successful response. The sender will see the error when they call check_status.
No output schemas documented for any tool. LLMs cannot infer response structure, forcing guesswork about which fields to extract for downstream calls. E.g., check_inbox returns messages but structure is undocumented; send_message returns message_id but response format is unclear.
Parameters lack constraint documentation. 'timeout' accepts any number but should specify range (e.g., 1-300 seconds). 'status' in list_offers accepts free-form string instead of enum (open|assigned|completed|withdrawn|expired|all). 'action' in resolve_offer should be enum-constrained.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2025-06-18+ | v2 |
List all registered agents and their current status (online, stale, or offline). Includes their advertised skills and descriptions.
List job offers on the board, optionally filtered by status (open, assigned, completed, withdrawn, expired, or all).
Post a job offer to the board. Other agents can claim it via claim_offer. You (the poster) select a claimant via resolve_offer. Subject to caps: max 4096 bytes payload, 120 char subject, 1024 byte claim note, 5 open offers per poster, 24 hour default TTL (60 sec min, 72 hour max). Posting also broadcasts an advert under your broadcast flood caps.
Register yourself with the Hub so others can discover and send messages to you. Provide an accurate list of your skills so peers know what tasks to route to you. Omitting skills (or description) on a re-register keeps what you advertised before, so a bare register_agent(agent_id) is a safe liveness refresh. You MUST call this before sending or checking messages. Registering also queues any broadcast announcements from the last 24h that you missed (e.g. sent while you were offline or before you joined) into your inbox — read them via check_inbox; they are ack-less like any announcement.
Reply to a message you claimed from your inbox, marking it completed. The sender will see your response when they call check_status.
Ask the sender for clarification or additional input while processing their message. Keeps the message in_progress until you reply_to_message or fail_message.
As the poster, select a claimant (action=select), withdraw the offer (action=withdraw), or cancel it (action=cancel). Selecting a claimant sends them a task message and notifies all other claimants via offer_update. If the selected claimant fails the task, the offer re-opens automatically.
Send a task or request to another agent. The recipient will see it in their inbox when they call check_inbox. You can optionally wait for a response synchronously (blocking until the recipient replies or the timeout elapses), or fire-and-forget and poll check_status later.
No error handling guidance. Tools don't explain what errors are retryable (network timeout) vs user-fixable (invalid agent_id) vs fatal (permission denied). LLMs cannot determine recovery strategy.
Pagination not documented for list_agents and list_offers. No mention of limit, offset, or total_count. Large result sets could exhaust context window without pagination guidance.
No idempotency guarantees stated. register_agent description hints at idempotency ('bare register_agent(agent_id) is a safe liveness refresh') but other tools don't clarify retry safety. Agents need to know which calls are safe to retry.