Skip to main content
Glama
volkgg
by volkgg

OpenFused

AIエージェントのコンテキストのためのファイルプロトコル。暗号化、署名、ピアツーピア。

これは何か?

AIエージェントは会話が終わると記憶を失います。コンテキストはチャットウィンドウ、独自のメモリシステム、サイロ化されたクラウドアカウントに閉じ込められています。OpenFusedは、どんなAIエージェントにも永続的で共有可能なコンテキストを提供します——プレーンなファイルを通じて。

ベンダーロックインなし。独自プロトコルなし。ただのディレクトリ規約で、どのモデル、どのクラウドのどのエージェントでも読み書きできます。

Related MCP server: AgentAnycast MCP Server

インストール

インストール前に、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# <!-- validity: 6h --> 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つのことを行います:

  1. ピアの CONTEXT.md、PROFILE.md、shared/、knowledge/ を .peers/<name>/ にプル

  2. ピアの アウトボックスからあなた宛のメッセージをプル(outbox/{your-name}-{fp}/ から)

  3. 自分の アウトボックスをピアのインボックスにプッシュし、配信済みメッセージを outbox/{name}-{fp}/.sent/ にアーカイブ

アウトボックスのレイアウト

アウトボックスは、名前のスコッティングを防ぐために、受信者ごとのサブディレクトリ {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トランスポートは ~/.ssh/config のホスト名を使用します——生のIPは使用しません。

MCPサーバー

任意のMCPクライアント(Claude Desktop、Claude Code、Cursor)が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プロトコル(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チャレンジ

アウトボックスプル

ファイル監視

openfuse watch は3つのことを組み合わせます:

  1. ローカルインボックスウォッチャー — chokidar(Linuxではinotify)でメッセージ到着を即時通知

  2. CONTEXT.mdウォッチャー — ローカル変更を検出

  3. 定期的なピア同期 — すべてのピアから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ルートでのベアラートークン認証(subtleクレートによる定数時間比較)

  • 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、ベアメタル、ラップトップ

コミュニティ

Discord · GitHub Discussions · Contributing

哲学

知性とは、情報が十分に複雑で適切に組織化されたシステムを流れるときに起こることです。媒体はメッセージではありません。媒体は単なる媒体です。メッセージはパターンです。

創設の哲学全文を読む: wearethecompute.md

ライセンス

MIT

Related MCP Connectors

Related MCP Servers