DEV Community

TechNotes
TechNotes

Posted on

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
Enter fullscreen mode Exit fullscreen mode

Облачные серверы, те же Ahrefs или Semrush, подключаются похоже: вместо stdio пишете transport: streamable-http и адрес. Ключи кладутся в переменные окружения, в файл профиля их совать не надо.

Удобная мелочь: названия инструментов совпадают с Claude Code — mcp__dataforseo__.... Всё, что у вас привязано к этим именам, будь то правила разрешений или привычные формулировки заданий, едет без правок.

А теперь то, что выяснится лучше до переезда:

  • Мост пропускает только инструменты. Ресурсы MCP и готовые подсказки (prompts) не работают. Если ваш сервер Search Console отдаёт отчёты ресурсами, модель их не увидит.
  • На вызов стоит таймаут — 60 секунд по умолчанию. Объёмная выгрузка выдачи сразу по куче ключей может не влезть. Поле toolCallTimeoutMs это чинит.
  • Сервер не поднялся — харнесс всё равно стартует, просто без его инструментов, с ошибкой в логе. Для ночного прогона такая тишина опасна: задание отработает, но без данных. Поставьте failOnStartupError: true, чтобы падало открыто.

Ноутбук с открытым кодом крупным планом. Фото: 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. В конце сверь число строк на входе и на выходе. Не сошлось — задача не сделана.
Enter fullscreen mode Exit fullscreen mode

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

Две мелочи в плюс. Тело навыка перечитывается при каждой загрузке, так что правило можно подправить прямо посреди работы, без перезапуска. И вторая: папку .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: .
Enter fullscreen mode Exit fullscreen mode

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

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

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

dsh --profile headless "Сверь страницы из карты сайта с кодами ответа и закрытием в robots. Итог — таблица."
Enter fullscreen mode Exit fullscreen mode

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

Где зарыта экономия

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

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

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

Что в итоге

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

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

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

Текст подготовлен с использованием искусственного интеллекта.

Top comments (0)