API ВЕГА

BulkPublish MCP Server

Сервер Model Context Protocol, который позволяет Claude и другим AI-ассистентам взаимодействовать с API для публикации материалов в социальных сетях BulkPublish.

Возможности

Этот MCP-сервер предоставляет операции BulkPublish API в виде инструментов, которые AI-ассистенты могут вызывать напрямую. Вы можете попросить Claude запланировать публикации, проверить аналитику, загрузить медиафайлы, управлять метками и выполнить другие задачи — просто общаясь с ним на естественном языке.

Установка

Вариант 1: npx (рекомендуется)

npx @bulkpublish/mcp-server

Вариант 2: глобальная установка

npm install -g @bulkpublish/mcp-server
bulkpublish-mcp

Вариант 3: установка из исходного кода

git clone https://github.com/azeemkafridi/bulkpublish-api.git
cd bulkpublish-api/mcp-server
npm install
npm run build
node dist/index.js

Требуется Node версии 20.19 или выше. Команда npm run build собирает интерфейс редактора с помощью Vite (build:ui), а затем компилирует сервер с помощью tsc.

Настройка

Укажите API key в переменной окружения:

export BULKPUBLISH_API_KEY=bp_your_api_key_here

Получить API key можно на странице app.bulkpublish.com/developer.

Claude Desktop

Добавьте эту конфигурацию в файл настроек Claude Desktop:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "bulkpublish": {
      "command": "npx",
      "args": ["-y", "@bulkpublish/mcp-server"],
      "env": {
        "BULKPUBLISH_API_KEY": "bp_your_api_key_here"
      }
    }
  }
}

Если вы установили сервер из исходного кода:

{
  "mcpServers": {
    "bulkpublish": {
      "command": "node",
      "args": ["/absolute/path/to/bulkpublish-api/mcp-server/dist/index.js"],
      "env": {
        "BULKPUBLISH_API_KEY": "bp_your_api_key_here"
      }
    }
  }
}

Claude Code

Добавьте MCP-сервер в конфигурацию Claude Code:

claude mcp add bulkpublish -- npx -y @bulkpublish/mcp-server

Задайте переменную окружения в профиле командной оболочки или файле .env:

export BULKPUBLISH_API_KEY=bp_your_api_key_here

Удалённый сервер / размещённый сервер (HTTP)

В описанной выше конфигурации npx/stdio сервер запускается локально. Веб-клиенты, которые не могут запускать локальные процессы, — пользовательские коннекторы claude.ai и шлюз Smithery — подключаются к размещённой конечной точке HTTP. Помимо исполняемого файла stdio, сервер включает транспорт Streamable HTTP (dist/http.js), который запускается командой npm run start:http:

Конечная точкаНазначение
POST /mcpMCP Streamable HTTP (без сохранения состояния)
GET /.well-known/mcp/server-card.jsonСтатические метаданные, позволяющие реестрам не выполнять сканирование
GET /healthПроверка работоспособности

Сервер поддерживает несколько клиентов: процесс не хранит API key. Каждый клиент передаёт собственный ключ bp_… для каждого запроса — в URL подключения (?key=bp_…), в объекте конфигурации Smithery ?config= или в заголовке Authorization: Bearer bp_… / X-BulkPublish-Key. Для initialize, tools/list и resources/* ключ не нужен, поэтому сканирование и обнаружение инструментов работают без него. Вызов tools/call без ключа возвращает ошибку 401.

В комплект входит Dockerfile:

docker build -t bulkpublish-mcp . && docker run -p 8080:8080 bulkpublish-mcp

После развёртывания добавьте сервер в claude.ai → Настройки → Коннекторы → Добавить пользовательский коннектор, указав https:///mcp?key=bp_…, или опубликуйте URL https:///mcp в Smithery.

Профили инструментов

Сервер поддерживает три профиля инструментов. Выберите профиль с помощью BULKPUBLISH_TOOL_PROFILE:

ПрофильИнструментыИспользуется по умолчанию для
core20 — каналы, публикации, медиафайлы, аналитика и интерактивные панелиРазмещённого HTTP-сервера (dist/http.js), который представлен в каталогах Claude и ChatGPT
inbox27 — все инструменты из core, а также инструменты для Inbox и комментариев: list_conversations, get_conversation, reply_to_conversation, update_conversation, list_post_comments, reply_to_comment, moderate_commentНеобязательный профиль для размещённого сервера (BULKPUBLISH_TOOL_PROFILE=inbox). Инструменты core в нём совпадают с инструментами профиля core
fullВсе инструменты, включая инструменты для Inbox и комментариев, метки, группы хештегов, шаблоны, заметки календаря, ссылки на проверку, ссылки для подключения клиентов, повторяющиеся расписания, наборы каналов, RSS-ленты, загрузку по частям и квотыЛокального сервера stdio (npx @bulkpublish/mcp-server)

Задайте BULKPUBLISH_TOOL_PROFILE=full для размещённого сервера, чтобы включить все инструменты, или выберите core для локального сервера, чтобы использовать компактный список. Кнопки панелей обращаются к create_post, publish_post, retry_post, update_post, delete_post, list_channels, list_media, get_post, create_media_upload и finalize_media_upload, поэтому все эти инструменты входят в профиль core.

Для каждого инструмента указаны title и логические параметры readOnlyHint, destructiveHint, idempotentHint и openWorldHint. Команда npm run check:annotations проверяет их наличие во всех профилях. Добавьте --table, чтобы вывести таблицу с обоснованием для каждого инструмента, используемую при подаче заявок в каталоги.

ИнструментОписание
Публикации
create_post ★Создать публикацию и при необходимости запланировать её (поддерживаются Reels, Stories, карусели и Threads через postTypeOverrides)
compose_post ★Открыть интерактивный редактор публикаций (MCP Apps) для создания или планирования публикации; отправка выполняется через create_post
update_post ★Обновить черновик или запланированную публикацию
get_post ★Получить подробные сведения об одной публикации
list_posts ★Получить список публикаций с фильтрами по статусу, поисковому запросу и диапазону дат
delete_post ★Удалить публикацию
publish_post ★Немедленно опубликовать черновик
retry_post ★Повторить попытку публикации после сбоя
approve_postОдобрить публикацию, ожидающую подтверждения команды (для ролей с разрешением post:approve)
reject_postВернуть ожидающую одобрения публикацию в черновики; причину можно указать дополнительно
get_post_metrics ★Получить показатели вовлечённости: показы, отметки «Нравится», комментарии и репосты. Для каждой платформы указывается supportedMetrics: если показателя нет в этом списке, сохранённое значение 0 означает отсутствие данных, а не результат измерения
publish_storyОпубликовать материал в формате Stories на Facebook или Instagram
bulk_postsМассово удалить несколько публикаций или повторить попытку их публикации
get_queue_slot ★Получить ближайшее оптимальное время для публикации в канале
Каналы
list_channels ★Получить список всех подключённых каналов в социальных сетях
get_channel_healthПроверить состояние токена канала
get_channel_optionsПолучить параметры платформы, например доски или плейлисты
search_mentionsНайти пользователей для упоминания через @ (X, Bluesky, Mastodon, страницы LinkedIn — в результатах LinkedIn указывается соответствующий им идентификатор vanityName)
Группы каналов
list_channel_setsПолучить список сохранённых групп каналов для одновременного выбора нескольких каналов
create_channel_setСохранить именованную группу каналов (не более 50 на организацию; имена в пределах организации должны быть уникальными)
update_channel_setПереименовать группу или изменить входящие в неё каналы
delete_channel_setУдалить группу каналов
Автоматическая публикация из RSS
list_rss_feedsПолучить список RSS/Atom-лент, проверяемых каждые 15 минут; новые материалы превращаются в публикации
create_rss_feedДобавить ленту (не более 20 на организацию); mode задаёт режим: draft (по умолчанию — материалы создаются как черновики) или publish (автоматическая публикация). Необязательный параметр fieldMapping определяет обработку материалов: шаблон подписи, выбор медиафайла, усечение текста и переопределения для отдельных каналов
update_rss_feedИзменить ленту, приостановить её или указать другой источник (при изменении feedUrl отсчёт начинается заново, поэтому старые материалы не попадут в очередь массово)
delete_rss_feedОстановить и удалить ленту
Медиафайлы
upload_media ★Загрузить медиафайл по URL или по локальному пути на сервере stdio
get_mediaПолучить медиафайл по идентификатору
list_media ★Получить список загруженных медиафайлов
delete_mediaУдалить медиафайл
create_media_upload ★Зарезервировать подписанный URL R2 для прямой загрузки из браузера (используется редактором публикаций)
finalize_media_upload ★Зарегистрировать загруженный объект как медиафайл после выполнения браузером запроса PUT (используется редактором публикаций)
create_multipart_uploadНачать загрузку большого медиафайла по частям (видео размером до 1GB); для частей фиксированного размера 10MB выдаются подписанные URL
complete_multipart_uploadСобрать загруженные части (для каждой указываются partNumber и ETag) и зарегистрировать медиафайл
abort_multipart_uploadОтменить выполняемую загрузку по частям и удалить сохранённые части
Метки
create_labelСоздать метку
list_labelsПолучить список всех меток
update_labelИзменить название или цвет метки
delete_labelУдалить метку
Аналитика
get_analytics ★Получить сводку аналитики за указанный период
Расписания
list_schedulesПолучить список повторяющихся расписаний
create_scheduleСоздать повторяющееся расписание
update_scheduleИзменить расписание
delete_scheduleУдалить расписание
Входящие сообщения и комментарии
list_conversations ✉Получить список личных сообщений, отзывов и цепочек комментариев, отсортированный по времени последней активности, с фильтрами и постраничной навигацией (тарифы Pro и Business)
get_conversation ✉Прочитать сообщения в одной беседе в хронологическом порядке; беседа не помечается как прочитанная
reply_to_conversation ✉Немедленно отправить ответ пользователю на платформе; отменить отправку нельзя
update_conversation ✉Пометить беседу как прочитанную или непрочитанную, архивировать или восстановить её, отложить или назначить ответственного; сообщения при этом не отправляются
list_post_comments ✉Получить комментарии и реакции к опубликованной записи по каждому каналу; в результат включаются идентификаторы, используемые инструментами ответа и модерации
reply_to_comment ✉Немедленно опубликовать публичный ответ на комментарий от имени канала, где была опубликована запись
moderate_comment ✉Поставить или убрать отметку «Нравится», скрыть, показать или удалить комментарий на платформе (удаление необратимо)
Аккаунт
get_quota_usageПроверить текущее использование ресурсов аккаунта (скрыт, если задано BULKPUBLISH_HIDE_BILLING=1)
Интерактивный интерфейс (MCP Apps)
compose_post ★Открыть интерактивный редактор публикаций (также указан выше)
view_analytics ★Открыть интерактивную панель аналитики
view_posts ★Открыть интерактивный список публикаций
view_channels ★Открыть интерактивный список каналов
view_media ★Открыть интерактивную галерею медиафайлов
view_quotaОткрыть интерактивное представление использования ресурсов аккаунта (скрыто, если задано BULKPUBLISH_HIDE_BILLING=1)

Интерактивный интерфейс (MCP Apps)

В средах, поддерживающих MCP Apps, — Claude, ChatGPT, VS Code, Goose, Postman и тестовой среде Smithery — инструмент compose_post открывает встроенный в беседу интерактивный редактор: выберите каналы, подготовьте текст, при необходимости запланируйте публикацию и отправьте её. При отправке инструмент вызывает create_post через мост хост-среды, поэтому API-ключ не передаётся изолированному iframe. В средах без поддержки MCP Apps вместо этого отображается обычная текстовая сводка, так что работа продолжается без сбоев.

Несколько инструментов открывают интерфейс: compose_post (редактор публикаций), view_analytics, view_posts, view_channels, view_media и view_quota. Каждый из них представляет собой автономный виджет в src/ui//. С помощью Vite виджеты собираются в отдельные HTML-файлы: для каждого выполняется отдельная сборка с одним входным файлом (см. scripts/build-ui.mjs). Затем они встраиваются в сервер через src/ui/widgets.generated.ts. Для оформления используются те же дизайн-токены, что и в веб-приложении BulkPublish (src/ui/tokens.css), поэтому интерфейс выглядит единообразно. Виджет получает данные из structuredContent инструмента, который его вызвал, и может обращаться к другим инструментам через мост хост-среды. Благодаря этому API-ключ не передаётся изолированному iframe. В средах без поддержки MCP Apps вместо виджета отображается обычная текстовая сводка.

Пример диалога

Пример использования инструментов BulkPublish в Claude:

Вы: Запланируй на завтра на 9:00 по восточному времени публикацию со словами «Рады представить нашу новую функцию! Попробуйте её на example.com» во всех подключённых каналах.

Claude: Сначала проверю подключённые каналы.

[Вызов list_channels]

Подключено 3 активных канала:

  • X/Twitter: @yourcompany (ID: 1)

  • LinkedIn: страница вашей компании (ID: 2)

  • Instagram: @yourcompany (ID: 3)

Теперь запланирую публикацию на завтра, на 9:00 по восточному времени.

[Вызов create_post с параметрами content, channels, scheduledAt: "2025-01-16T14:00:00Z", timezone: "America/New_York", status: "scheduled"]

Готово! Публикация запланирована:

  • ID публикации: 42

  • Статус: scheduled

  • Время публикации: 16 января 2025 года, 9:00 EST

  • Каналы: X/Twitter, LinkedIn, Instagram


Вы: Как прошли мои публикации в этом месяце?

Claude: [Вызов get_analytics с параметрами from: "2025-01-01", to: "2025-01-31"]

Сводка аналитики за январь:

  • Всего публикаций: 28

  • Опубликовано: 25

  • Не удалось опубликовать: 1

  • Запланировано (ожидают публикации): 2

  • По платформам: X/Twitter (25 публикаций, 24 опубликованы), LinkedIn (20 публикаций, 19 опубликованы), Instagram (15 публикаций, все опубликованы)

  • Самый активный день: 12 января — 5 публикаций


Вы: Загрузи это изображение и создай с ним черновик публикации: https://example.com/product-launch.png

Claude: [Вызов upload_media с параметром url]

Изображение успешно загружено (ID: 15, 1200x630px, 245KB).

[Вызов create_post с параметрами content и mediaFileIds]

Черновик публикации создан (ID: 43), к нему прикреплено изображение запуска продукта. Вы можете проверить и опубликовать его, когда будете готовы.

Переменные окружения

ПеременнаяОбязательнаяЗначение по умолчаниюОписание
BULKPUBLISH_API_KEYДа—Ваш API-ключ (начинается с bp_)
BULKPUBLISH_BASE_URLНетhttps://app.bulkpublish.comБазовый URL API (для самостоятельно размещённых экземпляров)
BULKPUBLISH_TOOL_PROFILEНетfull (stdio) / core (hosted HTTP)core, inbox или full — см. Профили инструментов
BULKPUBLISH_HIDE_BILLINGНет—Значение 1 исключает get_quota_usage и view_quota (актуально только для full; в core эти инструменты не входят)

Лицензия

MIT