Skip to main content
Glama

hermes-dsh-bridge

Специализированный MCP-плагин — мост Hermes ↔ DeepSeek Harness: поднимает MCP-сервер внутри Harness, чтобы внешние MCP-клиенты (например, Hermes) могли управлять агентом Harness для настоящей кодинг-работы.

Hermes — мозг, Harness — руки.

license node CI

Зачем это нужно

В Harness уже есть мощный агентный рантайм (инструменты, LLM, агенты, сессии), но это Cordis-приложение — другие агенты им не управляют. Этот плагин выворачивает Harness наизнанку: запускает внутри Harness настоящий MCP-сервер (StreamableHTTP), связывая ядро Harness (ctx.agents / ctx.agentPresets / ctx.tools) и позволяя внешнему «мозгу» раздавать настоящую работу «рукам» Harness.

Hermes (MCP client, 大脑)
   │  agent_run / task_inbox / fs_read / session_stats ... (HTTP)
   ▼
harness-mcp-server (MCP server, :8090)
   │  ctx.agents.create → mount 'standard' preset
   ▼
Harness agent — 完整工具集: bash, fs, todo, web…

Related MCP server: dsh

Инструменты (19)

Задачи

Инструмент

Направление

Назначение

agent_run

→ Harness

Синхронно выполняет задачу; возвращает структурированный результат + статистику stats за этот проход

task_inbox

→ Harness

Помещает структурированную задачу (задача + контекст памяти + cwd) в асинхронную очередь

task_result

← Harness

Возвращает структурированный результат задачи из очереди

task_list

← Harness

Снимок очереди асинхронных задач (id/status/createdAt/error)

Сессии

Инструмент

Направление

Назначение

session_list

←

Показывает список сессий (live и сохранённые объединены), по каждой строке — сводка расхода token/LLM

session_log

←

Читает журнал событий сессии (reasoning вырезан), последние N записей, фильтр по типу

session_stats

←

Статистика сессии: rounds/steps/llmTime/toolTime/ttft/tokensPerSec/cacheHitRate/inputTokens/outputTokens

rename_session

←

Переименовать сессию (удобнее различать при архивировании)

attach_session

←

Привязать сессию к рабочей области

Файлы (под ограничением path jail)

Инструмент

Направление

Назначение

fs_read

←

Читает текстовый файл (постранично с номерами строк; path jail + чёрный список чувствительных имён)

fs_list

←

Список содержимого каталога (рекурсивно на depth уровней, чувствительные элементы скрываются автоматически)

fs_stat

←

Метаданные файла/каталога

fs_write

→

Запись файла (overwrite/append/create-new) — opt-in (регистрируется только при enableFsWrite: true), только в workspaceRoots

Статус и конфигурация

Инструмент

Направление

Назначение

status_get

←

Версия/uptime/provider/model/preset/активные агенты/глубина очереди

config_get

←

Сводка конфигурации времени выполнения (authToken маскируется как ***)

Пресеты

Инструмент

Направление

Назначение

preset_list

←

Список доступных пресетов агента + пресет по умолчанию

preset_get

←

Какой пресет фактически действует в сессии (или по умолчанию)

preset_set

→

Меняет пресет по умолчанию (scope=new-default) или пресет пустой сессии (scope=session)

Мета

Инструмент

Направление

Назначение

echo

—

Проверка MCP-соединения

harness_list_tools

—

Список имён инструментов, зарегистрированных внутри Harness

Структурированный результат и статистика

Каждый agent_run возвращает структурированный результат и статистику расхода за этот проход:

{
  "sessionId": "...",
  "assistantText": "最终回答",
  "toolCalls": [{ "name": "bash", "args": "..." }],
  "toolResults": ["命令输出"],
  "changes": "改了什么",
  "verification": "怎么验证的",
  "leftovers": "遗留问题",
  "stats": {
    "rounds": 1, "steps": 3,
    "llmTime": 13.9, "toolTime": 0.04,
    "ttft": 3349, "tokensPerSec": 40.7,
    "cacheHitRate": 1, "inputTokens": 8831, "outputTokens": 157
  }
}

Замкнутый контур: клиент передаёт память как context в каждую задачу, результат (changes/verification/leftovers) снова сохраняется в память клиента для следующего раунда.

Установка

Способ A — установка в профиль Harness из npm

# 在 Harness profile 的 node_modules 下
cd ~/.dsh/profiles/<你的profile>/node_modules
npm install hermes-dsh-bridge

Способ Б — сборка из исходников

git clone https://github.com/Emilia-awa/hermes-dsh-bridge.git
cd hermes-dsh-bridge
npm install && npm run build   # 产出 lib/index.js
# 把构建产物放进 Harness profile:
#   ~/.dsh/profiles/<你的profile>/node_modules/hermes-dsh-bridge

⚠️ dual-package hazard (обязательно к прочтению): Harness подключает @deepseek-ai/* из глобального дерева, а в node_modules самого плагина могут оказаться параллельные копии — два экземпляра модуля ⇒ Symbol не совпадает ⇒ агент незаметно лишается всех инструментов (проявляется тем, что agent_run печатает лишь текст <tool_calls>, а toolCalls всегда пуст). Исправление: симлинк @deepseek-ai/*-зависимостей плагина на глобальное дерево Harness:

PROFILE=~/.dsh/profiles/<你的profile>/node_modules
GLOBAL=$(npm root -g)/@deepseek-ai/dsh/node_modules/@deepseek-ai
for pkg in cordis cosmokit dsh-agent dsh-llm dsh-session dsh-tools dsh-scope \
           dsh-agent-presets dsh-code-runtime dsh-system-prompt dsh-typert-protocol \
           dsh-attachment dsh-brand dsh-invariants dsh-timeout dsh-settings \
           dsh-home-paths dsh-atomic-write dsh-user-approval \
           cordis-plugin-include cordis-plugin-loader; do
  rm -rf "$PROFILE/@deepseek-ai/$pkg" && ln -sfn "$GLOBAL/$pkg" "$PROFILE/@deepseek-ai/$pkg"
done

(cordis-plugin-include/loader не опубликован в npm registry и существует только в глобальном дереве Harness — симлинк обязателен.)

Patch-конфигурация

Добавьте в конец файла cordis.patch.yml вашего профиля Harness (или эквивалентного patch-файла):

- insert:
    - id: hermes-dsh-bridge
      name: 'hermes-dsh-bridge'
      config:
        http: true
        port: 8090
        host: 127.0.0.1        # 默认仅本机; 暴露前必须加认证
        # authToken: '你的随机长token'     # 可选: Bearer token 认证
        # workspaceRoots: ['/workspace']  # 可选: cwd 白名单
        # enableFsWrite: true             # 可选: 开启 fs_write(默认关)
        # ⚠️ 必须显式声明 provider/model, 否则 agent 组装会因空 {{model}} 崩溃:
        provider: opencode-go
        model: deepseek-v4-flash

Перезапуск и проверка

systemctl restart dsh.service        # 或你管理 Harness 的方式
# 验证 19 个工具全在线:
python3 examples/hermes_dsh_mcp.py list
python3 examples/hermes_dsh_mcp.py call status_get '{}'

🤖 Инструкция по установке в один клик для ИИ (для AI-агента)

Приведённые шаги рассчитаны на другого AI-агента: если вы AI-агент и устанавливаете этот плагин в управляемую вами среду Harness, строго выполняйте пронумерованные шаги ниже и после каждого шага сверяйте вывод перед продолжением.

Предварительные проверки (сначала эти 3 шага)

  1. Если Node ≥ 22.18: node --version (при 22.18 ниже упадёт zstd/stripTypeScriptTypes — сначала обновите Node).

  2. Проверьте, что целевой профиль Harness существует: ls ~/.dsh/profiles/ (название профиля ниже обозначено как <PROFILE>).

  3. Проверьте, что глобальное дерево Harness существует: npm root -g (ниже $GLOBAL_TREE заменяет npm root -g).

Шаги установки (можно копировать и запускать)

# ① 安装插件到 profile
cd ~/.dsh/profiles/<PROFILE>/node_modules
npm install hermes-dsh-bridge        # 未发布到 npm 前用方式 B(源码)

# ② 修复 dual-package hazard: 把所有 @deepseek-ai/* 和 cordis-plugin-* symlink 到全局树
GLOBAL_TREE=$(npm root -g)/@deepseek-ai/dsh/node_modules/@deepseek-ai
for pkg in cordis cosmokit dsh-agent dsh-llm dsh-session dsh-tools dsh-scope \
           dsh-agent-presets dsh-code-runtime dsh-system-prompt dsh-typert-protocol \
           dsh-attachment dsh-brand dsh-invariants dsh-timeout dsh-settings \
           dsh-home-paths dsh-atomic-write dsh-user-approval \
           cordis-plugin-include cordis-plugin-loader; do
  rm -rf "@deepseek-ai/$pkg" 2>/dev/null
  ln -sfn "$GLOBAL_TREE/$pkg" "@deepseek-ai/$pkg"
done

# ③ 在 profile 的 cordis patch 文件(cordis.patch.yml)末尾追加配置
cat >> ~/.dsh/profiles/<PROFILE>/cordis.patch.yml <<'EOF'
- insert:
    - id: hermes-dsh-bridge
      name: 'hermes-dsh-bridge'
      config:
        http: true
        port: 8090
        host: 127.0.0.1
        provider: opencode-go      # ← 换成你自己的 provider id
        model: deepseek-v4-flash   # ← 换成你自己的 model id
EOF

# ④ 重启 Harness(注意: 若你正跑在 Harness 里, 用 systemd-run 脱离进程树重启)
systemctl restart dsh.service

# ⑤ 验证: 等 8 秒后检查 MCP server 起来 + 工具列表
sleep 8
curl -s -X POST http://127.0.0.1:8090/mcp \
  -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"ai-setup","version":"1.0"}}}' \
  | tail -1 | head -c 300
python3 examples/hermes_dsh_mcp.py list | grep -cE "agent_run|session_stats|preset_set"   # 期望 ≥ 3

Критерии приёмки

  • dsh_mcp.py list выводит ≥ 19 инструментов, среди них обязательно agent_run, session_stats, preset_set, fs_read.

  • У status_get параметр version в ответе равен 0.3.0, а provider/model — значения из вашей конфигурации.

  • Прогоните пробную задачу: python3 examples/hermes_dsh_mcp.py run '回复:安装成功' — ответ содержит поле stats.

Типовые сбои и действия (смотреть, когда столкнётесь)

Симптом

Причина

Как исправить

agent_run Отдали текст, а toolCalls всегда пуст

dual-package hazard, symlink откат после npm install

Повторить symlink шага ② и перезапустить

При запуске ошибка prompt variable "{{model}}" has no value

в patch не указан provider/model

Дописать provider/model из шага ③

MISSING_CREDENTIAL: <provider>

API-ключ не попал в окружение (env) процесса Harness

в systemd unit добавить Environment=KEY=... или export

Cannot find package '@deepseek-ai/cordis-plugin-include'

в шаге ② пропущены cordis-plugin-*

Досимлинковать оба пакета

Версия та же, но поведение старой

в системе два глобальных npm-дерева, установлено не в то

which dsh + npm prefix -g — смотрите, unified с реально используемым деревом

Полное руководство по устранению — docs/TROUBLESHOOTING.md.

Документация

  • docs/TOOLS.md — полный справочник по 19 инструментам (вход/выход/лимиты/коды ошибок)

  • docs/CONFIG.md — поля конфигурации и безопасные значения по умолчанию

  • docs/TROUBLESHOOTING.md — известные грабли (SSE-разбор, 8KБ-бобрезка, dual-package hazard…)

  • docs/SECURITY.md — threat model

  • examples/hermes_dsh_mcp.py — MCP-клиент на Python из нуля зависимостей (только стандартная библиотека).

Позиционирование

Подходит как запасной инструмент, а не как главный каждый день: чтобы править код, запускайте своего основного Агента каждый день. Когда нужна изоляция контекста (большой рефакторинг выжжет клиентский контекст) или параллельное выполнение независимых задач — тогда за этим плагином.

  • Сессии агента переиспользуются на основе cwd (не пере-загружается контекст проекта при каждом вызове).

  • Bash изолируется в песочницу (workspace-write): на хосте должен быть установлен bubblewrap, иначе команды записи будут отклонены.

  • Блоки reasoning/thinking вырезаются перед возвратом (двойная защита: на стороне плагина + текстовая фильтрация на уровне текста).

License

GPL-3.0-only, части MIT от вышестоящих компонентов сохранены — см. NOTICE.md.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Exposes DeepSeek Harness agent capabilities as an MCP server, letting any MCP client drive Harness to execute real coding tasks with structured results, context isolation, and parallel execution.
    62 npm
    13
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Lets any MCP-capable coding harness (Cursor, Claude Code, Codex, Gemini CLI, VS Code/Copilot, opencode, and others) hand a self-contained task to a real, isolated DeepSeek Harness process that works in a chosen workspace with its own context window, model, and toolchain, then returns the final answer. Exposes task submission with time estimates and acceptance criteria, status polling with live progress and process-tree telemetry, graceful cancel and forced kill of whole process trees, and a health probe reporting concurrency, deadlines, and recent jobs.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Lets Claude Code, Codex, or any MCP client drive DeepSeek Harness as a long-lived coding agent: starting and resuming conversations, dispatching tasks in the background, streaming live output and reasoning stats, interjecting or interrupting mid-turn, handling approval prompts, and collecting results later. Sessions persist by ID, so work survives process restarts and can be handed back to a DSH GUI when needed.
    325 npm
    15
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Exposes a running DeepSeek Harness as an MCP endpoint so any other agent or script can create workspaces and sessions, hand coding tasks to the DSH agent, read and write files, run shell commands, and invoke permitted harness tools under the same sandbox, transcript, and permission policy as the DSH UI.
    290 npm
    6
    MIT