Publish, schedule & analyze posts on TikTok, Instagram, YouTube, LinkedIn, X & 10+ social networks
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Official Model Context Protocol (MCP) server for Upload-Post.
Lets any MCP-compatible AI agent (ChatGPT, Claude Desktop, Claude Code, Cursor, β¦) publish, schedule, analyze and manage social media across TikTok, Instagram, YouTube, LinkedIn, Facebook, Pinterest, Threads, Reddit, Bluesky, X, Google Business, Discord, Telegram and more with a single API key.
Built on top of the official
upload-postSDK and the public Upload-Post REST API.
Upload-Post is a reviewed app in the ChatGPT app directory. Add Upload-Post in ChatGPT β or search for Upload-Post under Apps β click Connect and sign in with OAuth. No Developer mode, no MCP URL to paste, and you get the Upload Studio widget for publishing video files straight from your computer.
Prefer to wire it up by hand? Enable Developer mode in Settings β Apps β Advanced settings, click Create app, point it at https://mcp.upload-post.com/mcp and set authentication to OAuth.
The server runs on your machine, spawned by the MCP client. Add to ~/.claude/mcp.json (or Cursor settings, etc.):
Get your API key at https://app.upload-post.com β API Keys. Restart the client β you should see 58 upload-post tools.
Run the server on any Docker-capable host (Fly, Railway, Cloud Run, your own boxβ¦) and let each user connect with their own Upload-Post API key. The server stores nothing per user.
Authorization: Bearer <key> is also accepted, for clients that only allow Bearer.
The server exposes Upload-Post API tools plus one ChatGPT App UI launcher.
| Group | Tools |
|---|---|
| Upload | upload_video, upload_photos, upload_text, upload_document, open_upload_studio |
| Media staging | create_media_upload, complete_media_upload, get_media_upload, delete_media_upload |
| Status | get_status, get_job_status, get_history, get_media |
| Schedule | list_scheduled, cancel_scheduled, edit_scheduled |
| Analytics | get_analytics, get_total_impressions, get_post_analytics, get_cached_post_analytics, get_platform_metrics |
| Audience | get_audience, get_suggestions |
| Users | get_account_info, list_users, create_user, delete_user, generate_jwt, validate_jwt |
| Pages/boards | 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 |
| Comments | 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 |
| Queue | get_queue_settings, update_queue_settings, preview_queue |
Async uploads return a request_id. The agent should poll get_status until success: true.
The Upload-Post API has no endpoint per social network: it has an endpoint per question, and a platform parameter saying who is being asked. get_post_comments, get_post_analytics, get_audience, get_suggestions and comment_action all work that way, so an agent learns one shape and reuses it for every network. Only the four tiktok_* tools are network-specific, because what they return (the Commercial Music Library, TikTok places, TikTok's per-account publishing settings) exists only on TikTok.
get_audience β who follows the profile, where they are, when they are online, what they tap. Also benchmark_categories, and the niche averages to compare against when benchmarkCategory is set. The server clamps the window to at most 60 days ending before today, so a wider range is trimmed rather than rejected, and range in the response says which window was used.get_suggestions β hashtags (with view_count) or related keyword searches, told apart by type, not by a different tool.get_post_comments β top-level comments on a post, or, with commentId, the replies under one of them.comment_action β hide / unhide, like / unlike, pin / unpin a comment. Each value carries its own inverse, so nothing is permanent. postId is required for hide and pin and must not be sent for like.get_post_analytics β per-post metrics. post_metrics is whatever the platform reports, so its shape varies: on TikTok it adds retention, impression_sources, audience_types, new_followers, reach and the watch times (average_time_watched, total_time_watched, full_video_watched_rate).Errors are shared too: platform_not_supported (400, with the list of the networks that can answer), invalid_parameter (400), tiktok_reconnect_required (400), reauth_required (409) and 502 when the upstream network fails.
get_post_comments, create_comment, delete_comment and comment_action accept platform: "tiktok", and firstComment works on TikTok like on every other network.
What a TikTok account can do depends on how it is connected. list_users returns a capabilities array on each TikTok account β music, location, cover_image, cover_timestamp, draft, video_privacy, photo_privacy, profile_analytics, comments, trend_search β and each tool's description names the one it needs. They are granted when the user connects TikTok, so an account connected before a capability existed has to reconnect before the matching tools answer; that is what a tiktok_reconnect_required error means.
get_media and get_cached_post_analytics are cursor-paginated: feed the response's next_cursor back as cursor until has_more is false. LinkedIn, Discord and Telegram do not support media cursors and accept limit only. Prefer get_cached_post_analytics over get_post_analytics when scanning many posts β it replays previously fetched results and so avoids the live analytics rate limit of 100 requests / 5 minutes. Only contains posts previously fetched through a live per-post endpoint; there is no background refresh, so captured_at is the last time that post was read live.
FFmpeg jobs accept one public URL through input_url or multiple URLs through files. Poll get_ffmpeg_job until completion, then call download_ffmpeg_result; it returns the result URL without streaming the processed binary through MCP.
open_upload_studio renders a ChatGPT Apps component for file-based video publishing. The widget creates a short-lived Upload-Post/R2 staging upload, PUTs the local video directly to R2, completes the upload, then calls upload_video with the returned temporary media URL.
The widget speaks the ChatGPT Apps SDK bridge, so it is only advertised to ChatGPT (detected from clientInfo at initialize; override the match with UPLOAD_POST_STUDIO_CLIENTS=<regex>). Every other host (claude.ai, Claude Desktop, Claude Code, Cursor, β¦) does not see the tool or its ui:// resource; instead create_media_upload / complete_media_upload are exposed to the model with step-by-step guidance, and upload_video tells the assistant to ask for a public URL or send the user to the dashboard when the client cannot PUT the file itself.
The staging object is deleted after 24 hours whether it is used or not. Scheduled/queued posts remain safe because upload_video copies the temporary URL into the existing durable scheduler storage before execution.
Claude and other MCP clients can use the same flow without the ChatGPT UI: call create_media_upload, PUT the file to upload_url, call complete_media_upload, then pass media_url to upload_video.
Set UPLOAD_POST_R2_CONNECT_DOMAINS on the MCP host to the comma-separated origins used by the backend's R2 signed URLs when they differ from the defaults (for example https://<account>.r2.cloudflarestorage.com,https://<bucket>.<account>.r2.cloudflarestorage.com) so the ChatGPT component CSP allows the browser PUT.
The R2 bucket CORS policy must allow browser uploads. A restrictive policy can include your actual widget origin; for fastest validation, use:
Factual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/upload-post)<a href="https://allmcps.com/mcp/upload-post"><img src="https://allmcps.com/api/badge/upload-post?style=directory" alt="Upload Post on AllMCPs" /></a>