BulkPublish
Publique, agende e gerencie mídias sociais em 11 plataformas com upload de mídia e rastreamento de análises.
Documentação
Servidor MCP BulkPublish
Um servidor Model Context Protocol que permite que o Claude e outros assistentes de IA interajam com a API de publicação em redes sociais BulkPublish.
O que ele faz
Este servidor MCP expõe as operações da API BulkPublish como ferramentas que os assistentes de IA podem chamar diretamente. Você pode pedir ao Claude para agendar posts, verificar análises, enviar mídia, gerenciar etiquetas e muito mais — tudo por meio de conversa natural.
Instalação
Opção 1: npx (recomendado)
npx @bulkpublish/mcp-server
Opção 2: Instalação global
npm install -g @bulkpublish/mcp-server
bulkpublish-mcp
Opção 3: A partir do código-fonte
git clone https://github.com/azeemkafridi/bulkpublish-api.git
cd bulkpublish-api/mcp-server
npm install
npm run build
node dist/index.js
Requer Node ≥ 20.19.
npm run buildempacota a interface do compositor com Vite (build:ui) e depois compila o servidor comtsc.
Configuração
Defina sua chave de API como uma variável de ambiente:
export BULKPUBLISH_API_KEY=bp_your_api_key_here
Obtenha sua chave de API em app.bulkpublish.com/developer.
Claude Desktop
Adicione isto ao seu arquivo de configuração do 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"
}
}
}
}
Se você instalou a partir do código-fonte:
{
"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
Adicione o servidor MCP à sua configuração do Claude Code:
claude mcp add bulkpublish -- npx -y @bulkpublish/mcp-server
Defina a variável de ambiente no seu perfil de shell ou no arquivo .env:
export BULKPUBLISH_API_KEY=bp_your_api_key_here
Servidor remoto / hospedado (HTTP)
A configuração npx/stdio acima executa o servidor localmente. Clientes web que não podem iniciar um processo local — conectores personalizados do claude.ai e gateway do Smithery — conectam-se a um endpoint HTTP hospedado. Além do binário stdio, o servidor inclui um transporte HTTP Streamable (dist/http.js, executado com npm run start:http):
| Endpoint | Finalidade |
|---|---|
POST /mcp | MCP Streamable HTTP (sem estado) |
GET /.well-known/mcp/server-card.json | Metadados estáticos para que registros possam pular a varredura |
GET /health | Verificação de atividade |
Ele é multi-tenant — o processo não contém chave de API. Cada chamador fornece sua própria chave bp_… por solicitação via URL de conexão (?key=bp_…), um blob ?config= do Smithery ou um cabeçalho Authorization: Bearer bp_… / X-BulkPublish-Key. initialize, tools/list e resources/* não precisam de chave (para que varreduras e descoberta de ferramentas funcionem); um tools/call sem chave retorna 401.
Um Dockerfile está incluído:
docker build -t bulkpublish-mcp . && docker run -p 8080:8080 bulkpublish-mcp
Após a implantação, adicione-o em claude.ai → Configurações → Conectores → Adicionar conector personalizado como https://<host>/mcp?key=bp_…, ou publique a URL https://<host>/mcp no Smithery.
Ferramentas disponíveis
| Ferramenta | Descrição |
|---|---|
| Posts | |
create_post | Criar e opcionalmente agendar um post (suporta reels, stories, carrosséis, threads via postTypeOverrides) |
compose_post | Abrir uma interface de compositor interativa (MCP Apps) para rascunhar/agendar um post; envia via create_post |
update_post | Atualizar um rascunho ou post agendado |
get_post | Obter um único post com detalhes completos |
list_posts | Listar posts com filtros (status, pesquisa, intervalo de datas) |
delete_post | Excluir um post |
publish_post | Publicar um post de rascunho imediatamente |
retry_post | Tentar novamente um post com falha |
approve_post | Aprovar um post aguardando aprovação da equipe (funções com post:approve) |
reject_post | Rejeitar um post pendente de volta para rascunho, com um motivo opcional |
get_post_metrics | Obter métricas de engajamento (impressões, curtidas, comentários, compartilhamentos). Cada entrada de plataforma contém supportedMetrics — uma chave que não está nessa lista é um 0 armazenado, não uma medição |
publish_story | Publicar como story no Facebook ou Instagram |
bulk_posts | Excluir em massa ou tentar novamente vários posts |
get_queue_slot | Obter o próximo intervalo de tempo ideal para um canal |
| Canais | |
list_channels | Listar todos os canais de redes sociais conectados |
get_channel_health | Verificar a saúde do token do canal |
get_channel_options | Obter opções específicas da plataforma (quadros, playlists) |
search_mentions | Pesquisar usuários para @menção (X, Bluesky) |
| Conjuntos de canais | |
list_channel_sets | Listar grupos de canais salvos para segmentação multicanal com um clique |
create_channel_set | Salvar um grupo nomeado de canais (máx. 50 por organização, nomes únicos por organização) |
update_channel_set | Renomear um conjunto ou alterar seus canais |
delete_channel_set | Excluir um conjunto de canais |
| Publicação automática RSS | |
list_rss_feeds | Listar feeds RSS/Atom verificados a cada 15 minutos (novos itens viram posts) |
create_rss_feed | Adicionar um feed (máx. 20 por organização); mode = draft (padrão, itens viram rascunhos) ou publish (publicados automaticamente); fieldMapping opcional controla como os itens são renderizados (modelo de legenda, seleção de mídia, truncamento, substituições por canal) |
update_rss_feed | Alterar, pausar ou redirecionar um feed (alterar feedUrl redefine sua linha de base — o backlog não é inundado) |
delete_rss_feed | Parar e remover um feed |
| Mídia | |
upload_media | Enviar um arquivo de mídia de uma URL (ou caminho local no servidor stdio) |
get_media | Obter um arquivo de mídia por ID |
list_media | Listar arquivos de mídia enviados |
delete_media | Excluir um arquivo de mídia |
create_media_upload | Reservar uma URL R2 pré-assinada para upload direto do navegador (usado pelo compositor) |
finalize_media_upload | Registrar um objeto enviado como arquivo de mídia após o PUT do navegador (usado pelo compositor) |
create_multipart_upload | Iniciar um upload em partes para mídia grande (vídeos de até 1GB) — URLs pré-assinadas para partes fixas de 10MB |
complete_multipart_upload | Montar as partes enviadas (partNumber + ETag de cada) e registrar o arquivo de mídia |
abort_multipart_upload | Cancelar um upload em partes em andamento e liberar suas partes armazenadas |
| Etiquetas | |
create_label | Criar uma nova etiqueta |
list_labels | Listar todas as etiquetas |
update_label | Atualizar o nome ou a cor de uma etiqueta |
delete_label | Excluir uma etiqueta |
| Análises | |
get_analytics | Obter resumo de análises para um intervalo de datas |
| Agendamentos | |
list_schedules | Listar agendamentos recorrentes |
create_schedule | Criar um agendamento recorrente |
update_schedule | Atualizar um agendamento |
delete_schedule | Excluir um agendamento |
| Conta | |
get_quota_usage | Verificar o uso atual da conta (oculto quando BULKPUBLISH_HIDE_BILLING=1) |
| Interface interativa (MCP Apps) | |
compose_post | Abrir o compositor de posts interativo (também listado acima) |
view_analytics | Abrir um painel de análises interativo |
view_posts | Abrir uma lista de posts interativa |
view_channels | Abrir uma visualização de canais interativa |
view_media | Abrir uma galeria de mídia interativa |
view_quota | Abrir uma visualização de uso da conta interativa (oculto quando BULKPUBLISH_HIDE_BILLING=1) |
Interface interativa (MCP Apps)
Em hosts que suportam MCP Apps — Claude, ChatGPT, VS Code, Goose, Postman e o playground do Smithery — a ferramenta compose_post abre um compositor interativo renderizado inline na conversa: escolha canais, escreva conteúdo, agende opcionalmente e envie. Ao enviar, ele chama create_post por meio da ponte do host, para que o iframe em sandbox nunca contenha sua chave de API. Hosts sem suporte a MCP Apps simplesmente recebem um resumo em texto simples, então nada quebra.
Várias ferramentas renderizam interfaces — compose_post (compositor), view_analytics, view_posts, view_channels, view_media e view_quota. Cada uma é um widget autônomo em src/ui/<name>/, empacotado em um único arquivo HTML com Vite (uma única passada de entrada por widget — veja scripts/build-ui.mjs) e incorporado ao servidor via src/ui/widgets.generated.ts. Elas compartilham os tokens de design do aplicativo web BulkPublish (src/ui/tokens.css), então a aparência é consistente. Uma View recebe seus dados do structuredContent da ferramenta acionadora e pode chamar outras ferramentas de volta pela ponte do host — então o iframe em sandbox nunca contém sua chave de API. Hosts sem suporte a MCP Apps simplesmente recebem um resumo em texto simples.
Exemplo de conversa
Aqui está um exemplo de uso das ferramentas BulkPublish no Claude:
Você: Agende um post para amanhã às 9h EST dizendo "Animados para anunciar nosso novo recurso! Confira em example.com" para todos os meus canais conectados.
Claude: Deixe-me verificar seus canais conectados primeiro.
[Chama list_channels]
Você tem 3 canais ativos:
- X/Twitter: @suaempresa (ID: 1)
- LinkedIn: Página da Sua Empresa (ID: 2)
- Instagram: @suaempresa (ID: 3)
Agora vou agendar o post para amanhã às 9h00 no horário do leste.
[Chama create_post com conteúdo, canais, scheduledAt: "2025-01-16T14:00:00Z", timezone: "America/New_York", status: "scheduled"]
Pronto! Seu post foi agendado:
- ID do post: 42
- Status: agendado
- Agendado para: 16 de janeiro de 2025 às 9h00 EST
- Canais: X/Twitter, LinkedIn, Instagram
Você: Como meus posts se saíram este mês?
Claude: [Chama get_analytics com from: "2025-01-01", to: "2025-01-31"]
Aqui está o resumo de análises de janeiro:
- Total de posts: 28
- Publicados: 25
- Com falha: 1
- Agendados (pendentes): 2
- Por plataforma: X/Twitter (25 posts, 24 publicados), LinkedIn (20 posts, 19 publicados), Instagram (15 posts, todos publicados)
- Melhor dia: 12 de janeiro com 5 posts
Você: Envie esta imagem e crie um post de rascunho com ela: https://example.com/product-launch.png
Claude: [Chama upload_media com url]
Imagem enviada com sucesso (ID: 15, 1200x630px, 245KB).
[Chama create_post com conteúdo e mediaFileIds]
Post de rascunho criado (ID: 43) com a imagem do lançamento do produto anexada. Você pode revisar e publicar quando quiser.
Variáveis de ambiente
| Variável | Obrigatória | Padrão | Descrição |
|---|---|---|---|
BULKPUBLISH_API_KEY | Sim | — | Sua chave de API (começa com bp_) |
BULKPUBLISH_BASE_URL | Não | https://app.bulkpublish.com | URL base da API (para instâncias auto-hospedadas) |
Licença
MIT