Год подряд 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, для разных задач — разные профили.
Осталось разобраться с тем, чего харнесс не решает: модель подаёт строки, а не выводы. Что развивать, от чего отказаться и что сказать клиенту — это по-прежнему решаете вы.
Текст подготовлен с использованием искусственного интеллекта.

Top comments (0)