deepseek-mcp
deepseek-mcp
MCP-сервер, который позволяет Claude Code делегировать DeepSeek одну ограниченную единицу работы с репозиторием как локальному субагенту.
Claude остается оркестратором: он определяет масштаб, архитектуру и корректность. DeepSeek — исполнитель для части, требовательной к токенам: исследование репозитория, внесение рутинных или повторяющихся изменений и запуск тестов — в пределах одного авторизованного рабочего пространства и при жестких бюджетах.
Смысл в том, чтобы не платить дважды за один и тот же контекст. Если Claude читает подсистему, а затем DeepSeek читает ее снова, ничего не сэкономлено; поэтому решение о делегировании принимается до широкого чтения.
User
↓
Claude: plan + define goal/scope
↓
DeepSeek: inspect repo + read code + implement + test
↓
DeepSeek: compact structured summary
↓
Claude: review diff/results + final answerDeepSeek — основной работник по репозиторию; Claude — оркестратор. Claude планирует, принимает архитектурные решения и решения по безопасности, проверяет возвращенный diff и пишет окончательный ответ. DeepSeek выполняет работу по репозиторию: исследование, Glob/Grep/ Read, понимание кода, реализацию, тестирование и рутинные исправления. Claude делегирует до широкого чтения исходных файлов, а DeepSeek сам находит соответствующие файлы в пределах авторизованной области и возвращает компактную структурированную сводку — Claude никогда не отправляет содержимое файлов.
Требуется Python 3.11+ и API-ключ DeepSeek. Одна зависимость времени выполнения: MCP
SDK. Все остальное — стандартная библиотека. ripgrep используется для поиска, когда
он доступен, а чисто-Python сканирование используется, когда его нет.
1. Установка
Пакет еще не опубликован на PyPI, поэтому установите его из клонированного репозитория. Установите его один раз, глобально — это не зависимость проекта, и он работает во всех репозиториях.
git clone https://github.com/giaminhgist/DeepSeek_MCP.git
cd DeepSeek_MCP
uv tool install . # recommended: isolated, and puts deepseek-mcp on PATH
# or
pipx install .
# or, into the current environment
pip install .Убедитесь, что консольный скрипт определяется:
deepseek-mcp --version # -> deepseek-mcp 0.1.0Если команда не найдена, каталог установки не находится в вашем PATH. С
uv выполните uv tool update-shell и откройте новый shell.
deepseek-mcp без аргументов запускает MCP-сервер на stdio. Именно это
запускает Claude Code; обычно вам не нужно вызывать его самостоятельно.
Related MCP server: Hydra
2. Установка API-ключа
Получите ключ на https://platform.deepseek.com/. Никогда не помещайте его в проект репозитория. Экспортируйте его из профиля вашего shell:
export DEEPSEEK_API_KEY="sk-your-key-here" # ~/.bashrc, ~/.zshrc, …# Windows PowerShell
setx DEEPSEEK_API_KEY "sk-your-key-here"Затем проверьте, что сервер его видит:
deepseek-mcp --check # prints a health report as JSON; exits 1 if unusable--check выводит "mode": "enabled" и "status": "ok", когда ключ
читается. Сам ключ никогда не появляется в отчете.
Три поддерживаемых источника ключа, в порядке приоритета:
DEEPSEEK_MCP_API_KEYилиDEEPSEEK_API_KEYв окружении сервера.api_key_envв файле конфигурации пользователя, указывающий на другую переменную окружения для чтения.api_keyв файле конфигурации пользователя — принимается, не рекомендуется, и вызывает предупреждение при запуске, потому что помещает ключ на диск.
Все остальное необязательно; см. Справочник по конфигурации.
Единственная другая переменная, о которой стоит знать заранее, — DEEPSEEK_MCP_WORKSPACE, которая
закрепляет авторизованный корень проекта вместо его обнаружения (см.
Рабочее пространство).
3. Добавление сервера в Claude Code
Если DEEPSEEK_API_KEY уже экспортирован в окружении, которое наследует
Claude Code:
claude mcp add deepseek --scope user -- deepseek-mcpЕсли нет — например, при запуске с рабочего стола, который не читает ваш профиль shell — передайте его явно:
claude mcp add deepseek --scope user -e DEEPSEEK_API_KEY=sk-your-key-here -- deepseek-mcp--scope user регистрирует его для каждого проекта. Используйте --scope local для
текущего проекта.
Эквивалентная конфигурация, написанная вручную:
{
"mcpServers": {
"deepseek": {
"command": "deepseek-mcp",
"env": {
"DEEPSEEK_API_KEY": "sk-your-key-here"
}
}
}
}Опустите блок env полностью, когда ключ уже находится в унаследованном
окружении. Не коммитьте ключ ни в какой файл репозитория.
4. Проверка подключения
claude mcp list # deepseek should be listed and connectedЗатем внутри Claude Code:
выполните
/mcp—deepseekдолжен появиться с двумя своими инструментами;попросите Claude вызвать
deepseek_health. Работающий сервер отвечает сstatus: "ok",mode: "enabled", моделью по умолчаниюmodelи списком разрешенных моделейallowed_models, разрешенным корнем рабочего пространства, включенными возможностями, лимитами бюджета и объектомusageс текущими итогами работника для этого процесса сервера.
Без настроенного ключа сервер все равно запускается и отвечает на
deepseek_health — сообщая status: "error", mode: "disabled" — так что
проблему можно диагностировать изнутри Claude Code. В этом состоянии он не выполняет никакой работы.
5. Устранение неполадок
Симптом | Причина и исправление |
| Каталог установки не находится в |
| Выполните |
| До процесса сервера не дошел API-ключ. Проверьте поле |
Делегирование возвращает | Политика отклонила запрос до любого вызова API: режим, запрашивающий возможности, которые сервер не предоставляет, команды проверки в режиме |
Делегирование возвращает | Единица работы слишком велика для лимитов, о которых сообщает |
Команда | Политика исполняемых файлов — список разрешенных. См. Политика команд; добавьте специфичные для проекта инструменты через |
Работник не может прочитать файл | Пути, содержащие секреты, и внутренности |
Корень рабочего пространства неверный | Он обнаруживается подъемом вверх от каталога, в котором Claude Code запустил сервер. Установите |
| Явно указанный файл конфигурации отсутствует. Исправьте путь или удалите переменную; сервер не будет молча возвращаться к значениям по умолчанию. |
Журналы идут в stderr как записи event key=value, никогда в stdout. Повысьте детализацию
с помощью DEEPSEEK_MCP_LOG_LEVEL=DEBUG или отправьте их в файл с
DEEPSEEK_MCP_LOG_FILE=/absolute/path.log.
Поверхность инструментов
Два инструмента, намеренно.
deepseek_health
Конфигурация и состояние: статус, модель по умолчанию model и список разрешенных моделей
allowed_models, авторизованный корень рабочего пространства и способ его определения, включенные
возможности, лимиты бюджета и объект usage с текущими итогами работника для этого
процесса сервера. Без секретов. Используйте его, чтобы подтвердить, что работник доступен,
и чтобы оценить масштаб делегирования перед его отправкой.
delegate_to_deepseek
Одна ограниченная единица работы как структурированный контракт, а не текстовый блок:
Поле | Назначение |
| Требуемый результат. Обязательно. |
| Глобы относительно рабочего пространства, к которым относится работа. Ограничивает запись. |
| Только те правила проекта, которые важны для этой задачи. |
| Условия, определяющие успех. |
| Команды для запуска перед завершением, как массивы argv. |
|
|
| Модель DeepSeek только для этого делегирования, например |
| Также вернуть карту репозитория — |
{
"objective": "Treat a None row as invalid and cover it with a test.",
"scope": ["src/importer/**", "tests/importer/**"],
"constraints": ["Do not change the public response schema."],
"acceptance_criteria": ["validate_row(None) returns False."],
"verification": [["pytest", "tests/importer", "-q"]],
"mode": "write"
}Затем работник циклически выполняет свою работу — glob, grep, read, edit, run, repair — и возвращает компактный результат, никогда не транскрипт:
{
"status": "completed",
"summary": "Treated a None row as invalid and added a regression test.",
"changed_files": ["src/importer/validate.py"],
"created_files": ["tests/importer/test_none.py"],
"deleted_files": [],
"inspected_files": ["src/importer/__init__.py"],
"verification": [
{"argv": ["pytest", "tests/importer", "-q"], "exit_code": 0, "summary": "24 passed"}
],
"warnings": [],
"unresolved": [],
"assumptions": [],
"diff_stat": " src/importer/validate.py | 3 ++-",
"metrics": {
"turns": 7, "tool_calls": 12, "prompt_tokens": 18400,
"completion_tokens": 2100, "duration_seconds": 41.2,
"files_read": 4, "files_changed": 2, "compactions": 0
},
"session_usage": {
"delegations": 3, "turns": 19, "tool_calls": 31,
"prompt_tokens": 51200, "completion_tokens": 6400,
"total_tokens": 57600, "since": "server start"
},
"model": "deepseek-chat",
"analysis": {
"important_files": ["src/importer/validate.py"],
"architecture_notes": ["validate_row is the single entry point for row checks."],
"dependencies": ["src/importer/schema.py"],
"suggested_scope": ["src/importer/**", "tests/importer/**"],
"risks": ["Changing the None handling may affect callers that rely on the old behaviour."]
},
"debug_ledger": ["R src/importer/validate.py", "E src/importer/validate.py", "X pytest tests/importer -q"]
}model — это модель, которая фактически выполнила делегирование, после разрешения переопределения для конкретной задачи. analysis присутствует только тогда, когда делегирование запрашивало его, и
содержит пять полей карты репозитория. debug_ledger — это компактный
журнал выполнения по одной строке на вызов инструмента, заполняемый только когда сервер работает с
включенным debug. metrics сообщает об использовании токенов и форме этого делегирования;
session_usage содержит текущие итоги работника для этого процесса сервера,
включая это делегирование — delegations, turns, tool_calls,
prompt_tokens, completion_tokens, total_tokens и since (всегда буквально
"server start").
Счётчик за usage и session_usage хранится в памяти и ограничен процессом сервера: он сбрасывается при перезапуске MCP-сервера, что как раз и фиксирует поле since. На диск он не сохраняется. Учитываются только те делегирования, которые дошли до воркера: запрос, отклонённый раньше (сервер отключён, недопустимое поле запроса или модель вне списка разрешённых allowed_models), никогда не вызывал модель, поэтому не увеличивает delegations и не влияет на счётчики токенов. total_tokens вычисляется из своих частей, а не хранится, поэтому не может «уплыть».
Статусы: completed, partial, blocked, failed, budget_exceeded, disabled. Ожидаемые сбои — плохая конфигурация, отклонённый путь, запрещённая команда, исчерпанный бюджет, ошибка провайдера — все возвращаются в виде одного из этих статусов с указанием причины. Трейсбек Python — никогда.
Результаты содержат выводы, а не сырые транскрипты Read/Grep/инструментов. Отладочный журнал — это компактный журнал: одна строка на вызов инструмента, а не вывод инструмента, даже когда отладка включена.
Режимы сужают, но никогда не расширяют
Режим | Чтение и поиск | Запуск команд | Запись файлов |
| да | нет | нет |
| да | да | нет |
| да | да | да, в пределах |
Режим пересекается с настроенными возможностями сервера. Запрос, требующий больше, чем предоставляет сервер, отклоняется до любого вызова API — он никогда не может расширить политику.
Что воркеру не доверяется
Две вещи в результате не исходят от модели:
Список изменённых файлов формируется из наблюдения за инструментами плюс сравнения
git statusсо снимком, сделанным до запуска, поэтому ранее существовавшие незакоммиченные правки пользователя никогда не сообщаются как работа воркера.Статус. Заявленный
completedпонижается доpartial, если запрошенная проверка так и не запустилась или завершилась с ненулевым кодом.failedиbudget_exceeded— это вердикты сервера, и воркер вообще не может их заявить.
Всё равно проверяйте. git status --short, git diff --stat, затем читайте изменённые фрагменты пропорционально риску. completed — это заявление, а не доказательство.
Бюджеты
Каждое делегирование ограничено, и выполнение останавливается со структурированной причиной, а не перерасходует лимиты: ходы (24), вызовы инструментов (80), время по часам (15 мин), вывод на один вызов инструмента (20 000 символов), окно Read (250 строк), совпадения Grep (100), пути Glob (300) и расчётный активный контекст (96 000 токенов).
Контекст рассматривается как бюджетный ресурс, а не растущий транскрипт. Выше порога старые полезные данные инструментов заменяются однострочными записями из детерминированного журнала выполнения; если этого недостаточно, отбрасываются целые старые ходы, поскольку журнал всё равно фиксирует, что они делали. Системный промпт, исходный контракт задачи, недавние ходы и журнал всегда сохраняются. Никогда не тратится дополнительный вызов модели на суммаризацию, и если воркеру нужна вытесненная деталь, он читает файл заново.
Все лимиты настраиваются и сообщаются через deepseek_health.
Справочник по конфигурации
Настройки, помеченные как зарезервированные, проверяются при запуске, но пока не используются.
Приоритет
переменная окружения > файл конфигурации пользователя > встроенное значение по умолчанию
Выбор модели имеет ещё один уровень выше: отдельное делегирование может указывать свою собственную модель, поэтому полный порядок такой:
модель задачи > переменная окружения > файл конфигурации пользователя > встроенное значение по умолчанию
Модель задачи — это параметр model в delegate_to_deepseek. Когда allowed_models сервера не пуст, это список разрешённых, и запрос с любым другим именем отклоняется как blocked до любого вызова API — выбор модели сужается до того, что разрешил оператор, точно так же, как режимы делегирования сужаются до возможностей сервера.
Отсутствующая, некорректная или противоречивая настройка — это ошибка. Сервер не откатывается к более широкому рабочему пространству или более мягкой политике.
Если конфигурация не загружается, процесс всё равно запускается и всё равно отвечает на deepseek_health, но сообщает status: "error", mode: "disabled" и не выполняет никакой работы. Запустите deepseek-mcp --check, чтобы увидеть тот же отчёт в командной строке.
Расположение файла конфигурации
Файл конфигурации пользователя находится вне любого проекта:
Платформа | Путь |
Linux/BSD |
|
macOS |
|
Windows |
|
DEEPSEEK_MCP_CONFIG переопределяет путь. Если он задан, а файл не существует, запуск завершается ошибкой, а не молча использует значения по умолчанию. Отсутствие файла конфигурации в месте по умолчанию — нормально; пустой файл — нормально; неизвестные ключи — ошибка.
Схема файла конфигурации
Каждый ключ необязателен.
{
"model": "deepseek-chat",
"allowed_models": ["deepseek-chat", "deepseek-reasoner"],
"base_url": "https://api.deepseek.com/v1",
"api_key_env": "DEEPSEEK_API_KEY",
"workspace": "/absolute/path/to/project",
"tools": {
"enabled": ["Read", "Glob", "Grep", "Edit", "Write", "Run"],
"max_write_bytes": 2000000,
"allow_secret_paths": false,
"secret_path_exceptions": []
},
"provider": {
"timeout_seconds": 120,
"max_retries": 3,
"retry_base_delay": 0.5,
"retry_max_delay": 8.0,
"temperature": 0.0,
"max_output_tokens": 4096
},
"budgets": {
"max_turns": 24,
"max_tool_calls": 80,
"max_wall_seconds": 900,
"max_tool_output_chars": 20000,
"read_window_lines": 250,
"max_grep_matches": 100,
"max_glob_paths": 300,
"max_context_tokens": 96000,
"compaction_threshold_ratio": 0.7
},
"commands": {
"default_timeout_seconds": 120,
"max_timeout_seconds": 600,
"extra_denied_executables": [],
"extra_allowed_executables": [],
"allow_unsafe_shell": false
},
"logging": { "level": "INFO", "file": null, "log_task_text": false },
"debug": false
}Ключ api_key здесь принимается, но не рекомендуется: он кладёт ключ на диск и вызывает предупреждение при запуске. Предпочитайте api_key_env, который указывает имя переменной окружения для чтения.
allowed_models — необязательный список разрешённых имён моделей, которые может запросить делегирование. Если он не пуст, настроенная model должна быть в нём (иначе настройки противоречат друг другу), а запрос с model вне списка отклоняется как blocked до любого вызова API. Пустое значение означает, что принимается любое корректно сформированное имя модели.
Учётные данные и конечная точка
Переменная | Эффект |
| API-ключ, наивысший приоритет |
| API-ключ (имя переменной по умолчанию; переопределяется через |
| Имя модели. |
| Список разрешённых имён моделей через запятую, которые может запросить делегирование. Пустое значение означает любое корректное имя. Запрос |
| Базовый URL, совместимый с OpenAI. Должен быть |
| Путь к файлу конфигурации |
Нет API-ключа — нет работы: при запуске сервер сообщается как отключённый.
Рабочее пространство
Переменная | Эффект |
| Абсолютный путь к авторизованному корню проекта |
Без явного рабочего пространства корень определяется подъёмом вверх от рабочего каталога процесса в поисках .git, .hg, .svn, pyproject.toml, package.json, go.mod или Cargo.toml. Если ничего не найдено, используется сам рабочий каталог, и записывается предупреждение.
Явное рабочее пространство, которое отсутствует, нечитаемо, не является каталогом, относительно или является корнем файловой системы, — это ошибка запуска. Оно никогда не деградирует до рабочего каталога. Серверу не обязательно находиться внутри вашего проекта, и он никогда не изменяет проект для своей активации.
Инструменты
Переменная | Эффект |
| Список через запятую из |
| Потолок размера записи и наибольший существующий файл, который воркер может перезаписать |
| По умолчанию выключено: |
Инструменты, включённые по умолчанию, — все, кроме NotebookEdit. NotebookEdit — это распознанное имя без реализации, поэтому его включение — ошибка запуска, а не инструмент, который воркеру предлагают и который он не может использовать. Read обязателен.
Внутренности .git, .hg и .svn никогда не читаются и не записываются через файловые инструменты; используйте вместо этого команду git только для чтения через Run.
Бюджетные лимиты
Все применяются к каждому делегированию и сообщаются через deepseek_health, чтобы Claude мог оценить делегирование перед отправкой.
Переменная | По умолчанию | Эффект |
| 24 | Вызовов провайдера на делегирование |
| 80 | Выполнений инструментов на делегирование |
| 900 | Общее время на часах; также ограничивает таймауты команд |
| 20000 | На результат инструмента, сохраняя начало и конец |
| 250 | Строк на |
| 100 | Совпадений на |
| 300 | Путей на |
| 96000 | Жёсткий потолок расчётного активного контекста |
| 0.7 | Доля потолка, при которой запускается компактификация |
Превышение бюджета завершает делегирование со status: "budget_exceeded" и причиной, после сообщения о уже выполненной работе.
Провайдер
Переменная | По умолчанию | Эффект |
| 120 | Таймаут на запрос, ограниченный оставшимся бюджетом времени |
| 3 | Повторы после первой попытки, только для временных сбоев |
| 0.5 | База экспоненциальной задержки, с джиттером |
| 8.0 | Потолок задержки |
| 0.0 | Температура сэмплирования |
| 4096 | Потолок завершения на ход |
Таймауты, ошибки подключения, 429 и 5xx повторяются. Ошибка 4xx проявляется
немедленно, потому что повторять плохой ключ или плохой запрос — только тратить время.
Редиректы отклоняются полностью, чтобы заголовок Authorization не мог быть воспроизведен
на другом хосте.
Политика команд
Переменная | По умолчанию | Эффект |
| 120 | Таймаут команды по умолчанию |
| 600 | Потолок, который рабочий процесс не может поднять |
| false | Зарезервировано. Выполнение без оболочки не реализовано; этот параметр ничего не даёт |
Run выполняет массив argv с shell=False. Исполняемый файл должен быть в
списке разрешённых, а опасные подкоманды отклоняются структурно. Используйте
в конфигурационном файле commands.extra_allowed_executables, чтобы добавить специфический для проекта инструмент, и
extra_denied_executables, чтобы удалить его. Дополнительная запись разрешения не может повторно включить программу, находящуюся в жёстком запрете.
По умолчанию отклоняются: повышение привилегий, установка пакетов, публикация,
сетевые утилиты, оболочки и интерпретаторы встроенного кода, разрушительные операции с файловой системой,
редакторы на месте, а также изменяющие или удалённые подкоманды git. Только для чтения git
(status, diff, log, show, ls-files, rev-parse, blame, …) —
разрешено.
Универсальные чтение файлов, такие как cat, head и grep, намеренно
не в списке разрешённых: они были бы обходом в одну команду списка запрещённых секретных путей,
который обеспечивают Read, Glob и Grep. Добавьте его обратно через
extra_allowed_executables, только если вы с этим согласны.
Ведение журнала
Переменная | Эффект |
|
|
| Абсолютный путь. Создаётся с |
| Зарезервировано. Необязательное журналирование текста задачи. Выключено по умолчанию и пока не используется |
| Зарезервировано. Отладочные детали в результатах. Пока не используется |
Журналирование делегирования — только метаданные: имя события, статус, режим, количество вызовов инструментов и ходов, количество токенов, длительность и количество файлов. Никакого текста задачи, содержимого файлов, вывода команд или тел подсказок. Журналы идут в stderr, никогда в stdout — stdout несёт только трафик протокола MCP. Ключ API удаляется из каждой записи как запасной вариант.
Позиция безопасности
Прочитайте этот раздел, прежде чем решать, на что направить рабочий процесс.
Описанные здесь защиты не изменяются функциями выбора модели и анализа: ограниченный контекст с компактизацией, песочница рабочей области, список разрешённых команд, без коммитов или push, без установки пакетов или сетевого доступа по умолчанию, и структурированный результат, содержащий метрики токенов и инструментов.
Что применяется в коде:
Каждый путь разрешается относительно одного корня рабочей области. Символические ссылки проверяются сначала, и результат — это то, что проверяется, поэтому ссылка за пределы дерева отклоняется. Для целей записи родительский каталог повторно проверяется непосредственно перед записью.
Явно настроенная рабочая область, которая отсутствует или непригодна, — это ошибка запуска. Она никогда не опускается до более широкого каталога.
Пути с секретами (
.env,.env.*,*.pem,*.key,id_rsa,.netrc,.ssh/,.aws/и подобные) и внутренности.git/.hg/.svnзапрещены для каждого инструмента и исключены из результатов поиска, а не просто нечитаемы.Область делегирования
scopeограничивает записи. Чтения остаются открытыми во всей рабочей области, потому что рабочему процессу нужно исследовать, чтобы выполнять свою работу.Runиспользуетshell=False. Оболочки нет, поэтому&&,|,$(...)и>приходят как буквальный текст аргумента и не могут объединить вторую команду. Исполняемый файл должен быть в списке разрешённых, опасные подкоманды отклоняются структурно через argv, аргументы абсолютных путей должны находиться внутри рабочей области, а аргумент, указывающий на существующий запрещённый путь, отклоняется.Установка пакетов, публикация, сетевые утилиты, повышение привилегий и изменяющие или удалённые подкоманды git отклоняются по умолчанию. Также универсальные чтение файлов, такие как
catиgrep, которые в противном случае были бы обходом в одну команду списка запрещённых секретных путей.Дочерние процессы получают окружение с удалёнными учётными данными, так что собственный ключ API рабочего процесса не может появиться в выводе команды или журнале.
Записи атомарны (временный файл, fsync, переименование), поэтому прерванная запись оставляет исходный файл нетронутым.
Editможет требовать SHA-256, который вернулRead, поэтому устаревшее редактирование отклоняется, а не применяется.Системная подсказка утверждает, что содержимое репозитория — это данные, а не инструкция — и перечисленные выше ограничения применяются на стороне сервера, поэтому файл, который говорит рабочему процессу игнорировать его инструкции, не может дать ему ничего.
Журналы по умолчанию содержат только метаданные: событие, статус, счётчики, длительность. Никакого текста задачи, содержимого файлов, вывода команд или тел подсказок. Ключ API удаляется из каждой записи как запасной вариант.
Что это не: песочница на уровне ОС против злонамеренного окружения.
Это политика уровня приложения. Она ограничивает категорию действий, которые может совершить запутанный, ошибочный или инъекционно-подсказанный рабочий процесс. Это не граница изоляции против решительного противника, и эти два понятия не эквивалентны.
Конкретно:
Разрешённый тестовый раннер выполняет код вашего проекта.
pytestимпортирует репозиторий;make testзапускает то, что говорит Makefile. Всё, что достижимо этим способом, достижимо, включая файлы, которые политика путей отказала бы.Нет изоляции процессов, файловой системы или сети — никакого контейнера, bubblewrap или seccomp, профиля песочницы macOS, объекта задания Windows, сетевого пространства имён. Команда, которая разрешена, выполняется с теми же привилегиями, что и процесс сервера.
Списки запретов структурны, а не исчерпывающие. Это причина, по которой политика исполняемых файлов является списком разрешённых: неизвестные программы отклоняются, а не считаются безопасными.
Не направляйте это на репозиторий, из которого вы не стали бы запускать тесты, и не рассматривайте это как замену просмотру diff.
Известные ограничения
NotebookEdit— это распознаваемое имя инструмента без реализации. Включение его приводит к ошибке запуска, а не к инструменту, который предлагается рабочему процессу и не может использоваться.commands.allow_unsafe_shellпроверяется, но ничего не делает; нет выполнения без оболочки.Рабочий процесс не может удалять файлы. Инструмента удаления нет, и
rmотклоняется.Нет песочницы на уровне ОС, как указано выше.
Оценка контекста — это эвристика на основе символов, откалиброванная вверх по сообщённому использованию от провайдера. Она намеренно консервативна, а не точная.
Поведение поиска немного отличается между движками
ripgrepи чисто-Python, потому что диалекты регулярных выражений различаются. Используемый движок указывается в каждом результате.Windows поддерживается и тестируется в CI, но завершение группы процессов по таймауту там выполняется по принципу "лучшее усилие" по сравнению с POSIX.
Одно делегирование за раз. Нет фоновых задач, постоянной памяти рабочего процесса и автоматического git commit или push.
Разработка
uv venv && uv pip install -e ".[dev]"
python -m pytest # the full suite; no API key and no network needed
python -m ruff check .
python -m ruff format --check .
python -m mypyТестовый набор никогда не вызывает платный API: вместо него используется скриптованный фейковый провайдер, а интеграционные тесты MCP запускают реальный подпроцесс сервера через stdio против временных git-репозиториев.
phases/ содержит последовательность реализации, из которой построен этот сервер, для справки.
GLOBAL_CLAUDE.md не является частью этого кодового базиса. Это файл инструкций Claude Code на уровне пользователя,
описывающий, когда делегировать — скопируйте его в ~/.claude/CLAUDE.md,
или объедините с тем, который у вас уже есть.
Лицензия
MIT.
Available Tools
3 toolsdeepseek_reviewA
First-pass code review by the DeepSeek worker of working/staged/head diffs or named files. Findings carry severity, confidence, and path:line evidence. Output is advisory — Claude does final review — and ends with a DeepSeek token usage footer.
| Name | Required | Description | Default |
|---|---|---|---|
| task | No | Optional additional review instruction. | |
| paths | No | Optional repository-relative path filters (diff scopes) or files under review (scope=paths). | |
| scope | No | Review scope. One of: working | staged | head | paths. | working |
| review_focus | No | Focus areas. Subset of: correctness | security | performance | tests | maintainability. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does meaningful work: it discloses the advisory nature, the final-review handoff to Claude, the structure of findings (severity, confidence, path:line evidence), and the token usage footer. It does not explicitly state that the operation is read-only, but the review framing and lack of mutation language are reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences carry the purpose, scope, output structure, advisory role, and footer behavior with no filler. The most important identifying information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no required parameters, an output schema, and clear parameter documentation, the description covers the essential role, scope, and output characteristics. It falls short only in not giving explicit usage boundaries against the sibling tools, which is a minor gap given the strong schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds only marginal semantic value by mapping "working/staged/head diffs or named files" to the scope choices, but it does not meaningfully elaborate on task, paths, or review_focus beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: "First-pass code review by the DeepSeek worker of working/staged/head diffs or named files." It clearly separates this from the sibling tools by framing it as an advisory review rather than a general task or usage query, so an agent can tell what it is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: this is a first-pass code review whose output is advisory and followed by Claude's final review. This implies when it should be used, though it does not explicitly name alternatives or state when-not-to-use conditions relative to deepseek_task or deepseek_usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deepseek_taskA
Delegate a high-context repository task to the DeepSeek worker. Use it for exploration, architecture tracing, evidence collection, debugging, and — when write/Bash tools are enabled — bounded implementation, targeted test execution, and status/diff inspection. The worker should complete the assigned repository work end to end when safe and supported. Output is advisory and ends with a DeepSeek token usage footer.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | The repository task to delegate. For code changes, request the complete loop: inspect, implement, write/update targeted tests, run checks, inspect status/diff, and report evidence. Keep the task bounded, recoverable, and testable. | |
| repo_root | No | Repository root override; only honored when repository.allow_repo_root_argument is true. | |
| focus_paths | No | Optional repository-relative paths to inspect first; the worker may follow evidence elsewhere. | |
| output_detail | No | Result compactness: brief, normal (default), or detailed. One of: brief | normal | detailed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does disclose that output is 'advisory,' that the worker completes work 'end to end when safe and supported,' and that output includes a 'DeepSeek token usage footer.' However, it does not explicitly warn about potential file modifications, command execution side effects, latency, or cost implications beyond the token footer, leaving meaningful behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. It front-loads the core delegation purpose, then adds use cases and behavioral caveats. Every sentence earns its place, and the content is dense but readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 100% schema coverage, an output schema, and the description's explicit use-case list, the definition is largely complete for selecting and invoking the tool. The main gap is the lack of direct comparison with deepseek_review and deepseek_usage, which would help an agent choose among siblings in ambiguous situations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters. The description adds general guidance about keeping tasks 'bounded, recoverable, and testable,' but it does not enrich individual parameter meaning beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb-plus-resource statement: 'Delegate a high-context repository task to the DeepSeek worker.' It enumerates concrete use cases (exploration, architecture tracing, evidence collection, debugging, bounded implementation) that make the tool's scope understandable. It does not explicitly distinguish itself from sibling tools deepseek_review and deepseek_usage, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context about when to use the tool, listing several task categories and adding the important condition 'when write/Bash tools are enabled' for implementation-related work. It does not name alternatives or provide explicit when-not-to-use guidance, so it does not reach the 5 level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deepseek_usageA
Report DeepSeek worker usage statistics (last run or process-wide totals) plus configured budgets and pricing. Makes no DeepSeek API call and costs nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Which statistics to show. One of: last_run | process. | process |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the disclosure burden. It clearly states the tool has no external side effect ('Makes no DeepSeek API call and costs nothing') and describes the kind of data returned. This is solid behavioral transparency for a read-only reporting tool, though it does not cover error cases or exact output details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence conveys the tool's purpose, scope options, and the important no-cost/no-call behavior. Every clause earns its place, and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has one well-documented optional parameter, and has an output schema for return value details. The description tells the agent when to use it and what it covers, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single scope parameter. The description adds some context by mentioning 'last run or process-wide totals', which maps to the scope options, but does not materially improve on the schema's own explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Report' and names the exact resource: DeepSeek worker usage statistics, budgets, and pricing. It also clarifies that the tool makes no API call, which sharply distinguishes it from the sibling tools deepseek_task and deepseek_review.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is for inspecting usage and budget information rather than performing DeepSeek tasks or reviews, especially by noting it costs nothing and makes no API call. It does not explicitly name alternatives, but the context is strong enough for an agent to choose it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.0- First observed
deepseek_review - First observed
deepseek_task - First observed
deepseek_usage
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: deepseek_task covers general repository work, deepseek_review is narrowly scoped to code review of diffs/files, and deepseek_usage reports statistics without making API calls. There is no realistic overlap that would cause an agent to pick the wrong tool.
All tools follow the same deepseek_ prefix followed by a single descriptive noun: deepseek_task, deepseek_review, deepseek_usage. The naming pattern is uniform and predictable.
Three tools is a well-scoped surface for a focused DeepSeek worker integration: one general-purpose execution tool, one specialized review tool, and one usage/accounting tool. Each tool earns its place without redundancy or bloat.
The surface covers the core operations for this domain: delegating task work, performing reviews, and checking usage/budgets. Minor gaps exist such as explicit cancellation, configuration, or history listing, but these are secondary and likely handled outside the MCP interface.
Maintenance
Related MCP Connectors
Cross-agent artifact workspace with provenance across Claude Code, Codex, Cursor, LangGraph.
- SeturosOAuthcom.seturos
Shared work memory for Claude Code, Codex, Cursor and chat, scoped to each repository.
Code-map tools for AI agents: see a repo's structure first, then edit only what matters.
11Lets coding agents check their own code for leaked secrets, risky dependencies and AI-code mistakes
11
Related MCP Servers
- AlicenseAqualityBmaintenanceRun DeepSeek as a real sub-agent inside Claude Code / Codex CLI — not just a single LLM call. DeepSeek gets its own 7-tool agent loop (Read/Write/Edit/Bash/Glob/Grep/NotebookEdit) inside a sandboxed workspace.240MIT
- AlicenseNot gradedqualityBmaintenanceEnables Codex to delegate bounded engineering jobs to Claude Code CLI in isolated Git worktrees with strict security and allowance pacing.MIT
- AlicenseAqualityBmaintenanceEnables Codex to delegate routine repository exploration, implementation, refactors, tests, and fixes to DeepSeek Harness in isolated Git worktrees, returning compact results and patches for review while keeping the main workspace protected.511 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables Claude Code to delegate bulk, read-heavy file analysis to a local DeepSeek Harness agent, keeping file contents out of the conversation context.MIT