SEO-плагины на DeepSeek Harness: что переезжает из Claude Code, а что нет
Целый год под SEO-плагинами к нейросети я понимал связку Claude Code с набором MCP-серверов: Search Console, DataForSEO, выгрузки краулера. Модель не сочиняет цифры, а тянет их сама. Потом DeepSeek представил свой агентный харнесс, DeepSeek Harness, он же dsh, и появился резонный вопрос: уехать на него всем набором и платить по тарифам DeepSeek, не переучивая ни проекты, ни себя.
Коротко — да, почти без потерь. А подробно разберу ниже, по слоям.
dsh — это стартёр профилей
Профиль здесь — упорядоченная стопка плагинов, поверх которой лежит ваш слой настроек в файле cordis.patch.yml внутри папки профиля. Из коробки есть веб-интерфейс, headless под разовые задачи и режимы для автоматизации. Ставится из npm, пакет @deepseek-ai/dsh.
Сразу оговорюсь: на момент текста это версия 0.1.5, релиз-кандидат. Документация полная, но для боевых задач я держал бы под рукой привычный клиент — на случай, если что-то изменится между версиями.
Любой харнесс собирает SEO-набор из трёх слоёв: источник данных, правила работы с ними и защита на случай, если модель свернула не туда. Пройдусь по каждому.
Данные идут через MCP
За этот слой отвечает плагин dsh-mcp-client. Одна запись — один сервер, без обёрток. Так выглядит DataForSEO, запущенный прямо на вашей машине: - insert: - id: mcp-dataforseo name: '@deepseek-ai/dsh-mcp-client' config: serverName: dataforseo transport: stdio command: npx args: ['-y', 'dataforseo-mcp-server'] env: DATAFORSEO_LOGIN: !!js process.env.DATAFORSEO_LOGIN DATAFORSEO_PASSWORD: !!js process.env.DATAFORSEO_PASSWORD
Облачные сервисы вроде Ahrefs или Semrush цепляются тем же способом, только на месте stdio пишется transport: streamable-http и адрес. Ключи держите в переменных окружения, в профиль их не кладут.
Ещё одна приятная вещь: инструменты называются как в Claude Code — mcp__dataforseo__.... Всё, что привязано к этим именам — разрешения, привычные формулировки задач, — переезжает без изменений.
Что проверить до переезда:
- Мост отдаёт только инструменты. MCP-ресурсы и готовые подсказки (prompts) не поддерживаются. Отдаёт ли ваш сервер Search Console отчёты через ресурсы — тогда модель их просто не увидит.
- Таймаут вызова — 60 секунд по умолчанию. Большая выгрузка выдачи пачкой ключей в него может не поместиться. Это чинится полем toolCallTimeoutMs.
- Сервер не поднялся — харнесс всё равно стартует, только без его инструментов, с ошибкой в логе. Для ночного прогона это ловушка: задание выполнится, но без данных. Поставьте failOnStartupError: true, чтобы оно честно падало.

Домашние правила живут в навыках
Сервер приносит цифры, но не знает ваших порядков: какой длины заголовки, что делаете с дублями, по какому признаку разводите фразы по посадочным. Раньше это оседало в длинной подсказке, и каждый писал её на свой лад. В dsh для этого есть навыки — те же skills, что и в Claude Code.
Навык — это папка с файлом SKILL.md или один файл <имя>.md в одном из корней, которые сканирует харнесс:
- .dsh/skills в корне проекта;
- .agents/skills там же;
- $DSH_HOME/skills — общие навыки пользователя.
В начале файла шапка с обязательными полями name и description. По описанию модель решает, когда подтянуть навык, а тело грузится только в этот момент. Вот пример: —- name: semantika-klastery description: Разбор выгрузки Вордстата на группы под посадочные страницы —- 1. Читай выгрузку целиком, не кусками. 2. Фразы на одну страницу, только если выдача по ним совпадает. 3. В конце сверь число строк на входе и на выходе. Не сошлось — задача не сделана.
Третий пункт я теперь вписываю в каждую пакетную задачу. Модель спокойно обработает сто строк из пятисот и отчитается, будто сделала всё. Счётчик на входе и выходе ловит это куда надёжнее, чем вчитывание в отчёт.
Два удобных момента. Тело навыка перечитывается при каждой загрузке, так что правило можно править прямо по ходу работы, без перезапуска. И второе: папку .claude/skills харнесс по умолчанию не сканирует. Если навыки уже там, пропишите её в customSkillDirs — копировать ничего не нужно.
Хуки как страховка
Главное, что дал мне год работы с плагинами: первые месяц-два не давать модели права на запись. Пусть смотрит и предлагает, а меняет человек. В Claude Code это держат хуки, и тут приятно: у dsh есть мост dsh-hooks-claude-code, который запускает готовый hooks.json без переписывания. - insert: - name: '@deepseek-ai/dsh-hooks-claude-code' config: configPath: ./.claude/hooks.json projectDir: .
Основные события работают: PreToolUse способен запретить вызов инструмента или запросить подтверждение, PostToolUse возвращает модели результат с замечанием, Stop вынуждает сделать ещё шаг, когда проверка не сошлась. Так что хук «не трогай CMS без меня» и хук «не заканчивай, пока не сойдутся счётчики» переносятся как есть. Ограничение одно: мост понимает только командные хуки — те, что зовут внешнюю программу.
Ночной аудит без интерфейса
Под регулярные задачи есть профиль headless: одно задание, один ответ, выход. dsh —profile headless "Сверь страницы из карты сайта с кодами ответа и закрытием в robots. Итог — таблица."
Такую строку несложно повесить в планировщик раз в неделю. Задача стартует в текущей папке — там и лежат навыки проекта, — а сессия сохраняется, так что утром можно открыть и глянуть, что агент делал и где споткнулся.
Где прячется экономия
DeepSeek дешевле не только по прайсу. У агента, который долго сидит в одном проекте, почти весь вход — это повторное чтение кэша: инструкции, описания инструментов, история шагов. У DeepSeek кэш стоит копейки, особенно вне пика.
Но у MCP есть и оборотная сторона: описания всех инструментов подключённого сервера уходят в каждый запрос. Сервер на полсотни инструментов — постоянная надбавка к каждому шагу. Пока список стабилен, эта часть одинаковая и ложится в кэш. Сменил сервер список инструментов — кэш сбился с этого места и дальше.
Вывод практический: не цепляйте всё сразу. Держите отдельный профиль под семантику и отдельный под технический аудит, в каждом только нужные серверы. Для dsh это органично: профиль и есть такая стопка.
Итог переезда
Перенос SEO-набора на DeepSeek Harness — это скорее перекладывание файлов, чем переделка:
- MCP-серверы подключаются одной записью, имена инструментов те же, что в Claude Code;
- навыки — тот же формат SKILL.md, старую папку достаточно указать в настройках;
- хуки из hooks.json работают через мост, если они командные;
- не переезжают MCP-ресурсы и готовые подсказки — проверьте, не висит ли на них что-то важное;
- под регулярные отчёты есть headless, под разные задачи — разные профили.
Не меняется от харнесса к харнессу только одно: модель приносит строки, а не решения. Что развивать, что закрывать и что говорить клиенту — это по-прежнему ваша работа.