AgentAnycast について
AgentAnycast Node は、分散型 P2P ネットワークと A2A エージェント通信を担うデーモンで、エージェント連携システムを開発する人を対象としています。暗号化メッセージ、ピア発見、ルーティング、MCP に対応し、ローカルネットワークでは設定なしでピアを発見できます。
主な機能
- 01mDNS によるローカルピア発見
- 02A2A タスクのルーティングと成果物のストリーミング
- 03ピア間通信のエンドツーエンド暗号化
- 04NAT 越えとリレー接続
- 05MCP によるノード機能の公開
- 06外部 MCP サーバーを P2P エージェントに接続
活用シーン
- 01ローカルネットワーク上のエージェントを発見して通信
- 02ピア ID またはスキルを指定してタスクを送信
- 03MCP サーバーを P2P 経由で利用可能にする
- 04リレーを使って異なるネットワークのエージェントを接続
MCP 対応
デーモンは stdio または Streamable HTTP 経由で P2P 機能を MCP ツールとして公開できます。MCP プロキシは外部 MCP サーバーをラップし、受信した A2A タスクをそのツールに転送します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
AgentAnycast Node
AgentAnycast の P2P エージェントネットワークを支えるコアデーモンです。
AgentAnycast Node(agentanycastd)は、各マシンで動作するサイドカーデーモンで、P2P ネットワーキング、エンドツーエンド暗号化、A2A プロトコルのルーティングを提供します。言語 SDK(Python、TypeScript)は gRPC 経由で通信します。
完全に分散化されています。 ローカルネットワークでは、エージェントは設定不要で mDNS を介して相互に検出します。ネットワークをまたいで通信するには、1 つのコマンドで独自のリレーをデプロイできます。
機能
| カテゴリ | 機能 |
|---|---|
| ネットワーキング | libp2p(TCP、QUIC、WebTransport)、NATS トランスポート、mDNS 自動検出、NAT トラバーサル(AutoNAT + DCUtR + Circuit Relay v2) |
| セキュリティ | E2E NaCl ボックス暗号化(X25519 + XSalsa20-Poly1305)、W3C DID アイデンティティ(did:key、did:web、did:dns)、スキルベースの ACL、ピアごとのレート制限 |
| A2A プロトコル | タスク状態マシン、3 種類のアドレス指定モード(direct / anycast / HTTP bridge)、ストリーミングアーティファクト、オフラインメッセージキュー |
| 相互運用性 | HTTP Bridge(P2P ↔ HTTP A2A)、ANP Bridge(Agent Network Protocol)、MCP サーバー(stdio + Streamable HTTP) |
| エンタープライズ | 監査ログ(JSON Lines)、Prometheus メトリクス、OpenTelemetry トレース(W3C Trace Context、OTLP) |
| AI ツール | 13 以上の AI プラットフォーム向け MCP サーバー、あらゆる MCP サーバーを P2P エージェントとしてラップする MCP Remote Proxy |
クイックスタート
スタンドアロン -- ローカルネットワーク(設定不要)
go build -o agentanycastd ./cmd/agentanycastd
./agentanycastd
# Agents on the same LAN discover each other automatically via mDNS
Python SDK を使用
pip install agentanycast
from agentanycast import Node
async with Node(skills=["translate"]) as node:
# The daemon starts automatically — no manual setup needed
result = await node.send_task("summarize", "Hello world")
MCP モード -- AI ツールとして使用
# stdio mode (Claude Desktop, Cursor, VS Code, Gemini CLI)
./agentanycastd -mcp
# Streamable HTTP mode (ChatGPT, remote clients)
./agentanycastd -mcp-listen :3000
ネットワークをまたぐ接続 -- 独自のリレーをデプロイ
# On any VPS with a public IP
git clone https://github.com/AgentAnycast/agentanycast-relay && cd agentanycast-relay
docker-compose up -d
# Note the RELAY_ADDR from the logs, then:
./agentanycastd -bootstrap-peers "/ip4/<RELAY_IP>/tcp/4001/p2p/12D3KooW..."
設定
優先順位: CLI フラグ > 環境変数 > 設定ファイル > デフォルト値
CLI フラグ
| フラグ | 説明 |
|---|---|
-key | アイデンティティキーファイルのパス |
-grpc-listen | gRPC リッスンアドレス(unix:// または tcp://) |
-log-level | ログレベル(debug、info、warn、error) |
-bootstrap-peers | カンマ区切りのブートストラップ用マルチアドレス |
-bridge-listen | HTTP Bridge のリッスンアドレス(例::8080) |
-enable-webtransport | WebTransport を有効化(QUIC ベース、ブラウザー互換) |
-mcp | stdio 経由の MCP サーバーとして実行 |
-mcp-listen | MCP Streamable HTTP のリッスンアドレス(例::3000) |
-mcp-proxy | MCP サーバーのコマンドを P2P でアクセス可能なエージェントとしてラップ |
-anp-listen | ANP Bridge のリッスンアドレス(例::8090) |
-nats-broker | NATS ブローカーの URL(例:nats://broker.example.com:4222) |
-otlp-endpoint | 分散トレース用の OTLP コレクターエンドポイント |
-metrics-listen | Prometheus メトリクスのリッスンアドレス(例::9090) |
-config | TOML 設定ファイルのパス |
-version | バージョンを表示して終了 |
環境変数
| 変数 | デフォルト |
|---|---|
AGENTANYCAST_KEY_PATH | ~/.agentanycast/key |
AGENTANYCAST_GRPC_LISTEN | unix://~/.agentanycast/daemon.sock |
AGENTANYCAST_LOG_LEVEL | info |
AGENTANYCAST_STORE_PATH | ~/.agentanycast/data |
AGENTANYCAST_BOOTSTRAP_PEERS | (なし) |
AGENTANYCAST_ENABLE_MDNS | true |
AGENTANYCAST_REGISTRY_ADDRS | (なし) |
AGENTANYCAST_MCP_LISTEN | (なし) |
設定ファイル
デフォルトの場所:~/.agentanycast/config.toml
key_path = "~/.agentanycast/key"
grpc_listen = "unix://~/.agentanycast/daemon.sock"
log_level = "info"
log_format = "json"
store_path = "~/.agentanycast/data"
enable_mdns = true
enable_quic = true
enable_webtransport = false
enable_relay_client = true
enable_hole_punching = true
offline_queue_ttl = "24h"
bootstrap_peers = ["/ip4/203.0.113.50/tcp/4001/p2p/12D3KooW..."]
[bridge]
enabled = false
listen = ":8080"
# tls_cert = "/path/to/cert.pem"
# tls_key = "/path/to/key.pem"
# cors_origins = ["*"]
[anycast]
routing_strategy = "random"
cache_ttl = "30s"
auto_register = true
# registry_addr = "relay.example.com:50052"
# registry_addrs = ["relay1:50052", "relay2:50052"] # federation
enable_dht = false
dht_mode = "auto" # "auto", "server", or "client"
[metrics]
enabled = false
listen = ":9090"
[mcp]
enabled = false
listen = ":3000"
[anp]
enabled = false
listen = ":8090"
# NATS Transport
[transport.nats]
enabled = true
broker = "nats://broker.example.com:4222"
subject_prefix = "agent."
# Enterprise Policy
[policy]
acl_rules = [
{ source = "*", skill = "*", allow = true },
]
[policy.rate_limits]
default_rps = 100
audit_log_path = "/var/log/agentanycast-audit.jsonl"
# OpenTelemetry
[otel]
enabled = false
otlp_endpoint = "localhost:4317"
[identity]
# did_web = "did:web:example.com:agents:myagent"
# did_dns_domain = "example.com"
アーキテクチャ
┌──────────────────────────────────────────────────────────────────────┐
│ agentanycastd │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ Engine │ │ Router │ │ Offline │ │ Anycast Router │ │
│ │(task FSM) │ │(A2A msg) │ │ Queue │ │(skill discovery) │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────────────┘ │
│ │ │ │ │ │
│ ┌────┴──────────────┴─────────────┴──────────────┴──────────────┐ │
│ │ Envelope Layer (E2E NaCl box encryption) │ │
│ ├───────────────────────────────────────────────────────────────┤ │
│ │ Transport Adapters │ │
│ │ libp2p (mDNS · TCP · QUIC · WebTransport · DHT) │ │
│ │ NATS · HTTP Bridge · Circuit Relay v2 · DCUtR │ │
│ └──────────────────────┬───────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────┴──────────────────────────────────────┐ │
│ │ gRPC Server (16 RPCs for SDKs) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────┐ ┌────────────┐ ┌──────────┐ ┌────────┐ ┌──────────┐ │
│ │ HTTP Bridge│ │ MCP Server │ │ANP Bridge│ │ OTel │ │MCP Proxy │ │
│ │ (A2A↔P2P) │ │(stdio/HTTP)│ │(ANP↔A2A) │ │(trace) │ │(wrap cmd)│ │
│ └────────────┘ └────────────┘ └──────────┘ └────────┘ └──────────┘ │
│ │
│ ┌────────┐ ┌──────┐ ┌─────────┐ ┌──────────────────┐ │
│ │Metrics │ │BoltDB│ │ ACL / │ │ Audit Logger │ │
│ │(Prom.) │ │(stor)│ │RateLimit│ │ (JSON Lines) │ │
│ └────────┘ └──────┘ └─────────┘ └──────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘
内部パッケージ
| パッケージ | 役割 |
|---|---|
internal/a2a/ | A2A プロトコルエンジン -- タスク状態マシン、エンベロープのルーティング、オフラインキュー、ストリーミング |
internal/node/ | libp2p ホスト -- ピア接続、mDNS、DHT、TCP/QUIC/WebTransport |
internal/crypto/ | Ed25519 キー、DID 変換(did:key、did:web、did:dns)、検証可能なクレデンシャル |
internal/nat/ | AutoNAT、DCUtR ホールパンチング、Circuit Relay v2 クライアント |
internal/store/ | BoltDB 永続化 -- タスク、エージェントカード、オフラインキュー |
internal/config/ | TOML 設定、環境変数、CLI フラグ |
internal/envelope/ | プロトコルに依存しないメッセージルーティング、E2E NaCl ボックス暗号化 |
internal/transport/ | プラグイン可能なトランスポートアダプター -- libp2p、NATS、HTTP ブリッジ |
internal/bridge/ | HTTP ブリッジ -- HTTP JSON-RPC ↔ P2P A2A エンベロープを変換 |
internal/anycast/ | エニーキャストルーター -- スキルベースのアドレス指定、複数レジストリのフェデレーション、DHT ディスカバリー |
internal/mcp/ | MCP サーバー -- P2P 機能を MCP ツールとして提供(stdio + Streamable HTTP) |
internal/mcpproxy/ | MCP リモートプロキシ -- 外部 MCP コマンドを P2P エージェントとしてラップ |
internal/anp/ | ANP ブリッジ -- ANP HTTP ↔ A2A P2P を変換(JSON-RPC 2.0 + JSON-LD) |
internal/policy/ | エンタープライズポリシー -- スキルベースの ACL、ピアごとのレート制限、監査ログ |
internal/metrics/ | Prometheus メトリクス -- 接続、タスク、ルーティング、ブリッジ、ストリーミング、MCP |
internal/otel/ | OpenTelemetry -- 分散トレーシング、W3C Trace Context、OTLP エクスポーター |
pkg/grpcserver/ | gRPC サーバー -- SDK 向けの 16 個の RPC メソッド |
gRPC API
| グループ | メソッド |
|---|---|
| ノード | GetNodeInfo、SetAgentCard |
| ピア | ConnectPeer、ListPeers、GetPeerCard |
| タスククライアント | SendTask(peer_id / skill_id / url)、GetTask、CancelTask、SubscribeTaskUpdates |
| タスクサーバー | SubscribeIncomingTasks、UpdateTaskStatus、CompleteTask、FailTask |
| ストリーミング | SubscribeTaskStream、SendStreamingArtifact |
| ディスカバリー | Discover |
MCP サーバー
デーモンは MCP(Model Context Protocol)サーバーとして実行でき、P2P 機能を AI アシスタント向けのツールとして公開します。
| ツール | 説明 |
|---|---|
toolGetNodeInfo | ローカルノードの情報を取得 |
toolListConnectedPeers | 接続中のピアを一覧表示 |
toolGetAgentCard | ローカルまたはリモートのエージェントカードを取得 |
toolDiscoverAgents | スキルでエージェントを検索 |
toolSendTask | ID を指定してピアにタスクを送信 |
toolSendTaskBySkill | スキルを指定してタスクを送信(エニーキャスト) |
toolGetTaskStatus | タスクのステータスを取得 |
トランスポートモード:
- stdio -- ローカルの AI ツール連携向け(Claude Desktop、Cursor、VS Code、Gemini CLI、JetBrains)
- Streamable HTTP -- リモートクライアント向け(ChatGPT)
MCP リモートプロキシ
フラグを 1 つ指定するだけで、任意の MCP サーバーを P2P からアクセス可能なエージェントとしてラップできます。
./agentanycastd --mcp-proxy "npx -y @modelcontextprotocol/server-filesystem /home/user"
プロキシは MCP サーバーのツール一覧からエージェントカードを自動生成し、スキルをリレーに登録して、受信した A2A タスクを MCP ツール呼び出しに橋渡しします。
HTTP ブリッジ
P2P ↔ HTTP 相互運用のため、A2A 互換の HTTP エンドポイントを公開します。
GET /.well-known/a2a-agent-card-- エージェントカードの検索POST /-- タスク操作用の JSON-RPC エンドポイント- オプションで TLS と CORS をサポート
ANP ブリッジ
Agent Network Protocol の相互運用のため、ANP 互換の HTTP エンドポイントを公開します。
GET /agent/ad.json-- エージェント記述(JSON-LD)GET /agent/interface.json-- OpenRPC 仕様POST /agent/rpc-- JSON-RPC 2.0 エンドポイント
可観測性
Prometheus のメトリクス
設定可能な HTTP ポート(デフォルトは :9090)で利用できます。
| メトリクス | 種類 | 説明 |
|---|---|---|
agentanycast_connected_peers | Gauge | 現在のピア数 |
agentanycast_connections_total | Counter | 方向別の接続イベント |
agentanycast_connections_by_transport | Counter | トランスポート別の接続数(tcp/quic/webtransport) |
agentanycast_tasks_total | Counter | 方向とステータス別のタスク数 |
agentanycast_task_duration_seconds | Histogram | タスクのレイテンシ |
agentanycast_route_resolutions_total | Counter | 結果別の Anycast 解決数 |
agentanycast_bridge_requests_total | Counter | HTTP ブリッジのリクエスト数 |
agentanycast_stream_chunks_total | Counter | 方向別のストリーミングチャンク数 |
agentanycast_messages_total | Counter | エンベロープタイプ別の A2A メッセージ数 |
agentanycast_offline_queue_size | Gauge | キューに入ったオフラインメッセージ数 |
agentanycast_mcp_tool_calls_total | Counter | ツールとステータス別の MCP ツール呼び出し数 |
agentanycast_acl_decisions_total | Counter | ACL の許可/拒否判定数 |
agentanycast_rate_limit_rejections_total | Counter | レート制限されたリクエスト数 |
OpenTelemetry
W3C Trace Context の伝播による分散トレーシングに対応しています。スパンはタスクのライフサイクル、トランスポートのホップ、エンベロープの暗号化を対象とします。
./agentanycastd --otlp-endpoint localhost:4317
ビルド
make build # Build agentanycastd binary -> bin/
make test # Run all tests (unit + integration, -race)
make test-unit # Unit tests only (-short)
make test-integration # Integration tests only
make lint # golangci-lint
make cross-compile # Build for darwin/linux x amd64/arm64 + windows/amd64
免責事項
本ソフトウェアは、いかなる種類の保証もなく「現状有姿」で提供されます。本ソフトウェアは暗号技術を使用しており、特定の法域では輸出規制の対象となる場合があります。
ライセンス
FSL-1.1-ALv2 -- Functional Source License, Version 1.1。将来のライセンスとして Apache License, Version 2.0 が適用されます。各リリースは公開日から 2 年後に Apache 2.0 に移行します。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。