Skip to main content
Glama
upload-post-mcp

upload-post-mcp

by MrSagarShah

upload-post-mcp

License: MIT Node >= 18 MCP Hosted on Cloudflare Workers GitHub stars

An MCP (Model Context Protocol) server that lets Claude — or any MCP client — post to social media via upload-post.com: text, photos, and videos across 13 platforms: TikTok, Instagram, LinkedIn, YouTube, Facebook, X, Threads, Pinterest, Bluesky, Reddit, Discord, Telegram, and Google Business Profile.

Unlike scheduler-specific connectors (e.g. Buffer's), this publishes directly to your connected accounts — no Buffer subscription, and it covers platforms most connectors don't (TikTok video, YouTube, Reddit, Google Business), plus scheduling, queues, analytics, and Instagram comment/DM replies.

🚀 Try it in 2 minutes (no install)

A hosted instance is live — connect it straight from your Claude settings:

  1. claude.ai (web) / Claude Desktop / mobile: Settings → Connectors → Add custom connector

    • Name: Upload-Post

    • URL: https://upload-post-mcp.sgr-flutter.workers.dev/mcp

    • Leave the OAuth fields empty → Add

  2. Claude opens a consent page — paste your upload-post API key once (free account: 10 posts/month, no card)

  3. In a chat, try: "verify my upload-post account", then "post 'hello from Claude' to my X"

Claude Code: claude mcp add --transport http upload-post https://upload-post-mcp.sgr-flutter.workers.dev/mcp

Ships in two flavors from this repo:

Local (stdio) — repo root

Hosted (remote) — worker/

Runs

on your machine

on Cloudflare Workers

Works in

Claude Code, Claude Desktop, Cursor...

claude.ai (web), Claude Desktop & mobile via Settings → Connectors

Auth

UPLOAD_POST_API_KEY env var

OAuth 2.1 — users paste their API key once on a consent page; stored encrypted

Media

local file paths or URLs

public URLs only

Live instance

—

https://upload-post-mcp.sgr-flutter.workers.dev/mcp

Related MCP server: Video MCP

Quick start

  1. Get an API key: create an account at app.upload-post.com, create a profile, connect your social accounts to it, and generate an API key (Settings → API Keys). Free tier: 10 uploads/month.

  2. Add to Claude Code:

    claude mcp add upload-post --scope user \
      --env UPLOAD_POST_API_KEY=YOUR_KEY_HERE \
      -- npx -y upload-post-mcp

    Claude Desktop (claude_desktop_config.json):

    {
      "mcpServers": {
        "upload-post": {
          "command": "npx",
          "args": ["-y", "upload-post-mcp"],
          "env": { "UPLOAD_POST_API_KEY": "YOUR_KEY_HERE" }
        }
      }
    }
  3. Test: ask Claude to "verify my upload-post account". It should return your account email and plan. Then try "post 'hello world' to my X account".

From source

git clone https://github.com/MrSagarShah/upload-post-mcp.git
cd upload-post-mcp && npm install && npm run build
claude mcp add upload-post --scope user \
  --env UPLOAD_POST_API_KEY=YOUR_KEY_HERE \
  -- node "$(pwd)/dist/index.js"

Tools (17)

Tool

Purpose

post_text

Text posts (X, LinkedIn, Facebook, Threads, Reddit, Bluesky, Discord, Telegram, GBP)

post_photos

Photos/carousels — local file paths or URLs

post_video

Videos (Reels, Shorts, TikToks...) — local file path or URL

get_upload_status

Poll async uploads (request_id) or scheduled jobs (job_id)

get_history

Paginated upload history

list_scheduled_posts / edit_scheduled_post / cancel_scheduled_post

Manage scheduled posts

get_profile_analytics

Followers/reach/likes/etc. per platform

list_media

Recent posts on a connected platform account

get_comments / reply_to_comment

Instagram comments + private DM replies

verify_account

Validate the API key, show plan

list_page_targets

Facebook pages / LinkedIn org pages / Pinterest boards (for required IDs)

list_profiles / create_profile / generate_connect_link

Manage upload-post profiles and link social accounts

All publish tools support scheduled_date + timezone, add_to_queue, async_upload, first_comment, and an extra_params passthrough for any platform-specific field in the upload-post API docs (X polls, YouTube tags/privacy, Instagram REELS/STORIES, TikTok privacy, and more).

Scheduling runs on upload-post's servers — schedule posts and close your laptop; they publish on time.

Publish calls send an Idempotency-Key automatically, so a retried request won't double-post.

Example prompts

  • "Post 'We're hiring!' to my LinkedIn and X"

  • "Schedule this for Friday 9am New York time on LinkedIn"

  • "Post these three photos as an Instagram carousel with caption ..."

  • "Upload ~/Videos/demo.mp4 to YouTube as unlisted and TikTok"

  • "How did my last week's posts perform on X?"

  • "Reply to the latest comments on my Instagram reel"

Notes

  • The user argument on posting tools is your upload-post profile name (see list_profiles), not your account email.

  • Facebook needs facebook_page_id, Pinterest needs pinterest_board_id, Reddit needs subreddit — use list_page_targets to find IDs.

  • Media parameters accept either a local file path or a public http(s):// URL (hosted connector: URLs only).

Troubleshooting

Symptom

Cause / fix

401: Invalid API key format

The key in your env/consent page is wrong or a placeholder — regenerate at app.upload-post.com/api-keys.

429 — monthly quota exhausted

Free tier is 10 uploads/month; the error includes your usage counters. Upgrade or wait for reset.

"must be a public http(s) URL" (hosted)

The hosted connector can't read files on your machine. Use a public URL, or switch to the local connector for file uploads.

Facebook/Pinterest/Reddit post rejected

Missing facebook_page_id / pinterest_board_id / subreddit — ask Claude to run list_page_targets first.

Connector missing after adding in claude.ai

Enable it per-chat via the tools (sliders) menu, and check Settings → Connectors shows it as connected.

Nothing posts to a platform

That platform isn't linked to the profile — ask Claude for a generate_connect_link and link it in the browser.

Roadmap

  • Local stdio connector (17 tools)

  • Hosted remote connector — OAuth 2.1 + Streamable HTTP on Cloudflare Workers

  • npm package (npx -y upload-post-mcp)

  • Anthropic connector directory listing

  • LinkedIn document posts, auto-DM monitors, queue-settings tools

  • Managed tier: connect socials directly, no upload-post account needed

Contributing & support

Issues and PRs welcome — open an issue for bugs or tool requests. For anything else: saumil@tempbutton.com.

If this saved you time, a ⭐ helps others find it.

Disclaimer: community project, not affiliated with or endorsed by Upload-Post. Your API key is yours; the hosted instance stores it encrypted and only forwards your own requests (privacy).

License

MIT

Available Tools

17 tools
cancel_scheduled_postCancel a scheduled postA

Cancel (delete) a scheduled post by job_id so it will not be published.

Inputs: job_id (required).

create_profileCreate an upload-post profileA

Create a new user profile. After creating, use generate_connect_link to get a URL for linking social accounts to it.

Inputs: username (required).

edit_scheduled_postEdit a scheduled postB

Change the publish time, title, or caption of a scheduled post by job_id.

Inputs: job_id (required), title, caption, scheduled_date.

get_commentsGet Instagram post commentsA

Retrieve comments on an Instagram post/reel. Provide post_id or post_url. Paginate with the returned next_cursor.

Inputs: user (required), after, limit, post_id, +1 more.

get_historyGet upload historyA

Retrieve paginated history of past uploads with their platforms, status, and post URLs.

Inputs: page, limit.

get_profile_analyticsGet profile analyticsA

Fetch account-level metrics (followers, reach, views, likes, comments, shares...) for a profile's connected platforms.

Inputs: platforms (required), profile_username (required), page_id, page_urn.

get_upload_statusGet upload statusA

Check the progress/result of an async upload (by request_id) or a scheduled post (by job_id). Provide one of the two.

Inputs: job_id, request_id.

list_mediaList recent posts on a platformB

List recent posts/media published on a connected platform account (instagram, tiktok, youtube, linkedin, facebook, x, threads, pinterest, bluesky, reddit).

Inputs: user (required), platform (required), page_urn.

list_page_targetsList Facebook pages / LinkedIn pages / Pinterest boardsA

List posting targets needed for platform-specific IDs: facebook → pages (facebook_page_id), linkedin → organization pages (target_linkedin_page_id), pinterest → boards (pinterest_board_id).

Inputs: platform (required), profile.

list_profilesList upload-post profilesA

List all user profiles and which social accounts each has connected. The profile 'username' is the 'user' value for posting tools.

Inputs: no named parameters.

list_scheduled_postsList scheduled postsA

List all posts scheduled for future publishing, with their job_ids.

Inputs: no named parameters.

post_photosPost photos to social platformsA

Publish photo(s) — including carousels — to instagram, tiktok, linkedin, facebook, x, threads, pinterest, bluesky, discord, telegram. Each photo can be a local file path or a public http(s) URL.

Inputs: user (required), photos (required), platforms (required), title, +11 more.

post_textPost text to social platformsA

Publish a text-only post to one or more platforms (x, linkedin, facebook, threads, reddit, bluesky, discord, telegram, google_business). 'title' is the post content. Supports scheduling, queueing, link previews (link_url), X polls via extra_params.

Inputs: user (required), title (required), platforms (required), link_url, +11 more.

post_videoPost a video to social platformsA

Publish a video to tiktok, instagram (reels/stories), youtube, linkedin, facebook, x, threads, pinterest, bluesky, discord, telegram. The video can be a local file path or a public http(s) URL. 'title' is required for YouTube and Reddit. YouTube extras (tags, categoryId, privacyStatus...), Instagram media_type, TikTok privacy etc. go in extra_params.

Inputs: user (required), video (required), platforms (required), title, +13 more.

reply_to_commentReply to an Instagram comment (private DM)A

Send a private reply DM to the author of an Instagram comment (comment_id comes from get_comments).

Inputs: user (required), message (required), comment_id (required).

verify_accountVerify upload-post accountA

Validate the API key and return account info (email, plan). Use this to test the connection.

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 17 tools

    Disambiguation5/5

    Each tool targets a distinct action on a specific resource (e.g., post_photos vs post_video, cancel_scheduled_post vs edit_scheduled_post). There is no functional overlap, making it easy for an agent to select the correct tool.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern with underscores (e.g., list_profiles, get_upload_status). No mixing of conventions, which enhances predictability.

    Tool Count5/5

    17 tools cover a broad but focused domain (social media posting, scheduling, analytics, account management). Each tool serves a necessary function without redundancy.

    Completeness4/5

    The set covers core workflows: account linking, posting (photo/video/text), scheduling, commenting, analytics, and history. Minor gaps like missing a tool to delete a published post or update a profile, but overall comprehensive.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      B
      maintenance
      Upload-Post is the all-in-one social media MCP server the Model Context Protocol server for social media publishing, scheduling and analytics. Connect any MCP-compatible AI agent (Claude, Cursor, ChatGPT, Claude Desktop, n8n, and more) and publish, schedule and analyze content across 13+ social networks from one API: TikTok, Instagram, YouTube, YouTube Shorts, Instagram Reels, LinkedIn, Facebook
      72
      191 npm
      19
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      A local MCP server that lets Claude log in to LinkedIn and publish image posts to your personal profile feed, backed by LinkedIn's REST Images API and Posts API.
      2
      27 npm
      MIT