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 /mcp | MCP 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:
| Профиль | Инструменты | Используется по умолчанию для |
|---|---|---|
core | 20 — каналы, публикации, медиафайлы, аналитика и интерактивные панели | Размещённого HTTP-сервера (dist/http.js), который представлен в каталогах Claude и ChatGPT |
inbox | 27 — все инструменты из 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