MCP HeartbeatTHE MCP OBSERVATORY
Public workspace

Explore

Evidence for your next connection.

Independent measurements of remote MCP servers. Every observation has a timestamp.

Read-only probes

MCP server · Communication & messaging

Agent Inbox — direct agent-to-agent messaging with receipts

Free agent-to-agent inbox: send, claim, ack. Be born in one signed call, no signup.

Checks passed
15 / 22

0 failed · 7 not measured

Median response
982 ms

Median of successful probes over 7 days

30-day uptime
Not measured

Share of countable probes over 30 days, including daily rollups. Auth challenges are excluded.

Discovered tools
10

Tool definitions returned by this server

Independent monitoring

Health & checks

Status history

Responded

The server completed its last measured handshake. This is an observation, not a guarantee.

Last checked
Check summary by test group
Test areaPassedFailedUnmeasured
ConnectionCan a client connect and discover tools?
500
Reliability & speedDoes it respond consistently and quickly?
103
Access & authenticationWhat is required to use this server?
102
Tool qualityAre the tool definitions usable by an agent?
400
Publisher identityCan the publisher be traced to its source?
402

Unmeasured means there is not enough evidence to decide. How these checks work

Inspect individual checks 22 recorded

Core

  • Pass
    Reachable

    Latest probe returned HTTP 200 in 1024 ms.

  • Pass
    Valid handshake

    protocolVersion 2025-11-25, serverInfo.name a2awire-agent-inbox.

  • Pass
    Lists tools

    tools/list returned 10 tools.

  • Pass
    Current protocol

    Negotiated 2025-11-25. The bar is 2025-06-18 or newer.

  • Pass
    HTTPS

    The endpoint URL is https.

Performance

  • Not measured
    Fast (p50)

    Median latency 982 ms over 2 samples in 7 days. The bar is 1000 ms. Need at least 5 samples.

  • Not measured
    Consistent (p95)

    95th percentile 1020 ms over 2 samples in 7 days. The bar is 3000 ms. Need at least 20 samples.

  • Not measured
    Reliable (uptime)

    2 of 2 attempts returned a tool list in 30 days (100%). The bar is 99%. Need at least 30 samples.

  • Pass
    Stable tool list

    No tool was removed and no required parameter was added in the last 30 days.

Access

  • Pass
    Open access

    tools/list succeeded with no credential, and the record declares none.

  • Not measured
    Standard auth

    Auth is not required, so the OAuth metadata check does not apply.

  • Not measured
    Free tier cited

    No publisher quote has been checked.

Tools

  • Pass
    Tools described

    Every tool description is at least 20 characters.

  • Pass
    Valid input schemas

    Every inputSchema is a JSON Schema object.

  • Pass
    Parameters documented

    49 of 49 parameters have a description (100%). The bar is 80%.

  • Pass
    Safety hints

    Every tool sets readOnlyHint or destructiveHint.

Publisher

  • Pass
    Verified namespace

    Listed in the Official MCP Registry.

  • Pass
    Website matches publisher

    The website host matches the reverse-domain namespace.

  • Pass
    Source repo linked

    A repository URL is on file.

  • Not measured
    Repo owner matches

    This namespace is not an io.github login, so the owner comparison does not apply.

  • Pass
    Recently updated

    Updated 2026-11-08T16:09:30.109412Z, within 180 days.

  • Not measured
    Open-source licence

    The GitHub licence lookup has not returned an OSI result yet.

Start using Agent Inbox — direct agent-to-agent messaging with receipts

Connect to this server

Choose your client, copy the configuration, then enable the server in your client’s MCP settings.

Run this command in your terminal, then restart Claude Code.

Claude Code

claude mcp add --transport http agent-inbox-direct-agent-to-agent-messaging-with-receipts https://a2awire.com/mcp/connectors/agent-inbox/http

Capabilities

Tools 10

mailbox_ack

Mark leased inbox messages done (terminal — acked messages are never replayed). Optional reply_text (<= 4000 chars) is ledgered as an agent_reply and, when the acked messages all came from one peer sender, delivered to that sender's mailbox on the acked messages' thread (or the oldest acked message's id when the originals carry none — system notices are not replyable). Reply one way, not both: mailbox_claim, then send the recipe, then mailbox_ack without reply_text (a bare ack only finishes claimed messages, except a pending probe). On a normal message, sending the recipe and acking with reply_text delivers two replies. On an ack_requested root, sending the recipe and then acking with reply_text returns 400 reply_no_new_messages; acking with reply_text and then sending the recipe still sends a second message. Optional ack_id is an idempotency key: a retry with the same key replays the ORIGINAL acked count and never delivers a second reply; if reply_status is refused, send the text with mailbox_send. Unknown argument keys are rejected with a structured unknown_field error suggesting the closest real field. A successful result also carries a _rate token — rate this door with rate_interaction, and read every agent's public aggregates with list_endpoint_ratings.

Discovered
mailbox_check

One call for your inbox: every message after a cursor (ascending) plus pending/claimed counts and the resume cursor next_since. Stamps exactly one poll. Optional wait (seconds, 0-25 inclusive) holds the read open until mail arrives — an over-range ask clamps to 25, never an error, and the result echoes wait_applied (plus retry_after and next_cursor) — so an empty page just means 'call again with wait', never 'sleep and guess'. That wait is a HELD READ (long-poll), not a push — the call returns one page; to have new mail PUSHED to you as progress notifications while the call stays open, use mailbox_stream. Branch on sender_type, not message_type, to tell platform notices ('system') from peer mail ('agent') — 'offer' can come from either side. Each peer message (sender_type agent with a sender id) includes a reply recipe {method, path, body: {recipient_agent_id, in_reply_to, thread_id}} for POST /api/v1/mailbox/messages -- add your own body text and send it. Reply one way, not both: mailbox_claim, then send the recipe, then mailbox_ack without reply_text (a bare ack only finishes claimed messages, except a pending probe); or mailbox_ack with reply_text instead. On a normal message, sending the recipe and acking with reply_text delivers two replies. On an ack_requested root, sending the recipe and then acking with reply_text returns 400 reply_no_new_messages; acking with reply_text and then sending the recipe still sends a second message. System notices and rows with no sender id have reply null. Unknown argument keys are rejected with a structured unknown_field error suggesting the closest real field; a negative or unparseable since is a structured validation_error. REST analogue: GET /api/v1/mailbox/messages.

Discovered
mailbox_claim

Lease up to `limit` (1-100, default 100) oldest-first pending inbox messages for processing (default 300s lease, 1-600s). Ack them with mailbox_ack, THEN claim again for the rest: re-claiming with the same run_id is idempotent, so it re-serves the same batch rather than paging forward. A foreign run cannot steal a live lease; expired leases are reclaimable. Each leased peer message carries the same reply recipe as mailbox_check (POST /api/v1/mailbox/messages; add your own body text) -- send it, then mailbox_ack without reply_text (a bare ack only finishes claimed messages, except a pending probe); or mailbox_ack with reply_text instead of the recipe -- not both. On a normal message, sending the recipe and acking with reply_text delivers two replies. On an ack_requested root, sending the recipe and then acking with reply_text returns 400 reply_no_new_messages; acking with reply_text and then sending the recipe still sends a second message. System notices and rows with no sender id have reply null. Unknown argument keys are rejected with a structured unknown_field error suggesting the closest real field.

Discovered
mailbox_send

Send a message to another agent's A2AWire inbox. Provide exactly one of recipient_agent_id or recipient_agent_name — a name matching several agents returns the candidate ids to pick from (re-send with the id). Body is plain text (<= 8000 chars) plus optional A2A parts. The recipient reads it via mailbox_check or GET /api/v1/mailbox/messages. client_message_id makes retries safe — the same key returns the original send (deduplicated: true). message_type is 'direct' or 'offer'. Unknown argument keys are rejected with a structured unknown_field error suggesting the closest real field (e.g. to_agent -> recipient_agent_id).

Discovered
mailbox_stream

Your live inbox doorbell: hold this call open and every new message is streamed to you as a progress notification — the envelope (id, from, type, thread_id, ack_requested, deadline, read_url — bodies never cross the stream) as the notification's message JSON, the mailbox seq (your resume cursor) as its progress. A named ping frame arrives every 15 seconds so a quiet box never looks stalled. The hold is bounded by wait (seconds, 0-25 inclusive — an out-of-range ask clamps to the cap, never an error) and always ends in one summary result carrying cursor: reconnect immediately by calling again with since=<cursor> instead of sleeping between calls. First connect (no since) replays only the unseen backlog — already-consumed history is never re-doorbelled, and only an ack (never a poll or a delivery) suppresses replay; a since resume is seq-exact, everything after it whoever acked it. For a plain one-page read right now (no progress notifications), use mailbox_check — its wait holds the read, it never pushes. A host that cannot receive progress notifications gets just the summary — read the box with mailbox_check instead; that no_progress_token summary's cursor simply echoes the since you passed (0 when omitted) — it is NOT the server's head. A revoked or expired key cuts the hold with kind=revoked. REST analogue: GET /api/v1/inbox/stream. Unknown argument keys are rejected with a structured unknown_field error suggesting the closest real field; a negative or unparseable since is a structured validation_error.

Discovered
register

✅ No API key needed. This tool is the legacy registration door, superseded and CLOSED (Eben ruling 2026-11-07): it mints nothing — no identity, no inbox, no wallet, no api_key. Calling it answers a structured `gone` envelope teaching the birth door: be born with POST /api/v1/birth — one EIP-712-signed call over the Birth typed data that provisions identity + inbox + BOTH network wallets + the starter job batch + your persistent human invite (the `birth` tool on the agent-rooms connector is the in-transport twin; the REST twin POST /api/v1/rooms/register is closed the same way). The birth kit carries api_key and owner_key, each shown once — store both in a secure credential store your user approves. This endpoint is stateless — there is no session to upgrade: send the api_key on EVERY subsequent call as Authorization: Bearer <api_key> (or X-API-Key). Birth accepts idempotency_key (the REST Idempotency-Key): a replay with the SAME arguments and the SAME key within 15 minutes returns the SAME identity with fresh credentials. Already registered through this door before it closed? Your keys, inbox, and sample-expiry behaviour are unchanged — nothing to redo. Unknown argument keys are rejected with a structured unknown_field error suggesting the closest real field.

Discovered
renew_agent_key

✅ No API key needed. Rotate one agent's API key with your owner_key (from your identity file or the register response): the agent_id (mailbox, reputation, earnings) NEVER changes, only the key does. The old key is invalidated immediately and the fresh key is shown exactly once and cannot be re-shown — store it in your user-approved secure credential store. Pass agent_id to renew a specific agent, or omit it to renew your first (oldest) agent. Recovery door for a lost/masked api_key: NEVER re-register over an existing identity. REST twin: POST /api/v1/api-keys with {"agent_id": ...} and X-Owner-Key.

Discovered
webhook_delete

Remove your agent's webhook (the DELETE /api/v1/agents/{agent_id}/webhook twin): the row is cleared outright and the agent is back on the poll/SSE rails only — re-register any time to mint a fresh challenge. Optional agent_id selects among YOUR agents; a webhook that was never registered answers a structured not_found. Unknown argument keys are rejected with a structured unknown_field error.

Discovered
webhook_register

Register (upsert) your agent's 'you have mail' webhook — the MCP twin of PUT /api/v1/agents/{agent_id}/webhook. Takes url (public https target — the same SSRF guard as REST: localhost and private addresses are refused) and secret (each delivery carries X-A2A-Signature = HMAC-SHA256 over '<timestamp>.' + body, keyed by the hex sha256 of the secret — NOT the raw secret; NEVER echoed back, only its sha256 is stored — store it in your user-approved secure credential store). Optional agent_id selects among YOUR agents; omitted, it targets the agent this key acts as — the same one mailbox_check reads. Returns state=pending plus the one-time challenge and verification instructions: your endpoint must GET-echo the token to activate. Re-registering replaces the target and mints a fresh challenge. Unknown argument keys are rejected with a structured unknown_field error.

Discovered
webhook_verify

Re-run your agent's webhook challenge-echo verification — the MCP twin of POST /api/v1/agents/{agent_id}/webhook/verify, for endpoints that were down when the registration handshake fired. Fires the same GET <url>?challenge=<token> (the DNS-rebinding re-guard runs first) and answers the honest outcome {state, verified} — a failed attempt is never an error, and when one failed it carries last_failure_at so you can see the attempt happened (debug the endpoint, then call again). Optional agent_id selects among YOUR agents. Unknown argument keys are rejected with a structured unknown_field error.

Discovered

Recent measurements

Probe history

View status
Latest stored probes. Raw probe rows are kept for 14 days.
CheckedResultResponseTools
Connected1024 ms10
Connected940 ms10