herdr-mesh
herdr-mesh-safe
MCP-мост с ограниченной областью безопасности для координации агентов разработки в Herdr.
Этот репозиторий — ответвление (fork) runchr-works/herdr-mesh. Он сохраняет вышестоящую интеграцию MCP/Herdr и заменяет неограниченный жизненный цикл терминала семантическими ожиданиями и ограниченными арендой ревьюерами и авторами.
Текущая версия пакета: 0.1.0-safe.13.
Зачем существует этот fork
Оркестратору нужно проверять воркеров, отправлять задачи, ждать результаты и возвращать завершённые мощности. Предоставление этому агенту произвольных терминальных команд, прямой инъекции клавиш или неограниченного удаления панелей создаёт излишние полномочия.
Этот мост предоставляет операции, необходимые координатору, сохраняя следующие инварианты:
никаких команд оболочки от вызывающей стороны и никакого неограниченного выполнения в терминале;
никаких прямых
send-keys;никакого неограниченного удаления панелей, вкладок, рабочих пространств или сессий;
учётные данные контроллера проверяются непосредственно перед промптами моста и запросами жизненного цикла;
каждый промпт удержанному агенту допускается только пока все хранилища жизненного цикла и квитанций передачи заблокированы;
сбор результатов привязан к конкретной арендованной панели и принятому курсору промпта;
автоматическое закрытие требует наблюдения состояния idle/done и неизменного курсора состояния во время захвата вывода;
ревьюер может быть закрыт только через аренду, созданную вместе с ним;
автор запускается только в связанном Git-worktree на незащищённой ветке;
одновременные авторы не могут арендовать пересекающиеся области путей;
освобождение автора сохраняет его ветку, worktree и байты.
Мост — это техническая граница безопасности. Он не решает, авторизованы ли GitHub Issue, спецификация, объявление владения, коммит, слияние, миграция или развёртывание. Координатор и контракт целевого репозитория остаются авторитетными.
Related MCP server: MCP Files
Архитектура
MCP client
│ stdio
▼
herdr-mesh-safe
├── semantic Herdr waits and prompts
├── exclusive controller lease and fence
├── reviewer leases
├── writer lane leases
├── content-free handoff receipts
└── read-only Git preflight
│
▼
Herdr CLI → Herdr socket → managed panes and agentsЗаписи аренды хранятся вне Git с режимом 0600 по пути:
${HERDR_MESH_STATE_DIR:-~/.local/state/herdr-mesh}/reviewer-leases
${HERDR_MESH_STATE_DIR:-~/.local/state/herdr-mesh}/writer-leases
${HERDR_MESH_STATE_DIR:-~/.local/state/herdr-mesh}/adopted-pane-leases
${HERDR_MESH_STATE_DIR:-~/.local/state/herdr-mesh}/controller-leases
${HERDR_MESH_STATE_DIR:-~/.local/state/herdr-mesh}/handoff-receiptsАдаптеры управления
Инструменты авторов требуют внешнего процесса управления, который принимает работу, объявляет владение и фиксирует устойчивые контрольные точки. Прочтите governance integration contract перед включением авторов.
GitHub control-plane example демонстрирует один практический адаптер, использующий Issues, GitHub Project, PR и контрольные точки без содержимого. GitHub — это пример, а не зависимость моста. Полное входное описание инструмента доступно в manifest.json.
Опциональный пакет agent-control-skills предоставляет переиспользуемые инструкции координатора для этой границы управления. Мост не устанавливает эти навыки и не наследует от них полномочия.
Предоставляемые инструменты
Жизненный цикл контроллера
Инструмент | Назначение |
| Получить первое поколение контроллера из управляемой панели Herdr вызывающей стороны. |
| Обновить учётные данные после очистки или перезапуска MCP с той же идентичностью агента. |
| Передать истёкшую аренду после того, как предшественник отсутствует, завершён или заблокирован. |
| Продлить текущее поколение до его истечения. |
| Аннулировать поколение после устойчивой контрольной точки. |
| Просмотреть идентичность контроллера и срок действия, не раскрывая fence-токены. |
Получите или возобновите контроллер проекта перед любой мутацией промпта, ревьюера, автора или очистки. Возвращённые id аренды и fence-токен — это эфемерные полномочия: передавайте их мутирующим инструментам, но не публикуйте в трекере, коммите, журнале или передаче. Инструменты инвентаризации и ожидания, доступные только для чтения, остаются доступными без аренды контроллера. Аренда по умолчанию длится 15 минут и должна продлеваться во время длительных циклов координации. herdr_bridge_status также сообщает о каждой блокировке резервирования как absent, active, stale или indeterminate, не раскрывая PID владельца, id блокировки или учётные данные контроллера. Блокировка на чужом хосте намеренно считается indeterminate; мост не забирает её по догадке о времени жизни.
Координация
Инструмент | Назначение |
| Отправить одному активному арендованному агенту и вернуть устойчивую квитанцию. |
| Отправить промпт и собрать точный результат, привязанный к квитанции. |
| Отправить до восьми независимых промптов и собрать все результаты или первый результат. |
| Собрать одну или несколько ожидающих квитанций без отправки нового промпта. |
| Просмотреть состояние квитанций без содержимого. |
| Явно снять неоднозначный барьер после того, как точный агент устоялся. |
| Просмотреть агентов и их вывод в терминале. |
| Ждать одно точное состояние Herdr. |
| Ждать |
| Ждать, пока первый из до 16 агентов не устоится; отменить проигравшие ожидания. |
| Ждать совпадения вывода панели. |
after_seq в ожиданиях устоявшегося состояния предотвращает удовлетворение нового ожидания терминальным состоянием от более ранней работы. Один длинный MCP-запрос заменяет многократный опрос на стороне клиента; SSE-боковой канал не требуется.
Для арендованного агента допуск промпта сначала требует точной устоявшейся идентичности, затем записывает курсор перед доставкой до отправки. Квитанция связывает панель, имя, тип агента, рабочую директорию, аренду жизненного цикла и курсор. Relay возвращается только после того, как Herdr подтвердит, что эта точная идентичность вошла в состояние working на следующем курсоре. Полученная квитанция — это непрозрачный ключ поиска; она не содержит fence, промпта или вывода. Пока квитанция не завершена, не провалена или явно не отброшена, каждый последующий промпт к этому адресату отклоняется. Аренда, уже находящаяся в состоянии closing или releasing, также отклоняет новые промпты.
Пакетная передача проверяет каждый целевой объект под тем же fence контроллера и резервированиями жизненного цикла перед отправкой любого промпта. Каждый целевой объект пакета должен иметь одну активную удержанную аренду; унаследованные цели без аренды отклоняются. mode=all возвращает результаты в порядке запросов. mode=first отменяет только проигравшие CLI-ожидания; остальные агенты продолжают работать и возвращаются как pendingReceipts. Сбор требует эти токены, ожидает строго после принятого курсора working и повторно считывает идентичность и последовательность после захвата вывода. Вывод более поздней задачи поэтому отклоняется, а не помечается неверно. Завершённая квитанция может быть воспроизведена после сбоя вызывающей стороны только пока её точная устоявшаяся идентичность и курсор всё ещё актуальны. Неоднозначная доставка остаётся блокирующей квитанцией reserved. Оператор может снять её только с помощью herdr_handoff_receipt_abandon, действующих полномочий контроллера и свежего наблюдения, что точный арендованный агент устоялся.
CLI контроллера
herdr-agent-control — это локальный CLI для именованного координатора, уже удерживающего активную аренду контроллера. Запускающая сторона должна задать AGENT_CONTROL_CONTROLLER_ID равным стабильному id этого контроллера в управляемой среде координатора. status и receipts доступны только для чтения и не загружают fence. Мутирующие команды загружают аренду только после сопоставления текущей панели Herdr, имени агента, типа, рабочей директории и происхождения процесса Linux с процессом контроллера, записанным при acquire/resume. Fence никогда не появляется в аргументах или выводе.
herdr-agent-control status
herdr-agent-control receipts
herdr-agent-control ask TARGET -- MESSAGE
herdr-agent-control ask-many --request TARGET=MESSAGE --mode first
herdr-agent-control collect --receipt TOKEN
herdr-agent-control abandon --receipt TOKENask и ask-many используют протокол пакетной передачи, привязанный к квитанциям. collect никогда не отправляет промпт. abandon никогда не останавливает процесс; он только снимает барьер допуска после того, как точный целевой объект наблюдался в устоявшемся состоянии. Аренды контроллера, созданные до введения привязки процесса, должны быть один раз возобновлены, прежде чем мутирующий CLI сможет их использовать. CLI не запускает, не закрывает, не останавливает, не удаляет, не коммитит и не выполняет произвольные терминальные команды.
Текущая аренда контроллера намеренно привязана к именованному агенту в управляемой панели Herdr. MCP-клиенты вне Herdr могут использовать инструменты инвентаризации и ожидания только для чтения, но не могут получить или осуществлять полномочия координации в этой версии. Поддержка внешнего координатора требует отдельной аутентифицированной идентичности вызывающей стороны; она не должна выдавать себя за панель или передавать самообъявленную идентичность. Происхождение процесса — это отказобезопасная привязка вызывающей стороны для кооперативной однопользовательской модели хоста, а не изоляция от враждебного процесса с той же Unix-учётной записью и правом перезаписывать файлы состояния с режимом 0600.
Жизненный цикл ревьюера
Инструмент | Назначение |
| Создать выделенную вкладку ревьюера без фокуса и постоянную аренду. |
| Перечислить аренды ревьюеров. |
| Захватить и закрыть одного ревьюера с совпавшей идентичностью в состоянии idle/done. |
| Выполнить пробный прогон или очистить подходящих арендованных ревьюеров для одного контроллера. |
Идентичность ревьюера включает контроллер, имя и тип агента, панель и рабочую директорию. Панели в состоянии working, blocked, без аренды или с отклонением идентичности сохраняются при наблюдении. Новая вкладка может существовать до того, как её корневая оболочка примет агента; мост повторяет попытки только для точного условия готовности agent_pane_busy в той же арендованной панели в течение ограниченного окна. Прочие ошибки запуска завершаются отказом закрытия.
Для ревьюеров Claude стартовый манифест может передавать явные model и effort; эти значения становятся нативными аргументами Claude CLI после --. Другие типы агентов отклоняют явные аргументы модели, пока у них нет проверенного адаптера провайдера.
Жизненный цикл автора
Инструмент | Назначение |
| Проверить и зарезервировать дорожку автора, ограниченную манифестом, затем запустить его агента в выделенной вкладке. |
| Перечислить аренды дорожек автора. |
| Повторно проверить контрольную точку, захватить вывод и освободить панель. |
Проверка хоста
Инструмент | Назначение |
| Зафиксировать устоявшегося автора, Git-статус и дайджесты worktree без выполнения кода репозитория. |
| Выполнить выбранный фиксированный рецепт: |
| Перечислить записи проверки без содержимого. |
Рецепты верификации — это код из арендованного репозитория. Они выполняются в песочнице Linux Bubblewrap с фиксированными аргументами и без сети. Они не являются границей безопасности против агента, который уже работает под тем же пользователем хоста. Необязательный веб-загрузчик использует закоммиченный lockfile, разрешает загрузку пакетов и отключает скрипты жизненного цикла пакетов. Python-загрузчик может прогревать локальный для запуска кэш uv из явно указанных файлов requirements.lock; каждый lock должен быть обычным файлом, не симлинком, чьи байты совпадают с принятым базовым коммитом и чей полный граф зависимостей имеет SHA-256 хэши. Мост монтирует производную от базовой копию в режиме только для чтения, игнорирует локальную для дорожки конфигурацию uv, отключает сборку из исходников и использует uv pip, не запуская Python, пока доступна сеть. Финальный шлюз остаётся офлайн и использует тот же изолированный кэш. Если хост-резолвер является симлинком за пределами /etc, сетевой загрузчик монтирует только его разрешённый файл в режиме только для чтения; офлайн-шлюзы по-прежнему используют отдельное сетевое пространство имён.
Аренды панелей для устаревших агентов
Устаревшие агенты, созданные вне моста, остаются без владельца, пока координатор не примет их через аренду только для очистки. Принятие проверяет точно указанного агента, панель, вид, рабочую директорию, установившийся курсор состояния, постоянные полномочия и защищённые панели. Оно не предоставляет права владения Git или полномочий на реализацию.
Инструмент | Назначение |
| Классифицирует активных агентов как соответствующих аренде, с изменённой идентичностью или без аренды. |
| Выполняет пробный запуск или завершает неудачную аренду только после подтверждения отсутствия точной панели. |
| Создаёт аренду только для очистки для одного простаивающего/завершённого устаревшего агента. |
| Перечисляет аренды только для очистки. |
| Захватывает и закрывает одну принятую панель после свежего курсора и постоянной контрольной точки. |
Для допуска писателя требуются:
постоянные ссылки на тикет и полномочия, а также принятый SHA-256 дайджест;
абсолютное связанное Git-рабочее дерево, а не основная рабочая копия репозитория;
точная ветка, базовый коммит, HEAD и дайджест Git-статуса;
как минимум одна защищённая ветка, обычно настроенная ветка по умолчанию;
буквальные области владения относительно репозитория без glob-шаблонов и
..;явные заблокированные области;
отсутствие существующего агента Herdr в рабочем дереве;
отсутствие сохранённой аренды для ветки, рабочего дерева, пересекающегося владения или заблокированной области.
Резервирования и освобождения используют атомарную блокировку хранилища. Сбой может намеренно оставить сохранённую резервацию, требующую проверки; хранилище никогда не должно допускать двух писателей только ради автоматического восстановления.
В Linux новые блокировки резерваций включают идентификатор загрузки и время запуска процесса, поэтому перезагрузка или повторно использованный PID распознаются как устаревшие. herdr_bridge_status отображает неоднозначные устаревшие блокировки или блокировки с других хостов как indeterminate; проверяйте их перед любым ручным восстановлением, а не удаляйте по возрасту.
Топология и обнаружение только для чтения
Безопасный профиль также предоставляет инспекцию сессий, панелей, вкладок, рабочих пространств и интеграций только для чтения. Сырые инструменты жизненного цикла остаются отфильтрованными списком разрешений в src/server.ts.
Требования
Linux или macOS с Node.js 18 или новее; для проверки хоста дополнительно требуются Linux и Bubblewrap;
Git;
установленный и запущенный Herdr;
интеграция Herdr для каждого вида агента, которого вы планируете запускать;
MCP-совместимый клиент, такой как Codex, Claude Code или OpenCode.
Проверьте Herdr перед установкой:
herdr status
herdr integration statusУстановите недостающие интеграции, например:
herdr integration install codex
herdr integration install claudeУстановка из исходников
git clone https://github.com/nativestrider/herdr-mesh-safe.git
cd herdr-mesh-safe
npm ci
npm test
npm run buildСкомпилированная точка входа MCP — dist/index.js.
Codex
Добавьте это в ~/.codex/config.toml, используя абсолютный путь к клонированному репозиторию:
[mcp_servers.herdr-mesh]
command = "node"
args = ["/absolute/path/to/herdr-mesh-safe/dist/index.js"]Claude Code
claude mcp add -s user herdr-mesh node /absolute/path/to/herdr-mesh-safe/dist/index.jsOpenCode или другой MCP-клиент
Зарегистрируйте локальный stdio MCP-сервер с именем herdr-mesh:
command: node
arguments: /absolute/path/to/herdr-mesh-safe/dist/index.jsПерезапустите MCP-клиент после установки или после каждого обновления моста. /clear или новый разговор в том же процессе не перезагружают уже запущенный MCP-сервер.
Дополнительное окружение
Переменная | Значение |
| Абсолютный исполняемый файл Herdr, когда |
| Родительский каталог для постоянных хранилищ аренд. |
Процесс MCP должен иметь доступ к тому же сокету Herdr, что и управляемое рабочее пространство. Координатор, уже запущенный внутри Herdr, может использовать CLI Herdr, но мост по-прежнему предоставляет более узкие полномочия, ожидания в событийном стиле и проверенный жизненный цикл.
Как использовать
Пользователи обычно общаются с координатором, а не вызывают имена инструментов.
Ожидание нескольких агентов
Wait for the first active worker to become idle, done, or blocked. Use each
worker's last state-change sequence so an old idle state is not accepted.Координатор использует herdr_agent_wait_any и получает первое конечное состояние и видимый вывод в одном результате.
Запуск внешней проверки только для чтения
Create a leased Claude reviewer in a dedicated tab rooted at the ticket worktree, ask it to review the
exact PR head against Standards and Spec, wait for its result, then reclaim the
reviewer pane if it is idle or done.Ожидаемая последовательность:
herdr_controller_acquireилиherdr_controller_resumeherdr_owned_reviewer_startс арендой/ограждением контроллера и, для Claude, точной моделью/уровнем усилийherdr_relayс той же арендой/ограждением контроллера и сохраните его квитанциюherdr_collect_handoffsс этой квитанциейherdr_owned_reviewer_closeс той же арендой/ограждением контроллера
Запуск дорожки писателя
Сначала координатор проверяет принятый тикет/спецификацию, зависимости, владение, блокировки и порядок интеграции на соответствие постоянному состоянию проекта. Затем он собирает точные локальные свидетельства, включая:
git -C /absolute/worktree rev-parse HEAD
git -C /absolute/worktree status --porcelain=v1 --untracked-files=all | sha256sumОн вызывает herdr_owned_worker_start с этими свидетельствами. Инструмент независимо перечитывает Git, резервирует владение, создаёт выделенную вкладку без фокуса, запускает агента в его корневой панели и проверяет его идентичность перед возвратом активной аренды.
Мост не ограничивает записи в файловую систему объявленными областями. Координатор должен по-прежнему сравнивать итоговые изменённые пути и diff с арендой, тикетом и контрактом репозитория.
Освобождение писателя
Перед освобождением запишите постоянную контрольную точку без содержимого, содержащую текущую ветку, HEAD, дайджест грязного состояния, подтверждение выполнения, блокеры и следующее действие. Затем вызовите herdr_owned_worker_release со ссылкой на контрольную точку и дайджестом, а также со свежим наблюдаемым курсором состояния агента и значениями Git.
Освобождение закрывает только арендованную панель. Оно не коммитит, не делает stash, reset, clean, не удаляет и не изменяет рабочее дерево.
Текущая команда pane close в Herdr не принимает ожидаемое состояние агента или курсор. Поэтому мост непосредственно перед запросом закрытия проверяет идентичность, установившееся состояние, стабильность курсора и полномочия контроллера, но финальная проверка и закрытие Herdr не являются одной атомарной операцией. Не отправляйте ручной промпт Herdr и не используйте эту панель повторно после начала закрытия. Условное закрытие требует поддержки в самом Herdr.
Преднамеренные ограничения
Независимые клоны не принимаются как дорожки писателя в этой версии; используйте связанные Git-рабочие деревья.
Существующие воркеры, созданные до появления аренд, автоматически не принимаются.
Мост не может доказать, что GitHub Issue предоставляет полномочия.
Владение проверяется при допуске и во время финальной координации; это не песочница файловой системы операционной системы.
Ограждение контроллера и проверки курсора предотвращают устаревшие операции моста, но Herdr не объединяет эти проверки атомарно с доставкой промпта или закрытием панели. Прямая активность CLI того же пользователя остаётся за пределами этой границы.
Человеческие диалоги и агенты в состоянии
blockedостаются человеческими решениями.Полномочия на commit, push, PR, merge, развёртывание, миграцию и выполнение остаются за пределами этого моста.
Разработка
npm ci
npm test
npm run build
npm audit --omit=devТесты покрывают контракт аргументов установленного CLI Herdr, ожидания с учётом курсора, ограждение и перехват контроллера, идентичность пакетных аренд, привязку резолвера песочницы, аренды ревьюеров, конфликты владения писателей, защищённые ветки, дайджесты Git-состояния и освобождение с контрольной точкой.
Собранная директория dist/ закоммичена, чтобы клиенты могли запускать мост без TypeScript-тулчейна. Сначала измените исходный код, выполните полный набор команд выше и закоммитьте исходный код, тесты, lockfile и сгенерированный вывод вместе.
Апстрим и лицензия
Основано на runchr-works/herdr-mesh в апстрим-коммите 54adef5. Апстрим остаётся источником универсального MCP-транспорта Herdr и установщика; этот форк отвечает за безопасный список разрешений, семантические ожидания и жизненный цикл аренд.
Лицензировано в соответствии с лицензией MIT. См. LICENSE; уведомление об авторских правах апстрима сохранено.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables secure coordination between multiple LLM agents through authenticated messaging, status updates, and conversation management. Features automatic secret redaction, rate limiting, and audit trails for safe multi-agent collaboration in development environments.MIT
- AlicenseNot gradedqualityCmaintenanceProvides a secure, constrained filesystem workspace for LLM agents to manage files, notes, and code artifacts via stdio or remote HTTP. It features granular access controls, including extension whitelisting, storage quotas, and immutable paths for safe automated file operations.BSD 3-Clause
- AlicenseBqualityCmaintenanceA safety-first MCP operations cockpit for Hermes Agent installations, exposing typed, evidence-producing management primitives.73MIT
- AlicenseCqualityAmaintenanceSecure agent coding runtime for local Git repos with policy enforcement, RBAC, sessions, approval workflow, and sandboxed writes, optionally connectable to ChatGPT via Secure MCP Tunnel.84MIT
Related MCP Connectors
Deny-by-default authority leases for agents wielding real power.
Preflight, approve, and prove consequential agent actions with signed evidence and x402 tools.
Coordinate multiple AI agents over MCP: atomic claims, leases, shared ledger, handoffs, tasks.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nativestrider/herdr-mesh-safe'
If you have feedback or need assistance with the MCP directory API, please join our Discord server