{
  "markdown": "# AgentAnycast Node\n\n**The core daemon powering AgentAnycast's P2P agent network.**\n\n[![CI](https://github.com/AgentAnycast/agentanycast-node/actions/workflows/ci.yml/badge.svg)](https://github.com/AgentAnycast/agentanycast-node/actions/workflows/ci.yml)\n[![Go](https://img.shields.io/badge/Go-1.25+-00ADD8?logo=go&logoColor=white)](https://go.dev)\n[![License](https://img.shields.io/badge/License-FSL--1.1--ALv2-blue)](LICENSE)\n\nAgentAnycast Node (`agentanycastd`) is a sidecar daemon that runs on each machine, providing P2P networking, end-to-end encryption, and A2A protocol routing. Language SDKs (Python, TypeScript) communicate with it over gRPC.\n\n> **Fully decentralized.** On a local network, agents discover each other via mDNS with zero configuration. For cross-network communication, deploy your own relay with a single command.\n\n## Features\n\n| Category | Capabilities |\n|---|---|\n| **Networking** | libp2p (TCP, QUIC, WebTransport), NATS transport, mDNS auto-discovery, NAT traversal (AutoNAT + DCUtR + Circuit Relay v2) |\n| **Security** | E2E NaCl box encryption (X25519 + XSalsa20-Poly1305), W3C DID identity (`did:key`, `did:web`, `did:dns`), skill-based ACL, per-peer rate limiting |\n| **A2A Protocol** | Task state machine, 3 addressing modes (direct / anycast / HTTP bridge), streaming artifacts, offline message queue |\n| **Interop** | HTTP Bridge (P2P ↔ HTTP A2A), ANP Bridge (Agent Network Protocol), MCP Server (stdio + Streamable HTTP) |\n| **Enterprise** | Audit logging (JSON Lines), Prometheus metrics, OpenTelemetry tracing (W3C Trace Context, OTLP) |\n| **AI Tools** | MCP Server for 13+ AI platforms, MCP Remote Proxy to wrap any MCP Server as a P2P agent |\n\n## Quick Start\n\n### Standalone -- local network (zero configuration)\n\n```bash\ngo build -o agentanycastd ./cmd/agentanycastd\n./agentanycastd\n# Agents on the same LAN discover each other automatically via mDNS\n```\n\n### With Python SDK\n\n```bash\npip install agentanycast\n```\n\n```python\nfrom agentanycast import Node\n\nasync with Node(skills=[\"translate\"]) as node:\n    # The daemon starts automatically — no manual setup needed\n    result = await node.send_task(\"summarize\", \"Hello world\")\n```\n\n### MCP mode -- use as an AI tool\n\n```bash\n# stdio mode (Claude Desktop, Cursor, VS Code, Gemini CLI)\n./agentanycastd -mcp\n\n# Streamable HTTP mode (ChatGPT, remote clients)\n./agentanycastd -mcp-listen :3000\n```\n\n### Cross-network -- deploy your own relay\n\n```bash\n# On any VPS with a public IP\ngit clone https://github.com/AgentAnycast/agentanycast-relay && cd agentanycast-relay\ndocker-compose up -d\n\n# Note the RELAY_ADDR from the logs, then:\n./agentanycastd -bootstrap-peers \"/ip4/<RELAY_IP>/tcp/4001/p2p/12D3KooW...\"\n```\n\n## Configuration\n\n**Priority:** CLI flags > environment variables > config file > defaults\n\n### CLI Flags\n\n| Flag | Description |\n|---|---|\n| `-key` | Path to identity key file |\n| `-grpc-listen` | gRPC listen address (unix:// or tcp://) |\n| `-log-level` | Log level (`debug`, `info`, `warn`, `error`) |\n| `-bootstrap-peers` | Comma-separated bootstrap multiaddrs |\n| `-bridge-listen` | HTTP bridge listen address (e.g., `:8080`) |\n| `-enable-webtransport` | Enable WebTransport (QUIC-based, browser-compatible) |\n| `-mcp` | Run as MCP server over stdio |\n| `-mcp-listen` | MCP Streamable HTTP listen address (e.g., `:3000`) |\n| `-mcp-proxy` | Wrap an MCP Server command as a P2P-accessible agent |\n| `-anp-listen` | ANP bridge listen address (e.g., `:8090`) |\n| `-nats-broker` | NATS broker URL (e.g., `nats://broker.example.com:4222`) |\n| `-otlp-endpoint` | OTLP collector endpoint for distributed tracing |\n| `-metrics-listen` | Prometheus metrics listen address (e.g., `:9090`) |\n| `-config` | Path to TOML config file |\n| `-version` | Print version and exit |\n\n### Environment Variables\n\n| Variable | Default |\n|---|---|\n| `AGENTANYCAST_KEY_PATH` | `~/.agentanycast/key` |\n| `AGENTANYCAST_GRPC_LISTEN` | `unix://~/.agentanycast/daemon.sock` |\n| `AGENTANYCAST_LOG_LEVEL` | `info` |\n| `AGENTANYCAST_STORE_PATH` | `~/.agentanycast/data` |\n| `AGENTANYCAST_BOOTSTRAP_PEERS` | (none) |\n| `AGENTANYCAST_ENABLE_MDNS` | `true` |\n| `AGENTANYCAST_REGISTRY_ADDRS` | (none) |\n| `AGENTANYCAST_MCP_LISTEN` | (none) |\n\n### Config File\n\nDefault location: `~/.agentanycast/config.toml`\n\n```toml\nkey_path = \"~/.agentanycast/key\"\ngrpc_listen = \"unix://~/.agentanycast/daemon.sock\"\nlog_level = \"info\"\nlog_format = \"json\"\nstore_path = \"~/.agentanycast/data\"\nenable_mdns = true\nenable_quic = true\nenable_webtransport = false\nenable_relay_client = true\nenable_hole_punching = true\noffline_queue_ttl = \"24h\"\nbootstrap_peers = [\"/ip4/203.0.113.50/tcp/4001/p2p/12D3KooW...\"]\n\n[bridge]\nenabled = false\nlisten = \":8080\"\n# tls_cert = \"/path/to/cert.pem\"\n# tls_key = \"/path/to/key.pem\"\n# cors_origins = [\"*\"]\n\n[anycast]\nrouting_strategy = \"random\"\ncache_ttl = \"30s\"\nauto_register = true\n# registry_addr = \"relay.example.com:50052\"\n# registry_addrs = [\"relay1:50052\", \"relay2:50052\"]  # federation\nenable_dht = false\ndht_mode = \"auto\"   # \"auto\", \"server\", or \"client\"\n\n[metrics]\nenabled = false\nlisten = \":9090\"\n\n[mcp]\nenabled = false\nlisten = \":3000\"\n\n[anp]\nenabled = false\nlisten = \":8090\"\n\n# NATS Transport\n[transport.nats]\nenabled = true\nbroker = \"nats://broker.example.com:4222\"\nsubject_prefix = \"agent.\"\n\n# Enterprise Policy\n[policy]\nacl_rules = [\n  { source = \"*\", skill = \"*\", allow = true },\n]\n\n[policy.rate_limits]\ndefault_rps = 100\n\naudit_log_path = \"/var/log/agentanycast-audit.jsonl\"\n\n# OpenTelemetry\n[otel]\nenabled = false\notlp_endpoint = \"localhost:4317\"\n\n[identity]\n# did_web = \"did:web:example.com:agents:myagent\"\n# did_dns_domain = \"example.com\"\n```\n\n## Architecture\n\n```\n┌──────────────────────────────────────────────────────────────────────┐\n│                           agentanycastd                              │\n│                                                                      │\n│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────────────┐     │\n│  │  Engine   │  │  Router  │  │ Offline  │  │ Anycast Router   │     │\n│  │(task FSM) │  │(A2A msg) │  │  Queue   │  │(skill discovery) │     │\n│  └────┬─────┘  └────┬─────┘  └────┬─────┘  └────┬─────────────┘     │\n│       │              │             │              │                   │\n│  ┌────┴──────────────┴─────────────┴──────────────┴──────────────┐   │\n│  │         Envelope Layer (E2E NaCl box encryption)              │   │\n│  ├───────────────────────────────────────────────────────────────┤   │\n│  │                    Transport Adapters                         │   │\n│  │  libp2p (mDNS · TCP · QUIC · WebTransport · DHT)             │   │\n│  │  NATS · HTTP Bridge · Circuit Relay v2 · DCUtR                │   │\n│  └──────────────────────┬───────────────────────────────────────┘   │\n│                         │                                            │\n│  ┌──────────────────────┴──────────────────────────────────────┐     │\n│  │                gRPC Server (16 RPCs for SDKs)               │     │\n│  └─────────────────────────────────────────────────────────────┘     │\n│                                                                      │\n│  ┌────────────┐ ┌────────────┐ ┌──────────┐ ┌────────┐ ┌──────────┐ │\n│  │ HTTP Bridge│ │ MCP Server │ │ANP Bridge│ │  OTel  │ │MCP Proxy │ │\n│  │ (A2A↔P2P) │ │(stdio/HTTP)│ │(ANP↔A2A) │ │(trace) │ │(wrap cmd)│ │\n│  └────────────┘ └────────────┘ └──────────┘ └────────┘ └──────────┘ │\n│                                                                      │\n│  ┌────────┐ ┌──────┐ ┌─────────┐ ┌──────────────────┐               │\n│  │Metrics │ │BoltDB│ │  ACL /  │ │   Audit Logger   │               │\n│  │(Prom.) │ │(stor)│ │RateLimit│ │   (JSON Lines)   │               │\n│  └────────┘ └──────┘ └─────────┘ └──────────────────┘               │\n└──────────────────────────────────────────────────────────────────────┘\n```\n\n### Internal Packages\n\n| Package | Responsibility |\n|---|---|\n| `internal/a2a/` | A2A protocol engine -- task state machine, envelope routing, offline queue, streaming |\n| `internal/node/` | libp2p host -- peer connections, mDNS, DHT, TCP/QUIC/WebTransport |\n| `internal/crypto/` | Ed25519 keys, DID conversion (`did:key`, `did:web`, `did:dns`), Verifiable Credentials |\n| `internal/nat/` | AutoNAT, DCUtR hole punching, Circuit Relay v2 client |\n| `internal/store/` | BoltDB persistence -- tasks, agent cards, offline queue |\n| `internal/config/` | TOML config, environment variables, CLI flags |\n| `internal/envelope/` | Protocol-neutral message routing, E2E NaCl box encryption |\n| `internal/transport/` | Pluggable transport adapters -- libp2p, NATS, HTTP bridge |\n| `internal/bridge/` | HTTP Bridge -- translates HTTP JSON-RPC ↔ P2P A2A envelopes |\n| `internal/anycast/` | Anycast router -- skill-based addressing, multi-registry federation, DHT discovery |\n| `internal/mcp/` | MCP Server -- P2P capabilities as MCP tools (stdio + Streamable HTTP) |\n| `internal/mcpproxy/` | MCP Remote Proxy -- wraps external MCP commands as P2P agents |\n| `internal/anp/` | ANP Bridge -- translates ANP HTTP ↔ A2A P2P (JSON-RPC 2.0 + JSON-LD) |\n| `internal/policy/` | Enterprise policy -- skill-based ACL, per-peer rate limiting, audit logging |\n| `internal/metrics/` | Prometheus metrics -- connections, tasks, routing, bridge, streaming, MCP |\n| `internal/otel/` | OpenTelemetry -- distributed tracing, W3C Trace Context, OTLP exporter |\n| `pkg/grpcserver/` | gRPC server -- 16 RPC methods for SDKs |\n\n## gRPC API\n\n| Group | Methods |\n|---|---|\n| **Node** | `GetNodeInfo`, `SetAgentCard` |\n| **Peers** | `ConnectPeer`, `ListPeers`, `GetPeerCard` |\n| **Task Client** | `SendTask` (peer_id / skill_id / url), `GetTask`, `CancelTask`, `SubscribeTaskUpdates` |\n| **Task Server** | `SubscribeIncomingTasks`, `UpdateTaskStatus`, `CompleteTask`, `FailTask` |\n| **Streaming** | `SubscribeTaskStream`, `SendStreamingArtifact` |\n| **Discovery** | `Discover` |\n\n## MCP Server\n\nThe daemon can run as an MCP (Model Context Protocol) server, exposing P2P capabilities as tools for AI assistants.\n\n| Tool | Description |\n|---|---|\n| `toolGetNodeInfo` | Get local node information |\n| `toolListConnectedPeers` | List connected peers |\n| `toolGetAgentCard` | Get local or remote agent card |\n| `toolDiscoverAgents` | Discover agents by skill |\n| `toolSendTask` | Send task to peer by ID |\n| `toolSendTaskBySkill` | Send task by skill (anycast) |\n| `toolGetTaskStatus` | Get task status |\n\n**Transport modes:**\n- **stdio** -- for local AI tool integration (Claude Desktop, Cursor, VS Code, Gemini CLI, JetBrains)\n- **Streamable HTTP** -- for remote clients (ChatGPT)\n\n### MCP Remote Proxy\n\nWrap any MCP Server as a P2P-accessible agent with a single flag:\n\n```bash\n./agentanycastd --mcp-proxy \"npx -y @modelcontextprotocol/server-filesystem /home/user\"\n```\n\nThe proxy auto-generates an Agent Card from the MCP server's tool list, registers skills with the relay, and bridges incoming A2A tasks to MCP tool calls.\n\n## HTTP Bridge\n\nExposes an A2A-compatible HTTP endpoint for P2P ↔ HTTP interop:\n\n- `GET /.well-known/a2a-agent-card` -- Agent Card discovery\n- `POST /` -- JSON-RPC endpoint for task operations\n- Optional TLS and CORS support\n\n## ANP Bridge\n\nExposes an ANP-compatible HTTP endpoint for Agent Network Protocol interop:\n\n- `GET /agent/ad.json` -- Agent Description (JSON-LD)\n- `GET /agent/interface.json` -- OpenRPC specification\n- `POST /agent/rpc` -- JSON-RPC 2.0 endpoint\n\n## Observability\n\n### Prometheus Metrics\n\nAvailable on a configurable HTTP port (default `:9090`):\n\n| Metric | Type | Description |\n|---|---|---|\n| `agentanycast_connected_peers` | Gauge | Current peer count |\n| `agentanycast_connections_total` | Counter | Connection events by direction |\n| `agentanycast_connections_by_transport` | Counter | Connections by transport (tcp/quic/webtransport) |\n| `agentanycast_tasks_total` | Counter | Tasks by direction and status |\n| `agentanycast_task_duration_seconds` | Histogram | Task latency |\n| `agentanycast_route_resolutions_total` | Counter | Anycast resolution by result |\n| `agentanycast_bridge_requests_total` | Counter | HTTP bridge requests |\n| `agentanycast_stream_chunks_total` | Counter | Streaming chunks by direction |\n| `agentanycast_messages_total` | Counter | A2A messages by envelope type |\n| `agentanycast_offline_queue_size` | Gauge | Queued offline messages |\n| `agentanycast_mcp_tool_calls_total` | Counter | MCP tool calls by tool and status |\n| `agentanycast_acl_decisions_total` | Counter | ACL allow/deny decisions |\n| `agentanycast_rate_limit_rejections_total` | Counter | Rate-limited requests |\n\n### OpenTelemetry\n\nDistributed tracing with W3C Trace Context propagation. Spans cover task lifecycle, transport hops, and envelope encryption.\n\n```bash\n./agentanycastd --otlp-endpoint localhost:4317\n```\n\n## Building\n\n```bash\nmake build              # Build agentanycastd binary -> bin/\nmake test               # Run all tests (unit + integration, -race)\nmake test-unit          # Unit tests only (-short)\nmake test-integration   # Integration tests only\nmake lint               # golangci-lint\nmake cross-compile      # Build for darwin/linux x amd64/arm64 + windows/amd64\n```\n\n## Disclaimer\n\nThis software is provided \"as is\", without warranty of any kind. This software uses cryptography and may be subject to export controls in certain jurisdictions.\n\n## License\n\n[FSL-1.1-ALv2](LICENSE) -- Functional Source License, Version 1.1, with Apache License, Version 2.0 as the future license. Each release converts to Apache 2.0 two years after its publication date.\n",
  "bytes": 13543,
  "sha": "9f2ab0ee865057cb907a076de5d6b5535046708f4041ca38dcbca41e64685e84",
  "repo_slug": "agentanycast/agentanycast-node",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_agentanycast_agentanycast_fa69b70b/readme"
}