Catalog PyPI
PACKAGE EXPLORERView in registry

agentanycast

PyPI

Connect AI agents across any network — no public IP needed. P2P encrypted, NAT-traversing, zero-config on LAN.

a2aa2a-protocolagentagent-communicationagnoclaude-agent-sdkcrewaidecentralizeddidend-to-end-encryptiongoogle-adkgrpclanggraphlibp2pmcpmcp-server
All keywords (23)
nat-traversalnoise-protocolopenai-agentsp2ppydantic-aistrands-agentszero-config
Versions collected1
Direct dependencies20From release 0.7.3
Last observed20 Oct, 21:27 UTC

README

Version 0.7.3 documentation

AgentAnycast Python SDK

Build P2P agents in Python. Discover, communicate, and collaborate with AI agents across any network -- encrypted, decentralized, NAT-traversing.

CI PyPI Python License

pip install agentanycast

Try it now -- start a demo agent in one command:

agentanycast demo

The daemon downloads automatically on first run. The demo prints the exact command to test it from another terminal.

Quick Start

Create an agent:

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()

Send a task to another agent:

async with Node(card=card) as node:
    handle = await node.send_task(
        peer_id="12D3KooW...",
        message={"role": "user", "parts": [{"text": "Hello!"}]},
    )
    result = await handle.wait()
    print(result.artifacts[0].parts[0].text)  # "Echo: Hello!"

Three Ways to Send a Task

# Direct — by Peer ID
await node.send_task(peer_id="12D3KooW...", message=msg)

# Anycast — by skill (relay resolves the target)
await node.send_task(skill="translate", message=msg)

# HTTP Bridge — to standard HTTP A2A agents
await node.send_task(url="https://agent.example.com", message=msg)

CLI

Add --verbose (or -v) before any command for debug output:

agentanycast --verbose demo
agentanycast demo                        # Start an echo agent
agentanycast discover translate          # Find agents by skill
agentanycast send 12D3KooW... "Hello!"   # Send a task
agentanycast status                      # Check node status
agentanycast info                        # Show Peer ID, DID, version

How It Works

┌─────────────┐         mDNS / Relay         ┌─────────────┐
│  Agent A    │<------------------------------>│  Agent B    │
│  (Python)   │     E2E encrypted (Noise)     │  (Python)   │
└──────┬──────┘                               └──────┬──────┘
       | gRPC                                        | gRPC
┌──────┴──────┐                               ┌──────┴──────┐
│ agentanycastd│                               │ agentanycastd│
│  (Go daemon)│<---------- libp2p ------------>│  (Go daemon) │
└─────────────┘                               └──────────────┘
  • LAN -- agents discover each other via mDNS. Zero configuration.
  • WAN -- deploy a self-hosted relay and point agents to it.
  • The Go daemon is auto-downloaded and managed by the SDK. No manual setup.

Framework Adapters

Turn existing frameworks into P2P agents with one function call:

pip install agentanycast[crewai]         # CrewAI
pip install agentanycast[langgraph]      # LangGraph
pip install agentanycast[google-adk]     # Google ADK
pip install agentanycast[openai-agents]  # OpenAI Agents SDK
pip install agentanycast[claude]         # Claude Agent SDK
pip install agentanycast[strands]        # AWS Strands Agents
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(crew, card=card, relay="...")
await serve_graph(graph, card=card, relay="...")
await serve_adk_agent(agent, card=card, relay="...")
await serve_openai_agent(agent, card=card, relay="...")
await serve_claude_agent(prompt_template="...", card=card)
await serve_strands_agent(agent, card=card)

Skill Discovery

agents = await node.discover("translate")
agents = await node.discover("translate", tags={"lang": "fr"})

Interoperability

# W3C DID
from agentanycast.did import peer_id_to_did_key, did_key_to_peer_id
did = peer_id_to_did_key("12D3KooW...")      # "did:key:z6Mk..."
pid = did_key_to_peer_id("did:key:z6Mk...")  # "12D3KooW..."

# MCP Tool <-> A2A Skill mapping
from agentanycast.mcp import mcp_tools_to_agent_card
card = mcp_tools_to_agent_card(mcp_tools, name="MCPAgent")

# A2A v1.0 JSON format
from agentanycast.compat.a2a_v1 import task_to_a2a_json, task_from_a2a_json

# OASF / AGNTCY Directory
from agentanycast.compat.oasf import card_to_oasf_record
from agentanycast.compat.agntcy import AGNTCYDirectory

API Reference

Node

MethodDescription
Node(card, relay?, home?, ...)Create a node with an AgentCard and optional config
async with Node(...) as nodeContext manager -- starts/stops daemon automatically
send_task(peer_id?, skill?, url?, message=)Send a task using any addressing mode
discover(skill, tags?)Find agents by skill with optional tag filtering
on_task(handler)Register handler for incoming tasks
serve_forever()Block and process incoming tasks until stopped

Core Types

ClassDescription
AgentCardAgent identity, capabilities, and metadata
SkillA single capability an agent can perform
TaskHandleReturned by send_task(). Call wait() for the result.
IncomingTaskPassed to task handlers. Provides message data and response methods.

Node Options

ParameterDescriptionDefault
cardAgent's AgentCardRequired
relayRelay multiaddr for cross-network communicationNone (LAN only)
daemon_pathPath to a local agentanycastd binaryAuto-download
daemon_addrAddress of an externally managed daemonAuto-managed
key_pathPath to Ed25519 identity key file<home>/key
homeData directory. Use different values for multiple nodes.~/.agentanycast
status_callbackOptional callback for progress messages (download, startup)None

Development

pip install -e ".[dev]"    # Install in editable mode with dev deps
pytest                     # Run all tests
ruff check .               # Lint
ruff format .              # Format
mypy src/                  # Type check (strict)

Requirements

  • Python 3.10+
  • The agentanycastd daemon (auto-managed by the SDK)

Part of AgentAnycast -- see the main repo for architecture docs, protocol reference, and examples.

License

Apache License, Version 2.0

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.7.327 Mar 202620

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

PENDING
agentanycast/agentanycast-python

Shared repository data · GitHub

License detected in repository
Not collected

Repository

ACCESSIBLE
agentanycast/agentanycast

Shared repository data · GitHub

License detected in repository
Apache-2.0
License branch / ref
main
Last push
28 Mar 2026
Archived
No
Contributor identities
— · partial collection

Public sponsor counts have not been collected. These signals belong to the repository owner.

Downloads & popularity

7count
Gauge · observed snapshots23 Oct 2026
73.50
2026-10-23: 7 · observed 2026-10-23T20:39:51.2155162Z
23 Oct23 Oct

github · 1 observations shown. Missing days are unknown.

View observed values
Date / source periodValueObserved at
2026-10-2372026-10-23T20:39:51.2155162Z

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 21:27 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:be1ac6c4f044a565cf73ccfcded26a05a09493c5e30da608d166801b983faca2