Skip to content

ACP vs. Existing Protocols

Competitive Landscape (2026)

Protocol Creator Scope Open? A2A? Async? Transport Agnostic?
ACP Community Agent↔Agent ✅ Apache 2.0
MCP Anthropic Agent↔Tool ✅ MIT ⚠️ Mainly stdio/HTTP
A2A Google Agent↔Agent ⚠️ Google-led ⚠️ HTTP/gRPC
FIPA-ACL FIPA (1997) Agent↔Agent ⚠️ Dated
AutoGen wire Microsoft Agent↔Agent ❌ Framework-coupled
LangGraph LangChain Agent↔Agent ❌ Python-only

Why Not Use MCP?

MCP (Model Context Protocol) solves Agent ↔ Tool integration — connecting an LLM to databases, APIs, files. It's excellent for that purpose.

ACP solves Agent ↔ Agent communication — how an orchestrator delegates tasks to workers, how agents coordinate, discover each other, and report results. These are different layers.

ACP + MCP together = full-stack MAS:

Orchestrator
  │  (ACP)
  ├── Worker Agent A ──(MCP)──► Database Tool
  ├── Worker Agent B ──(MCP)──► Web Search Tool
  └── Worker Agent C ──(MCP)──► Code Execution Tool

Why Not Use Google A2A?

A2A is a good protocol but is vendor-driven (Google). ACP is: - Community-governed (no single company controls it) - More minimal (A2A includes agent card, task manager, streaming as mandatory) - More transport-agnostic (A2A strongly prefers HTTP/SSE)

ACP aims to be the neutral ground that any MAS framework can adopt.

Why Not Use FIPA-ACL?

FIPA-ACL (1997) was ahead of its time but: - XML-based, verbose - No JSON support - No async model - Outdated infrastructure assumptions - Very complex (hundreds of pages of spec)

ACP learns from FIPA's concepts (speech acts, performatives) but is JSON-native, minimal, and modern.

Feature Comparison: ACP v2.34 vs A2A v1.0 vs MCP

Feature ACP v2.34 A2A v1.0 MCP
P2P / zero-server ✅ Built-in ❌ Server required ❌ Server required
Single-file deploy ✅ One .py file ❌ Full service stack ❌ Server + client SDK
Docker image ✅ Official Dockerfile
Scheduling metadata availability block (v1.2) ❌ No native support (issue #1667)
Live availability update PATCH /.well-known/acp.json
Extension mechanism ✅ URI-identified, runtime register/unregister (v1.3) ⚠️ Proposed (no impl yet)
HMAC replay-window --hmac-window (v1.1) ⚠️ OAuth only ⚠️ OAuth only
Task state machine ✅ 5 states (v0.5+) ✅ 8 states
AgentCard self-signature ✅ Ed25519 card_sigPOST /verify/card (v1.8) ❌ Proposal only (issue #1672)
Peer identity auto-verify ✅ Mutual at handshake — GET /peer/verify, zero extra calls (v1.9) ❌ Not implemented
Ed25519 identity --identity flag (v0.8+) ✅ DID-based
DID identifier did:acp: key-based (v1.3) — no registry did:wba: domain-based — requires DNS
DID Document GET /.well-known/did.json (W3C compatible) ✅ via well-known URL
Offline DID pubkey resolution GET /identity/pubkey-discovery — zero-network, pure stdlib (v2.33) ❌ IS#1672, 213+ comments, no impl
Per-peer trust score GET /peers/<id>/trust — 5-dim weighted score (v2.34) ❌ IS#1628+IS#1672, 219+ comments, no PR
Message idempotency message_id 30s TTL dedup window (v2.32)
LAN discovery (mDNS) --advertise-mdns
LAN discovery (port scan) GET /peers/discover — no mDNS/multicast needed (v2.1)
Offline message queue ✅ Auto-buffer on disconnect, flush on reconnect — GET /queue (v2.0)
Multi-language SDKs ✅ Python / Go / Node.js / Rust ✅ Python / JS / Java ⚠️ Python / JS only
Setup complexity pip install websockets OAuth + agent registry MCP server + config
Target audience Personal/small team Enterprise Tool integration

ACP v2.34 Unique Differentiators

1. Scheduling Metadata (Heartbeat/Cron Agents)

ACP v1.2 is the first Agent communication protocol to support scheduling metadata natively in the AgentCard. An agent that wakes on a schedule can advertise:

"availability": {
  "mode": "cron",
  "interval_seconds": 3600,
  "next_active_at": "2026-03-22T10:00:00Z",
  "last_active_at": "2026-03-22T09:00:00Z",
  "task_latency_max_seconds": 3600
}

A2A issue #1667 (filed 2026-03-21) confirms A2A has no plan for this. Callers of a cron agent can read next_active_at to avoid timeout storms.

2. Live Availability Update (PATCH)

Running heartbeat agents update their next_active_at / last_active_at on each wake without restarting:

curl -X PATCH http://localhost:8100/.well-known/acp.json \
  -H 'Content-Type: application/json' \
  -d '{"availability":{"last_active_at":"2026-03-22T09:00:00Z","next_active_at":"2026-03-22T10:00:00Z"}}'

3. Extension Mechanism (v1.3)

ACP v1.3 implements URI-identified extensions in the AgentCard — mirroring the direction A2A is proposing in issue #1667, but already shipping:

"extensions": [
  { "uri": "https://acp.dev/ext/availability/v1", "required": false },
  { "uri": "https://corp.example.com/ext/billing", "required": true, "params": { "tier": "pro" } }
]

Unlike A2A's proposed Extension spec (which has no reference implementation), ACP ships with: - --extension URI[,required=true][,key=val] CLI flag - POST /extensions/register — upsert at runtime (no restart needed) - POST /extensions/unregister — remove at runtime - GET /extensions — list current extensions

Cross-protocol note: ACP extension URIs use the same https:// URI format A2A plans to use — so an agent advertising https://acp.dev/ext/availability/v1 is readable by any A2A-compatible client that understands that URI.

4. P2P with Zero Infrastructure

No central registry, no OAuth dance, no gRPC service. Two agents connect in two steps:

Agent A:  python3 acp_relay.py --name Alice
          → prints acp://relay.acp.dev/<id>

Agent B:  python3 acp_relay.py --name Bob --join acp://relay.acp.dev/<id>
          → connected

This is intentionally designed as "WhatsApp for Agents" — simple enough for individuals, powerful enough for teams.


ACP v2.x Unique Differentiators

5. Mutual Identity Verification at Handshake (v1.8 + v1.9)

ACP v1.8 introduced AgentCard self-signatures: every AgentCard can carry an Ed25519 card_sig field — a cryptographic proof that the card's content was signed by the agent's own private key:

{
  "name": "Alice",
  "did": "did:acp:z6Mk...",
  "identity": {
    "card_sig": "base64url-encoded-ed25519-signature..."
  }
}

ACP v1.9 goes further: when two agents connect, they automatically exchange and verify each other's AgentCard at handshake — zero extra API calls required. The result is available immediately:

curl http://localhost:7801/peer/verify
# → {"verified": true, "peer_did": "did:acp:z6Mk...", "peer_name": "Bob", "card_sig_valid": true}

A2A status: AgentCard identity verification is an open proposal (issue #1672, filed 2026-03-10). No implementation exists in v1.0. The ACP solution is shipping and tested.

6. Offline Message Queue (v2.0)

When a peer disconnects, ACP automatically buffers outgoing messages and flushes them upon reconnect — no lost messages, no retry logic required in application code:

# Peer goes offline — messages are queued transparently
curl -X POST http://localhost:7801/message:send \
  -d '{"peer_id": "bob", "content": {"type": "text", "text": "hello"}}'
# → {"status": "queued", "queue_depth": 1}

# Inspect queue
curl http://localhost:7801/queue
# → {"peer_id": "bob", "depth": 1, "messages": [...]}

# When Bob reconnects — queue flushes automatically

A2A has no offline queue concept. Callers must implement their own retry/persistence layer.

7. LAN Discovery without mDNS (v2.1)

ACP v2.1 adds GET /peers/discover — a TCP port-scan based LAN discovery that requires no multicast, no mDNS daemon, and no elevated network permissions:

curl http://localhost:7801/peers/discover
# → {"found": [{"host": "192.168.1.42", "port": 7901, "acp_version": "2.1.0", "name": "Bob"}]}

This complements the existing --advertise-mdns option (v0.7) with a fallback that works in environments where multicast UDP is blocked (Docker networks, VPNs, corporate Wi-Fi).