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