Upload-Post
Publique, agende e analise posts no TikTok, Instagram, YouTube, LinkedIn, Facebook, X, Threads, Pinterest, Reddit, Bluesky, Google Business, Discord e Telegram com uma única chave de API (servidor OAuth remoto + pacote npm).
Documentação
@upload-post/mcp
Servidor oficial do Model Context Protocol (MCP) para Upload-Post.
Permite que qualquer agente de IA compatível com MCP (ChatGPT, Claude Desktop, Claude Code, Cursor, …) publique, agende, analise e gerencie mídias sociais em TikTok, Instagram, YouTube, LinkedIn, Facebook, Pinterest, Threads, Reddit, Bluesky, X, Google Business, Discord, Telegram e muito mais com uma única chave de API.
Construído sobre o
upload-postSDK oficial e a API REST pública do Upload-Post.
Use no ChatGPT (sem configuração)
O Upload-Post é um aplicativo revisado no diretório de aplicativos do ChatGPT. Adicione o Upload-Post no ChatGPT — ou pesquise por Upload-Post em Apps — clique em Conectar e faça login com OAuth. Sem modo de desenvolvedor, sem URL MCP para colar, e você obtém o widget Upload Studio para publicar arquivos de vídeo diretamente do seu computador.
Prefere configurar manualmente? Ative o modo de desenvolvedor em Configurações → Apps → Configurações avançadas, clique em Criar app, aponte para https://mcp.upload-post.com/mcp e defina a autenticação como OAuth.
Duas maneiras de executar você mesmo
A) stdio local (usuário único) — mais simples
O servidor roda na sua máquina, iniciado pelo cliente MCP. Adicione ao ~/.claude/mcp.json (ou configurações do Cursor, etc.):
{
"mcpServers": {
"upload-post": {
"command": "npx",
"args": ["-y", "@upload-post/mcp"],
"env": { "UPLOAD_POST_API_KEY": "YOUR_API_KEY" }
}
}
}
Obtenha sua chave de API em https://app.upload-post.com → API Keys. Reinicie o cliente — você deve ver 58 ferramentas upload-post.
B) HTTP hospedado (multi-tenant) — compartilhe um servidor com muitos usuários
Execute o servidor em qualquer host compatível com Docker (Fly, Railway, Cloud Run, sua própria máquina…) e deixe cada usuário conectar com sua própria chave de API do Upload-Post. O servidor não armazena nada por usuário.
{
"mcpServers": {
"upload-post": {
"url": "https://mcp.your-domain.com/mcp",
"headers": {
"Authorization": "ApiKey YOUR_OWN_UPLOAD_POST_API_KEY"
}
}
}
}
Authorization: Bearer <key> também é aceito, para clientes que só permitem Bearer.
O que o agente pode fazer?
O servidor expõe ferramentas da API do Upload-Post mais um lançador de UI do ChatGPT App.
| Grupo | Ferramentas |
|---|---|
| Upload | upload_video, upload_photos, upload_text, upload_document, open_upload_studio |
| Staging de mídia | create_media_upload, complete_media_upload, get_media_upload, delete_media_upload |
| Status | get_status, get_job_status, get_history, get_media |
| Agendamento | list_scheduled, cancel_scheduled, edit_scheduled |
| Analytics | get_analytics, get_total_impressions, get_post_analytics, get_cached_post_analytics, get_platform_metrics |
| Público | get_audience, get_suggestions |
| Usuários | get_account_info, list_users, get_connect_link, create_user, delete_user, generate_jwt, validate_jwt |
| Páginas/quadros | get_facebook_pages, get_linkedin_pages, get_pinterest_boards, get_google_business_locations, get_google_business_reviews, reply_to_google_business_review, get_reddit_detailed_posts |
| Posts | retry_post, unpublish_post |
| Comentários | get_post_comments, create_comment, delete_comment, comment_action, reply_to_comment, public_reply_to_comment |
| TikTok | tiktok_music_trending, tiktok_music_search, tiktok_location_search, tiktok_publishing_settings |
| DMs | send_dm, list_dm_conversations, manage_autodms |
| FFmpeg | submit_ffmpeg_job, get_ffmpeg_job, download_ffmpeg_result, get_ffmpeg_consumption |
| Fila | get_queue_settings, update_queue_settings, preview_queue |
Uploads assíncronos retornam um request_id. O agente deve consultar get_status até que success: true.
Uma ferramenta por pergunta, não por rede
A API do Upload-Post não tem um endpoint por rede social: ela tem um endpoint por pergunta e um parâmetro platform que indica quem está sendo consultado. get_post_comments, get_post_analytics, get_audience, get_suggestions e comment_action funcionam assim, então um agente aprende uma forma e a reutiliza para todas as redes. Apenas as quatro ferramentas tiktok_* são específicas de rede, porque o que elas retornam (a Biblioteca de Música Comercial, locais do TikTok, configurações de publicação por conta do TikTok) existe apenas no TikTok.
get_audience— quem segue o perfil, onde estão, quando estão online, no que clicam. Tambémbenchmark_categories, e as médias do nicho para comparar quandobenchmarkCategoryestá definido. O servidor limita a janela a no máximo 60 dias terminando antes de hoje, então um intervalo maior é reduzido em vez de rejeitado, erangena resposta indica qual janela foi usada.get_suggestions— hashtags (comview_count) ou buscas por palavras-chave relacionadas, diferenciadas portype, não por uma ferramenta diferente.get_post_comments— comentários de primeiro nível em um post, ou, comcommentId, as respostas abaixo de um deles.comment_action— moderar um comentário no TikTok (ocultar / curtir / fixar), Facebook (ocultar / curtir / editar), Instagram (ocultar, ou ativar / desativar comentários em um post), YouTube (ocultar / reter) e Threads (ocultar / aprovar / ignorar). Cada valor carrega seu próprio inverso, então nada é permanente.get_post_analytics— métricas por post.post_metricsé o que a plataforma reporta, então sua forma varia: no TikTok adicionaretention,impression_sources,audience_types,new_followers,reache os tempos de exibição (average_time_watched,total_time_watched,full_video_watched_rate).
Os erros também são compartilhados: platform_not_supported (400, com a lista das redes que podem responder), invalid_parameter (400), tiktok_reconnect_required (400), reauth_required (409) e 502 quando a rede upstream falha.
Recursos do TikTok
get_post_comments, create_comment, delete_comment e comment_action aceitam platform: "tiktok", e firstComment funciona no TikTok como em qualquer outra rede.
O que uma conta do TikTok pode fazer depende de como ela está conectada. list_users retorna um array capabilities em cada conta do TikTok — music, location, cover_image, cover_timestamp, draft, video_privacy, photo_privacy, profile_analytics, comments, trend_search — e a descrição de cada ferramenta nomeia o que ela precisa. Eles são concedidos quando o usuário conecta o TikTok, então uma conta conectada antes de um recurso existir precisa reconectar antes que as ferramentas correspondentes respondam; é isso que um erro tiktok_reconnect_required significa.
get_media e get_cached_post_analytics são paginados por cursor: alimente o next_cursor da resposta de volta como cursor até que has_more seja falso. LinkedIn, Discord e Telegram não suportam cursores de mídia e aceitam apenas limit. Prefira get_cached_post_analytics em vez de get_post_analytics ao examinar muitos posts — ele reproduz resultados buscados anteriormente e assim evita o limite de taxa de analytics ao vivo de 100 requisições / 5 minutos. Contém apenas posts buscados anteriormente por um endpoint ao vivo por post; não há atualização em segundo plano, então captured_at é a última vez que aquele post foi lido ao vivo.
Trabalhos FFmpeg aceitam uma URL pública via input_url ou múltiplas URLs via files. Consulte get_ffmpeg_job até a conclusão, então chame download_ffmpeg_result; ele retorna a URL do resultado sem transmitir o binário processado pelo MCP.
UI de upload de vídeo do ChatGPT
open_upload_studio renderiza um componente de ChatGPT Apps para publicação de vídeo baseada em arquivo. O widget cria um upload de staging Upload-Post/R2 de curta duração, envia o vídeo local diretamente para o R2 via PUT, completa o upload e então chama upload_video com a URL de mídia temporária retornada.
O widget fala a ponte do SDK de ChatGPT Apps, então ele é anunciado apenas para o ChatGPT (detectado a partir de clientInfo em initialize; substitua a correspondência com UPLOAD_POST_STUDIO_CLIENTS=<regex>). Qualquer outro host (claude.ai, Claude Desktop, Claude Code, Cursor, …) não vê a ferramenta nem seu recurso ui://; em vez disso, create_media_upload / complete_media_upload são expostos ao modelo com orientação passo a passo, e upload_video instrui o assistente a pedir uma URL pública ou enviar o usuário ao painel quando o cliente não puder enviar o arquivo via PUT.
O objeto de staging é excluído após 24 horas, usado ou não. Posts agendados/na fila permanecem seguros porque upload_video copia a URL temporária para o armazenamento durável do agendador existente antes da execução.
Claude e outros clientes MCP podem usar o mesmo fluxo sem a UI do ChatGPT: chame create_media_upload, envie o arquivo via PUT para upload_url, chame complete_media_upload, então passe media_url para upload_video.
Defina UPLOAD_POST_R2_CONNECT_DOMAINS no host MCP para as origens separadas por vírgula usadas pelas URLs assinadas R2 do backend quando elas diferirem dos padrões (por exemplo, https://<account>.r2.cloudflarestorage.com,https://<bucket>.<account>.r2.cloudflarestorage.com) para que o componente CSP do ChatGPT permita o PUT do navegador.
A política CORS do bucket R2 deve permitir uploads do navegador. Uma política restritiva pode incluir a origem real do seu widget; para validação mais rápida, use:
[
{
"AllowedOrigins": ["*"],
"AllowedMethods": ["PUT", "GET", "HEAD"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["ETag"],
"MaxAgeSeconds": 3600
}
]
Local / desenvolvimento
git clone https://github.com/Upload-Post/upload-post-mcp.git
cd upload-post-mcp
npm install
npm run build
# stdio (default — used by Claude Desktop, Cursor)
UPLOAD_POST_API_KEY=... node dist/index.js
# HTTP streamable (for hosted deployments)
UPLOAD_POST_API_KEY=... node dist/index.js --http --port 8080
Inspecione a superfície de ferramentas ao vivo com o inspetor oficial:
npx @modelcontextprotocol/inspector node dist/index.js
Configuração
| Variável de ambiente | Modo | Padrão | Descrição |
|---|---|---|---|
UPLOAD_POST_API_KEY | stdio | — (obrigatório) | Chave de API do Upload-Post do usuário único. Ignorada no modo --http — as chaves vêm por requisição. |
UPLOAD_POST_BASE_URL | ambos | https://api.upload-post.com/api | Substituição para self-hosted / staging. |
UPLOAD_POST_MCP_PORT | http | 8080 | Porta para o modo --http. |
OPENAI_APPS_CHALLENGE_TOKEN | http | Token de desafio atual do Upload-Post | Substituição opcional para verificação de domínio do ChatGPT Apps em /.well-known/openai-apps-challenge. |
Flags de CLI:
--http— inicia o transporte HTTP streamable em vez de stdio--port <n>— porta para o modo HTTP
Endpoints HTTP:
POST /mcp— JSON-RPC sobre MCP HTTP streamable. RequerAuthorization: ApiKey <key>(ouBearer <key>) em cada requisição. A chave é a chave de API do Upload-Post do próprio usuário; o servidor a usa apenas para aquela sessão e não armazena nada.GET /healthz— sonda de atividade, sempre aberta. Retorna{"ok":true}.
O modelo de autenticação no modo --http é o mesmo padrão que Resend, Tavily, Brave Search e outros serviços nativos de chave de API usam para seus MCPs hospedados: a chave upstream é a autenticação.
Implante com Docker
O repositório inclui um Dockerfile multi-estágio e um .dockerignore. Em qualquer PaaS compatível com Docker (Fly.io, Railway, Render, Cloud Run, fly machines, sua própria máquina…):
- Aponte o PaaS para este repositório e selecione Dockerfile como o build pack.
- Porta: 8080 (corresponde a
EXPOSE 8080). - Variáveis de ambiente: nenhuma é obrigatória. Opcionalmente, defina
UPLOAD_POST_BASE_URLse apontar para staging. - Caminho do health check:
/healthz(HTTP, porta 8080). - Domínio: anexe um domínio, ex.
mcp.your-domain.com, e provisione TLS (a maioria dos PaaS faz isso automaticamente via Let's Encrypt).
Implante. O servidor agora está pronto para qualquer número de usuários. Cada usuário adiciona o endpoint à configuração do seu cliente MCP com sua própria chave de API do Upload-Post:
{
"mcpServers": {
"upload-post": {
"url": "https://mcp.your-domain.com/mcp",
"headers": {
"Authorization": "ApiKey USER_OWN_UPLOAD_POST_API_KEY"
}
}
}
}
Sem um cabeçalho
Authorization, o servidor retorna401. O cabeçalho é a única credencial — chaves inválidas do Upload-Post aparecerão como erros upstream na primeira chamada de ferramenta.
Teste local da imagem de produção:
docker build -t upload-post-mcp .
docker run --rm -p 8080:8080 upload-post-mcp
curl http://localhost:8080/healthz # → {"ok":true}
curl -i -X POST http://localhost:8080/mcp \
-H "content-type: application/json" \
-d '{}' # → 401 (no Authorization)
Dicas para instruir o agente
- Prefira URLs públicas em vez de caminhos locais ao enviar — caminhos locais só funcionam se o servidor MCP rodar na máquina do usuário.
- Nos aplicativos ChatGPT, prefira
open_upload_studiopara arquivos de vídeo selecionados pelo usuário. Isso evita problemas de transferência de caminho local, enviando para o staging de curta duração Upload-Post/R2 e, em seguida, passando uma URL de mídia temporária paraupload_video. - Em qualquer outro cliente com arquivo local: se o cliente puder executar requisições HTTP (Claude Code, Cursor, um script), faça o staging com
create_media_upload→ envie os bytes via PUT paraupload_url→complete_media_upload, e então passe omedia_urlretornado paraupload_video. Chats hospedados sem essa capacidade (claude.ai) precisam de uma URL HTTPS pública ou do painel em https://app.upload-post.com.. - Para enviar vídeo diretamente em bytes (um cliente que possui o arquivo em vez de uma URL), passe
videoBase64paraupload_videoem vez devideoPathOrUrl. O servidor grava em um arquivo temporário, envia e depois o exclui. Bytes inline são limitados aUPLOAD_POST_MAX_INLINE_MB(padrão de 100 MB) — para vídeos maiores, use uma URL pública. - Sempre crie o perfil primeiro (
create_user) e conecte as redes sociais no painel Upload-Post antes de publicar. - Para postagens agendadas, passe datas ISO 8601 com fuso horário, ex.:
"2026-12-25T10:00:00Z"+"timezone": "Europe/Madrid".
Privacidade e tratamento de dados
Este servidor é um proxy sem estado para a API Upload-Post. Por requisição, os únicos dados processados são a chave de API do usuário (ou token de acesso OAuth resolvido para uma) e os argumentos da chamada de ferramenta em execução. Nenhum dado do usuário é persistido pelo contêiner MCP.
- O que recebemos por requisição: o cabeçalho
Authorization, o nome da ferramenta MCP + argumentos, e quaisquer URLs/caminhos de mídia que o agente passar. - O que encaminhamos: os argumentos da ferramenta para a API Upload-Post em nome do usuário autenticado.
- O que armazenamos: nada por usuário. Tokens OAuth são armazenados upstream no backend Upload-Post, com hash (SHA-256), então uma violação do armazenamento de tokens não pode se passar por usuários.
- O que registramos: método HTTP, caminho, código de status e um ID de requisição opaco. Sem argumentos de ferramenta, sem chaves de API, sem tokens.
Política de privacidade completa do Upload-Post (coleta de dados, retenção, compartilhamento com terceiros, contato, GDPR/CCPA): https://upload-post.com/privacy
Para revogar o acesso de um conector a qualquer momento, abra Aplicativos conectados em app.upload-post.com.
Segurança
- Todo o tráfego é terminado em TLS na borda (somente HTTPS).
/mcpexige um cabeçalhoAuthorizationválido em cada requisição; tokens de acesso OAuth são de curta duração (1 h de acesso + 90 d de renovação com rotação conforme RFC 6749 §10.4).- O servidor valida o cabeçalho
Origincontra uma lista de permissões (claude.ai,claude.com,chatgpt.com,chat.openai.com,app.upload-post.com,localhost) para mitigar ataques de rebinding de DNS de clientes baseados em navegador. Estenda comOAUTH_EXTRA_ALLOWED_ORIGINS(separado por vírgulas) ao auto-hospedar atrás de um painel personalizado. - Se o ChatGPT mostrar
redirect_uri not on allow-listdurante o OAuth, adicione oredirect_uriexato da requisição de autorização com falha à lista de permissões de redirecionamento OAuth do backend Upload-Post. Para clientes ChatGPT, isso normalmente está emhttps://chatgpt.com/.../oauth/callbackouhttps://chat.openai.com/.../oauth/callback. - Callbacks de redirecionamento OAuth são pré-permitidos para: Claude (claude.ai/claude.com), ChatGPT, Cursor, VS Code (estável + Insiders), Smithery, Glama, Toolhouse, Perplexity (padrão + Enterprise), depurador Mistral Studio e Postman — além de qualquer redirecionamento
http://localhost/loopback (RFC 8252), que cobre Claude Code, Windsurf, Cline, Continue, Goose, Gemini CLI e outros clientes estilomcp-remote. Plataformas sem callback fixo documentado (ex.: Grok, Le Chat produção) são adicionadas sob solicitação. - Todas as ferramentas declaram anotações MCP
readOnlyHint/destructiveHintpara que os clientes possam exibir prompts de confirmação para operações destrutivas.
Reporte um problema de segurança: info@upload-post.com (PGP criptografado disponível sob solicitação).
Licença
MIT © Upload-Post