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 это и есть естественная форма: профиль по сути и есть такая стопка.
Итог
Переезд на DeepSeek Harness — это перенос файлов, а не переделка:
- MCP-серверы подключаются одной записью, имена инструментов совпадают с Claude Code;
- навыки — прежний формат SKILL.md, старую папку хватает указать в настройках;
- хуки из hooks.json идут через мост, если они командные;
- не едут MCP-ресурсы и заготовленные подсказки — проверьте, не висит ли на них что-то важное;
- регулярные отчёты закрывает headless, разные задачи — разные профили.
И то, что не меняет никакой харнесс: модель выдаёт строки, а не решения. Что развивать, от чего отказаться и что сказать клиенту — по-прежнему ваша работа.