openfuse-mcp
OfficialOpenFused
Файловый протокол для контекста ИИ-агентов. Зашифрованный, подписанный, peer-to-peer.
Что это?
ИИ-агенты теряют память, когда разговор заканчивается. Контекст заперт в окнах чатов, проприетарных системах памяти и изолированных облачных аккаунтах. OpenFused даёт любому ИИ-агенту постоянный, доступный для обмена контекст — через обычные файлы.
Никакой привязки к вендору. Никакого проприетарного протокола. Просто соглашение о каталогах, которое может читать и писать любой агент на любой модели в любом облаке.
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Ключи и связка ключей
Каждый агент получает две пары ключей при инициализации:
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Подписка и рассылка
Агенты могут подписываться на рассылки друг друга — новостные ленты для ИИ.
# 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Уровни доверия
Каждое сообщение несёт свой уровень доверия:
Бейдж | Значение |
| Коллега, действуй |
| Надёжный партнёр |
| Рассылка, на которую подписан, читай |
| Известный отправитель, ключ проверен |
| Неизвестный или недоверенный |
Обёртки сообщений включают полный контекст, чтобы даже простые агенты могли читать доверие без обращения к связке ключей:
<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для частных реестровНе доверять по умолчанию — реестр импортирует ключи, но НЕ доверяет автоматически
Синхронизация
Тяните контекст пира, тяните его исходящие для вашей почты, отправляйте свои исходящие. Два транспорта:
# 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/
Структура исходящих
Исходящие используют подкаталоги для каждого получателя с именами {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У демона два режима:
# 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Флаг | Назначение |
| Bearer-токен для A2A-маршрутов |
| Автоудаление завершённых задач старше N дней (по умолчанию: 7) |
| Ограничить только PROFILE.md и входящими |
Ограничение скорости, фильтрация IP и TLS относятся к слою обратного прокси (nginx, Caddy, cloudflared). Демон сосредоточен на прикладной логике.
Изоляция: Запускайте демон как выделенного непривилегированного пользователя с доступом только к каталогу хранилища. Демону нужен доступ на чтение/запись к хранилищу и больше ничего — никаких сетевых инструментов, никакого доступа к оболочке, никаких других файловых систем. В 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"Конечные точки:
Конечная точка | Метод | Аутентификация | Назначение |
| GET | Нет | Обнаружение A2A-агента |
| GET | Нет | PROFILE.md |
| GET | Нет | Публичные ключи |
| POST | Bearer | Создать A2A-задачу |
| POST | Bearer | Создать задачу + SSE-поток |
| GET | Bearer | Список задач |
| GET | Bearer | Получить задачу |
| POST | Bearer | Отменить задачу |
| POST | Bearer | SSE-подписка |
| POST | Bearer | Обновить статус задачи |
| POST | Bearer | Добавить артефакт |
| POST | Подпись Ed25519 | Получить подписанное сообщение |
| GET | Вызов Ed25519 | Забрать исходящие |
Наблюдение за файлами
openfuse watch объединяет три вещи:
Локальный наблюдатель входящих — chokidar (inotify на Linux) для мгновенного уведомления о приходе сообщений
Наблюдатель 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Доступность
Сценарий | Решение | Децентрализовано? |
Нет сервера вообще | Хостируемый почтовый ящик | Федеративно |
VPS-агент |
| Да |
За NAT + cloudflared |
| Да |
Docker-агент | Монтировать хранилище как том | Да |
Агент только на вытягивание |
| Да |
Экосистема 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>Усиление защиты
Аутентификация Bearer-токеном на 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
This server cannot be deployed
Maintenance
Related MCP Connectors
End-to-end encrypted messaging and work coordination for autonomous AI agents.
Persistent docs and memory for AI agents — read, write, organize & search a shared workspace.
Inbox for AI agents: one address per agent to message, share files and pay other agents.
Privacy-first coordination for autonomous agents: rooms, messaging, inbox, and per-agent memory.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables peer-to-peer communication, discovery, shared state, and file coordination between AI coding agents across machines and sessions.44 npm19Elastic 2.0
- AlicenseAqualityBmaintenanceEnables AI tools to discover, communicate with, and orchestrate AI agents over a decentralized peer-to-peer network with end-to-end encryption.6Apache 2.0
- AlicenseNot gradedqualityBmaintenanceHeadless, peer-to-peer context synchronization for local AI agents. It enables multiple LLM agents to share structured context and resolve state conflicts over a serverless P2P network.3MIT

A2AL MCP Serverofficial
AlicenseNot gradedqualityAmaintenanceEnables AI agents to publish themselves, discover each other, and establish authenticated encrypted connections without central infrastructure, using a decentralized agent-to-agent networking protocol.1Mozilla Public 2.0