Skip to main content
Glama
zaytsv-bot-graph-mcp

zaytsv-bot-graph-mcp

by skiddgoddamn

zaytsv-mcp

CI npm version node license: MIT

MCP-сервер (+ скилл для Claude Code) для сборки и публикации воронок/автоматизаций ботов (Telegram, MAX и Instagram) в сервисе zaytsv /bots: из текстового описания → валидный граф сценария → заливка и публикация через API.

  • 🤖 30 инструментов сборки/публикации: list_bots, list_graphs, list_channels, get_graph, create_graph, update_graph, edit_graph_live, patch_graph, dry_run, publish_graph, import_funnel, list_templates, create_graph_from_template, clone_graph, copy_graph, rename_graph, set_active_graph, delete_graph, upload_file, list_files, delete_file, graph_analytics, list_bot_users, list_links (+ setup/set_token).

  • 📝 Статьи блога (тот же токен zmcp_…): article_publish, article_update, article_list, article_get — публикация статей в Markdown (как README на GitHub) в раздел /articles.

  • 📎 Медиа: upload_file грузит фото/видео/документы в библиотеку /bots/files (до 50 МБ) и возвращает публичный URL — его вставляешь в медиа-карточку сценария.

  • 🧠 Скилл build-bot-funnel: учит агента собирать корректный граф (типы узлов, ветки, кнопки, задержки) и проверять его перед публикацией. Поддерживает Telegram, MAX и Instagram.

  • 📦 Без зависимостей — чистый Node ≥18, ставится и запускается сразу.

Поддерживаемые платформы

Платформа

Онбординг

Триггеры входа

Ограничения

Telegram

Токен бота (BotFather)

/start, команды, callback, текст, рассылки

Полный функционал

MAX

Токен бота (MAX Developer)

Команды, callback, текст

Без SUBSCRIBED/reply-клавиатур (мягкие предупреждения)

Instagram

OAuth в /growth (без токена)

Комментарий/Direct/Ответ на историю/Упоминание

Ограниченный набор узлов; DELAY ≤ 24ч; ASK_QUESTION только TEXT/EMAIL/PHONE/NUMBER/CONTACT (CONTACT = ручной ввод номера); без рассылок


Установка

Вариант A — как плагин Claude Code (рекомендуется)

/plugin marketplace add skiddgoddamn/zaytsv-mcp
/plugin install zaytsv-mcp@zaytsv

Подтянутся и MCP-сервер bot-graph, и скилл build-bot-funnel. Проверить: /mcp и /plugin.

Вариант B — как обычный MCP-сервер (Claude Code / Cursor / Windsurf / любой MCP-клиент)

Через npx без установки. Пример конфига (.mcp.json / настройки клиента):

{
  "mcpServers": {
    "zaytsv-mcp": {
      "command": "npx",
      "args": ["-y", "zaytsv-mcp"],
      "env": {
        "ZAYTSV_BASE_URL": "https://zaytsv.ru",
        "ZAYTSV_MCP_TOKEN": "zmcp_ваш_токен"
      }
    }
  }
}

См. также examples/.mcp.json.


Related MCP server: telegram-api-mcp

Авторизация — персональный токен

Токен даёт полный доступ к управлению твоими ботами (как вход в аккаунт).

  1. Залогинься на https://zaytsv.ru → открой /bots/mcp-tokens.

  2. Создай токен → скопируй секрет zmcp_... (показывается один раз).

  3. Передай токен любым способом:

    • просто пришли его агенту в чат — он вызовет инструмент set_token и сохранит токен в ~/.zaytsv-bot-graph/token (применяется сразу, без рестарта), или

    • env в .mcp.json (Вариант B), или

    • переменной окружения: PowerShell setx ZAYTSV_MCP_TOKEN "zmcp_...", bash export ZAYTSV_MCP_TOKEN="zmcp_...".

Отозвать токен можно там же — доступ блокируется мгновенно.

Не знаешь, что делать? Скажи агенту «настрой подключение» — он вызовет setup, объяснит шаги и попросит токен. Любой инструмент при отсутствии токена тоже вернёт пошаговую инструкцию.

Дев-окружение: ZAYTSV_BASE_URL=http://localhost:8066. Fallback без токена: ZAYTSV_SESSION_COOKIE = значение куки SESSION из браузера.


Использование

Опиши воронку словами — агент соберёт граф и (через MCP) опубликует:

«Собери бота: /start → приветствие с кнопкой подписки на канал → вопрос с 3 кнопками (бизнес / эксперт / просто смотрю) → для каждой свою цепочку из 2 сообщений с задержкой 1 день → финал с регистрацией на вебинар. Залей в бота и опубликуй.»

Под капотом скилл соберёт nodes/edges, прогонит локальную проверку и вызовет import_funnel → создаст граф, зальёт узлы, прогонит dry-run /start, опубликует. При ошибках публикации — разберёт по code/nodeId, починит, повторит.

Инструменты

Tool

Назначение

setup

статус авторизации + пошаговая инструкция подключения

set_token

сохранить присланный токен zmcp_… (без env/рестарта)

list_bots

список ботов

list_graphs(botId)

графы (сценарии) бота

list_channels(botId)

каналы/группы, подключённые к боту (chatId для условия SUBSCRIBED)

get_graph(graphId, [summary], [saveToFile])

получить граф; summary:true — компактная сводка (id/type/title + рёбра), saveToFile — записать полный JSON на диск (для больших графов, чтобы не упереться в лимит токенов)

create_graph(botId, name)

создать пустой граф (DRAFT)

update_graph(graphId, graphFile|graph|nodes,edges)

залить узлы/рёбра (PUT); graphFile — путь к локальному JSON, граф не нужно слать инлайном

edit_graph_live(graphId, graphFile|graph|nodes,edges)

правка живого графа НА МЕСТЕ + авто-бэкап (рекомендуется для прода)

patch_graph(graphId, replacements)

строковые замены в JSON графа на сервере (для больших/живых графов)

dry_run(graphId, kind, value)

прогон без публикации

publish_graph(graphId)

публикация (вернёт errors[] при провале)

import_funnel(botId, name, graphFile|graph)

всё за раз: create → update → dry-run → publish

list_templates()

готовые шаблоны воронок

create_graph_from_template(botId, templateId, name)

граф из шаблона (DRAFT)

clone_graph(graphId)

копия графа в новый DRAFT

rename_graph(graphId, name)

переименовать сценарий

set_active_graph(botId, graphId)

переключить активный (живой) граф бота

delete_graph(graphId)

удалить граф (активный — нельзя, 409)

upload_file(path|url)

загрузить файл в /bots/files → публичный url для медиа-карточки

list_files()

файлы библиотеки /bots/files + использовано/лимит байт

delete_file(id)

удалить файл из /bots/files

graph_analytics(graphId)

прохождение сценария по узлам (где отваливается воронка)

list_bot_users(botId)

подписчики/лиды бота (постранично, поиск query)

list_links(botId)

стартовые трекинговые ссылки бота с UTM

article_list()

свои статьи блога (id, slug, title, просмотры)

article_get(slug)

статья по slug (Markdown content, excerpt, обложка)

article_publish(content, title?, cover?, excerpt?)

новая статья (Markdown; title из # ..., если не задан; обложка из cover-URL или 1-й картинки → OG; excerpt явно или авто) → id, slug, URL

article_update(id, content, title?)

обновить свою статью по id


Формат графа и проверка

Граф — контейнер zaytsv-bot-graph (nodes[] + edges[]). Полная схема узлов/хэндлов и правила валидатора — в скилле:

Локальная проверка графа перед заливкой:

# Telegram (по умолчанию)
node skills/build-bot-funnel/validate.mjs path/to/import.json
# Instagram-бот
node skills/build-bot-funnel/validate.mjs path/to/import.json --platform=INSTAGRAM
# MAX-бот
node skills/build-bot-funnel/validate.mjs path/to/import.json --platform=MAX

Разработка

git clone https://github.com/skiddgoddamn/zaytsv-mcp
cd zaytsv-mcp
ZAYTSV_MCP_TOKEN=zmcp_... node src/index.mjs   # стартует stdio MCP-сервер

Зависимостей нет — это голый JSON-RPC по stdio (протокол MCP 2024-11-05).

Безопасность

Токен = доступ к аккаунту по API. Не коммить его; держи в env. В конфигах храни ссылку ${ZAYTSV_MCP_TOKEN}, не само значение.

Лицензия

MIT — см. LICENSE.

Available Tools

30 tools
article_getA

Получить статью блога по slug (GET /api/articles/by-slug/{slug}) — публичное чтение, в т.ч. чужие. Возвращает title, content (Markdown), excerpt, coverImage, viewCount.

Inputs: slug (required).

article_listA

Список СВОИХ статей блога zaytsv (GET /api/articles/my): id, slug, title, viewCount, даты. id нужен для article_update, slug — публичный адрес /articles/{slug}. Read-only.

Inputs: no named parameters.

article_publishA

Опубликовать НОВУЮ статью блога zaytsv (POST /api/articles). content — Markdown (как README на GitHub: заголовки, списки, таблицы, код, картинки по URL). title необязателен: если не передать, заголовком станет первая строка вида «# Заголовок», и она убирается из текста. Обложку можно задать явно через cover (URL картинки) — иначе берётся первая картинка из текста; excerpt (SEO-описание) тоже можно задать явно, иначе генерируется из текста. Возвращает статью с id и slug + публичный URL.

Inputs: content (required), cover, title, excerpt.

article_updateA

Обновить СВОЮ статью по id (PUT /api/articles/{id}; id бери из article_list). content — Markdown; title необязателен (как в article_publish, иначе берётся из «# ...»). Только владелец — чужую вернёт 403.

Inputs: id (required), content (required), title.

clone_graphA

Склонировать граф в новый DRAFT «… (copy)» — безопасно итерировать поверх опубликованного.

Inputs: graphId (required).

copy_graphA

Скопировать граф в ДРУГОГО бота (в т.ч. на другую платформу). Возвращает {graphId, sourcePlatform, targetPlatform, notes[]}. notes[] помечают, что адаптировано (severity=TRANSFORM, напр. вопрос-контакт → ввод телефона текстом), что требует ручной правки (MANUAL, напр. условие SUBSCRIBED в MAX) и особенности платформы (INFO). Авто-адаптация узлов реализована для Telegram⇄MAX; при копировании в/из Instagram-бота граф копируется без трансформаций — несовместимые узлы будут отмечены при публикации (IG-allowlist). preview=true — только проверка совместимости, без копирования. Тот же бот запрещён (для дублирования есть clone_graph).

Inputs: graphId (required), targetBotId (required), preview.

create_graphB

Создать пустой граф (DRAFT) в боте. Возвращает граф с id.

Inputs: name (required), botId (required).

create_graph_from_templateA

Создать граф (DRAFT) из шаблона (см. list_templates). Возвращает граф с id — дальше правь через update_graph.

Inputs: botId (required), templateId (required), name.

delete_fileB

Удалить файл из библиотеки /bots/files по id (DELETE /api/bots/media/{id}). Освобождает место в хранилище тарифа.

Inputs: id (required).

delete_graphA

Удалить граф. Активный (опубликованный и назначенный боту) удалить нельзя — будет 409; сначала переключи активный через set_active_graph.

Inputs: graphId (required).

dry_runB

Прогнать сценарий без публикации. kind: command|callback|text.

Inputs: kind (required), value (required), graphId (required), presetTags, +2 more.

edit_graph_liveA

РЕКОМЕНДОВАННЫЙ способ правки СУЩЕСТВУЮЩЕГО (часто живого/опубликованного) сценария: редактирует ТОТ ЖЕ graphId НА МЕСТЕ (id не меняется) и сначала снимает авто-бэкап текущего состояния в один rolling-граф «🔙 Авто-бэкап». НЕ клонирует и НЕ создаёт новый активный граф. Открытые редакторы перечитают граф вживую (external_update), бот применит изменения сразу (читает активный граф заново из БД). Используй ВМЕСТО clone+publish, когда нужно поправить сценарий, который уже открыт/в проде. ВАЖНО: PUT не валидирует — перед вызовом прогони offline validate.mjs и dry_run.

Inputs: graphId (required), name, edges, graph, +4 more.

get_graphA

Получить граф по graphId. Для БОЛЬШИХ графов (десятки узлов JSON может превысить лимит токенов) используй summary:true (компактная сводка: id/type/title/позиции + рёбра) или saveToFile (записать полный граф на диск и вернуть сводку+путь — потом правь файл и заливай через update_graph/edit_graph_live с graphFile).

Inputs: graphId (required), summary, saveToFile.

graph_analyticsA

Аналитика прохождения сценария по узлам (GET /api/bots/graphs/{graphId}/analytics): сколько пользователей дошло до каждого узла — видно, где отваливается воронка. Read-only.

Inputs: graphId (required).

import_funnelA

Всё за раз: создать граф, залить узлы/рёбра, (опц.) dry-run /start, опубликовать. Граф можно передать инлайном (graph) или файлом (graphFile).

Inputs: botId (required), name, graph, dryRun, +2 more.

list_botsA

Список ботов пользователя (id, имя, статус).

Inputs: no named parameters.

list_bot_usersA

Пользователи (подписчики/лиды) бота, постранично (GET /api/bots/{botId}/users). Опц. page (с 0), size (по умолч. 25), query (поиск по имени/username/id). Read-only.

Inputs: botId (required), page, size, query.

list_channelsB

Список каналов/групп, подключённых к боту (chatId, title, type, статус бота, дата). chatId — числовой id для условия SUBSCRIBED («Подписан на канал»).

Inputs: botId (required).

list_filesA

Список файлов в библиотеке /bots/files (GET /api/bots/media) + использовано/лимит байт. Бери готовые url отсюда, чтобы не загружать одно и то же повторно.

Inputs: no named parameters.

list_graphsC

Список графов (сценариев) бота.

Inputs: botId (required).

list_templatesA

Список готовых шаблонов воронок (id, имя, описание). Можно стартовать граф из шаблона вместо сборки с нуля.

Inputs: no named parameters.

patch_graphA

Точечная правка БОЛЬШОГО/живого графа без отправки графа целиком: сервер сам берёт граф по graphId, делает строковые замены в его JSON, проверяет валидность и заливает обратно НА МЕСТЕ (с авто-бэкапом). Идеально, когда граф слишком велик, чтобы передавать его целиком через update_graph/edit_graph_live — напр. сменить id канала в условиях SUBSCRIBED, ссылки кнопок, тексты. replacements: [{find, replace}] — заменяются ВСЕ вхождения; делай find максимально специфичным, чтобы не задеть лишнее. preview=true — только показать число совпадений, ничего не сохраняя. Бот применит изменения сразу (читает активный граф заново из БД).

Inputs: graphId (required), replacements (required), backup, preview.

publish_graphB

Опубликовать граф. Вернёт publishedGraphId или errors[] (code, nodeId, message).

Inputs: graphId (required).

rename_graphA

Переименовать сценарий (работает и для опубликованных — имя не влияет на исполнение).

Inputs: name (required), graphId (required).

set_active_graphA

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

Inputs: botId (required), graphId (required).

set_tokenA

Сохранить персональный токен (zmcp_...), который пользователь создал на /bots/mcp-tokens. Применяется сразу, без рестарта.

Inputs: token (required).

setupA

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

Inputs: no named parameters.

update_graphA

Залить узлы/рёбра в граф (PUT, сырой replace без бэкапа). Для правок СУЩЕСТВУЮЩЕГО/живого сценария используй edit_graph_live. Принимает graphFile (путь к локальному файлу — НЕ нужно слать граф инлайном, удобно для больших графов), graph-контейнер или nodes/edges.

Inputs: graphId (required), name, edges, graph, +3 more.

upload_fileA

Загрузить файл в библиотеку /bots/files (POST /api/bots/media) и получить публичный URL для вставки в сценарий. Передай path (локальный файл) ИЛИ url (перезалить файл по ссылке в своё хранилище). Возвращает {id, url, mediaType, sizeBytes, originalName}. Полученный url ставь в медиа-карточку SEND_MESSAGE (image/video/audio/file/voice/videonote → поле url; gallery → urls[]) или в SEND_PHOTO.photoUrl. Лимит 50 МБ; типы: image/video/audio/pdf/zip/doc(x)/xlsx/pptx/txt (SVG запрещён); при нехватке места — HTTP 402.

Inputs: url, path, filename.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 30 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes (e.g., list_graphs, create_graph, publish_graph), but there is overlap among graph modification tools (update_graph, edit_graph_live, patch_graph) and creation tools (create_graph, create_graph_from_template, import_funnel). Detailed descriptions help, but an agent must read carefully to choose the right one.

    Naming Consistency4/5

    The majority follow a consistent verb_noun pattern (list_graphs, create_graph, delete_graph, rename_graph), but there are exceptions like article_list instead of list_articles, graph_analytics, and dry_run that break the convention. Overall, naming is readable and mostly predictable.

    Tool Count2/5

    With 30 tools, the server is over-scoped. The core graph management could be handled in fewer tools, and the inclusion of blog article tools (article_list, article_get, article_publish, article_update) is unrelated to bot graphs. Many operations are fragmented, making the toolkit feel bloated.

    Completeness4/5

    The graph lifecycle is thoroughly covered: create, get, update, delete, publish, clone, copy, rename, set active, dry run, and template creation. File and bot management are also present. Minor gaps exist (e.g., no article_delete, no single-file retrieval), but these do not affect the core domain.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      MCP server that exposes a Telegram bot, enabling sending messages and retrieving updates through natural language.
      3
      42 PyPI
      1
      MIT
    • A
      license
      C
      quality
      C
      maintenance
      Ultimate MCP server for Telegram Bot API — 169 methods, full v9.6 coverage, meta-mode, rate limiting, and circuit breaker, enabling AI to control Telegram bots with natural language.
      100
      34
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server that enables Telegram bot interaction via Telegraf, providing tools for sending, replying, reacting, editing, deleting, forwarding messages, and receiving Telegram events over an optional notification channel.
      60 npm
      4
      MIT