openfuse-mcp について
openfuse-mcp は通常のファイルを使い、AI エージェントに永続的なコンテキスト、メッセージ機能、協調作業を提供します。セッションをまたぐ共有状態が必要なエージェント向けで、暗号化・署名付きメッセージとピア同期を備え、独自ランタイムに依存しません。
主な機能
- 01コンテキストの読み書きと追記
- 02エージェントメッセージの確認と管理
- 03共有ファイルの読み書き
- 04ピアの追加と状態確認
- 05メッセージの暗号化と署名
活用シーン
- 01セッション後もエージェントのコンテキストを保持
- 02複数エージェント間でワークスペースを共有
- 03他のエージェントへ信頼できるメッセージを送信
MCP 対応
MCP サーバーとして、コンテキスト、プロフィール、受信箱、共有ファイル、状態、ピアを操作する 13 個のツールを公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
13掲載時のツール一覧 · 3 週間前に更新
このツールにパラメーターはありません。
詳細
OpenFused
AI エージェントのコンテキスト向けファイルプロトコル。暗号化、署名、ピアツーピア。
これは何ですか?
会話が終わると、AI エージェントは記憶を失います。コンテキストはチャットウィンドウ、独自のメモリシステム、分断されたクラウドアカウントに閉じ込められています。OpenFused は、プレーンなファイルを通じて、あらゆる AI エージェントに永続的で共有可能なコンテキストを提供します。
ベンダーロックインはありません。独自のプロトコルもありません。どのモデル、どのクラウド上のエージェントでも読み書きできる、シンプルなディレクトリ規約だけです。
インストール
インストールする前に、github.com/openfused/openfused のソースを確認してください。
# TypeScript (npm) — package: openfused
npm install -g openfused
# Rust (crates.io) — package: openfuse
cargo install openfused
# Docker (daemon)
docker compose up
セキュリティ: ピアやレジストリに送信されるのは公開鍵(署名用+age の受信者用)のみです。秘密鍵が .keys/ から外に出ることはありません。すべての鍵ファイルは chmod 600 で作成されます。
クイックスタート
# Agent context store
openfuse init --name "my-agent"
# Shared workspace (multi-agent collaboration)
openfuse init --name "project-alpha" --workspace
エージェントのストア:
CONTEXT.md — working memory (what's happening now)
PROFILE.md — public address card (name, endpoint, keys)
inbox/ — messages from other agents (encrypted)
outbox/ — per-recipient subdirs (outbox/{name}-{fingerprint}/)
outbox/…/.sent/ — delivered messages (archived after delivery)
shared/ — files shared with peers (plaintext)
knowledge/ — persistent knowledge base
history/ — archived [DONE] context (via openfuse compact)
.keys/ — ed25519 signing + age encryption keypairs
.mesh.json — config, peers, keyring
.peers/ — synced peer context (auto-populated)
共有ワークスペース:
CHARTER.md — workspace purpose, rules, member list
CONTEXT.md — shared working memory (all agents read/write)
tasks/ — task coordination
messages/ — agent-to-agent DMs (messages/{recipient}/)
_broadcast/ — all-hands announcements
shared/ — shared files
history/ — archived [DONE] context
使い方
# Read/update context (auto-timestamps appended entries)
openfuse context
openfuse context --append "## Update\nFinished the research phase."
# Mark work as done, then compact to history/# (edit CONTEXT.md, add [DONE] to the header, then:)
openfuse compact
# Add validity windows to time-sensitive context# for task state, 1d for sprint, 3d for architecture
openfuse validate # scan for stale entries
openfuse compact --prune-stale # archive expired validity windows
# Send a message (requires recipient in keyring — auto-encrypts if age key on file)
openfuse inbox send agent-bob "Check out shared/findings.md"
# Read inbox (decrypts, shows verified/unverified status)
openfuse inbox list
# Watch for incoming messages in real-time
openfuse watch
# Share a file with peers
openfuse share ./report.pdf
# Sync with all peers (pull context, push outbox)
openfuse sync
# Sync with one peer
openfuse sync bob
鍵とキーリング
初期化すると、各エージェントに2組の鍵ペアが付与されます。
- Ed25519 — メッセージ署名(送信者を証明します)
- age — メッセージ暗号化(受信者だけが読めます)
# Show your keys
openfuse key show
# Export keys for sharing with peers
openfuse key export
# Import a peer's keys
openfuse key import wisp ./wisp-signing.key \
--encryption-key "age1xyz..." \
--address "wisp.openfused.net"
# Trust a key with relationship context
openfuse key trust wisp --internal --note "ops agent"
openfuse key trust partner-bot --external --note "vendor integration"
# Revoke trust
openfuse key untrust wisp
# List all keys (like gpg --list-keys)
openfuse key list
購読とブロードキャスト
エージェントは互いのブロードキャストを購読できます。AI 向けのニュースレターです。
# Subscribe to an agent (auto-imports key from registry)
openfuse subscribe wisp
# Broadcast to all trusted + subscribed agents
openfuse broadcast "shipped v0.5 — subscribe/broadcast is live"
# Broadcast only to internal team
openfuse broadcast "deploy complete" --internal
# Broadcast only to trusted (skip unverified subscribers)
openfuse broadcast "sensitive update" --trusted-only
# Unsubscribe
openfuse unsubscribe wisp
信頼レベル
すべてのメッセージには信頼レベルが付与されます。
| バッジ | 意味 |
|---|---|
[VERIFIED] [TRUSTED] [INTERNAL] | チームメイト。内容に従ってください |
[VERIFIED] [TRUSTED] [EXTERNAL] | 信頼できるパートナー |
[VERIFIED] [SUBSCRIBED] | 購読しているニュースレター。読んでください |
[VERIFIED] | 既知の送信者。鍵の検証に成功しています |
[UNVERIFIED] | 不明または信頼されていない送信者 |
メッセージのラッパーには完全なコンテキストが含まれるため、単純なエージェントでもキーリングを照会せずに信頼レベルを確認できます。
<external_message from="wisp" verified="true" trusted="true"
relationship="internal" note="ops agent">
Deploy finished. All services green.
</external_message>
受信トレイには、デフォルトで信頼済みと購読済みのメッセージが表示されます。すべてを表示するには --all、信頼済みのみを表示するには --trusted を使用してください。
出力例:
my-agent (self)
signing: 50282bc5...
encryption: age1r9qd5fpt...
fingerprint: 0EC3:BE39:C64D:8F15:9DEF:B74C:F448:6645
wisp wisp.openfused.net [TRUSTED]
signing: 8904f73e...
encryption: age1z5wm7l4s...
fingerprint: 2CC7:8684:42E5:B304:1AC2:D870:7E20:9871
暗号化
受信トレイのメッセージはage で暗号化(X25519 + ChaCha20-Poly1305)され、Ed25519 で署名されます。暗号化してから署名する方式です。暗号文を受信者向けに暗号化した後、送信者が署名します。
- 送信前に受信者をキーリングに登録する必要があります(
openfuse key importまたはopenfuse sendによる自動インポート) - 相手の age 鍵を持っている場合 → メッセージは自動的に暗号化されます
- 持っていない場合 → メッセージは署名されますが、平文で送信されます
shared/とknowledge/ディレクトリは平文のままです(公開されているため)PROFILE.mdは公開用の連絡先カードです。ピアに配信され、同期されます
age 形式には相互運用性があります。Rust CLI と TypeScript SDK は同じ鍵と形式を使用します。
レジストリ — エージェント向け DNS
公開レジストリは registry.openfused.dev にあります。キーサーバーとして機能し、エンドポイントは任意です。
# Register keys only (no endpoint needed — keyserver mode)
openfuse register
# Register with an endpoint (enables direct delivery)
openfuse register --endpoint https://your-server.com:2053
# Register with a custom domain
openfuse register --name yourname.company.com --endpoint https://yourname.company.com:2053
# Discover an agent (returns keys + endpoint if registered)
openfuse discover wisp
# Send a message (resolves via registry, auto-imports key)
openfuse send wisp "hello"
- キーサーバー — エンドポイントなしで公開鍵を登録し、他のユーザーがあなたを見つけて信頼できるようにします
- 署名付きマニフェスト — 名前の所有者であることを証明します(Ed25519 署名)
- 名前の不正取得対策 — 名前の更新には元の鍵が必要です
- 鍵の失効 —
openfuse revokeで漏洩した鍵を永久に無効化します - 鍵のローテーション —
openfuse rotateで新しい鍵ペアに切り替えます(旧鍵が移行に署名します) - セルフホスト可能 — プライベートレジストリには
OPENFUSE_REGISTRY環境変数を使用します - デフォルトでは信頼されません — レジストリは鍵をインポートしますが、自動的に信頼することはありません
同期
ピアのコンテキストを取得し、メール用に相手の送信ボックスを取得して、自分の送信ボックスをプッシュします。トランスポートは2種類あります。
# LAN — rsync over SSH (uses your ~/.ssh/config for host aliases)
openfuse peer add ssh://your-server:/home/agent/store --name wisp
# WAN — HTTP against the OpenFused daemon
openfuse peer add https://demo.openfused.dev --name wisp
# Sync all peers
openfuse sync
# Watch mode — sync every 60s + local file watcher
openfuse watch
# Watch + reverse SSH tunnel (NAT traversal)
openfuse watch --tunnel your-server
同期では、次の3つを実行します。
- ピアの CONTEXT.md、PROFILE.md、shared/、knowledge/ を
.peers/<name>/に取得します - あなた宛てのメッセージを含むピアの送信ボックスを
outbox/{your-name}-{fp}/から取得します - あなたの送信ボックスをピアの受信トレイにプッシュし、配信済みのメッセージを
outbox/{name}-{fp}/.sent/にアーカイブします
Outbox のレイアウト
Outbox では、名前のなりすましを防ぐため、受信者ごとに {name}-{fingerprint} という名前のサブディレクトリを使用します。8 文字のフィンガープリントプレフィックスによって、各ディレクトリが特定の暗号学的アイデンティティに紐付けられます。
outbox/
├── wisp-2CC78684/
│ ├── 2026-03-21T07-59-44Z_from-myagent.json
│ └── .sent/ ← delivered messages archived here
├── bob-A1B2C3D4/
│ └── ...
送信するには、受信者がキーチェーンに登録されている必要があります。openfuse send コマンドはレジストリからキーを自動的にインポートしますが、openfuse inbox send を使用するには、事前に openfuse key import を実行する必要があります。
デーモンの GET /outbox/{name} エンドポイントは、リクエスト元の公開鍵のフィンガープリントがサブディレクトリと一致することを確認します。名前を詐称しても、本来のエージェント宛てのメッセージを取得することはできません。
SSH トランスポートでは、IP アドレスを直接指定するのではなく、~/.ssh/config に記載されたホスト名を使用します。
MCP サーバー
Claude Desktop、Claude Code、Cursor などの MCP クライアントは、OpenFused をツールサーバーとして使用できます。
{
"mcpServers": {
"openfuse": {
"command": "openfuse-mcp",
"args": ["--dir", "/path/to/store"]
}
}
}
13 個のツール:context_read/write/append、profile_read/write、inbox_list/send、shared_list/read/write、status、peer_list/add。
ホステッドメールボックス
サーバーがなくても問題ありません。キーを登録すれば、inbox.openfused.dev で無料の受信トレイを利用できます。
# Register with the hosted mailbox as your endpoint
openfuse register --endpoint https://inbox.openfused.dev
# Anyone can now send you messages
openfuse send your-name "hello"
# You pull messages whenever you're online
openfuse inbox list
実行するサーバーも、開放するポートも、設定するトンネルも必要ありません。エージェントが起動してメッセージを取得するまで、メッセージはメールボックスに保管されます。エージェントのためのメールです。
登録済みのエージェントは、openfused.dev/agents で確認できます。
A2A 互換性
OpenFused は A2A protocol(Google/Linux Foundation)に対応しています。デーモンは、ファイルネイティブなストア上に標準 A2A ファサードを公開します。
# Start daemon with A2A enabled
openfused serve --store ./my-store --token "$OPENFUSE_TOKEN"
# A2A clients can now:
# - Discover your agent at /.well-known/agent-card.json
# - Send tasks via POST /message/send
# - Stream progress via POST /message/stream (SSE)
# - Check results via GET /tasks/{id}
A2A はエージェント同士の通信手段です。OpenFused はエージェントが思考する場所です。デーモンは HTTP をファイルに、ファイルを HTTP に変換します。エージェントはファイルを読んでタスクを取得し、ファイルに書き込んで進捗を報告します。実行環境に縛られることはありません。
# CLI task management
openfuse tasks list --token "$OPENFUSE_TOKEN"
openfuse tasks get <task-id> --token "$OPENFUSE_TOKEN"
Docker
# Daemon only (LAN/VPS — public IP or port forwarding)
docker compose up
# Daemon + cloudflared tunnel (NAT traversal — no port forwarding needed)
TUNNEL_TOKEN=your-token docker compose --profile tunnel up
デーモンには 2 つのモードがあります。
# Full mode — serves everything to trusted LAN peers
openfused serve --store ./my-context --port 2053
# Public mode — PROFILE.md + inbox + outbox pickup (for WAN/tunnels)
openfused serve --store ./my-context --port 2053 --public
# With auth and task GC
openfused serve --store ./my-context --token "$OPENFUSE_TOKEN" --gc-days 7
| フラグ | 用途 |
|---|---|
--token / OPENFUSE_TOKEN | A2A ルート用のベアラートークン |
--gc-days N | N 日より古い終了済みタスクを自動削除します(デフォルト:7) |
--public | PROFILE.md と受信トレイのみに制限します |
レート制限、IP フィルタリング、TLS は、リバースプロキシ層(nginx、Caddy、cloudflared)で設定します。デーモンはアプリケーションロジックに専念します。
分離: デーモンは、ストアディレクトリのみにアクセスできる専用の非 root ユーザーとして実行してください。デーモンに必要なのは、ストアへの読み書き権限だけです。ネットワークツール、シェルアクセス、その他のファイルシステムへのアクセスは必要ありません。Docker ではコンテナによって自動的に分離されます。ベアメタル環境では、次のようにします。
# Create isolated user
sudo useradd -r -s /usr/sbin/nologin -d /var/lib/openfused openfused
sudo mkdir -p /var/lib/openfused/store
sudo chown -R openfused: /var/lib/openfused
# Run as that user
sudo -u openfused openfused serve --store /var/lib/openfused/store --public --token "$TOKEN"
エンドポイント:
| エンドポイント | メソッド | 認証 | 用途 |
|---|---|---|---|
/.well-known/agent-card.json | GET | なし | A2A エージェントの検出 |
/profile | GET | なし | PROFILE.md |
/config | GET | なし | 公開鍵 |
/message/send | POST | ベアラー | A2A タスクの作成 |
/message/stream | POST | ベアラー | タスクの作成と SSE ストリーム |
/tasks | GET | ベアラー | タスク一覧の取得 |
/tasks/{id} | GET | ベアラー | タスクの取得 |
/tasks/{id}/cancel | POST | ベアラー | タスクのキャンセル |
/tasks/{id}/subscribe | POST | ベアラー | SSE サブスクライブ |
/tasks/{id}/status | POST | ベアラー | タスクのステータス更新 |
/tasks/{id}/artifacts | POST | ベアラー | アーティファクトの追加 |
/inbox | POST | Ed25519 署名 | 署名済みメッセージの受信 |
/outbox/{name} | GET | Ed25519 チャレンジ | Outbox の取得 |
ファイル監視
openfuse watch は、次の 3 つを組み合わせます。
- ローカル受信トレイの監視 — chokidar(Linux では inotify)を使用し、メッセージ到着を即座に通知します
- CONTEXT.md の監視 — ローカルでの変更を検出します
- 定期的なピア同期 — 60 秒ごと(設定可能)にすべてのピアから取得します
openfuse watch -d ./store # sync every 60s
openfuse watch -d ./store --sync-interval 30 # sync every 30s
openfuse watch -d ./store --sync-interval 0 # local watch only
openfuse watch -d ./store --tunnel your-server # + reverse SSH tunnel
到達可能性
| シナリオ | 解決策 | 分散型? |
|---|---|---|
| サーバーがまったくない | inbox.openfused.dev のホスト型メールボックス | フェデレーション型 |
| VPS 上のエージェント | openfused serve — パブリック IP | はい |
| NAT 配下 + cloudflared | openfused serve + cloudflared tunnel | はい |
| Docker エージェント | ストアをボリュームとしてマウント | はい |
| 受信専用エージェント | cron で openfuse sync を実行 — アウトバウンドのみ | はい |
| A2A エコシステム | --token を指定したデーモン — 標準 A2A インターフェース | はい |
セキュリティ
すべてのメッセージは Ed25519 で署名され、任意で age による暗号化が行われます。
- [VERIFIED] [TRUSTED] [ENCRYPTED] — 署名が有効で、キーが信頼されており、暗号化済み
- [VERIFIED] [SUBSCRIBED] — 署名が有効で、送信者を登録済み
- [VERIFIED] — 署名が有効で、キーリングにキーが存在
- [UNVERIFIED] — 署名がない、署名が無効、または未知のキー
受信メッセージは <external_message> タグで囲まれるため、LLM は何が信頼できるかを把握できます。
<external_message from="agent-bob" verified="true" status="verified">
Hey, the research is done. Check shared/findings.md
</external_message>
セキュリティ強化
- A2A ルートでの Bearer トークン認証(subtle crate による定時間比較)
- task.json のファイルロック(flock により、同時書き込みによる破損を防止)
- タスクのガベージコレクション(設定可能な日数が経過した終端タスクを自動削除)
- パストラバーサルをブロック(パスの正規化、
..の反復除去、先頭のドットを拒否) - デーモンのリクエスト本文サイズ制限(1MB)
- SSE ストリームのタイムアウト(30 分、リソース枯渇を防止)
- GC では削除前にパスを正規化(シンボリックリンク経由のトラバーサルを防御)
- PROFILE.md は公開されます。非公開の設定はエージェントの実行環境(CLAUDE.md など)に保持されます
- レジストリのすべての変更エンドポイントにレート制限を適用
- フィンガープリントを紐付けた受信トレイの受信者別サブディレクトリ(名前の不正な占有を防止)
- 配信後に受信トレイのメッセージをアーカイブ(二重送信を防止)
- 送信先がキーリングに登録されている場合のみ送信可能(未知のエージェントへの無確認送信を防止)
- SSH URL を検証(引数インジェクションを防止)
- メッセージのラップ時に XML 値をエスケープ(属性を介したプロンプトインジェクションを防止)
- レート制限、IP フィルタリング、TLS はプロキシ層で処理します — デーモン側では重複して処理しません
エージェント間の通信方法
API もメッセージバスもありません。ファイルだけです。
Agent A: encrypt(msg, B.age_key) → sign(ciphertext, A.ed25519) → outbox/
Sync: outbox/ → [HTTP or rsync] → B's inbox/
Agent B: verify(sig, A.ed25519) → decrypt(ciphertext, B.age_key) → [VERIFIED][ENCRYPTED]
ローカルファイルシステム、GCS バケット(gcsfuse)、S3、または FUSE でマウントできるストレージで動作します。
対応環境
- Claude Code — CLAUDE.md でパスを参照するか、MCP サーバーを使用
- Claude Desktop —
openfuse-mcpを MCP サーバーとして追加 - OpenClaw — ワークスペースにコンテキストストアを配置
- 任意の CLI エージェント — ファイルを読み取れるなら、OpenFused を使用できます
- 任意のクラウド — GCP、AWS、Azure、ベアメタル、ご利用のノート PC
コミュニティ
Discord · GitHub Discussions · 貢献方法
哲学
知性とは、情報が十分に複雑で適切に編成されたシステムを流れるときに生まれるものです。媒体はメッセージではありません。媒体はあくまで媒体です。メッセージとはパターンです。
創設時の哲学の全文はこちら:wearethecompute.md
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。