Почему агенту недостаточно промпта

Знания модели и актуальная выдача — разные источники. Даже сильная LLM не должна угадывать текущие позиции, рекламные блоки, сниппеты или состав доменов. Поисковая выдача меняется по региону, языку, устройству, времени и персонализации.

Ручная передача данных частично решает проблему, но создаёт четыре риска:

  • оператор может пропустить результат, перепутать позицию или обрезать сниппет;
  • агент не знает точные параметры запроса и время сбора;
  • повторный анализ требует снова собирать и вставлять данные;
  • невозможно отделить факты источника от выводов модели.

Coding-агент становится полезнее, когда получает ограниченный инструмент с формализованным входом и машинно-читаемым ответом. Именно эту границу и задаёт MCP: Claude Code вызывает сервер, сервер получает данные из разрешённого источника, а результат возвращается в контекст с явными полями.

Что именно сравниваем

В обоих вариантах Claude Code видит инструмент с одинаковой задачей: получить органические результаты по фразе, стране, языку, устройству и лимиту. Различается транспорт и место выполнения.

Свойство Hosted HTTP Local stdio
Где работает сервер На удалённой инфраструктуре На машине пользователя
Транспорт HTTP с поддерживаемым MCP-механизмом stdio: JSON-сообщения через stdin и stdout
Запуск Подключение к URL Claude Code запускает локальный процесс
Секреты Могут храниться у провайдера или передаваться в заголовке Обычно читаются из локальных переменных окружения
Обновление Централизованное Пользователь обновляет пакет или исходники
Типичный риск Сеть, доступность сервиса, доверие оператору Зависимости, версии runtime, загрязнение stdout

Hosted не означает автоматически «облачный SERP-провайдер», а local не означает «бесплатный парсинг». В обоих случаях сервер может обращаться к одному и тому же лицензированному источнику данных. Для честного сравнения источник, параметры запроса и схема ответа должны совпадать.

Практический кейс и правила теста

Представим редактора русскоязычного технического журнала. Он готовит материал под запрос mcp сервер для seo и хочет понять:

  • какие типы страниц присутствуют в первых десяти органических результатах;
  • какие темы повторяются в заголовках и сниппетах;
  • каких важных аспектов нет в плане будущей статьи;
  • какие утверждения нельзя делать без дополнительного источника.

Это учебный запрос, а не заявление о реальной частотности или коммерческой ценности фразы. Фактическую выдачу читатель получает через собственный источник в момент теста.

Фиксируем тест до запуска

{
  "query": "mcp сервер для seo",
  "country": "RU",
  "language": "ru",
  "device": "desktop",
  "limit": 10
}

Запишите рядом дату и время запуска, название источника, тариф или режим, а также признак кеширования. Не меняйте формулировку запроса между двумя прогонами. Если источник поддерживает точную геолокацию, используйте один и тот же населённый пункт; если нет — не имитируйте эту точность в выводах.

Главное правило: сравнивайте подключения, а не две разные поисковые базы. Разные провайдеры могут вернуть разные выдачи даже при одинаковом запросе.

Подготовка

Понадобятся Claude Code, поддерживаемая среда запуска локального сервера и легальный источник SERP-данных с документированным API. Ниже используются условные адреса, команды и имена переменных: замените их значениями из документации выбранного MCP-сервера и поставщика данных.

Проверьте среду

claude --version
node --version
npm --version

Если локальный сервер написан на Python, вместо Node.js проверьте его рекомендуемую версию:

python3 --version

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

Подготовьте отдельный тестовый каталог

mkdir seo-mcp-comparison
cd seo-mcp-comparison
git init

Секреты не должны попадать в репозиторий. Создайте локальный файл окружения только тогда, когда это предусмотрено сервером, и добавьте его имя в .gitignore. Ещё безопаснее передавать переменную непосредственно процессу через менеджер секретов или оболочку.

# пример имени, а не действующий ключ
export SERP_API_TOKEN="replace-with-your-own-token"

Не вставляйте токен в промпт, файл статьи, журнал теста или конфигурацию, которую планируете коммитить.

Подключение hosted HTTP

Сначала получите у оператора сервера точный MCP URL, способ авторизации и перечень доступных инструментов. Обычная REST-точка ещё не является MCP-сервером: клиент и сервер должны поддерживать совместимый протокол и транспорт.

Вариант через команду Claude Code

Синтаксис CLI может различаться между версиями, поэтому перед добавлением подключения проверьте встроенную справку:

claude mcp --help
claude mcp add --help

Если установленная версия поддерживает добавление HTTP-сервера таким способом, команда будет выглядеть концептуально так:

claude mcp add --transport http seo-hosted https://mcp.example.invalid/seo

example.invalid намеренно не ведёт к сервису. Подставьте адрес своего сервера. Для авторизации используйте механизм, который документирован именно вашим клиентом и сервером. Не угадывайте имя флага или формат заголовка.

Проверка регистрации

claude mcp list
claude mcp get seo-hosted

Название seo-hosted должно появиться в списке. Затем откройте Claude Code в тестовом каталоге и попросите перечислить доступные MCP-инструменты, не выполняя поисковый запрос. На этом этапе проверяются соединение, авторизация и обнаружение инструментов.

Минимальные меры безопасности

  • выдавайте токену только разрешение на чтение SERP;
  • ограничьте бюджет или число запросов на стороне провайдера;
  • не отправляйте приватные ключевые слова на чужой hosted-сервер без оценки политики данных;
  • проверьте, какие поля сервер пишет в логи и как долго их хранит;
  • разделяйте тестовые и рабочие учётные данные.

Подключение local stdio

Локальный вариант — это процесс, который Claude Code запускает командой. Запросы приходят через стандартный ввод, ответы уходят через стандартный вывод. Диагностические сообщения сервер обязан писать в stderr: любой произвольный текст в stdout может повредить протокольный поток.

Установка сервера

Используйте команду из официальной документации выбранного проекта. Для Node.js безопаснее фиксировать проверенную версию пакета, а не полагаться на плавающий тег:

# шаблон: замените пакет и версию
npm install --save-dev @vendor/seo-mcp-server@X.Y.Z

Если вы запускаете пакет без установки, всё равно укажите точную версию:

# шаблон, не название реального пакета
npx --yes @vendor/seo-mcp-server@X.Y.Z

Регистрация stdio-сервера

Сначала уточните синтаксис текущей версии:

claude mcp add --help

Типичная форма команды для stdio выглядит так:

claude mcp add seo-local --env SERP_API_TOKEN="$SERP_API_TOKEN" -- \
  npx --yes @vendor/seo-mcp-server@X.Y.Z

Некоторые версии клиента или серверы используют конфигурационный файл вместо CLI. Эквивалентная структура обычно содержит имя команды, массив аргументов и окружение:

{
  "mcpServers": {
    "seo-local": {
      "command": "npx",
      "args": [
        "--yes",
        "@vendor/seo-mcp-server@X.Y.Z"
      ],
      "env": {
        "SERP_API_TOKEN": "${SERP_API_TOKEN}"
      }
    }
  }
}

Не копируйте этот фрагмент вслепую: имя файла, область конфигурации и поддержка подстановки переменных зависят от версии Claude Code. Проверяйте локальную справку и схему конфигурации. Смысл примера — показать границу процесса и не хранить буквальный секрет.

Проверка запуска

claude mcp list
claude mcp get seo-local

Если процесс завершается сразу, выполните его команду отдельно в той же оболочке. Проверяйте код завершения и stderr, но не пытайтесь общаться с stdio-сервером вручную обычным текстом: он ожидает протокольные сообщения.

Единый контракт инструмента

Честный тест невозможен, если hosted-инструмент возвращает десять результатов с датой сбора, а local-инструмент — только пять URL. В идеале оба сервера должны предоставить инструмент с одной схемой, например search_serp.

Рекомендуемый вход

{
  "query": "string",
  "country": "string",
  "language": "string",
  "device": "desktop | mobile",
  "limit": 10
}

Рекомендуемый ответ

{
  "query": "mcp сервер для seo",
  "country": "RU",
  "language": "ru",
  "device": "desktop",
  "collected_at": "ISO-8601 timestamp or null",
  "source": "declared provider or dataset",
  "cached": true,
  "organic": [
    {
      "position": 1,
      "title": "string",
      "url": "https://...",
      "displayed_url": "string or null",
      "snippet": "string or null"
    }
  ]
}

Поля collected_at, source и cached критичны для интерпретации. Если сервер их не возвращает, отметьте это как ограничение, а не просите модель восстановить значения.

Если названия инструментов отличаются, не требуйте от модели «примерно одинакового» вызова. Составьте явное соответствие параметров и проверьте, что значения действительно доходят до источника. Например, один сервер может ожидать gl=ru, другой — country=RU; это допустимо только при одинаковой семантике.

Сравнительный тест на одном SERP-запросе

Запускайте прогоны последовательно с минимальным интервалом. Если источник позволяет задать идентификатор одного сохранённого снимка, используйте его для обоих транспортов: тогда вы сравните именно доставку данных. Если такой возможности нет, зафиксируйте время каждого ответа и учитывайте, что сама выдача могла измениться.

Шаг 1. Новый сеанс для hosted

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

Используй только MCP-сервер seo-hosted и его SERP-инструмент.

Выполни ровно один запрос:
query: "mcp сервер для seo"
country: "RU"
language: "ru"
device: "desktop"
limit: 10

Сначала покажи неизменённые метаданные ответа и таблицу organic:
position, title, url, snippet.

Затем отдельно:
1. сгруппируй результаты по типу страницы;
2. назови повторяющиеся темы только по title и snippet;
3. перечисли отсутствующие или null-поля;
4. не делай выводов о частотности, трафике и ранжирующих факторах.

Сохраните ответ в журнал вручную или разрешённым механизмом экспорта. Не просите агента записывать файл, если хотите сравнить только чтение данных и не готовы предоставить доступ на запись.

Шаг 2. Новый сеанс для local

Откройте чистый сеанс, чтобы предыдущая выдача не осталась в контексте, и повторите тот же промпт, заменив только имя сервера на seo-local.

Шаг 3. Зафиксируйте фактические показатели

Не заполняйте таблицу «на глаз». Для времени используйте измерение клиента, сервера или оболочки; для полноты — сопоставление полей; для стоимости — журнал выбранного провайдера.

Критерий Hosted HTTP Local stdio Как проверить
Инструмент обнаружен Заполнить после теста Заполнить после теста Список MCP-инструментов
Время до полного ответа Заполнить измеренное значение Заполнить измеренное значение Одинаковая точка начала и конца
Число organic Заполнить Заполнить Длина массива, не обещанный limit
Параметры подтверждены Да / нет / неизвестно Да / нет / неизвестно Эхо параметров или серверный лог
Время сбора присутствует Да / нет Да / нет Поле collected_at
Кеширование раскрыто Да / нет Да / нет Поле cached или документация
Ошибки и повторы Заполнить Заполнить Логи одного прогона
Списанные единицы или стоимость Заполнить по журналу Заполнить по журналу Биллинг источника данных

Шаг 4. Сравните сырые записи

Нормализуйте только технические различия: порядок ключей, пустую строку против null, завершающий слеш URL. Не нормализуйте позиции, заголовки и сниппеты — именно расхождения в них требуют объяснения.

Для каждой позиции проверьте:

  1. совпадает ли URL после удаления безопасных трекинговых параметров;
  2. совпадают ли title и snippet без изменения смысла;
  3. одинаковы ли страна, язык и устройство;
  4. не был ли один ответ получен из кеша;
  5. не выполнил ли агент повторный вызов после ошибки.

Если выдачи различаются, это ещё не доказывает ошибку транспорта. Причиной могут быть разные моменты сбора, разные конечные точки провайдера, скрытый регион по IP, кеш или неодинаковое преобразование параметров.

Проверка: откуда видно, что задача решена

Подключение считается рабочим не тогда, когда Claude сообщает «сервер подключён», а когда подтверждена вся цепочка.

  1. Регистрация: оба сервера отображаются в конфигурации Claude Code.
  2. Обнаружение: клиент видит нужный SERP-инструмент и его входную схему.
  3. Вызов: сервер получает все пять заданных параметров.
  4. Ответ: возвращается структурированный массив, а не пересказ модели.
  5. Происхождение: известны источник и, по возможности, время сбора и состояние кеша.
  6. Разделение: сырые данные показаны отдельно от SEO-интерпретации.
  7. Повторяемость: новый сеанс может выполнить тот же вызов без ручной вставки выдачи.

Контрольный промпт против выдуманных данных

Не используй память модели для заполнения пропусков.
Если MCP-вызов не выполнен, остановись и покажи ошибку.
Если поле отсутствует, выведи null.
Для каждого вывода укажи позиции результатов, на которых он основан.
Не утверждай, что выборка представляет весь рынок или все регионы.

Дополнительно выберите две записи из ответа и откройте их URL вручную. Это не подтверждает точную позицию в выдаче, но помогает обнаружить сломанные ссылки, неверную кодировку и очевидную подмену полей.

Проверка независимости от контекста

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

Типовые сбои и диагностика

Hosted-сервер виден, но инструментов нет

Проверьте, что URL указывает именно на MCP endpoint, а не на домашнюю страницу или REST API. Затем проверьте совместимость транспорта и авторизацию. HTTP 200 от обычной страницы не означает успешную MCP-сессию.

Ответ 401 или 403

Вероятны отсутствующий токен, неверный формат заголовка, истёкшее разрешение или запрет конкретного инструмента. Не печатайте полный заголовок авторизации в терминал или статью. Сверьте область доступа и при необходимости выпустите отдельный тестовый секрет.

Ответ 429

Достигнут лимит запросов. Не запускайте бесконтрольные повторы: они увеличивают задержку и расход. Зафиксируйте ошибку, прочитайте указание о повторе, если оно есть, и повторите тест позже с теми же параметрами.

Local-процесс сразу завершается

Проверьте версию runtime, существование команды, рабочий каталог, установку пакета и наличие переменной окружения. Запустите команду отдельно и изучите stderr. Если пакет требует сборки, выполните документированный шаг до регистрации в Claude Code.

Ошибка разбора протокола у stdio

Частая причина — отладочный console.log или баннер в stdout. Для протокола stdout должен содержать только сообщения MCP. Перенесите диагностику в stderr или отключите её штатной настройкой сервера.

Инструмент игнорирует страну или устройство

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

Claude вызывает не тот сервер

В тестовом промпте укажите точное имя подключения и запретите другие источники. Для максимально строгого испытания временно оставьте активным только проверяемый сервер, если это безопасно и предусмотрено вашей конфигурацией.

Два ответа не совпали

Сначала сравните collected_at, источник, кеш и фактически переданные параметры. Затем повторите тест на одном сохранённом снимке. Без этого нельзя приписывать расхождение HTTP или stdio.

Модель сделала выводы сверх данных

SERP из десяти результатов не показывает частотность запроса, трафик страниц, конверсию или причинные факторы ранжирования. Ужесточите промпт: требуйте ссылки на позиции и помечайте гипотезы отдельно от наблюдений.

Ограничения эксперимента

  • Один запрос — не исследование рынка. Он проверяет интеграцию и формат анализа, но не качество SEO-стратегии в целом.
  • Выдача нестабильна. Разница во времени сбора может оказаться важнее разницы транспортов.
  • Источник может нормализовать данные. Сниппеты, специальные блоки и локальные элементы не всегда представлены так, как в браузере.
  • Hosted добавляет доверенную сторону. Оператор может видеть запросы и метаданные, если архитектура не заявляет иного.
  • Local не устраняет внешний обмен. Если процесс обращается к SERP API, ключевые слова всё равно покидают компьютер.
  • Локальный запуск повышает ответственность. Пользователь управляет зависимостями, обновлениями и секретами.
  • MCP не гарантирует качество. Протокол доставляет данные и описывает инструменты, но не проверяет правдивость поставщика.
  • Стоимость определяется не только транспортом. Учитывайте тариф источника, инфраструктуру, время поддержки, кеш и повторные вызовы.

Не используйте несанкционированный автоматический сбор результатов в обход правил поисковой системы. Выбирайте источник и режим доступа, которые подходят вашей юрисдикции, договору и назначению проекта.

Как выбрать hosted или local

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

Local stdio обычно подходит для индивидуальной разработки, прототипирования и сценариев, где важно контролировать код обвязки и локальное окружение. Он уменьшает число постоянно работающих удалённых компонентов, но требует следить за runtime, пакетами и корректностью протокольного вывода.

Выбор нельзя делать только по одному замеру задержки. Для рабочего решения оцените пять групп факторов:

  1. одинаково ли полно передаются параметры SERP;
  2. можно ли установить происхождение и свежесть данных;
  3. где находятся секреты и поисковые запросы;
  4. кто обновляет сервер и разбирает сбои;
  5. какова полная стоимость, включая повторные вызовы и поддержку.

Практический вывод: для быстрого командного подключения чаще удобен hosted HTTP; для контролируемого локального эксперимента — stdio. Но победителем вашего теста должен стать вариант, который подтвердил параметры, вернул проверяемые метаданные и стабильно повторил вызов, а не тот, который просто ответил быстрее один раз.

Финальный чек-лист

  • Выбран один разрешённый источник SERP для обоих вариантов.
  • Версии Claude Code, runtime и локального пакета зафиксированы.
  • Секреты не записаны в репозиторий и промпты.
  • Hosted и local серверы обнаруживаются клиентом.
  • Схемы инструментов сопоставлены по смыслу.
  • Запрос, страна, язык, устройство и лимит одинаковы.
  • Каждый прогон выполнен в чистом сеансе.
  • Сырые данные отделены от интерпретации модели.
  • В журнал внесены только измеренные показатели.
  • Расхождения проверены по времени, кешу и параметрам.
  • Повторный вызов проходит без ручной вставки выдачи.

После этой проверки Claude Code получает актуальные SEO-данные как инструмент, а не как фрагмент текста от оператора. Следующий шаг — превратить тот же контракт в повторяемый процесс: сбор снимка, сохранение метаданных, анализ и проверка выводов по позициям.