by Mr-potato-123 (community) Claude Desktop, Claude Code, OpenCode, любой MCP-клиент, Windows 11, DeepSeek-flash
DSH как MCP — делает Claude Code, Codex и подобные агенты быстрее, мощнее и экономичнее.
Плагин DeepSeek Harness (DSH): диспетчеризация задач DSH-агентам из Claude Code / Codex — нативный прогресс субагентов, …
Open-source control plane и runtime для организационных агентов: общий контекст компании, изолированное выполнение, approvals и MCP.
Git-based control plane для навыков, инструментов, контекста, прав доступа и идентичности AI-агентов. Self-hosted, MCP-native.
Позволяет чату напрямую диспетчеризовать и контролировать локальные Codex / DSH: не нужно вручную переносить промпты и …
cd dsh-mcp npm install npm run build # → dist\index.js # register in your MCP client (Claude Code shown as example) claude mcp add dsh ` --transport stdio ` --env DEEPSEEK_API_KEY=sk-... ` -- node D:\path\to\dsh-mcp\dist\index.js claude mcp list # confirm "dsh" is listed
Инструменты агентного кодинга дороги и медленны по одной причине: родительская модель
читает файлы по одному. dsh-mcp переворачивает это — родительский агент сохраняет
рассуждение, локальный DeepSeek Harness выполняет тяжёлую работу: пакетное чтение,
редактирование и запуск команд по тарифам deepseek-v4-flash, на вашей машине.
Работает с любым MCP-клиентом · протестирован End-to-End с Claude Code
Боль. Долгие задачи с множеством файлов — это то, где агентные инструменты
сжигают деньги и время: родительская модель сама перемалывает каждый файл — одно
Read на файл, циклы исследования, контекст, который растёт и дрейфует. Вы платите
по тарифам родительской модели за чтение и ждёте, пока модель делает это
последовательно.
Решение. Один вызов delegate_to_dsh передаёт всю токено-тяжёлую подзадачу
свежему, сфокусированному агенту DeepSeek Harness, работающему на
deepseek-v4-flash внутри вашего рабочего пространства. Весь файловый ввод-вывод
происходит там — пакетно, локально, дёшево. Родитель остаётся в цикле для того,
что действительно требует мозга: планирование, диагностика, решения, верификация.
Измерено на 100 долгих задачах в стиле SWE-bench (гетерогенная конфигурация моделей: родитель = deepseek-v4-pro, DSH = deepseek-v4-flash; ветка B запускает ту же родительскую модель без плагина):
с dsh-mcp |
чистый агент | |
|---|---|---|
| Точность | 100/100 · 100% | 89/100 · 89% |
| Среднее время выполнения | 76с | 120с |
| Статистическая значимость | — | Fisher p < 0.001 |
Быстрее, точнее — и разрыв в точности теперь статистически значим (p = 3.7×10⁻⁴ при n=100), а не просто направленный. Дорогое чтение теперь выполняется на deepseek-v4-flash. Полный отчёт · Воспроизвести

Промпт, использованный для генерации этого изображения, находится в
docs/architecture-image-prompt.md.
%USERPROFILE%\.dsh).process.execPath + явный argv, shell: false — никаких
багов с кавычками, никаких .cmd-обёрток, пробелы в путях просто работают.Шаг 1 — соберите один раз
cd dsh-mcp
npm install
npm run build # → dist\index.js
Шаг 2 — зарегистрируйте в вашем MCP-клиенте (Claude Code показан как пример)
claude mcp add dsh `
--transport stdio `
--env DEEPSEEK_API_KEY=sk-... `
-- node D:\path\to\dsh-mcp\dist\index.js
claude mcp list # confirm "dsh" is listed
Это стандартный MCP-сервер — тот же dist\index.js также работает с
OpenAI Codex, Cursor, VS Code и любым другим MCP-клиентом (см.
Развёртывание).
Шаг 3 — перезапустите Claude Code, затем сделайте первое делегирование
Claude Code загружает MCP-серверы при запуске, поэтому перезапустите его внутри любого проекта. Затем просто попросите обычными словами:
Пусть DSH прочитает README.md и package.json этого проекта и сообщит название проекта и первый абзац README. Не читай файлы сам — делегируй всё.
Вы увидите, как Claude вызывает delegate_to_dsh, и ответ вернётся через
секунды. DSH работает в вашем корне проекта — никогда в каталоге dsh-mcp.
delegate_to_dshне появляется? Выполнитеclaude mcp listснова — если сервер не запустился, он сообщит об ошибке там. Перейдите к Устранению неполадок.
100 долгих задач с множеством файлов в двух партиях (01–50: исправление багов, рефакторинг, миграции, реализация по спецификации, разработка через тесты, аудит; 51–100: harder — глубокие потоки данных, асинхронные гонки, конечные автоматы, парсеры, кэши, межпроцессное состояние) · автоматизированная проверка эталонных результатов (выполнение утверждений + проверка stdout; чистые фикстуры должны падать, эталонные исправления должны проходить) · гетерогенная настройка моделей: родитель = deepseek-v4-pro на обеих ветках, DSH = deepseek-v4-flash на ветке A · полный отчёт:
tests/bench/bench-report.md· примечание к эксперименту: Claude Code в этом бенчмарке работает на ядре deepseek-v4-pro (настраивается через переменную окруженияANTHROPIC_MODEL) — родитель — это модель DeepSeek, а не Anthropic, на обеих ветках. Таким образом, разница заключается именно в плагине: один и тот же родитель DeepSeek, сdsh-mcpи без него · набор данных:tests/bench/tasks.mjs
с dsh-mcp |
чистый агент | |
|---|---|---|
| Точность | 100/100 · 100% | 89/100 · 89% |
| Среднее время выполнения | 76.5с | 120.2с |
| Общее время выполнения | 7647с | 12019с |
| Сбои | 0 | 11 |
О чём говорят цифры
Воспроизведение:
DEEPSEEK_API_KEY=sk-... node tests\bench\run-bench.mjs AB 01-50 # both arms, 100 tasks
DEEPSEEK_API_KEY=sk-... node tests\bench\run-bench.mjs AB 51-100 # (range filter)
DEEPSEEK_API_KEY=sk-... node tests\e2e-headless.mjs # real E2E (A/B/C/D)
DEEPSEEK_API_KEY=sk-... node tests\long-horizon-e2e.mjs # multi-delegation loop
Ключи попадают только во временный
mcp.jsonвнутри песочницы и удаляются при выходе — никогда не записываются в репозиторий и не выводятся.
Одно семейство инструментов, разделённое по ответственности, чтобы родительский агент выбирал по намерению (имя инструмента + описание — это входные данные для решения модели):
| Инструмент | Используйте для | Ограничение |
|---|---|---|
delegate_to_dsh |
общие самодостаточные задачи | нет — всё зависит от текста вашей задачи |
dsh_investigate |
анализ только для чтения: чтение файлов, трассировка потоков вызовов, «найти, где используется X» | агенту запрещено изменять файлы или выполнять команды с побочными эффектами |
dsh_fix |
изменение кода: исправление ошибок, рефакторинг, миграции, хорошо специфицированные реализации | агент проверяет (если задача указывает проверку) и перечисляет каждый изменённый файл |
dsh_execute |
выполнение команд: тестовые наборы, скрипты сборки, запросы окружения | агент сообщает полный вывод + код возврата, не трогает исходные файлы |
dsh_status |
диагностика окружения: разрешение DSH, версия CLI, конфигурация модели, таймаут, наличие ключа | нет дочернего процесса DSH, не требуется API-ключ |
Все инструменты делегирования используют одну схему: task (обязательно), cwd (необязательно),
timeoutMs (переопределение DSH_MCP_TIMEOUT_MS для конкретного вызова) и trackChanges
(по умолчанию true).
Отслеживание изменений — у чёрного ящика появляется хвост. Безголовый CLI DSH
возвращает только своё финальное сообщение: ни диффа, ни списка файлов. Поэтому каждое делегирование
создаёт снимки вашего рабочего пространства до и после и добавляет блок [mcp] к результату,
чтобы родитель мог видеть, что делегирование реально затронуло:
<DSH final output>
[mcp] exitCode: 0
[mcp] durationMs: 45210
[mcp] cwd: D:\workspace\foo
[mcp] changedFiles: 2
[mcp] M src/store.js (modified)
[mcp] A src/store.test.js (added)
Используйте trackChanges: false (или DSH_MCP_TRACK_CHANGES=0), чтобы пропустить снимки на
очень больших репозиториях. Каталоги зависимостей/сборки (node_modules, .git,
dist, build, coverage, …) и скрытые каталоги всегда исключаются.
Ограничения категорий обеспечиваются шаблонами задач, а не CLI — в безголовом режиме DSH нет флага «только чтение». Отслеживание изменений — это страховка: если
dsh_investigateвсё же что-то изменил, список[mcp] changedFilesраскрывает это, и родитель может сам проверить файлы.
dsh-mcp — это стандартный MCP-сервер stdio. Любой клиент, поддерживающий MCP, может
Разместите его — Claude Code, OpenAI Codex, Cursor, VS Code, Claude Desktop или ваш
собственный инструментарий. Сервер и семейство инструментов dsh идентич everywhere;
отличается только шаг регистрации. Claude Code — это клиент, который мы проверили
end-to-end.
claude mcp add dsh `
--transport stdio `
--env DEEPSEEK_API_KEY=sk-... `
-- node D:\path\to\dsh-mcp\dist\index.js
claude mcp list
Codex загружает MCP-серверы из своего конфига в %USERPROFILE%\.codex\config.toml
(на уровне проекта: .codex\config.toml). Добавьте:
[mcp_servers.dsh]
command = "node"
args = ["D:\\path\\to\\dsh-mcp\\dist\\index.js"]
env = { DEEPSEEK_API_KEY = "sk-..." }
Перезапустите codex и просто попросите — например: «Используй инструмент dsh_investigate, чтобы прочитать
README и package.json и сообщи название проекта». Codex не видит внутренности
DSH (это чёрный ящик для хоста), именно поэтому каждый
делегированный вызов возвращает блок [mcp] changedFiles — родитель узнаёт, что
затронула делегация, даже если хост — не Claude Code.
Укажите вашему клиенту на dist\index.js с теми же переменными окружения. Большинство клиентов
принимают JSON-блок mcpServers (конфиг уровня проекта Claude Code, Cursor
mcp.json, VS Code, Claude Desktop, …):
{
"mcpServers": {
"dsh": {
"command": "node",
"args": ["D:\\path\\to\\dsh-mcp\\dist\\index.js"],
"env": { "DEEPSEEK_API_KEY": "sk-..." }
}
}
}
Не коммитьте ключ. Скрипты автоматизации удаляют свой временный конфиг перед завершением работы.
DSH находится ровно в четырёх местах, проверяемых по порядку — сервер никогда
не смотрит на PATH:
DSH_ROOT — явное переопределение, побеждает безусловно..\deepseek-harness.\deepseek-harness%USERPROFILE%\.dsh\profiles\node_modules\@deepseek-ai\dsh
(DSH_HOME переопределяет домашний каталог)Таким образом, вы можете установить DSH где угодно — соседний checkout, отдельный
каталог инструментов, другой диск — и указать DSH_ROOT на него. Подходит любой
вариант: исходный checkout (сначала соберите его CLI: pnpm install && pnpm run build)
или установленный CLI-пакет (<root>\lib\bin.js). Всё, что находится за пределами этих четырёх
мест, просто не обнаруживается; сообщение об ошибке подскажет вам задать
DSH_ROOT.
# register with a DSH that lives in your own directory
claude mcp add dsh `
--transport stdio `
--env DEEPSEEK_API_KEY=sk-... `
--env DSH_ROOT=D:\tools\deepseek-harness `
-- node D:\path\to\dsh-mcp\dist\index.js
| Переменная | Значение |
|---|---|
DEEPSEEK_API_KEY |
Обязательно. Передаётся в DSH через окружение. |
DSH_ROOT |
Необязательно. Указывает на checkout DSH / установленный CLI. |
DSH_HOME |
Необязательно. Домашний каталог DSH (по умолчанию %USERPROFILE%\.dsh). |
DSH_MCP_TIMEOUT_MS |
Необязательно. Таймаут дочернего процесса; не задано = нет таймаута. |
DSH_MCP_DEBUG=1 |
Диагностика в stderr ([dsh-mcp] dshRoot=... cli=...). |
| Симптом | Исправление |
|---|---|
Unable to locate DeepSeek Harness |
Задайте DSH_ROOT или установите DSH CLI (npx @deepseek-ai/dsh) |
CLI build artifact is missing |
В checkout DSH: pnpm install && pnpm run build |
DEEPSEEK_API_KEY is not configured |
Добавьте заново с --env DEEPSEEK_API_KEY=..., перезапустите Claude Code |
| Не тот workspace | Порядок разрешения: cwd инструмента → CLAUDE_PROJECT_DIR → MCP_WORKSPACE_DIR → cwd сервера |
| Делегация падает, непонятно почему | Сначала запустите dsh_status — он сообщает о разрешении DSH, версии CLI, конфигурации модели, таймауте и наличии клю |
Каждый инструмент делегирования принимает один аргумент task (см. Tools для
полного семейства). Каждый вызов порождает нового DSH-агента, который работает в
вашем рабочем пространстве проекта и возвращает свой конечный результат. У DSH нет памяти
между вызовами — это задумка (нет сеанса, который можно повредить) — и он устанавливает
одно главное правило:
Делайте каждую делегацию самодостаточной. Дайте DSH всё, что нужно подзадаче: пути к файлам, контекст, ожидаемый результат. Никогда не пишите «как выше», «как раньше» или «тот файл, о котором я упоминал ранее» — DSH не видит вашу переписку.
Одна и та же задача, написанная двумя способами:
❌ "Fix the bug in the store module and verify."
— Which module? What bug? Verify how? DSH has no memory of "the" bug.
✅ "In src/store.js, createOrder() (around line 42) computes the order total
without the tax field. Fix it so the total includes tax. Then run
node src/tests/order.test.js and report the output."
— Self-contained: file, bug, expected behavior, verification command.
1. Исследование — DSH читает файлы, родитель читает отчёт
Read src/modules/a.js, b.js and c.js and report: (1) every exported
function signature, (2) all TODO/FIXME comments with line numbers,
(3) where each module is imported from. Don't modify anything.
2. Исправление + проверка — родитель решает, DSH выполняет и проверяет
In src/utils.js, slugify(" hello ") returns "hello " instead of "hello"
(leading whitespace leaks through). Fix it, then run
node src/test/utils.test.js and report which assertions pass.
3. Пакетное редактирование — одна делегация вместо N циклов чтение/правка
Across the project, replace every occurrence of config.port with
config.serverPort in all .js files (skip node_modules). List each file
you changed, one line per file.
| Делегировать (много токенов, самодостаточно) | Оставить у родителя (нужен контекст) |
|---|---|
| Прочитать и резюмировать N файлов | Взвешивание двух архитектур |
| Многофайловый переименование / миграция / рефакторинг | Решение, что строить дальше |
| Запустить набор тестов / скрипт и сообщить вывод | Отладочный диалог, который развивается |
| Реализовать чётко специфицированную функцию | Всё, чья цель ещё неясна |
| ### Как выглядит делегирование в сессии |
You: The login flow is broken. Have DSH trace login.js → session.js → db.js
under src/auth/ and report where an error could be swallowed, with
line numbers. Don't read the files yourself.
DSH: Found it: src/auth/session.js:37 catches the error and returns null
instead of rethrowing, so login.js treats the failure as "not logged
in". Three files read, nothing modified.
Быстрота и дешевизна обеспечиваются моделью на стороне DSH: deepseek-v4-flash.
Ранняя разработка полностью велась на flash (и родитель, и DSH); приведённый выше
бенчмарк на 100 задач использует гетерогенную комбинацию родитель = deepseek-v4-pro[1m],
DSH = deepseek-v4-flash (рука B использует того же родителя pro без плагина,
поэтому разница обусловлена именно плагином). Ядро Claude Code в бенчмарке — это
модель DeepSeek: ANTHROPIC_MODEL: deepseek-v4-pro[1m], а не модель Anthropic;
приведённые ниже утверждения предполагают лишь наличие сильного родителя, независимо от вендора.
delegate_to_dsh не зависит от модели на всём протяжении.| Уровень | Покрытие | Статус |
|---|---|---|
| Модульные тесты | 42 vitest (обнаружение DSH / рабочая область / раннер / отслеживание изменений / инструменты) | ✅ |
| Реальный E2E (Claude Code) | запуск из подкаталога · китайский язык · пробелы в пути · реальный API | ✅ |
| Длинный горизонт | план → исследование → решение → исправление → обратное чтение → проверка | ✅ 5/5 |
| A/B бенчмарк | 100 задач × 2 руки (точность + время выполнения, p<0,001) | ✅ |
| Проверка записи DSH | headless-профиль может записывать файлы | ✅ |
DSH_MCP_ENGINEERING(1).md (§0–§40).dsh-mcp — это независимый проект с открытым исходным кодом. Он не связан с OpenAI,
Anthropic или DeepSeek, не одобрен ими и не спонсируется ими. DeepSeek Harness — это
проект DeepSeek с открытым исходным кодом; данный адаптер лишь интегрируется с его CLI
через протокол MCP. Все названия продуктов и товарные знаки принадлежат их
соответствующим владельцам.
MIT