seo-factory-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SEO_FACTORY_TOKEN | No | API token for the site (zmcp_...) | |
| SEO_FACTORY_BASE_URL | No | URL of the site's article API (e.g., https://example.com) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| setupA | Статус конфига и авторизации по всем сайтам (живой лёгкий probe GET /api/account/mcp-tokens на каждый) + инструкция подключения, если пусто. Вызывай первым при ошибках доступа или если пользователь не знает, с чего начать. |
| add_siteA | Добавить/обновить сайт в конфиге (существующий alias перезаписывается — так ротируется токен). Валидирует живьём: GET /api/articles/list (сайт реализует контракт) и, если передан token, GET /api/account/mcp-tokens (токен жив). Невалидное НЕ сохраняется. Первый сайт становится дефолтным. yandexHost принимает и URL, и host_id Вебмастера (https:site.ru:443 — двоеточия не опечатка), нормализуется сам. hiddenTags — темы, скрытые на самом сайте (напр. VPN на zaytsv.ru из-за РКН): исключаются из перелинковки/аудитов. |
| list_articlesA | Лёгкий список статей сайта (GET /api/articles/list — без content; поля: id, slug, title, excerpt, coverImage, tags, viewCount, authorName, createdAt; updatedAt там НЕТ). Фильтры на клиенте: tag (вхождение в теги, без регистра), query (подстрока заголовка). Скрытые на сайте статьи помечаются hidden:true. Пагинации на сервере нет — приходит всё; на большом сайте передай saveToFile. |
| get_articleA | Полная статья по slug (публичный GET /api/articles/by-slug/{slug}): title, content (Markdown), excerpt, coverImage, tags, viewCount, id (нужен для update/delete), даты (LocalDateTime без таймзоны). Для больших статей — saveToFile. |
| publish_articleA | Опубликовать НОВУЮ статью (POST /api/articles). Сначала гоняет validate_article: errors блокируют (обход skipValidation:true), warnings печатаются. content — Markdown; title можно не передавать, если content начинается с «# Заголовок» (сервер возьмёт и вырежет строку). ⚠️ Slug генерирует сервер (транслит + дата + счётчик коллизий) — узнаёшь его ТОЛЬКО из ответа; внутренние ссылки на новую статью ставь после публикации. Обложка = первая картинка в теле ( |
| update_articleA | Обновить статью (resolve по slug через публичный /by-slug → PUT /api/articles/{id}). Это НЕ upsert: нет статьи → ошибка с подсказкой про publish_article. ⚠️ ГЛАВНАЯ ГОТЧА: PUT стирает excerpt/coverImage/authorName и пере-выводит их из НОВОГО content — если у статьи была обложка, а в новом теле нет первой картинки, обложка пропадёт; тул это ловит и блокирует (обход skipValidation:true). Slug при PUT стабилен. tags: не передал — сохранились старые; передал [] — стёр. 403 = статья не найдена ИЛИ принадлежит другому аккаунту (бэкенд не различает). |
| delete_articleA | ⚠️ Удалить статью (DELETE /api/articles/{id}; resolve по slug). Требует confirm:true. 404 — нет статьи, 403 — чужая (админ-аккаунт может удалять чужие). После удаления IndexNow НЕ уведомляется — URL останется в индексе; при необходимости снять через Вебмастер. |
| upload_imageA | Загрузить картинку статьи (POST /api/media/article-image, multipart): jpg/png/webp/gif/avif/svg, ≤10 МБ. Возвращает {url}. Вставь « |
| validate_articleA | Офлайн-линтер статьи БЕЗ сети: errors (пустой content; нет title и нет «# H1»; двойной H1) и warnings (title>60; первый абзац>160 — обрежется excerpt/description; нет «## FAQ» с ≥2 парами «### Вопрос» — не будет FAQPage-разметки; нет картинки-обложки в теле; голый URL без расширения — сервер не увидит обложку; <2 внутренних ссылок; заголовок без букв/цифр → slug no-title; тегов >6/длиннее 40). Возвращает и facts: слова, FAQ-пары, обложка, ссылки. Прогоняется автоматически внутри publish_article/update_article. |
| audit_orphansA | Статьи-сироты: на кого не ссылается ни одна «Читайте также» (тот же тематический скоринг, что на фронте: теги ×3 + слова заголовка ×1; count = размер блока на сайте, по умолчанию 3). Сирота = поисковик считает страницу неважной. К каждой сироте — до 2 статей-доноров, куда добавить входящую ссылку. Скрытые на сайте статьи (hiddenTags) исключены из графа. На большом сайте — saveToFile. |
| audit_contentA | Контент-аудит по ПОЛНЫМ телам (GET /api/articles/all — тяжёлый, на 400+ статьях мегабайты: всегда передавай saveToFile). По каждой статье: есть ли «## FAQ» (≥2 пар), длина < minWords, title>60, нет картинки-обложки в теле (уязвима к PUT-готче), <2 внутренних ссылок. В чат — сводка с приоритетами, полный список — в файл. |
| suggest_linksA | Перелинковка для одной статьи: тематически близкие (score>0, теги ×3 + слова заголовка ×1) с готовыми markdown-сниппетами title. Скоринг симметричен, поэтому список один: используй его и как ЦЕЛИ (на кого сослаться из этой статьи), и как ДОНОРОВ (в чьи тела добавить ссылку на эту статью через update_article). |
| match_queriesA | Мост «Вебмастер → контент-план»: сопоставить поисковые запросы со статьями сайта. Вход: queries — массив строк ИЛИ объектов {query, shows?, position?}; queriesFile — JSON-файл того же формата (пиши его сам из ответа yd_webmaster_search_queries_popular: query_text→query, TOTAL_SHOWS→shows, AVG_SHOW_POSITION→position; фильтруй позиции 8–30 ДО вызова). По каждому запросу: score против всех статей → вердикт boost (дожать существующую, best.slug) или new (написать новую). Сортировка по shows desc. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 13 tools
Each tool targets a distinct function: site config, article CRUD, audits, linking, validation, image upload, and query matching. No two tools have overlapping purposes; even similar-sounding ones like audit_content and validate_article serve different scopes (full site vs single article).
Most tools follow a consistent verb_noun pattern (e.g., add_site, get_article, publish_article). The exception is 'setup', which is a single-word verb, breaking the pattern slightly. Overall, naming is clear and predictable.
With 13 tools, the server is well-scoped for an SEO/content management domain. Each tool serves a clear purpose without redundancy, and the count falls comfortably within the ideal range of 3-15.
The tool surface covers the main workflows: site management, full article CRUD, multiple audit types, link suggestions, image upload, and query matching. Minor gaps exist, such as no tool for deleting a site or explicitly listing sites (though setup provides status), but these are non-critical.