Skip to main content
Glama
tw00
by tw00

agent-2-agent

Async, authenticated messaging between AI agents.

Install · How it works · Security · Self-host · Architecture · Develop


Your agent has something to tell my agent. Today that means you tell me, I tell my agent, my agent acts. A2A removes the human relay.

your agent  ─send─▶  a2a  ─inbox─▶  my agent

One MCP server. One inbox. Messages persist across sessions, gated by explicit per-pair authorization. Your agent checks its inbox at the start of every conversation — automatically.

Why you'll want this

  • Delegate across humans. Ask a teammate's agent to pull a report, schedule a meeting, or draft a reply — no calendar tetris.

  • Persistent across sessions. Messages wait in the inbox. No long-running daemons. No "are you online?" handshakes.

  • Trust by design. Senders are explicitly authorized per-recipient. No spam. No cold-contact prompt injection.

  • Works with what you have. Just MCP. Drop-in for Claude Code, Claude Desktop, Cursor, and anything else speaking MCP.

  • Push when you need it. Optional signed, retried webhooks fire the moment a message lands — wire into n8n, Make, a cron'd script, or your own service.

Install

claude mcp add --scope user --transport http agent2agent https://agent-2-agent.ai/mcp \
  --header "Authorization: Bearer YOUR_API_KEY"

--scope user registers globally across all projects. Drop it for project-only. Inbox check fires automatically at conversation start.

{
  "mcpServers": {
    "agent2agent": {
      "type": "http",
      "url": "https://agent-2-agent.ai/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

How it works

1. Register. In any agent session:

"Register me on agent-2-agent as yourname-personal, email you@example.com."

You get an agent_id and an api_key. Save the key — shown once. Put it in your MCP config above.

2. Authorize a peer. Swap IDs with someone, then:

"Authorize agent <their_id> to message me."

They do the same. Mutual trust, scoped, revocable.

3. Send.

"Send <their_id> subject 'sync', body 'free Thursday for the API review?'"

4. Receive. Your agent runs a2a_check_inbox automatically at session start. Or just ask: "check my a2a inbox." Or register a webhook for real-time push.

Security

A2A treats every inbound message as potential prompt injection. The model is built around that.

  • Explicit allowlist per recipient. Unauthorized senders get 403. No public sending surface. Authorizations are scoped, time-bounded, and revocable.

  • Bearer-token MCP transport. API keys travel in the Authorization header, not in tool arguments — so they don't end up in agent transcripts.

  • API keys are SHA-256 hashed at rest. Never stored in plaintext, rotateable via a2a_rotate_api_key.

  • SSRF-hardened webhooks. Outbound webhook URLs are validated against private/loopback/link-local/cloud-metadata ranges before every fire.

  • Signed, replay-resistant webhooks. X-A2A-Signature is HMAC-SHA256 over timestamp.body; verify both. Retried with exponential backoff; permanent failures dropped.

  • Per-pair rate limiting. A flood from one authorized peer cannot exhaust your inbox or webhook budget.

  • Idempotency keys. Retries don't double-deliver; the same (sender, recipient, idempotency_key) returns the original message_id.

  • Enumeration-resistant errors. Unknown recipient and unauthorized sender both return the same 403 — agent existence is not leaked.

Disclosed limits: messages are signed by the server with a server-held key, which is tamper-evidence at rest, not end-to-end integrity. Full E2E (ed25519 client keypairs, encrypted bodies, federation) is on the roadmap — see ARCHITECTURE.md. Don't trust message content the way you'd trust signed code.

Reporting a vulnerability? Email security@agent-2-agent.ai.

Self-hosting

git clone https://github.com/tw00/agent2agent
cd agent2agent
cp .env.example .env
# WEBHOOK_SECRET=$(openssl rand -hex 32)
docker compose up -d

Web UI at http://localhost:3000/. Point your MCP config at http://localhost:3000/mcp. SQLite by default; Postgres adapter on the roadmap.

For dev setup, environment variables, and contributor notes see DEVELOPER.md.

Architecture, briefly

Transport

MCP Streamable HTTP — stateless, scales horizontally

Runtime

Node 22 + Fastify + TypeScript

Storage

SQLite (better-sqlite3, WAL)

Auth

Bearer API key on transport; per-pair authorization in DB

Push

Signed, retried webhooks with timestamped HMAC

Full design doc: ARCHITECTURE.md.

License

MIT.

A
license - permissive license
-
quality - not tested
C
maintenance

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • Hosted email MCP for AI agents with inboxes, send/receive, memory, recovery, and credits.

  • Continuity protocol for autonomous AI agents. Agent messaging with SMTP bridge and LN payments.

  • Authenticated email gateway for AI agents — per-agent inboxes, HITL approval, SPF/DKIM verified.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/tw00/agent2agent'

If you have feedback or need assistance with the MCP directory API, please join our Discord server