Последний год под «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, поднятый у вас на машине:

Облачные серверы, например 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. По описанию модель решает, нужен ли навык, а тело подгружает только в этот момент. К примеру:

Третий пункт я теперь вставляю в каждую пакетную задачу. Модель умеет молча проглотить сто строк из пятисот и отрапортовать, будто сделала всё. Счётчик на входе и выходе ловит такое надёжнее, чем вдумчивое чтение отчёта.

Ещё две мелочи. Тело навыка перечитывается при каждой загрузке, так что правило можно поменять прямо посреди работы, без перезапуска. И второе: папку .claude/skills харнесс по умолчанию не сканирует. Если навыки уже лежат там, пропишите её в customSkillDirs — копировать ничего не придётся.

Хуки как страховка

Главный вывод из года работы с плагинами: первые месяц-два не давайте модели права записи. Пусть смотрит и предлагает, а меняет человек. В Claude Code это держится на хуках, и тут приятно: в dsh есть мост dsh-hooks-claude-code, который гоняет ваш готовый hooks.json без переписывания.

Основные события на месте: PreToolUse может запретить вызов инструмента или спросить подтверждение, PostToolUse — вернуть модели результат с замечанием, Stop — заставить сделать ещё шаг, если проверка провалилась. Так что хук «не трогай CMS без меня» и хук «не заканчивай, пока не сошлись счётчики» переезжают как есть. Ограничение одно: мост понимает только командные хуки — те, что вызывают внешнюю программу.

Ночной аудит без интерфейса

Для регулярных задач есть профиль headless: одно задание, один ответ, выход.

Такую строку удобно вешать в планировщик раз в неделю. Задача стартует в текущей папке — там же лежат навыки проекта, — а сессия сохраняется, и утром можно открыть её и посмотреть, чем агент занимался и где споткнулся.

Где экономия

DeepSeek дешевле не только по прайсу. У агента, который долго сидит в одном проекте, почти весь вход — повторное чтение кэша: инструкции, описания инструментов, история шагов. Кэш у DeepSeek стоит копейки, особенно вне пиковых часов.

Но у MCP есть и обратная сторона: описания всех инструментов подключённого сервера уходят в каждый запрос. Сервер на полсотни инструментов — постоянная прибавка к каждому шагу. Пока список не меняется, эта часть остаётся одинаковой и попадает в кэш. А если сервер поменял список инструментов, кэш сбивается с этого места и дальше.

Отсюда правило: не подключайте всё сразу. Держите отдельный профиль под семантику и отдельный под технический аудит, в каждом — только нужные серверы. Для dsh это ложится естественно: профиль и есть такая стопка.

Итог

Переезд на DeepSeek Harness для SEO-набора — это скорее перенос файлов, чем переделка:

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

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