mcpField
O
openfuse-mcp

openfuse-mcp

本地服务
openfused.dev记忆与知识1828 周前更新

关于 openfuse-mcp

openfuse-mcp 为 AI Agent 提供基于普通文件的持久上下文、消息和协作能力,适用于需要跨会话共享状态的 Agent。它结合加密签名消息、对等同步及文件式存储,不依赖专有运行时。

主要功能

  1. 01读写与追加上下文
  2. 02读取和管理 Agent 消息
  3. 03共享文件读写
  4. 04对等节点添加与状态查看
  5. 05加密并签名消息

适用场景

  1. 01在会话结束后保留 Agent 上下文
  2. 02多个 Agent 共享工作空间
  3. 03向其他 Agent 发送可信消息

MCP 相关

它作为 MCP 服务提供 13 个工具,用于读写上下文、档案和共享文件,以及管理收件箱和对等节点。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"openfused": {
"command": "npx",
"args": [
"-y",
"openfused"
]
}
}
}
启动命令npx -y openfused

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmopenfused0.4.2

工具

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

同步会执行三项操作:

  1. 拉取 对等方的 CONTEXT.md、PROFILE.md、shared/、knowledge/,保存到 .peers/<name>/
  2. 拉取 对等方的发件箱,获取发给你的消息(来自 outbox/{your-name}-{fp}/)
  3. 推送 你的发件箱到对等方的收件箱,并将已送达的消息归档到 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_TOKENA2A 路由的 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.jsonGET无A2A Agent 发现
/profileGET无PROFILE.md
/configGET无公钥
/message/sendPOSTBearer创建 A2A 任务
/message/streamPOSTBearer创建任务并建立 SSE 流
/tasksGETBearer列出任务
/tasks/{id}GETBearer获取任务
/tasks/{id}/cancelPOSTBearer取消任务
/tasks/{id}/subscribePOSTBearer通过 SSE 订阅
/tasks/{id}/statusPOSTBearer更新任务状态
/tasks/{id}/artifactsPOSTBearer添加产物
/inboxPOSTEd25519 签名接收签名消息
/outbox/{name}GETEd25519 挑战拉取 Outbox

文件监视

openfuse watch 集成了三项功能:

  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 Agentopenfused serve — 公网 IP是
位于 NAT 后方 + cloudflaredopenfused 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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。