MCP для SEOParse
Підключіть власного AI-провайдера (Claude Code, Anthropic Messages API, VS Code, Gemini CLI) і керуйте аналізом контенту без інтерфейсу.
Що таке MCP
MCP — відкритий протокол, який дозволяє AI-клієнту
(наприклад, Claude Code чи іншому асистенту) підключатися до зовнішнього сервісу як до набору
«тулів» (дій) і «ресурсів» (даних для читання), без окремого UI. SEOParse піднімає власний
MCP-сервер поруч з основним застосунком: кожен тул MCP відповідає рівно одному ендпоінту
публічного REST API /api/v1, і обидва беруть схеми даних з одного джерела правди —
реєстру тулів нижче.
Що це дає
- AI-провайдер може читати URL, абзаци, речення, SERP-результати та конкурентів вашого сайту напряму.
- Довгі операції (парсинг, SERP-аналіз, перезапис сторінки) запускаються й відстежуються через задачі
(
job_id) — без очікування у відкритому запиті. - Доступ обмежується персональним токеном зі scope'ами — AI бачить і може лише те, що дозволено і вашому обліковому запису, і самому токену.
- Кожен виклик логується окремо від інтерфейсу, з наскрізним ідентифікатором запиту, — завжди можна простежити, що саме зробив AI-клієнт.
Як підключити
-
Створіть персональний API-токен: Профіль → API Tokens.
Оберіть потрібні scope'и (
read/write/analyze/delete) — сирий секрет токена показується рівно один раз, збережіть його одразу. Видача токена (create_token) доступна лише через цю сторінку і REST напряму — це навмисно не тул MCP. - Підключіть одного з клієнтів нижче до адреси MCP-сервера:
https://seoparse.site/mcp.
Claude Code
claude mcp add --transport http seoparse https://seoparse.site/mcp --header "Authorization: Bearer <ВАШ_ТОКЕН>"
або файл .mcp.json:
{
"mcpServers": {
"seoparse": {
"type": "http",
"url": "https://seoparse.site/mcp",
"headers": { "Authorization": "Bearer <ВАШ_ТОКЕН>" }
}
}
}
Anthropic Messages API (MCP connector)
{
"mcp_servers": [
{ "type": "url", "url": "https://seoparse.site/mcp", "name": "seoparse", "authorization_token": "<ВАШ_ТОКЕН>" }
],
"tools": [
{ "type": "mcp_toolset", "mcp_server_name": "seoparse" }
]
}
VS Code / Copilot
Файл .mcp.json (або ~/.copilot/mcp-config.json):
{
"servers": {
"seoparse": {
"type": "http",
"url": "https://seoparse.site/mcp",
"headers": { "Authorization": "Bearer <ВАШ_ТОКЕН>" }
}
}
}
Gemini CLI
Файл ~/.gemini/settings.json:
{
"mcpServers": {
"seoparse": {
"httpUrl": "https://seoparse.site/mcp",
"headers": { "Authorization": "Bearer <ВАШ_ТОКЕН>" }
}
}
}
claude.ai / ChatGPT connectors (OAuth-підключення без ручного токена) — після впровадження OAuth (фаза 4 плану MCP).
Scopes і безпека
Ефективні права виклику завжди дорівнюють перетину прав вашого користувача і scope'ів токена: токен ніколи не підвищує роль і не обходить обмеження облікового запису (наприклад, заборону на парсинг). Доступні scope'и:
read— читання даних (URL, контент, SERP, задачі, токени).write— зміни без витрати бюджету (видача токенів, скасування задач).analyze— дії, що витрачають бюджет SERP/AI (Bright Data, AI-перезапис).delete— незворотні дії (відкликання токенів тощо).
Деструктивні тули (позначені прапорцем «⚠️ Потребує confirm=true» у довіднику нижче) вимагають
явного аргументу confirm: true — без нього виклик відхиляється помилкою
confirm_required.
Задачі та прогрес
Довгі операції (парсинг, SERP-аналіз, перезапис сторінки) не блокують виклик — тул одразу
повертає job_id. Прогрес і результат читаються тулами get_job /
list_jobs (статус, лічильники, повідомлення поточного кроку). Скасування
(cancel_job) — кооперативне: задача перевіряє прапорець скасування
між кроками (URL/батчами), тож негайної миттєвої зупинки протокол не гарантує.
Квота, ліміти й помилки
Усі помилки API повертаються в одному форматі з кодом, повідомленням і ідентифікатором запиту:
| HTTP | Код | Що означає |
|---|---|---|
| 401 | unauthorized | Токен відсутній, невалідний, відкликаний або прострочений. |
| 403 | forbidden_scope | Токену бракує потрібного scope. |
| 403 | forbidden_role | Обліковий запис не має потрібного права (наприклад, парсингу). |
| 403 | forbidden_url | Немає доступу до вказаного URL. |
| 404 | not_found | Ресурс не знайдено. |
| 422 | validation_error | Некоректні вхідні дані. |
| 400 | confirm_required | Деструктивна дія без confirm: true. |
| 403 | quota_exceeded | Вичерпано місячну SERP-квоту. |
| 429 | rate_limited | Перевищено ліміт частоти запитів (заголовок Retry-After). |
| 409 | job_conflict | Конфлікт стану задачі. |
| 502 | provider_error | Відмова Bright Data чи іншого AI-провайдера. |
| 500 | internal_error | Неочікувана внутрішня помилка сервера. |
Довідник тулів
Усього доступно тулів через MCP: 58. Кожен тул відповідає рівно одному ендпоінту /api/v1.
account
get_bright_data_balance
GET
/api/v1/account/balance
— REST-двійник цього тула
Поточний баланс акаунта Bright Data (доступно для parser+).
scope: read
force: boolean
balance: numbercached: booleanfetched_at: string (date-time)
analysis
rescan_paragraph
POST
/api/v1/paragraphs/{paragraph_id}/rescan
— REST-двійник цього тула
Синхронний повторний SERP-аналіз абзацу — повний респлит (type=paragraph) або кожного вже виділеного речення окремо (type=sentences). Spends Bright Data budget.
scope: analyze Витрачає SERP/AI-бюджет
paragraph_id: integer (обов'язкове)type: stringquery_type: string
target_id: integerrequests_made: integeris_unique: booleanis_filtered: booleanquota_remaining: integer
rescan_sentence
POST
/api/v1/sentences/{sentence_id}/rescan
— REST-двійник цього тула
Синхронний повторний SERP-аналіз одного речення. Spends Bright Data budget.
scope: analyze Витрачає SERP/AI-бюджет
sentence_id: integer (обов'язкове)
target_id: integerrequests_made: integeris_unique: booleanis_filtered: booleanquota_remaining: integer
start_serp_analysis
POST
/api/v1/jobs/serp
— REST-двійник цього тула
Запускає SERP-аналіз URL або конкретних абзаців як фонову задачу з job_id/прогресом. Spends Bright Data budget; квота списується поступово, за фактично перевіреними реченнями.
scope: analyze Витрачає SERP/AI-бюджет
url_ids: integer[]paragraph_ids: integer[]only_unanalyzed: boolean
job_id: stringkind: stringsentences_planned: integerquota_remaining_after: integer
content
get_analysis_status
GET
/api/v1/urls/{url_id}/analysis-status
— REST-двійник цього тула
Статус SERP-аналізу URL, порахований з БД (без залежності від сесії).
scope: read
url_id: integertotal_sentences: integeranalyzed: integerunique: integerfiltered: integerprogress_pct: numbercompleted: booleanactive_job_id: string
get_competitors_summary
GET
/api/v1/competitors/summary
— REST-двійник цього тула
Швидка агрегована статистика конкурентів і нашого домену по всіх власних URL.
scope: read
domain: stringurl_id: integer
total_competitors: integertotal_competitor_urls: integertotal_appearances: integertop_3_appearances: integerour_stats: OurDomainStatsOut
get_paragraph
GET
/api/v1/paragraphs/{paragraph_id}
— REST-двійник цього тула
Картка одного абзацу з повним текстом і статистикою речень.
scope: read
id: integerurl_id: integerposition: integertag_type: stringtext: stringchar_count: integerword_count: integeris_unique: booleanis_filtered: booleanuniqueness_percent: numbersentences: SentenceSummaryOutlast_analyzed: string (date-time)
get_paragraph_serp
GET
/api/v1/paragraphs/{paragraph_id}/serp
— REST-двійник цього тула
Останній SERP-результат абзацу з органічними результатами.
scope: read
query: stringtimestamp: string (date-time)is_original_empty: booleandomain_matches_count: integerexact_url_match: booleanserp_url: stringorganic_results: OrganicResultOut[]
get_sentence_serp
GET
/api/v1/sentences/{sentence_id}/serp
— REST-двійник цього тула
Повна історія SERP-сканувань одного речення.
scope: read
sentence_id: integerhistory: SentenceSerpHistoryEntryOut[]
list_competitors
GET
/api/v1/urls/{url_id}/competitors
— REST-двійник цього тула
Домени-конкуренти, знайдені в SERP-результатах абзаців і речень URL.
scope: read
items: CompetitorOut[]total: integer
list_paragraphs
GET
/api/v1/urls/{url_id}/paragraphs
— REST-двійник цього тула
Список абзаців URL зі статусами унікальності/фільтрації (пагінований).
scope: read
url_id: integer (обов'язкове)page: integerper_page: integerinclude_text: booleantext_max_chars: integeronly_non_unique: boolean
items: ParagraphOut[]total: integerpage: integerper_page: integer
list_sentences
GET
/api/v1/paragraphs/{paragraph_id}/sentences
— REST-двійник цього тула
Речення абзацу з коротким SERP-підсумком кожного речення.
scope: read
items: SentenceOut[]total: integer
gsc
disconnect_gsc
POST
/api/v1/gsc/disconnect
— REST-двійник цього тула
Відключає Google Search Console — видаляє збережене підключення.
scope: delete Потребує confirm=true
confirm: boolean (обов'язкове)
disconnected: boolean
get_gsc_connection
GET
/api/v1/gsc/connection
— REST-двійник цього тула
Стан підключення до Google Search Console і посилання на ручний consent.
scope: read
connected: booleanproperty: stringlast_sync_at: string (date-time)connect_url: string
import_gsc_csv
POST
/api/v1/gsc/import
— REST-двійник цього тула
Імпортує GSC Pages.csv (текстом) у пріоритезований пакет сторінок.
scope: write
csv_text: string (обов'язкове)property: string
batch_id: stringrows_imported: integerrows_skipped: integer
list_gsc_priority
GET
/api/v1/gsc/priority
— REST-двійник цього тула
Впорядкований за пріоритетом список сторінок GSC (striking distance).
scope: read
batch_id: stringpage: integerper_page: integer
items: GscPriorityItemOut[]total: integerbatch_id: string
queue_gsc_pages
POST
/api/v1/gsc/queue
— REST-двійник цього тула
Ставить вибрані сторінки GSC у чергу — створює URL, готові для start_parse.
scope: write
page_ids: integer[] (обов'язкове)serp_settings: GscSerpSettingsIn
url_ids: integer[]created: integer[]existing: integer[]rejected: GscQueueRejectedOut[]
select_gsc_property
POST
/api/v1/gsc/select-property
— REST-двійник цього тула
Обирає GSC-властивість для підключеного акаунту.
scope: write
property: string (обов'язкове)
connected: booleanproperty: stringlast_sync_at: string (date-time)connect_url: string
sync_gsc
POST
/api/v1/gsc/sync
— REST-двійник цього тула
Завантажує живі метрики з Google Search Console у новий пакет.
scope: write
days: integer
rows_upserted: integerwindow_from: string (date)window_to: string (date)
health
jobs
cancel_job
POST
/api/v1/jobs/{job_id}/cancel
— REST-двійник цього тула
Запитує кооперативне скасування задачі (потребує confirm=true). Не гарантує миттєву зупинку — задача перевіряє прапорець між кроками.
scope: write Потребує confirm=true
job_id: string (обов'язкове)confirm: boolean (обов'язкове)
id: stringkind: stringstatus: stringprogress: JobProgressOutresult: objecterror: stringurl_ids: integer[]created_at: string (date-time)started_at: string (date-time)finished_at: string (date-time)heartbeat_at: string (date-time)cancel_requested: boolean
get_job
GET
/api/v1/jobs/{job_id}
— REST-двійник цього тула
Стан однієї фонової задачі — статус, прогрес, результат або помилка.
scope: read
id: stringkind: stringstatus: stringprogress: JobProgressOutresult: objecterror: stringurl_ids: integer[]created_at: string (date-time)started_at: string (date-time)finished_at: string (date-time)heartbeat_at: string (date-time)cancel_requested: boolean
list_jobs
GET
/api/v1/jobs
— REST-двійник цього тула
Список власних фонових задач (парсинг/SERP/рерайт) з фільтрами за статусом і типом.
scope: read
status: stringkind: stringpage: integerper_page: integerall: boolean
items: JobOut[]total: integerpage: integerper_page: integer
manage
delete_url
DELETE
/api/v1/urls/{url_id}
— REST-двійник цього тула
Незворотно видаляє URL і всі повʼязані дані аналізу (потребує confirm=true).
scope: delete Потребує confirm=true
url_id: integer (обов'язкове)confirm: boolean (обов'язкове)
url_id: integerdeleted: boolean
export_url
GET
/api/v1/urls/{url_id}/export
— REST-двійник цього тула
Експортує повну HTML-сторінку аналізу URL (те саме, що /export/export_page).
scope: read
url_id: integer (обов'язкове)format: string
filename: stringcontent_type: stringcontent: stringcontent_base64: string
get_ignored_domains
GET
/api/v1/urls/{url_id}/ignored-domains
— REST-двійник цього тула
Список доменів, ігнорованих під час SERP-аналізу цього URL.
scope: read
url_id: integer (обов'язкове)
url_id: integerignored_domains: string[]
regenerate_export_password
POST
/api/v1/urls/{url_id}/export-password
— REST-двійник цього тула
Генерує новий пароль для захищеного публічного експорту URL (старий перестає діяти).
scope: write
url_id: integer (обов'язкове)
url_id: integerpassword: stringexport_url: string
set_ignored_domains
PUT
/api/v1/urls/{url_id}/ignored-domains
— REST-двійник цього тула
Замінює список ігнорованих доменів URL; повідомляє, чи потрібен повторний аналіз.
scope: write
url_id: integer (обов'язкове)ignored_domains: string[]
url_id: integerignored_domains: string[]need_reanalysis: boolean
toggle_favorite
POST
/api/v1/urls/{url_id}/favorite
— REST-двійник цього тула
Перемикає стан "обране" для URL поточного користувача.
scope: write
url_id: integer (обов'язкове)
url_id: integeris_favorite: boolean
me
get_me
GET
/api/v1/me
— REST-двійник цього тула
Профіль поточного користувача, стан квоти та дані токена.
scope: read
user_id: integerusername: stringemail: stringrole: stringcan_parse: booleanquota: MeQuotaOuttoken: MeTokenOut
parse
check_serp_settings
POST
/api/v1/urls/{url_id}/serp-settings/check
— REST-двійник цього тула
Dry-run порівняння нових SERP-налаштувань зі збереженими для URL.
scope: read
url_id: integer (обов'язкове)serp_settings: SerpSettingsIn (обов'язкове)
diff: SerpSettingsDiffItemOut[]need_reanalysis: boolean
collect_urls
POST
/api/v1/urls
— REST-двійник цього тула
Додає URL без веб-інтерфейсу: створює/оновлює URL, SERP-налаштування, ігноровані домени та повертає url_id кожного рядка.
scope: write
urls: string[] (обов'язкове)ignored_domains: string[]serp_settings: SerpSettingsIn
items: CollectUrlsItemOut[]rejected: CollectUrlsRejectedOut[]
start_parse
POST
/api/v1/jobs/parse
— REST-двійник цього тула
Запускає парсинг (або повний репарсинг) URL як фонову задачу. Spends Bright Data/Playwright budget. Reparse=true requires confirm=true.
scope: analyze Витрачає SERP/AI-бюджет Потребує confirm=true
url_ids: integer[] (обов'язкове)reparse: booleanconfirm: booleanserp_settings: SerpSettingsIn
job_id: stringkind: stringurl_ids: integer[]status: string
rewrite
generate_sentence_rewrites
POST
/api/v1/sentences/{sentence_id}/rewrite
— REST-двійник цього тула
Генерує 3 AI-варіанти перепису неунікального речення. Spends AI budget. force=false повертає кеш без нового виклику, якщо він є.
scope: analyze Витрачає SERP/AI-бюджет
sentence_id: integer (обов'язкове)force: boolean
items: RewriteVariantOut[]cached: boolean
list_sentence_rewrites
GET
/api/v1/sentences/{sentence_id}/rewrites
— REST-двійник цього тула
Читає збережені варіанти перепису речення без AI-виклику.
scope: read
sentence_id: integer (обов'язкове)
items: RewriteVariantOut[]cached: boolean
rewrite_paragraph
POST
/api/v1/paragraphs/{paragraph_id}/rewrite
— REST-двійник цього тула
Переписує одним AI-запитом усі неунікальні речення абзацу. Spends AI budget. skip_existing=true (дефолт) не викликає AI повторно для вже покритого абзацу.
scope: analyze Витрачає SERP/AI-бюджет
paragraph_id: integer (обов'язкове)skip_existing: boolean
paragraph_id: integersentences_rewritten: integertotal_non_unique: integeritems: RewriteVariantOut[]
start_page_rewrite
POST
/api/v1/jobs/rewrite
— REST-двійник цього тула
Запускає повносторінковий AI-рерайт неунікальних речень як фонову задачу. Spends AI budget (найбільша витрата серед rewrite-тулів).
scope: analyze Витрачає SERP/AI-бюджет
url_id: integer (обов'язкове)skip_existing: boolean
job_id: stringkind: stringstatus: string
verify_rewrite
POST
/api/v1/rewrites/{rewrite_id}/verify
— REST-двійник цього тула
SERP-верифікація обраного варіанта перепису. Spends SERP quota budget (лише для нової перевірки — кешований результат нічого не списує).
scope: analyze Витрачає SERP/AI-бюджет
rewrite_id: integer (обов'язкове)
rewrite_id: integeris_unique: booleanis_verified: booleanrequests_made: integerquota_remaining: object
rewrite_manage
apply_rewrite
POST
/api/v1/rewrites/{rewrite_id}/apply
— REST-двійник цього тула
Застосовує варіант перепису для його речення (знімає застосування з інших варіантів того самого речення).
scope: write
rewrite_id: integer (обов'язкове)
rewrite_id: integersentence_id: integeris_applied: booleanrating: integertext: string
clear_applied_rewrites
POST
/api/v1/urls/{url_id}/rewrites/clear-applied
— REST-двійник цього тула
Знімає застосування з УСІХ варіантів перепису на URL (потребує confirm=true). Не видаляє самі варіанти.
scope: delete Потребує confirm=true
url_id: integer (обов'язкове)confirm: boolean (обов'язкове)
url_id: integercleared: integer
edit_rewrite
PATCH
/api/v1/rewrites/{rewrite_id}
— REST-двійник цього тула
Редагує текст варіанту перепису вручну (1-2000 символів).
scope: write
rewrite_id: integer (обов'язкове)rewritten_text: string (обов'язкове)
rewrite_id: integersentence_id: integeris_applied: booleanrating: integertext: string
export_rewrite_draft
GET
/api/v1/urls/{url_id}/draft/export
— REST-двійник цього тула
Експортує чорновик сторінки як txt або html файл (текст у JSON; REST підтримує ?download=1).
scope: read
url_id: integer (обов'язкове)format: string (обов'язкове)
filename: stringcontent_type: stringcontent: string
export_rewrites_csv
GET
/api/v1/urls/{url_id}/rewrites/export.csv
— REST-двійник цього тула
Експортує таблицю всіх варіантів перепису URL як CSV (текст у JSON; REST підтримує ?download=1).
scope: read
url_id: integer (обов'язкове)
filename: stringcontent_type: stringcontent: string
get_rewrite_draft
GET
/api/v1/urls/{url_id}/draft
— REST-двійник цього тула
Зібраний чорновик сторінки з підставленими застосованими варіантами перепису.
scope: read
url_id: integer (обов'язкове)
url_id: integersections: DraftSectionOut[]applied_count: integergenerated_at: string (date-time)
rate_rewrite
POST
/api/v1/rewrites/{rewrite_id}/rate
— REST-двійник цього тула
Оцінює якість варіанту перепису: -1 (погано), 0 (нейтрально) або 1 (добре).
scope: write
rewrite_id: integer (обов'язкове)rating: integer (обов'язкове)
rewrite_id: integersentence_id: integeris_applied: booleanrating: integertext: string
unapply_rewrite
DELETE
/api/v1/rewrites/{rewrite_id}/apply
— REST-двійник цього тула
Скасовує застосування варіанту перепису (речення повертається до оригінального тексту в чорновику).
scope: write
rewrite_id: integer (обов'язкове)
rewrite_id: integersentence_id: integeris_applied: booleanrating: integertext: string
rules
create_parsing_rule
POST
/api/v1/parsing-rules
— REST-двійник цього тула
Створює правило виключення тегів/класів для домену при парсингу.
scope: write
domain: string (обов'язкове)exclude_tags: stringexclude_classes: string
id: integerdomain: stringexclude_tags: stringexclude_classes: stringowner_user_id: integercreated_at: string (date-time)
delete_parsing_rule
DELETE
/api/v1/parsing-rules/{rule_id}
— REST-двійник цього тула
Незворотно видаляє власне правило виключення парсингу.
scope: delete Потребує confirm=true
rule_id: integer (обов'язкове)confirm: boolean (обов'язкове)
deleted: booleanrule_id: integer
list_parsing_rules
GET
/api/v1/parsing-rules
— REST-двійник цього тула
Список правил виключення парсингу: власні для parser, усі для timlid/superuser.
scope: read
items: ParsingRuleOut[]total: integer
update_parsing_rule
PATCH
/api/v1/parsing-rules/{rule_id}
— REST-двійник цього тула
Оновлює виключені теги/класи власного правила (домен незмінний).
scope: write
rule_id: integer (обов'язкове)exclude_tags: stringexclude_classes: string
id: integerdomain: stringexclude_tags: stringexclude_classes: stringowner_user_id: integercreated_at: string (date-time)
tokens
list_tokens
GET
/api/v1/tokens
— REST-двійник цього тула
Список власних API-токенів (без сирих секретів).
scope: read
items: TokenOut[]total: integer
revoke_token
POST
/api/v1/tokens/{token_id}/revoke
— REST-двійник цього тула
Відкликає власний API-токен (потребує confirm=true).
scope: delete Потребує confirm=true
confirm: boolean (обов'язкове)
id: integerprefix: stringname: stringscopes: string[]kind: stringcreated_at: string (date-time)last_used_at: string (date-time)expires_at: string (date-time)revoked_at: string (date-time)
urls
get_content_structure
GET
/api/v1/urls/{url_id}/structure
— REST-двійник цього тула
Ієрархічна структура контенту сторінки.
scope: read
url_id: integerurl: stringstructure: object
get_page_metadata
GET
/api/v1/urls/{url_id}/metadata
— REST-двійник цього тула
SEO-метадані сторінки: title, h1, description, canonical, hreflang.
scope: read
url_id: integertitle: stringh1: stringlanguage: stringdescription: stringcanonical: stringtotal_words: integertotal_chars: integerupdated_at: string (date-time)alternate_links: AlternateLinkOut[]
get_tag_stats
GET
/api/v1/urls/{url_id}/tag-stats
— REST-двійник цього тула
Агрегована статистика вмісту за типами HTML-тегів.
scope: read
url_id: integeritems: TagStatOut[]total_tags: integer
get_url
GET
/api/v1/urls/{url_id}
— REST-двійник цього тула
Картка URL: статистика, SERP-налаштування, ігноровані домени.
scope: read
id: integerurl: stringdomain: stringpath: stringis_parsed: booleanlast_parsed: string (date-time)created_at: string (date-time)owner_user_id: integeris_favorite: booleanstats: UrlStatsOutserp_settings: SerpSettingsOutignored_domains: string[]metadata_present: boolean
list_favorites
GET
/api/v1/favorites
— REST-двійник цього тула
Список обраних URL поточного користувача.
scope: read
items: FavoriteOut[]total: integer
list_urls
GET
/api/v1/urls
— REST-двійник цього тула
Список URL з фільтрами й пагінацією — те саме, що показує /all_urls.
scope: read
page: integerper_page: integerdomain: stringis_parsed: stringuniqueness_op: stringuniqueness_val: integerfiltered_op: stringfiltered_val: integerdate_from: string (date)date_to: string (date)search: stringonly_favorites: stringuser_id: integer
items: UrlSummaryOut[]total: integerpage: integerper_page: integer
search_domains
GET
/api/v1/domains
— REST-двійник цього тула
Автопідказка доменів за підрядком (максимум 10).
scope: read
search: string
items: string[]