deepseek-subagent-mcp
deepseek-subagent-mcp
Даёт Claude Code, Codex или любому другому MCP-клиенту агента DeepSeek Harness, которому можно поручать работу, так же, как он поручал бы её одному из своих субагентов.
MCP (Model Context Protocol) — это стандарт, с помощью которого кодирующий агент загружает внешние инструменты. DeepSeek Harness — это открытый агентский рантайм DeepSeek: модель в цикле с файловыми и shell-инструментами, выпущенный в августе 2026 года под лицензией MIT. Этот сервер находится между ними: он запускает агента Harness в отдельном процессе и предоставляет шесть инструментов для его запуска, наблюдения, продолжения и остановки.
Дочерний агент имеет собственное окно контекста. В этом и суть: вы передаёте ему самодостаточную задачу, он тратит свои собственные токены, работая с файлами, и вы получаете результат, а не транскрипт.
Требования
Python 3.11 или новее
Ключ API DeepSeek с platform.deepseek.com
macOS 14+ на Apple Silicon, или Linux на x86-64 или arm64
Установка Node.js не требуется: рантайм Harness поставляется как самодостаточный исполняемый файл внутри wheel-пакета deepseek-harness-sdk. Этот wheel-пакет также является ограничением платформы — он публикует macosx_14_0_arm64, manylinux_2_28_x86_64 и manylinux_2_28_aarch64 и ничего больше, так что Windows, Intel Mac и macOS 13 вообще не могут установить это.
Установка
uvx --from git+https://github.com/gaztrabisme/deepseek-subagent-mcp deepseek-subagent-mcpClaude Code
Добавьте в .mcp.json в вашем проекте или в ~/.claude.json для всех проектов:
{
"mcpServers": {
"deepseek-subagent": {
"command": "uvx",
"args": [
"--from", "git+https://github.com/gaztrabisme/deepseek-subagent-mcp",
"deepseek-subagent-mcp"
],
"env": {
"DEEPSEEK_API_KEY": "sk-...",
"DSA_WORKSPACE": "/path/to/your/project"
}
}
}
}Codex
Добавьте в ~/.codex/config.toml:
[mcp_servers.deepseek-subagent]
command = "uvx"
args = ["--from", "git+https://github.com/gaztrabisme/deepseek-subagent-mcp", "deepseek-subagent-mcp"]
env = { DEEPSEEK_API_KEY = "sk-...", DSA_WORKSPACE = "/path/to/your/project" }Инструменты
Инструмент | Что делает |
| Запускает нового субагента для задачи. Немедленно возвращает |
| Блокирует выполнение, пока запуск не завершится; возвращает результат. |
| Отправляет последующую работу существующему агенту в его исходной сессии. |
| Все агенты, которыми владеет этот сервер, с состоянием, стоимостью и историей запусков. |
| Останавливает агента и освобождает его процесс. |
| Что агент фактически делал — вызовы инструментов, сообщения, завершения ходов и сырой ответ. |
Запуски асинхронны по умолчанию, потому что задача кодирования может занять много минут, а MCP-клиенты прерывают отдельные вызовы инструментов по таймауту. dsh_delegate возвращается сразу после постановки работы в очередь; dsh_await занимается ожиданием и сообщает о прогрессе, пока ждёт. Для коротких задач передайте wait_seconds в dsh_delegate и пропустите второй вызов.
Каждый dsh_delegate создаёт одного агента, удерживая один процесс рантайма и одну сохранённую сессию. dsh_continue повторно входит в эту сессию, так что у дочернего агента сохраняются его более ранние ходы в контексте.
Каждая делегация указывает, как она будет проверена
dsh_delegate требует аргумент verification: команду, которая доказывает, что задача выполнена.
dsh_delegate(task="Fix the failing date parser", verification="pytest -q tests/test_dates.py")Сервер сам запускает эту команду в рабочем пространстве агента после того, как дочерний агент завершил работу. Дочерний агент, сообщающий о своих собственных результатах тестов, — это утверждение; код выхода — это факт, а агенты, преждевременно объявляющие победу, — это хорошо задокументированный сбой.
Результат | Состояние |
Команда завершается с кодом 0 |
|
Команда падает, истекает по таймауту или не была задана |
|
Команда классифицируется той же политикой, которая ограничивает собственные вызовы дочернего агента перед их выполнением, — вызывающая сторона является другим агентом и может быть подвергнута промпт-инъекции, поэтому «вызывающая сторона попросила об этом» не является авторизацией. Передайте verification="true", когда проверять действительно нечего; явная ложь лучше молчаливого значения по умолчанию.
Что возвращается
Субагент, возвращающий полный транскрипт, сводит на нет собственную цель. Когда ответ дочернего агента больше, чем DSA_SUMMARY_TOKENS, ему предлагается — в той же сессии, ещё одним ходом — заменить его кратким резюме для передачи из семи разделов: Цель, Ограничения и предпочтения, Прогресс, Ключевые решения, Следующие шаги, Соответствующие файлы, Критический контекст. Именно это пересекает границу MCP.
Ответ, уже не превышающий лимит, возвращается дословно и не требует дополнительного хода. Сырой ответ всегда сохраняется: dsh_transcript(run_id, raw=True).
Контролируемое выполнение
Вызовы инструментов дочернего агента блокируются до их выполнения. Хук PreToolUse внутри рантайма передаёт каждый предлагаемый вызов этому серверу, который отвечает разрешить или запретить; запрещённый вызов возвращается модели как заблокированный результат инструмента с указанием причины, и модель адаптируется.
Детерминированный классификатор решает первым, и он решает большинство вызовов. Чтение файлов, ls, grep, операции чтения систем контроля версий, запуск собственного кода и тестов рабочего пространства разрешены без участия модели. Привилегированные команды, удаления за пределами рабочего пространства, fetch, переданный по конвейеру в shell, и всё, что касается SSH-ключей или .env, категорически запрещены — в том числе через безобидно выглядящий глагол, потому что cat ~/.ssh/id_rsa — это инструмент только для чтения, применённый к секрету. Эскалируется только то, что классификатор не может классифицировать.
Эскалация выполняется на лучшем уровне, который поддерживает клиент, определяется при запуске и сообщается через dsh_list:
Уровень | Кто решает | Требуется |
| модель MCP-клиента | клиент объявляет |
| вы, в вашем клиенте | клиент объявляет |
| никто — эскалация запрещает | всегда доступен |
Каждый уровень при сбое закрывается. Недостижимый супервизор, таймаут, некорректный запрос или клиент, не поддерживающий ни одну из возможностей, — всё приводит к запрету, но никогда к одобрению.
Лестница проходится, а не выбирается один раз: уровень, который ошибается, переходит к следующему, поэтому клиент, отбрасывающий sampling — объявленный устаревшим в редакции спецификации от 2026-07-28, но всё ещё работающий сегодня, — деградирует до вопроса к вам, а не до запрета всего. Уровень, у которого истекает таймаут, не переходит дальше; не получивший ответа вопрос означает «нет», и повторный вопрос по другому каналу лишь удвоит ожидание.
Установите DSA_SUPERVISOR=off, чтобы полностью отключить шлюз.
Супервизору показываются структурированные факты, а не текст дочернего агента: инструмент, программы в каждом сегменте конвейера и каждый путь, который называет команда, с флагом внутри-или-снаружи-рабочего-пространства. Дочерний агент пишет и команду, и любое обоснование для неё; агент, способный аргументировать свою позицию, будет это делать. Путь, который нельзя разрешить статически, — $TMPDIR/out.txt, — сообщается как неразрешённый, а не угадывается, и считается находящимся снаружи.
examples/claude_supervisor.py запускает весь шаблон на реальном Claude для клиентов, которые сами не объявляют sampling:
DEEPSEEK_API_KEY=sk-... uv run python examples/claude_supervisor.pyПотолки и стоимость
Делегированный агент тратит ваши деньги в цикле, поэтому его ограничивают четыре независимых потолка, и каждый запуск сообщает, что было использовано.
Потолок | Регулятор | Обеспечивается |
Время по часам на запуск |
| убийством рантайма |
Всего токенов на запуск |
| убийством рантайма |
Вызовов модели на запуск |
| убийством рантайма |
Повторяющиеся одинаковые вызовы инструментов |
| убийством рантайма |
В проводном протоколе нет отмены посреди хода, поэтому каждая остановка — это убийство процесса. Убийство из-за потолка всегда имеет приоритет над тем, что сообщил сам запуск: вывод убитого процесса никогда не читается как успех.
dsh_delegate, dsh_await и dsh_list сообщают об использовании токенов — ввод, вывод, чтение и запись кэша, а также количество шагов, — суммируя данные, сообщённые провайдером. Ввод на каждом шаге суммируется намеренно: каждый запрос оплачивает весь повторно отправляемый префикс, так что итог — это фактическая стоимость делегации.
Конфигурация
Каждый параметр — это переменная окружения на процессе сервера.
Переменная | По умолчанию | Значение |
| — | Обязательно. Передается дочерней среде выполнения. |
| DeepSeek's public API | Указывает на прокси или собственный эндпоинт. |
|
| Идентификатор модели для делегированной работы. |
| the server's working directory | Каталог, который читает и записывает дочерний процесс. |
|
| Одновременно разрешено активных агентов. Каждый занимает процесс. |
|
| Где записываются журналы сессий. |
| provider default | Ограничение вывода на запрос для дочернего процесса. |
| unset | Общее количество токенов, которое может потратить один запуск, прежде чем он будет завершен. |
|
| Количество вызовов модели, которое может сделать один запуск, прежде чем он будет завершен. |
|
| Одинаковые вызовы инструментов, после которых запуск завершается как неконтролируемый. |
|
| Секунд до завершения запуска и сообщения о сбое. |
|
| Секунд до удаления простаивающего агента. |
|
| Завершенные запуски остаются читаемыми после удаления агента. |
|
| Размер результата, при превышении которого дочернему процессу предлагается сделать краткое изложение. |
|
| Коэффициент пересчета для этого ограничения. Измерено как 3.54 для данной нагрузки. |
|
| Секунд, в течение которых может выполняться команда проверки, ограничено оставшимся сроком выполнения запуска. |
|
|
|
|
| Секунд ожидания вердикта перед отказом. |
|
|
|
|
|
|
|
| Относительно этого измеряется уплотнение рабочего бюджета. |
|
| Ограничение на уровне исполнителя для одного вызова bash. |
| none | Секунд ожидания одного запроса к среде выполнения. |
|
| Строк активности, сохраняемых на один запуск. |
|
| Уровень журнала сервера. Записывает только в stderr. |
| the packaged composition | Путь или |
|
| Маршрут провайдера, зарегистрированный композицией. |
Ограничения, которые следует знать перед использованием
Они исходят из протокола проводки Harness SDK, а не из решений, принятых здесь.
Песочница файловой системы не охватывает bash.
dsh-fs-sandboxограничивает инструментыwrite/editмодели рабочим пространством, ноdsh-bash-sandboxне входит в состав исполняемого файла среды выполнения, поэтому сам bash не ограничен. Супервизор покрывает это — он блокирует каждый инструмент, включая bash, до выполнения. ПриDSA_SUPERVISOR=offграниц для bash вообще нет; направьте его на ветку или временный каталог.Песочница ограничивает только воздействие на файлы — не на сеть, процессы или системные вызовы. И
workspace-writeразрешает/tmp, а также корень рабочего пространства.Отмена убивает процесс. В протоколе нет отмены в середине хода, поэтому
dsh_cancelзавершает среду выполнения. Уже записанные правки остаются на диске, и сессию нельзя возобновить после этого.Сессия удаленного агента исчезает, но его результаты — нет. После
DSA_IDLE_TIMEOUTпроцесс освобождается;dsh_awaitиdsh_transcriptпо-прежнему работают с его завершенными запусками,dsh_continue— нет.Сессии живут столько же, сколько процесс. Нет закрытия по сессиям, поэтому память растет с историей агента. Отменяйте агентов, с которыми закончили.
Вышестоящий проект находится в стадии предварительной разработки.
deepseek-harness-sdkзафиксирован на==0.1.0rc7; за неделю вышли два кандидата в релиз. Ожидайте изменений протокола.
Разработка
uv sync
uv run pytest # 127 tests, no API key, no network
uv run ruff check .
uv run deepseek-subagent-mcp # starts on stdio; a client drives itЖивые тесты требуют реального ключа и расходуют токены; они не собираются pytest:
DEEPSEEK_API_KEY=sk-... uv run python tests/smoke_task.py # the product works
DEEPSEEK_API_KEY=sk-... uv run python tests/smoke_result.py # distillation and the archive
DEEPSEEK_API_KEY=sk-... uv run python tests/smoke_supervisor.py # the gate works
DEEPSEEK_API_KEY=sk-... uv run python tests/smoke_escalation.py # both escalation tiers
DEEPSEEK_API_KEY=sk-... uv run python tests/smoke_limits.py # reaper and deadline
DEEPSEEK_API_KEY=sk-... uv run python tests/smoke_mcp.py # all six toolsCLAUDE.md содержит архитектуру и ограничения вышестоящего проекта; wiki/ содержит записи решений и результаты измерений.
Лицензия
MIT.
This server cannot be installed
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 Connectors
Durable agent-to-agent handoffs and shared scratchpad for multi-agent workflows.
Cross-agent artifact workspace with provenance across Claude Code, Codex, Cursor, LangGraph.
Human-as-a-Service for AI agents. Delegate tasks that need a real human, get results via API.
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/gaztrabisme/deepseek-subagent-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server