BulkPublish
Publica, programa y gestiona redes sociales en 11 plataformas con carga de medios y seguimiento de análisis.
Documentación
Servidor MCP de BulkPublish
Un servidor de Model Context Protocol que permite a Claude y otros asistentes de IA interactuar con la API de publicación en redes sociales de BulkPublish.
Qué hace
Este servidor MCP expone las operaciones de la API de BulkPublish como herramientas que los asistentes de IA pueden llamar directamente. Puedes pedirle a Claude que programe publicaciones, consulte análisis, suba medios, gestione etiquetas y más, todo mediante conversación natural.
Instalación
Opción 1: npx (recomendado)
npx @bulkpublish/mcp-server
Opción 2: Instalación global
npm install -g @bulkpublish/mcp-server
bulkpublish-mcp
Opción 3: Desde el código fuente
git clone https://github.com/azeemkafridi/bulkpublish-api.git
cd bulkpublish-api/mcp-server
npm install
npm run build
node dist/index.js
Requiere Node ≥ 20.19.
npm run buildagrupa la interfaz del compositor con Vite (build:ui), luego compila el servidor contsc.
Configuración
Establece tu clave de API como una variable de entorno:
export BULKPUBLISH_API_KEY=bp_your_api_key_here
Obtén tu clave de API en app.bulkpublish.com/developer.
Claude Desktop
Añade esto a tu archivo de configuración de 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"
}
}
}
}
Si lo instalaste desde el código fuente:
{
"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
Añade el servidor MCP a tu configuración de Claude Code:
claude mcp add bulkpublish -- npx -y @bulkpublish/mcp-server
Establece la variable de entorno en tu perfil de shell o en el archivo .env:
export BULKPUBLISH_API_KEY=bp_your_api_key_here
Servidor remoto / alojado (HTTP)
La configuración npx/stdio anterior ejecuta el servidor localmente. Los clientes web que no pueden iniciar un proceso local — conectores personalizados de claude.ai y la puerta de enlace de Smithery — se conectan a un endpoint HTTP alojado en su lugar. Junto al binario stdio, el servidor incluye un transporte HTTP Streamable (dist/http.js, ejecutado con npm run start:http):
| Endpoint | Propósito |
|---|---|
POST /mcp | MCP Streamable HTTP (sin estado) |
GET /.well-known/mcp/server-card.json | Metadatos estáticos para que los registros puedan omitir el escaneo |
GET /health | Comprobación de actividad |
Es multi-tenant — el proceso no contiene ninguna clave de API. Cada llamador proporciona su propia clave bp_… por solicitud a través de la URL de conexión (?key=bp_…), un blob de Smithery ?config=, o un encabezado Authorization: Bearer bp_… / X-BulkPublish-Key. initialize, tools/list y resources/* no necesitan clave (para que los escaneos y el descubrimiento de herramientas funcionen); un tools/call sin una devuelve 401.
Se incluye un Dockerfile:
docker build -t bulkpublish-mcp . && docker run -p 8080:8080 bulkpublish-mcp
Una vez implementado, agrégalo a claude.ai → Configuración → Conectores → Añadir conector personalizado como https://<host>/mcp?key=bp_…, o publica la URL https://<host>/mcp en Smithery.
Herramientas disponibles
| Herramienta | Descripción |
|---|---|
| Publicaciones | |
create_post | Crear y opcionalmente programar una publicación (admite reels, historias, carruseles, hilos mediante postTypeOverrides) |
compose_post | Abrir una interfaz de compositor interactiva (MCP Apps) para redactar/programar una publicación; se envía mediante create_post |
update_post | Actualizar un borrador o una publicación programada |
get_post | Obtener una sola publicación con todos los detalles |
list_posts | Listar publicaciones con filtros (estado, búsqueda, rango de fechas) |
delete_post | Eliminar una publicación |
publish_post | Publicar un borrador inmediatamente |
retry_post | Reintentar una publicación fallida |
approve_post | Aprobar una publicación pendiente de aprobación del equipo (roles con post:approve) |
reject_post | Rechazar una publicación pendiente de vuelta a borrador, con una razón opcional |
get_post_metrics | Obtener métricas de interacción (impresiones, me gusta, comentarios, compartidos). Cada entrada de plataforma lleva supportedMetrics — una clave que no esté en esa lista es un 0 almacenado, no una medición |
publish_story | Publicar como historia en Facebook o Instagram |
bulk_posts | Eliminar o reintentar múltiples publicaciones en masa |
get_queue_slot | Obtener el próximo espacio de tiempo óptimo para un canal |
| Canales | |
list_channels | Listar todos los canales de redes sociales conectados |
get_channel_health | Comprobar la salud del token del canal |
get_channel_options | Obtener opciones específicas de la plataforma (tableros, listas de reproducción) |
search_mentions | Buscar usuarios para @mencionar (X, Bluesky) |
| Conjuntos de canales | |
list_channel_sets | Listar grupos de canales guardados para apuntar a múltiples canales con un clic |
create_channel_set | Guardar un grupo de canales con nombre (máx. 50 por organización, nombres únicos por organización) |
update_channel_set | Renombrar un conjunto o cambiar sus canales |
delete_channel_set | Eliminar un conjunto de canales |
| Autopublicación RSS | |
list_rss_feeds | Listar fuentes RSS/Atom consultadas cada 15 minutos (los nuevos elementos se convierten en publicaciones) |
create_rss_feed | Añadir una fuente (máx. 20 por organización); mode = draft (predeterminado, los elementos se convierten en borradores) o publish (publicado automáticamente); el fieldMapping opcional controla cómo se renderizan los elementos (plantilla de subtítulo, selección de medios, truncamiento, anulaciones por canal) |
update_rss_feed | Cambiar, pausar o re-apuntar una fuente (cambiar feedUrl la re-baselinea — el backlog no se inunda) |
delete_rss_feed | Detener y eliminar una fuente |
| Medios | |
upload_media | Subir un archivo de medios desde una URL (o ruta local en el servidor stdio) |
get_media | Obtener un archivo de medios por ID |
list_media | Listar archivos de medios subidos |
delete_media | Eliminar un archivo de medios |
create_media_upload | Reservar una URL R2 prefirmada para una subida directa desde el navegador (usada por el compositor) |
finalize_media_upload | Registrar un objeto subido como archivo de medios después del PUT del navegador (usado por el compositor) |
create_multipart_upload | Iniciar una subida fragmentada para medios grandes (videos de hasta 1GB) — URLs prefirmadas para partes fijas de 10MB |
complete_multipart_upload | Ensamblar las partes subidas (partNumber + ETag cada una) y registrar el archivo de medios |
abort_multipart_upload | Cancelar una subida fragmentada en curso y liberar sus partes almacenadas |
| Etiquetas | |
create_label | Crear una nueva etiqueta |
list_labels | Listar todas las etiquetas |
update_label | Actualizar el nombre o color de una etiqueta |
delete_label | Eliminar una etiqueta |
| Análisis | |
get_analytics | Obtener un resumen de análisis para un rango de fechas |
| Horarios | |
list_schedules | Listar horarios recurrentes |
create_schedule | Crear un horario recurrente |
update_schedule | Actualizar un horario |
delete_schedule | Eliminar un horario |
| Cuenta | |
get_quota_usage | Comprobar el uso actual de la cuenta (oculto cuando BULKPUBLISH_HIDE_BILLING=1) |
| Interfaz interactiva (MCP Apps) | |
compose_post | Abrir el compositor de publicaciones interactivo (también listado arriba) |
view_analytics | Abrir un panel de análisis interactivo |
view_posts | Abrir una lista de publicaciones interactiva |
view_channels | Abrir una vista de canales interactiva |
view_media | Abrir una galería de medios interactiva |
view_quota | Abrir una vista de uso de cuenta interactiva (oculta cuando BULKPUBLISH_HIDE_BILLING=1) |
Interfaz interactiva (MCP Apps)
En los hosts que admiten MCP Apps — Claude, ChatGPT, VS Code, Goose, Postman y el playground de Smithery — la herramienta compose_post abre un compositor interactivo renderizado en línea en la conversación: elige canales, escribe contenido, programa opcionalmente y luego envía. Al enviar, llama a create_post a través del puente del host, por lo que el iframe en sandbox nunca contiene tu clave de API. Los hosts sin soporte de MCP Apps simplemente reciben un resumen en texto plano, así que nada se rompe.
Varias herramientas renderizan interfaces — compose_post (compositor), view_analytics, view_posts, view_channels, view_media y view_quota. Cada una es un widget autocontenido bajo src/ui/<name>/, empaquetado en un solo archivo HTML con Vite (una pasada de entrada única por widget — ver scripts/build-ui.mjs) e incrustado en el servidor mediante src/ui/widgets.generated.ts. Comparten los tokens de diseño de la aplicación web de BulkPublish (src/ui/tokens.css), por lo que el aspecto coincide. Una Vista recibe sus datos del structuredContent de la herramienta desencadenante y puede llamar a otras herramientas a través del puente del host — por lo que el iframe en sandbox nunca contiene tu clave de API. Los hosts sin soporte de MCP Apps simplemente reciben un resumen en texto plano.
Ejemplo de conversación
Aquí hay un ejemplo de uso de las herramientas de BulkPublish en Claude:
Tú: Programa una publicación para mañana a las 9 a.m. EST que diga "¡Emocionados de anunciar nuestra nueva función! Mírala en example.com" en todos mis canales conectados.
Claude: Déjame comprobar primero tus canales conectados.
[Llama a list_channels]
Tienes 3 canales activos:
- X/Twitter: @yourcompany (ID: 1)
- LinkedIn: Tu página de empresa (ID: 2)
- Instagram: @yourcompany (ID: 3)
Ahora programaré la publicación para mañana a las 9:00 a.m. hora del Este.
[Llama a create_post con content, channels, scheduledAt: "2025-01-16T14:00:00Z", timezone: "America/New_York", status: "scheduled"]
¡Listo! Tu publicación ha sido programada:
- ID de publicación: 42
- Estado: scheduled
- Programada para: 16 de enero de 2025 a las 9:00 a.m. EST
- Canales: X/Twitter, LinkedIn, Instagram
Tú: ¿Cómo se desempeñaron mis publicaciones este mes?
Claude: [Llama a get_analytics con from: "2025-01-01", to: "2025-01-31"]
Aquí está tu resumen de análisis de enero:
- Total de publicaciones: 28
- Publicadas: 25
- Fallidas: 1
- Programadas (pendientes): 2
- Por plataforma: X/Twitter (25 publicaciones, 24 publicadas), LinkedIn (20 publicaciones, 19 publicadas), Instagram (15 publicaciones, todas publicadas)
- Mejor día: 12 de enero con 5 publicaciones
Tú: Sube esta imagen y crea una publicación borrador con ella: https://example.com/product-launch.png
Claude: [Llama a upload_media con url]
Imagen subida exitosamente (ID: 15, 1200x630px, 245KB).
[Llama a create_post con content y mediaFileIds]
Publicación borrador creada (ID: 43) con la imagen de lanzamiento del producto adjunta. Puedes revisarla y publicarla cuando estés listo.
Variables de entorno
| Variable | Requerida | Predeterminado | Descripción |
|---|---|---|---|
BULKPUBLISH_API_KEY | Sí | — | Tu clave de API (comienza con bp_) |
BULKPUBLISH_BASE_URL | No | https://app.bulkpublish.com | URL base de la API (para instancias autoalojadas) |
Licencia
MIT