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, чтобы упало честно.
Ноутбук с открытым кодом крупным планом. Фото: Marc Mueller, Unsplash, CC0
Ноутбук с открытым кодом крупным планом. Фото: Marc Mueller, Unsplash, CC0

Слой второй: правила живут в навыках

Сервер тащит цифры, но не знает ваших порядков: какая длина заголовков, что считается дублем, по какому признаку фразы расходятся по посадочным. Раньше это висело в длинной подсказке, и каждый писал её на свой лад. В 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 это и есть естественная форма: профиль по сути и есть такая стопка.

Итог

Переезд на DeepSeek Harness — это перенос файлов, а не переделка:

  • MCP-серверы подключаются одной записью, имена инструментов совпадают с Claude Code;
  • навыки — прежний формат SKILL.md, старую папку хватает указать в настройках;
  • хуки из hooks.json идут через мост, если они командные;
  • не едут MCP-ресурсы и заготовленные подсказки — проверьте, не висит ли на них что-то важное;
  • регулярные отчёты закрывает headless, разные задачи — разные профили.

И то, что не меняет никакой харнесс: модель выдаёт строки, а не решения. Что развивать, от чего отказаться и что сказать клиенту — по-прежнему ваша работа.