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.

smithery badge Glama npm

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-post SDK 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.

GrupoFerramentas
Uploadupload_video, upload_photos, upload_text, upload_document, open_upload_studio
Staging de mídiacreate_media_upload, complete_media_upload, get_media_upload, delete_media_upload
Statusget_status, get_job_status, get_history, get_media
Agendamentolist_scheduled, cancel_scheduled, edit_scheduled
Analyticsget_analytics, get_total_impressions, get_post_analytics, get_cached_post_analytics, get_platform_metrics
Públicoget_audience, get_suggestions
Usuáriosget_account_info, list_users, get_connect_link, create_user, delete_user, generate_jwt, validate_jwt
Páginas/quadrosget_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
Postsretry_post, unpublish_post
Comentáriosget_post_comments, create_comment, delete_comment, comment_action, reply_to_comment, public_reply_to_comment
TikToktiktok_music_trending, tiktok_music_search, tiktok_location_search, tiktok_publishing_settings
DMssend_dm, list_dm_conversations, manage_autodms
FFmpegsubmit_ffmpeg_job, get_ffmpeg_job, download_ffmpeg_result, get_ffmpeg_consumption
Filaget_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ém benchmark_categories, e as médias do nicho para comparar quando benchmarkCategory está 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, e range na resposta indica qual janela foi usada.
  • get_suggestions — hashtags (com view_count) ou buscas por palavras-chave relacionadas, diferenciadas por type, não por uma ferramenta diferente.
  • get_post_comments — comentários de primeiro nível em um post, ou, com commentId, 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 adiciona retention, impression_sources, audience_types, new_followers, reach e 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 ambienteModoPadrãoDescrição
UPLOAD_POST_API_KEYstdio— (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_URLamboshttps://api.upload-post.com/apiSubstituição para self-hosted / staging.
UPLOAD_POST_MCP_PORThttp8080Porta para o modo --http.
OPENAI_APPS_CHALLENGE_TOKENhttpToken de desafio atual do Upload-PostSubstituiçã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. Requer Authorization: ApiKey <key> (ou Bearer <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…):

  1. Aponte o PaaS para este repositório e selecione Dockerfile como o build pack.
  2. Porta: 8080 (corresponde a EXPOSE 8080).
  3. Variáveis de ambiente: nenhuma é obrigatória. Opcionalmente, defina UPLOAD_POST_BASE_URL se apontar para staging.
  4. Caminho do health check: /healthz (HTTP, porta 8080).
  5. 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 retorna 401. 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_studio para 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 para upload_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 para upload_url → complete_media_upload, e então passe o media_url retornado para upload_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 videoBase64 para upload_video em vez de videoPathOrUrl. O servidor grava em um arquivo temporário, envia e depois o exclui. Bytes inline são limitados a UPLOAD_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).
  • /mcp exige um cabeçalho Authorization vá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 Origin contra 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 com OAUTH_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-list durante o OAuth, adicione o redirect_uri exato 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á em https://chatgpt.com/.../oauth/callback ou https://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 estilo mcp-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/destructiveHint para 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