MCP (Model Context Protocol) — открытый протокол, который позволяет ИИ-помощникам (Claude, Cursor и другим) обращаться к внешним программам и пользоваться их инструментами. SEOMaster предоставляет проверенные технические данные, а помощник помогает человеку их осмыслить. В самом сервисе по-прежнему работают только PHP и обычные алгоритмы: MCP лишь открывает доступ к тем же методам, что и API, с теми же правами ключа, лимитами и правилами. Отдельной системы расчётов нет.
Что это даёт
Вы задаёте вопрос обычными словами, например: «Почему у моего сайта уменьшилось число страниц в поиске за последнюю неделю?». Помощник сам вызывает нужные инструменты (индексация, различия проверок, недавние исправления, первопричина), получает данные и составляет объяснение: что произошло, какие причины вероятны и в каком порядке действовать.
| Вопрос | Инструменты |
|---|
| Показать все мои сайты | list_sites, get_overview |
| Последний технический отчёт | get_site, get_report |
| Главные ошибки сайта | get_top_issues, explain_check |
| Сравнить две проверки | get_changes (параметры from и to — номера из get_history) |
| Проблемы с индексацией | get_indexing |
| Скорость и мобильная версия | get_performance |
| Изменения поисковых позиций | list_positions (trend=down), get_position_pages, list_search_queries |
| Вероятные причины ухудшения | get_diagnosis, get_changes, сценарий investigate_indexing_drop |
| Невыполненные задачи | get_plan, list_site_tasks |
| История устранения ошибки | get_work_history, get_fix_effects |
| Новая проверка (с подтверждением) | start_analysis, затем get_job |
| Перепроверка исправления (с подтверждением) | recheck_task |
Подключение
Адрес сервера: https://ваш-сервис/mcp. Авторизация — заголовок Authorization: Bearer smk_… (тот же ключ API). Готовые настройки с вашим ключом показаны в кабинете: «API и вебхуки» → «ИИ-помощники (MCP)».
Claude Code:
claude mcp add --transport http seomaster https://seo.example/mcp --header "Authorization: Bearer smk_…"
Cursor, VS Code и другие клиенты, которые принимают заголовки (mcp.json):
{"mcpServers": {"seomaster": {"url": "https://seo.example/mcp", "headers": {"Authorization": "Bearer smk_…"}}}}
Claude Desktop, через мост mcp-remote (нужен Node.js):
{"mcpServers": {"seomaster": {"command": "npx", "args": ["-y", "mcp-remote", "https://seo.example/mcp", "--header", "Authorization:${SEOMASTER_AUTH}"], "env": {"SEOMASTER_AUTH": "Bearer smk_…"}}}}
Запуск как программы (stdio), если на компьютере есть PHP: самостоятельный файл bin/mcp.php пересылает сообщения на сервер.
SEOMASTER_URL=https://seo.example SEOMASTER_KEY=smk_… php bin/mcp.php
Переменные: SEOMASTER_URL, SEOMASTER_KEY, необязательные SEOMASTER_TOOLS, SEOMASTER_READONLY, SEOMASTER_LANG. ChatGPT и веб-версия Claude подключаются кнопкой через вход OAuth (см. ниже).
Подключение кнопкой (OAuth)
ChatGPT и claude.ai подключают сервер без заголовка: добавьте свой коннектор с адресом https://ваш-сервис/mcp и нажмите «Подключить». Откроется страница SEOMaster: войдите в аккаунт, отметьте права (чтение включено всегда; запуск проверок и изменение данных — по желанию) и нажмите «Разрешить». Протокол — OAuth 2.1:
- метаданные:
/.well-known/oauth-protected-resource (защищённый ресурс /mcp) и /.well-known/oauth-authorization-server (адреса конечных точек); ответ 401 на /mcp указывает на них в заголовке WWW-Authenticate (resource_metadata); - динамическая регистрация клиентов:
POST /oauth/register (RFC 7591); адрес возврата — https, http://localhost или схема приложения; до 20 регистраций в час с одного адреса; - вход:
GET /oauth/authorize — код с обязательным PKCE (code_challenge_method=S256), state и resource проверяются, ответ содержит iss (RFC 9207); - токены:
POST /oauth/token — authorization_code и refresh_token; отзыв: POST /oauth/revoke (RFC 7009).
Токен доступа — обычный ключ API (smk_…) с выбранными правами: он работает в MCP и в REST API, виден в «API и вебхуки → Ключи» с пометкой OAuth, а вкладка «ИИ-помощники (MCP)» показывает все подключения. Токен живёт сутки и обновляется приложением само; refresh-токен меняется при каждом обновлении и действует 90 дней с последнего использования. Повторное использование старого refresh-токена или кода отзывает доступ целиком. Отзыв ключа в «Ключах» закрывает доступ немедленно, повторное подключение того же приложения заменяет прежнее. Если сервис стоит за прокси, задайте SEOMASTER_BASE_URL (адрес с https).
Ключ и права
Для помощника заведите отдельный ключ (кнопка в кабинете создаёт его с правом read). Набор инструментов определяется правами ключа: с read помощник видит только чтение; run добавляет запуск проверок, write — изменение данных. Ключ можно отозвать в любой момент; журнал вызовов виден в карточке ключа. Каждый вызов инструмента — запрос API в лимите ключа (по умолчанию 120 в час; для помощника кнопка в кабинете задаёт не меньше 120): помощник делает несколько вызовов на один вопрос, при необходимости поднимите лимит ключа.
Инструменты
Всего 62; каждый соответствует методу API (подробности и параметры — в справочнике «API_REFERENCE»). Названия общие для API, CLI и MCP.
Ключ (account)
| Инструмент | Право | Подтверждение | Что делает |
|---|
get_account | read | нет | Сведения о ключе и владельце: права, срок, лимит, расход за текущий час. |
get_key_usage | read | нет | Запросы этого ключа по дням за последние 30 суток. |
Сайты (sites)
| Инструмент | Право | Подтверждение | Что делает |
|---|
list_sites | read | нет | Сайты в мониторинге с последней оценкой. |
add_site | write | да | Добавить сайт в мониторинг (с учётом лимита тарифа). |
remove_site | write | да | Убрать сайт из мониторинга. |
get_overview | read | нет | Все сайты в одной таблице: ранг и его изменение, критичные и открытые задачи, доступность, давность проверки, проект и важность; с фильтрами, сортировкой и постраничным выводом. Для сайтов с типом (профилем) ранг учитывает исключения, рядом rank_without_exclusions. |
Данные сайта (site-data)
| Инструмент | Право | Подтверждение | Что делает |
|---|
get_site | read | нет | Карточка сайта: оценка, задачи, динамика. |
get_report | read | нет | Последний отчёт по сайту. |
get_history | read | нет | История проверок. |
get_crawl | read | нет | Последний аудит страниц. |
get_links | read | нет | Перелинковка: сироты, битые ссылки, дубли. |
get_external_links | read | нет | Внешние ссылки по результатам аудита. |
get_uptime | read | нет | Доступность: аптайм за 24 часа, 7 и 30 дней, инциденты. |
get_top_issues | read | нет | Пять главных проблем простыми словами: что это, чем грозит, сколько баллов ранга даст исправление, трудоёмкость; итог «если исправить всё». |
get_changes | read | нет | Различия двух проверок: новые, устранённые и вернувшиеся замечания, ухудшения и улучшения, изменение ранга и групп, технологии. По умолчанию — последняя и предыдущая проверки. |
get_performance | read | нет | Скорость и мобильная версия: проверки скорости и адаптации из последнего отчёта и показатели браузера (LCP, CLS, INP, TBT) по телефону и компьютеру. |
Задачи (tasks)
| Инструмент | Право | Подтверждение | Что делает |
|---|
list_site_tasks | read | нет | Задачи по сайту с идентификаторами и статусами. |
set_task_status | write | да | Сменить статус задачи: open, done, ignored. |
get_plan | read | нет | Открытые задачи по всем сайтам (или по одному), самые полезные первыми. План пересобирается с учётом типа сайта. |
recheck_task | run | да | Перепроверить одну задачу: сайт проверяется заново, ответ — было, стало, исправлено ли. Свежий отчёт (моложе двух минут) используется повторно; действует суточный предел перепроверок. |
get_fix_effects | read | нет | Эффект исправлений: помогла ли выполненная задача (показатель до и после, изменение в процентах, вывод). |
get_work_history | read | нет | История работ по сайту: что исправлено, какие были инциденты, ваши пометки за период (days, до 90). |
События (events)
| Инструмент | Право | Подтверждение | Что делает |
|---|
list_events | read | нет | Лента событий с фильтрами и курсором after_id для опроса. |
Трафик (traffic)
| Инструмент | Право | Подтверждение | Что делает |
|---|
get_traffic_forecast | read | нет | Прогноз органического трафика на 14 дней с диапазоном, тренд, необычные дни, оценка трафика конкурентов по вашим запросам и потенциал роста. |
Позиции (positions)
| Инструмент | Право | Подтверждение | Что делает |
|---|
get_position_pages | read | нет | Какие страницы сайта держат видимость и по каким запросам, плюс каннибализация (по запросу в выдаче разные страницы). |
get_serp_volatility | read | нет | Волатильность выдачи по дням: смена состава топ-10 и сдвиги ваших позиций, дни, похожие на обновление выдачи. |
Глубокий обход (deep)
| Инструмент | Право | Подтверждение | Что делает |
|---|
get_js_dependency | read | нет | Зависимость сайта от JS по последней проверке рендерингом: разделы, страницы выборки, что добавляет JS (текст, ссылки, мета-данные), найденные фреймворки. |
Сторонние API (providers)
| Инструмент | Право | Подтверждение | Что делает |
|---|
list_providers | read | нет | Реестр провайдеров: подключён ли, свежесть данных, бюджет ошибок за 30 суток, атрибуция, можно ли показывать данные публично, срок хранения и когда вы сверяли условия. Параметр all=1 добавляет неиспользуемых провайдеров. |
Соцсети (social)
| Инструмент | Право | Подтверждение | Что делает |
|---|
get_social | read | нет | Ссылки на соцсети на главной, карточки Open Graph, состояние страниц ВКонтакте и Telegram, число подписчиков и замечания аудита (по последней проверке). |
Конкуренты (competitors)
| Инструмент | Право | Подтверждение | Что делает |
|---|
get_competitor_history | read | нет | Динамика доли видимости вас и главных конкурентов по срезам выдачи (параметры points до 26, step 7 или 30) и кто вас обогнал или резко вырос. |
get_competitors | read | нет | Доля видимости сайта и конкурентов по вашим запросам, угрозы, площадки в выдаче, кластеры запросов, намерения и сложность. |
get_keyword_gap | read | нет | Разрыв по запросам: где конкуренты в топ-10, а вас нет (kind=missing) или они выше (kind=behind). С оценкой потенциала и сложности. |
Диагностика (diagnosis)
| Инструмент | Право | Подтверждение | Что делает |
|---|
get_diagnosis_all | read | нет | Диагноз всех ваших сайтов: уровень, оценка здоровья, первопричина. Самые тяжёлые первыми. |
get_diagnosis | read | нет | Полный диагноз сайта: зоны здоровья, первопричина, динамика, полнота данных и рекомендуемый порядок действий с оценкой времени и прироста индекса. |
get_diagnosis_history | read | нет | Здоровье сайта по дням: оценка, уровень, зоны, первопричина и изменения за неделю. |
Вебхуки (webhooks)
| Инструмент | Право | Подтверждение | Что делает |
|---|
list_webhooks | read | нет | Ваши адреса вебхуков и их состояние (без секретов). |
list_webhook_deliveries | read | нет | Последние доставки на адрес: статус, код ответа, число попыток. |
Проверки (checks)
| Инструмент | Право | Подтверждение | Что делает |
|---|
analyze_site_sync | run | да | Проверить сайт (или взять свежий отчёт из кэша). |
check_page | run | да | Одна проверка страницы (meta, headings, images и т. д.). |
check_page_full | run | да | Все проверки страницы сразу. |
check_ssl | run | да | Сертификат сайта (живое подключение). |
check_dns | run | да | DNS-записи домена (живой запрос). |
start_analysis | run | да | Запустить проверку сайта в фоне: ответ 202 с заданием, ход — GET /jobs/{id}. Свежий отчёт из кэша возвращается как готовое задание; fresh=true — проверить заново. |
start_crawl | run | да | Запустить аудит страниц сайта из мониторинга в фоне: ответ 202 с заданием. Считается как три проверки в лимите. |
Индексация (indexing)
| Инструмент | Право | Подтверждение | Что делает |
|---|
get_indexing | read | нет | Диагностика индексации: страницы вне индекса и причины по данным Яндекса и Google, собственная проверка, расхождения, действия. |
Рынок (market)
| Инструмент | Право | Подтверждение | Что делает |
|---|
get_market | read | нет | Рыночная аналитика по загруженным данным подключённого источника (Ahrefs, Semrush): конкуренты, пересечения, упущенные запросы и потенциал. Данные только ваши и только из разрешённых источников. |
Тип сайта (profile)
| Инструмент | Право | Подтверждение | Что делает |
|---|
get_site_profile | read | нет | Тип сайта (магазин, форум, блог, корпоративный, портал), исключённые проверки, ранг с профилем и без исключений, допустимые типы и исключения. |
set_site_profile | write | да | Задать тип сайта и исключения. Каждое исключение нужно подтвердить в confirm: исключаются только проверки из белого списка, не больше 5 и не больше половины веса группы. Без exclude берутся исключения типа по умолчанию. |
reset_site_profile | write | да | Сбросить тип сайта: применяется стандартный набор проверок. |
Справка (help)
| Инструмент | Право | Подтверждение | Что делает |
|---|
list_explanations | read | нет | Список кодов проверок, для которых есть объяснение и инструкция. |
explain_check | read | нет | Объяснение проверки: что это значит, примеры хорошего и плохого значения, почему важно, трудоёмкость и ссылка на пошаговую инструкцию. Параметр lang=ru/en. |
Задания (jobs)
| Инструмент | Право | Подтверждение | Что делает |
|---|
list_jobs | read | нет | Последние фоновые задания, запущенные через API. |
get_job | read | нет | Состояние задания: queued, running, done или error, прогресс, ссылки на результат; poll_after_s — через сколько секунд спрашивать снова. |
Поиск и ссылки (search)
| Инструмент | Право | Подтверждение | Что делает |
|---|
list_search_queries | read | нет | Поисковые запросы сайта из Яндекс.Вебмастера и Google Search Console: клики, позиция и их прежние значения. |
list_search_opportunities | read | нет | Возможности роста по данным поиска: запросы «почти в топе», низкий CTR и каннибализация страниц, с ожидаемым приростом кликов. |
list_positions | read | нет | Позиции отслеживаемых запросов: сейчас, в прошлую проверку, неделю назад, лучшая; trend=down — просевшие за неделю, up — выросшие, lost — выпавшие из выдачи. |
list_backlinks | read | нет | Обратные ссылки из подключённых источников: живые или пропавшие, с анкором, типом и рейтингом источника. |
Утилиты (utilities)
| Инструмент | Право | Подтверждение | Что делает |
|---|
list_utilities | read | нет | Каталог утилит сервиса (86 штук: проверки сайта, текст, разработчику, сеть, подсказки и превью, изображения, расчёты): группа, название, обращается ли к чужим сайтам (net), работает ли через API. Фильтры: group, q (поиск), net. |
get_utility | read | нет | Описание одной утилиты: поля ввода с типами, допустимыми значениями и пределами, нужное право, пример input. Вызывайте перед запуском. |
run_utility | read (run для net=true) | только для net=true | Запустить утилиту. Результат: result (данные), blocks (готовые блоки: таблицы, пары, код, сравнение) и warnings. Утилиты, которые ходят на чужие сайты, требуют право run. Данные нигде не сохраняются. |
Сводки (digest)
| Инструмент | Право | Подтверждение | Что делает |
|---|
get_today | read | нет | Что делать сегодня: индекс и динамика сайтов, самые полезные задачи, открытые инциденты, диагноз, вероятные причины, результаты ваших действий, события за сутки. |
list_incidents | read | нет | Инциденты: связанные сигналы (падение, недоступность, изменение выдачи) с началом, концом, уровнем и советом. Фильтры: host, days, status. |
Подтверждение действий
Любой инструмент, который меняет данные или расходует лимит проверок, сначала возвращает не результат, а описание действия:
{"confirmation_required": true, "tool": "start_analysis", "action": "Будет запущена проверка сайта example.com: расходуется суточный лимит проверок вашего тарифа.", "arguments": {"host": "example.com"}, "next": "Спросите пользователя…"}
Помощник должен спросить вас и только после согласия повторить вызов с confirmed=true. Кроме того, такие инструменты помечены в протоколе как не «только чтение» (и удаление — как разрушающее), поэтому клиенты показывают собственный запрос разрешения. Сервер не может проверить, что человек действительно согласился: это обязанность клиента и помощника, поэтому давайте права run и write только тем помощникам, которым доверяете.
Ресурсы и готовые сценарии
Ресурсы (resources): seomaster://sites, seomaster://plan, seomaster://today, seomaster://utilities, seomaster://guide и шаблоны seomaster://site/{host}/issues, …/changes, …/indexing, seomaster://explain/{code}. Готовые сценарии (prompts) — заготовки вопросов с порядком вызова инструментов:
| Сценарий | Аргументы | Для чего |
|---|
investigate_indexing_drop | host | Почему у сайта уменьшилось число страниц в поиске |
weekly_report | host | Недельный отчёт по сайту |
what_to_fix_first | host? | Что исправлять в первую очередь |
verify_fix | host, task_id | Проверить исправление |
speed_and_mobile | host | Скорость и мобильная версия |
search_growth | host | Где можно вырасти в поиске |
compare_checks | host | Сравнить две проверки |
full_site_audit | host | Полный аудит сайта с приоритетами |
new_site_onboarding | host | Подключить новый сайт и разобрать первые результаты |
daily_briefing | — | Утренняя сводка: что важно сегодня |
incident_triage | host | Разобрать инцидент на сайте |
page_seo_review | url, keyword? | SEO-разбор одной страницы |
technical_seo_health | host | Техническая проверка сайта утилитами |
security_and_reputation | host | Безопасность и репутация домена |
redirect_migration_check | host | Проверить перенос сайта и редиректы |
link_health_review | host | Здоровье ссылок сайта |
meta_tags_writer | url, keyword? | Написать title и description для страницы |
content_quality_check | url | Проверить качество текста страницы |
keyword_cannibalization | host | Каннибализация запросов |
competitor_review | host | Обзор конкурентов |
serp_volatility_check | host | Это обновление выдачи или проблема сайта |
traffic_outlook | host | Прогноз трафика и точки роста |
backlinks_review | host | Обзор обратных ссылок |
uptime_and_speed_report | host | Доступность и скорость за период |
monthly_client_report | host | Ежемесячный отчёт для клиента |
social_presence_review | host | Соцсети и превью ссылок |
robots_sitemap_review | host | Проверка robots.txt и sitemap |
developer_ticket | host, task_id | Задача для разработчика по замечанию |
pre_launch_checklist | host | Чек-лист перед запуском сайта |
utm_campaign_links | url, campaign? | Размеченные ссылки для кампании |
utility_picker | task | Подобрать и запустить подходящую утилиту |
Наборы инструментов
Чтобы не перегружать помощника и сузить доступ, добавьте параметры к адресу: ?tools=essentials — основной набор из 21 инструмента; ?tools=site-data,indexing — только указанные группы (коды групп указаны в заголовках разделов выше; неизвестная группа отклоняется ошибкой, как и у других серверов); ?readonly=1 — без действий; ?lang=en — описания на английском (по умолчанию русский).
Безопасность
- Вебхуки через MCP не публикуются: адрес для событий, подсказанный текстом чужой страницы, был бы каналом утечки данных. Их можно настраивать только в кабинете или через API.
- Тексты со страниц сайтов (заголовки, анкоры, запросы) — недоверенные данные. Сервер сообщает об этом помощнику в инструкции; тем не менее внимательно относитесь к просьбам помощника, которые пришли «из данных».
- Запросы из браузера принимаются только с разрешённых источников (адрес сервиса, claude.ai, chatgpt.com и список
mcp_origins в настройках); остальные получают 403. - Ответ инструмента ограничен 60 КБ: длинные списки укорачиваются, в ответе есть поле
_truncated с числом показанных и общих элементов. Для остального есть limit и offset. - Данные видит только владелец ключа; права и IP-ограничения ключа действуют так же, как в API.
Протокол
Транспорт — Streamable HTTP: только POST /mcp с одним сообщением JSON-RPC 2.0, ответ application/json (без потоков SSE и без сеансов). GET и DELETE дают 405. Пакеты запросов не поддерживаются (убраны в версии протокола 2025-06-18). Поддерживаемые версии: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05. Методы: initialize, ping, tools/list, tools/call, resources/list, resources/templates/list, resources/read, prompts/list, prompts/get.
Ошибки авторизации и лимита приходят с HTTP-кодом 401, 403 или 429 и телом JSON-RPC: {"error": {"code": -32001, "message": "…", "data": {"code": "invalid"}}}; коды data.code — те же, что в API (missing, invalid, revoked, expired, ip, blocked, limit, maintenance, server). Ошибка самого инструмента приходит как обычный результат с isError: true и телом {"error", "code", "http", "retryable", "hint"}, чтобы помощник мог на неё отреагировать. Ошибки протокола (неизвестный инструмент, неверные параметры) — стандартные ошибки JSON-RPC.
Ограничения
- Вход OAuth требует публичного адреса с https; для работы на закрытой сети используйте ключ в заголовке.
- Сервер не отправляет уведомления и не ведёт сеансы; долгие операции — задания, ход смотрите через
get_job. - Данные, которых нет (источник не подключён, проверка не запускалась), возвращаются как
not_ready с пояснением; помощник не должен их выдумывать, но это зависит от модели. - Описания инструментов и сценарии — на русском и английском;
plain и guide в explain_check — только на русском. - Согласие на действие обеспечивается описанием инструмента, пометками протокола и запросом клиента, а не проверкой на сервере.