Try it now
pip install agentanycast && agentanycast demo
# Open another terminal:
agentanycast send <PEER_ID> "Hello!"
The daemon downloads automatically. The demo prints the exact command to test it.
pip install agentanycast # Python SDK
npm install agentanycast # TypeScript SDK
uvx agentanycast-mcp # MCP Server for Claude, Cursor, VS Code, etc.
Why AgentAnycast?
The A2A protocol assumes every agent has a public URL. That excludes agents on laptops, behind NATs, or inside private networks. AgentAnycast fixes this:
Quick Start
Python
pip install agentanycast
from agentanycast import Node, AgentCard, Skill
card = AgentCard(
name="EchoAgent",
description="Echoes back any message",
skills=[Skill(id="echo", description="Echo the input")],
)
async with Node(card=card) as node:
@node.on_task
async def handle(task):
text = task.messages[-1].parts[0].text
await task.complete(artifacts=[{"parts": [{"text": f"Echo: {text}"}]}])
print(f"Agent running — Peer ID: {node.peer_id}")
await node.serve_forever()
TypeScript
npm install agentanycast
import { Node, type AgentCard } from "agentanycast";
const card: AgentCard = {
name: "EchoAgent",
description: "Echoes back any message",
skills: [{ id: "echo", description: "Echo the input" }],
};
const node = new Node({ card });
await node.start();
node.onTask(async (task) => {
const text = task.messages.at(-1)?.parts[0]?.text ?? "";
await task.complete([{ parts: [{ text: `Echo: ${text}` }] }]);
});
console.log(`Agent running — Peer ID: ${node.peerId}`);
await node.serveForever();
Python and TypeScript agents interoperate out of the box -- same daemon, same protocol, same network.
MCP Server (Any AI Tool)
No code needed. Install the MCP server and use P2P agents from Claude Desktop, Cursor, VS Code, or any MCP-compatible tool:
uvx agentanycast-mcp
Add to your AI tool's config (example: Claude Desktop):
{
"mcpServers": {
"agentanycast": {
"command": "uvx",
"args": ["agentanycast-mcp"]
}
}
}
Then ask: "Find agents that can translate Japanese" or "Send a task to the summarize agent".
See platform-specific setup for Cursor, VS Code, Windsurf, JetBrains, Gemini CLI, and more.
How It Works
AgentAnycast uses a sidecar architecture: a thin SDK talks to a local Go daemon over gRPC. The daemon handles all P2P networking, encryption, and protocol logic.
- On a LAN -- agents find each other via mDNS. Zero configuration.
- Across networks -- deploy a self-hosted relay. Agents connect through it, but the relay cannot read traffic (end-to-end encrypted).
- Behind NAT -- the daemon tries hole-punching (DCUtR) first, then falls back to relay.
- Identity -- each agent gets an Ed25519 key pair mapped to W3C DIDs (
did:key,did:web). No certificates, no DNS, no accounts.
Three Ways to Connect
# 1. Direct — send to a known agent by Peer ID
await node.send_task(peer_id="12D3KooW...", message=msg)
# 2. Anycast — send by skill, the network finds the right agent
await node.send_task(skill="translate", message=msg)
# 3. HTTP Bridge — reach standard HTTP-based A2A agents
await node.send_task(url="https://agent.example.com", message=msg)
Framework Adapters
Turn existing agent frameworks into P2P agents with one function call:
from agentanycast.adapters.crewai import serve_crew
from agentanycast.adapters.langgraph import serve_graph
from agentanycast.adapters.adk import serve_adk_agent
from agentanycast.adapters.openai_agents import serve_openai_agent
from agentanycast.adapters.claude_agent import serve_claude_agent
from agentanycast.adapters.strands import serve_strands_agent
await serve_crew(my_crew, card=card, relay="...") # CrewAI
await serve_graph(my_graph, card=card, relay="...") # LangGraph
await serve_adk_agent(my_agent, card=card, relay="...") # Google ADK
await serve_openai_agent(my_agent, card=card, relay="...") # OpenAI Agents SDK
await serve_claude_agent(prompt="...", card=card) # Claude Agent SDK
await serve_strands_agent(my_agent, card=card) # AWS Strands Agents
Key Features
Interoperability
Comparison
Self-Hosted Relay
On a LAN, no relay is needed -- agents discover each other via mDNS.
For cross-network communication, deploy a relay on any machine with a public IP:
git clone https://github.com/AgentAnycast/agentanycast-relay.git && cd agentanycast-relay
docker compose up -d
Then point agents to it:
async with Node(card=card, relay="/ip4/<IP>/tcp/4001/p2p/12D3KooW...") as node:
...
The relay is a zero-knowledge forwarder -- it passes only encrypted bytes. It also hosts a skill registry for anycast discovery, with optional multi-relay federation.
Repository Ecosystem
Examples
Start with 01-hello-world or explore all examples -- including CrewAI, LangGraph, Google ADK, OpenAI Agents, Claude Agent SDK, and AWS Strands integrations.
Documentation
Contributing
Contributions welcome! See CONTRIBUTING.md for guidelines. A CLA bot will guide you on your first PR.
License
SDKs and protocol definitions are Apache-2.0. Daemon and relay are FSL-1.1-Apache-2.0 -- each release auto-converts to Apache-2.0 after two years.
Community
- GitHub Discussions -- questions, ideas, show & tell
- GitHub Issues -- bug reports, feature requests