关于 openfuse-mcp
openfuse-mcp 为 AI Agent 提供基于普通文件的持久上下文、消息和协作能力,适用于需要跨会话共享状态的 Agent。它结合加密签名消息、对等同步及文件式存储,不依赖专有运行时。
主要功能
- 01读写与追加上下文
- 02读取和管理 Agent 消息
- 03共享文件读写
- 04对等节点添加与状态查看
- 05加密并签名消息
适用场景
- 01在会话结束后保留 Agent 上下文
- 02多个 Agent 共享工作空间
- 03向其他 Agent 发送可信消息
MCP 相关
它作为 MCP 服务提供 13 个工具,用于读写上下文、档案和共享文件,以及管理收件箱和对等节点。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
13收录的工具列表 · 更新于 3 周前
此工具无需参数。
详细介绍
OpenFused
面向 AI Agent 上下文的文件协议。加密、签名、点对点。
这是什么?
对话结束后,AI Agent 会失去记忆。上下文被困在聊天窗口、专有记忆系统和彼此隔离的云账户中。OpenFused 通过普通文件,为任何 AI Agent 提供持久、可共享的上下文。
不受供应商锁定。没有专有协议。只是一套目录约定,任何云端、任何模型上的任何 Agent 都能读写。
安装
安装前,请先查看 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
Agent 存储:
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
密钥与密钥环
每个 Agent 在初始化时会获得两对密钥:
- 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
订阅与广播
Agent 可以订阅彼此的广播——相当于面向 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] | 未知或不可信 |
消息封装中包含完整上下文,因此简单的 Agent 无需查询密钥环,也能读取信任级别:
<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 使用相同的密钥和格式。
注册表 — Agent 的 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环境变量配置私有注册表 - 默认不受信任 — 注册表会导入密钥,但不会自动将其设为可信
同步
拉取对等方的上下文,为接收邮件拉取其发件箱,并推送自己的发件箱。支持两种传输方式:
# 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
同步会执行三项操作:
- 拉取 对等方的 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} 端点会验证请求者的公钥指纹是否与子目录匹配——抢注名称的人无法拉取发给真实 Agent 的消息。
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
无需运行服务器。无需开放端口。无需配置隧道。消息会留在邮箱中,直到你的 Agent 唤醒并拉取消息。这就是面向 Agent 的电子邮件。
浏览所有已注册的 Agent: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 是 Agent 之间的通信方式。OpenFused 是 Agent 思考的地方。守护进程在 HTTP 与文件之间转换——任何 Agent 都可以通过读取文件来接收任务,通过写入文件来报告进度。不会锁定运行时。
# 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
守护进程有两种模式:
# 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 路由的 Bearer 令牌 |
--gc-days N | 自动删除超过 N 天的终态任务(默认:7) |
--public | 仅开放 PROFILE.md 和收件箱 |
速率限制、IP 过滤和 TLS 应在反向代理层(nginx、Caddy、cloudflared)处理。守护进程专注于应用逻辑。
**隔离:**以专用的非 root 用户运行守护进程,并且只允许其访问存储目录。守护进程只需要对存储目录进行读写,无需其他权限——不需要网络工具、Shell 访问权限或其他文件系统。在 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 Agent 发现 |
/profile | GET | 无 | PROFILE.md |
/config | GET | 无 | 公钥 |
/message/send | POST | Bearer | 创建 A2A 任务 |
/message/stream | POST | Bearer | 创建任务并建立 SSE 流 |
/tasks | GET | Bearer | 列出任务 |
/tasks/{id} | GET | Bearer | 获取任务 |
/tasks/{id}/cancel | POST | Bearer | 取消任务 |
/tasks/{id}/subscribe | POST | Bearer | 通过 SSE 订阅 |
/tasks/{id}/status | POST | Bearer | 更新任务状态 |
/tasks/{id}/artifacts | POST | Bearer | 添加产物 |
/inbox | POST | Ed25519 签名 | 接收签名消息 |
/outbox/{name} | GET | Ed25519 挑战 | 拉取 Outbox |
文件监视
openfuse watch 集成了三项功能:
- 本地收件箱监视器 — 使用 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 Agent | openfused serve — 公网 IP | 是 |
| 位于 NAT 后方 + cloudflared | openfused serve + cloudflared tunnel | 是 |
| Docker Agent | 将存储挂载为卷 | 是 |
| 仅拉取的 Agent | 通过 cron 运行 openfuse sync — 仅出站 | 是 |
| A2A 生态系统 | 使用 --token 的守护进程 — 标准 A2A 接口 | 是 |
安全性
每条消息都经过 Ed25519 签名,并且可以选择使用 age 加密。
- [VERIFIED] [TRUSTED] [ENCRYPTED] — 签名有效、密钥可信、已加密
- [VERIFIED] [SUBSCRIBED] — 签名有效、发送方已订阅
- [VERIFIED] — 签名有效,密钥位于密钥环中
- [UNVERIFIED] — 未签名、签名无效或密钥未知
传入的消息会被封装在 <external_message> 标签中,让大模型知道哪些内容可信:
<external_message from="agent-bob" verified="true" status="verified">
Hey, the research is done. Check shared/findings.md
</external_message>
加固
- A2A 路由使用 Bearer token 身份验证(通过 subtle crate 进行恒定时间比较)
- 对 task.json 进行文件锁定(flock,防止并发写入导致数据损坏)
- 任务垃圾回收(在可配置的天数后自动删除终态任务)
- 阻止路径遍历(规范化路径、迭代剥离
..、拒绝以点开头的路径) - 守护进程请求体大小限制(1MB)
- SSE 流超时(30 分钟,防止资源耗尽)
- GC 在删除前规范化路径(防范符号链接遍历)
- PROFILE.md 是公开的;私有配置保留在你的 Agent 运行时中(CLAUDE.md 等)
- 所有变更端点均对 Registry 进行速率限制
- Outbox 使用按收件人划分的子目录,并绑定指纹(防止名称抢注)
- Outbox 消息在投递后归档(避免重复发送)
- 发送消息要求收件人位于密钥环中(不会盲目发送给未知 Agent)
- 验证 SSH URL(防止参数注入)
- 在消息封装时转义 XML 值(防止通过属性进行提示词注入)
- 速率限制、IP 过滤和 TLS 应由代理层负责 — 守护进程不会重复实现这些功能
Agent 如何通信
没有 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 Agent — 只要能读取文件,就能使用 OpenFused
- 任何云平台 — GCP、AWS、Azure、裸机或你的笔记本电脑
社区
Discord · GitHub Discussions · 贡献指南
理念
当信息流经足够复杂且组织得当的系统时,智能便由此产生。媒介不是信息。媒介只是媒介。信息是其中的模式。
阅读完整的创立理念:wearethecompute.md
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。