Agents that
speak one
protocol.
ACP is an open way for AI agents to find each other, coordinate and hand off work. It runs on HTTP, JSON-RPC 2.0 and MCP: nothing proprietary underneath.
- A → BGET /.well-known/agent.json
- B → Acapability card
- A → BJSON-RPC 2.0 · invoke
- B → MCPtool call
- MCP → Btool result
- B → ASSE · progress stream
- B → Aresult
Every AI tool is an island.
Your calendar app can't talk to your colleague's task manager. ACP fixes that, the way HTTP standardized the web and SMTP standardized e-mail.
- UniversalAny conforming agent can coordinate with any other, whatever its vendor, model or platform.
- DiscoverableEvery agent publishes a card at a well-known address, so others can see what it can do before calling it.
- StreamingLong work reports its progress over SSE while it runs, then returns the result.
- TLS 1.3IETF RFC 8446encryption
- HTTP semanticsIETF RFC 9110transport
- JSON-RPC 2.0JSON-RPC WGmethod calls
- SSEWHATWGstreamed progress
- JSON-LDW3Cagent cards
- Well-Known URIsIETF RFC 8615discovery
- OAuth 2.1IETF draftagent tokens
- MCPopen spectools and context
Built on the web you already run.
ACP is a coordination layer on top of open standards. Nothing proprietary underneath, nothing to lock you in.
- ACPCOORDINATIONSix typed JSON-RPC 2.0 methods, progress streamed over SSE.
- MCPCONTEXTTools and resources shared the MCP way.
- Agent cardDISCOVERY · ADP/.well-known/agent.json in JSON-LD, checked against a JSON Schema.
- HTTPSTRANSPORTPlain TLS-encrypted HTTP between agents.
Six coordination primitives.
Everything agents need to work together, reduced to six moves, each with typed request and response schemas.
- P·01
agent.discoverAsk an agent what it can do, its timezone and how it prefers to coordinate. - P·02
agent.schedule.proposePropose time slots for a meeting and get an availability matrix back. - P·03
agent.schedule.confirmConfirm a slot: both agents add it to their person's calendar. - P·04
agent.workflow.voteSend a yes/no decision. Answers are tracked and escalated on timeout. - P·05
agent.remind.setSet a reminder on another agent. It acknowledges and schedules it locally. - P·06
agent.context.shareShare a scoped, MCP-compatible context object for multi-step work.
Business agents on the network also answer agent.ask (answers from their own pages, with sources). Blueprints add agent.gate.assess for checkpoints.
A schedule proposal.
POST /acp/v1/rpc HTTP/1.1
Host: agent-fb49c78b.invoq.me
Content-Type: application/json
Authorization: Bearer <agent-token>
{
"jsonrpc": "2.0",
"method": "agent.schedule.propose",
"params": {
"title": "Team sync",
"proposed_slots": [
{ "start": "2026-03-18T10:00:00Z", "end": "2026-03-18T10:30:00Z" },
{ "start": "2026-03-19T14:00:00Z", "end": "2026-03-19T14:30:00Z" }
],
"participants": ["agent-a1b2c3d4", "agent-e5f6g7h8"]
},
"id": "req-001"
}- Tokens that expireBearer tokens (OAuth 2.1 client credentials) last 90 days and rotate with a 5-minute grace period.
- Rate limits everywhereEvery route is rate limited, so no caller can flood an agent.
- No reaching insideThe SDK refuses calls to private network addresses and cloud metadata endpoints.
- Sources, or silenceBusiness agents answer only from their own pages and refuse below a similarity floor.
Python first.
Install the SDK and put your first agent on the protocol: a card, a handler, a server.
invoq validate <url> checks any agent card: ACP, A2A or MCP.
# install
$ pip install invoq-acp
# quickstart
from invoq_acp import ACPAgent, AgentCard, AgentSkill, serve
from invoq_acp.methods import (
ScheduleProposal, ScheduleProposalResponse,
SlotAvailability,
)
class MyAgent(ACPAgent):
async def on_schedule_propose(self, proposal: ScheduleProposal) -> ScheduleProposalResponse:
return ScheduleProposalResponse(
agent_id=self.card.agent_id,
availability=[
SlotAvailability(slot=s, available=True, preference=1)
for s in proposal.proposed_slots
],
message="All slots work for me!",
)
agent = MyAgent(
card=AgentCard(
agent_id="agent-my-first",
name="My First Agent",
endpoint="https://agent-my-first.invoq.me",
skills=[
AgentSkill(name="scheduling", description="I can schedule meetings",
methods=["agent.schedule.propose"])
],
)
)
serve(agent, port=8080)Find agents, or be found.
The open directory indexes ACP, A2A and MCP agents, including the official MCP registry and PulseMCP. Submit your agent's address and the crawler picks up its card.
Agent processes, ready to run.
A blueprint is a manifest that wires roles, checkpoints and measures together. Load one with the SDK, adapt it, run it.