1. Conduid
  2. Social
  3. Upload-Post/upload-post-mcp
MCP server · Social

Upload-Post/upload-post-mcp

Model Context Protocol (MCP) server for Upload-Post — publish, schedule, analyze and manage social media from any MCP-compatible AI agent.

61Good

Scored 2 hours ago · breakdown

About Upload-Post/upload-post-mcp

Upload-Post/upload-post-mcp is an MCP server published by Upload-Post in the Social category: model Context Protocol (MCP) server for Upload-Post — publish, schedule, analyze and manage social media from any MCP-compatible AI agent.

The repository has 14 stars and 6 forks, with the last commit 4 days ago. Recent commit activity is the strongest signal that reported issues will get attention.

Install

From source
git clone https://github.com/Upload-Post/upload-post-mcp

This server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.

Tools (74)

approve_commentApprove a reply waiting for approval on one of the profile

Parameters not published.

cancel_scheduledCancel a scheduled post by its

Parameters not published.

comment_actionModerate or react to a comment on one of the profile

Parameters not published.

complete_media_uploadNo description in manifest

Parameters not published.

create_commentPost a top-level comment or a reply on a post. Provide exactly ONE of

Parameters not published.

create_media_uploadNo description in manifest

Parameters not published.

create_userCreate a new Upload-Post profile (logical container for connected socials).

Parameters not published.

delete_autodmPermanently delete an AutoDM monitor with its stats and logs. Cannot be undone.

Parameters not published.

delete_commentDelete a comment by

Parameters not published.

delete_media_uploadInternal/app staging helper. Delete a short-lived MCP staging media upload from R2. This does not delete scheduler durable copies created later by upload_video.

Parameters not published.

Show all 74 tools
delete_userPermanently delete a profile and disconnect its socials.

Parameters not published.

download_ffmpeg_resultReturns how to get a finished FFmpeg job

Parameters not published.

edit_commentReplace the text of a comment the Page itself wrote on Facebook. Facebook only. The previous text is not kept.

Parameters not published.

edit_scheduledEdit a pending scheduled post in place, keeping its job ID and media: reschedule it (scheduledDate/timezone) and/or fix its text.

Parameters not published.

generate_jwtGenerate a JWT + connection URL so an end-user can connect socials inside an embedded Upload-Post flow (white-label integration). The profile must already exist. Each call resets the profile

Parameters not published.

get_account_infoReturn the connected Upload-Post account: email, plan and usage limits. Useful as a first call to confirm the connection works before doing real work.

Parameters not published.

get_analyticsAggregated analytics for a profile across selected platforms (followers, views, engagement). Instagram also returns two audience breakdowns with the same shape (age / gender / country / city):

Parameters not published.

get_audienceWho follows the profile, when they are online and what they tap on it. One endpoint for every network, chosen with

Parameters not published.

get_autodm_logsRead the activity log of one AutoDM monitor: comments seen and DMs sent or failed.

Parameters not published.

get_cached_post_analyticsReplays per-post metrics Upload-Post already fetched, instead of calling the platforms again. ONLY contains posts previously fetched through

Parameters not published.

get_connect_linkGet the link the user opens to connect (or reconnect) social accounts such as TikTok, Instagram or YouTube. Use it when list_users shows no profile, or the platform the user wants is not connected or needs reconnecting.

Parameters not published.

get_facebook_pagesFacebook pages connected to a profile.

Parameters not published.

get_ffmpeg_consumptionMonthly FFmpeg processing minutes used vs. plan allowance.

Parameters not published.

get_ffmpeg_jobPoll the status of an FFmpeg job. When status is

Parameters not published.

get_google_business_locationsGoogle Business Profile locations the profile can post to.

Parameters not published.

get_google_business_reviewsList reviews for a Google Business Profile location. Pass the profile that owns the connected Google Business account; location_id defaults to the account

Parameters not published.

get_historyPaginated history of uploads across all profiles.

Parameters not published.

get_job_statusCheck the status of a scheduled or queued upload by

Parameters not published.

get_linkedin_pagesLinkedIn company pages connected to a profile.

Parameters not published.

get_mediaRetrieve recent media (videos, photos, text posts) pulled directly from a profile

Parameters not published.

get_media_uploadInternal/app staging helper. Get status for a short-lived MCP media upload. Optionally returns a fresh temporary media_url for an already-uploaded staging object.

Parameters not published.

get_pinterest_boardsPinterest boards available to a profile.

Parameters not published.

get_platform_metricsReference: which metrics are available per platform (impressions, likes, …) and their human labels.

Parameters not published.

get_post_analyticsPer-platform metrics for a specific post identified by

Parameters not published.

get_post_commentsList comments on a post. One endpoint for every network, chosen with

Parameters not published.

get_queue_settingsPosting queue configuration (slots per day, time windows, timezone).

Parameters not published.

get_reddit_detailed_postsRecent Reddit posts published from a profile, with the platform-side metadata (subreddit, flair, score, …). ${REDDIT_UNAVAILABLE}

Parameters not published.

get_statusCheck the status of an async upload by

Parameters not published.

get_suggestionsWhat to write about: the hashtags or the searches a network suggests around a word. One endpoint for both questions, told apart by

Parameters not published.

get_total_impressionsSum of impressions for a profile from daily snapshots. Use

Parameters not published.

hide_commentHide a comment on one of the profile

Parameters not published.

hold_commentMove a comment on one of the channel

Parameters not published.

ignore_commentIgnore a reply waiting for approval on one of the profile

Parameters not published.

like_commentLike a comment as the profile

Parameters not published.

list_autodmsList the account

Parameters not published.

list_dm_conversationsRecent DM conversations for a profile on a given platform.

Parameters not published.

list_scheduledList all currently scheduled (not-yet-published) posts.

Parameters not published.

list_usersList all Upload-Post profiles in the account, with their connected social accounts. Call this FIRST, before publishing, to get the exact profile name (

Parameters not published.

manage_autodmsControl AutoDM monitors, which answer every comment on a post (or only those containing

Parameters not published.

open_upload_studioOpen the upload studio in the user

Parameters not published.

pause_autodmPause an AutoDM monitor: no DMs are sent until resume_autodm.

Parameters not published.

pin_commentPin a comment to the top of one of the profile

Parameters not published.

preview_queuePreview the upcoming queue slots and what would land in them. Optionally

Parameters not published.

public_reply_to_commentPost a public reply visible under the original Instagram comment.

Parameters not published.

reply_to_commentSend a private DM to the author of an Instagram comment (within Instagram

Parameters not published.

reply_to_google_business_reviewCreate or update the owner reply to a Google Business review. Provide review_name (the full resource path from get_google_business_reviews) or review_id + location_id.

Parameters not published.

resume_autodmResume a paused AutoDM monitor, so it sends DMs to new matching comments again.

Parameters not published.

retry_postRetry a failed upload. Identify it by either

Parameters not published.

send_dmSend an Instagram DM to a recipient from a connected Upload-Post profile. Use a recipient_id returned by Instagram comments or DM conversation tools.

Parameters not published.

set_post_commentsTurn commenting off on one of the profile

Parameters not published.

start_autodmWatch one of the profile

Parameters not published.

stop_autodmStop an AutoDM monitor: it stops sending DMs and shows as stopped in list_autodms (with

Parameters not published.

submit_ffmpeg_jobProcess media with FFmpeg on Upload-Post

Parameters not published.

tiktok_location_searchSearch TikTok places to tag on a post. TikTok needs both parts, so pass the returned

Parameters not published.

tiktok_music_searchFind a TikTok Commercial Music Library track by song title or artist, to soundtrack a TikTok video. Pass the returned track

Parameters not published.

tiktok_music_trendingTrending tracks from the TikTok Commercial Music Library, to soundtrack a TikTok video. Pass the returned track

Parameters not published.

tiktok_publishing_settingsWhat the connected TikTok account is allowed to publish. Call this before setting

Parameters not published.

unpublish_postDelete a post already published to a platform. Supported: facebook, youtube, x, linkedin, pinterest, bluesky, google_business. Instagram, TikTok, Threads and Reddit posts cannot be deleted through the API; they have to be removed in the platform

Parameters not published.

update_queue_settingsUpdate posting queue configuration for a profile. Fields are flat, not nested: timezone, slots, days_of_week, and max_posts_per_slot.

Parameters not published.

upload_documentPublish a document (PDF / PPT / PPTX / DOC / DOCX) to LinkedIn. Title is required.

Parameters not published.

upload_photosNo description in manifest

Parameters not published.

upload_textPublish a text-only post.

Parameters not published.

upload_videoNo description in manifest

Parameters not published.

validate_jwtVerify a JWT previously issued by

Parameters not published.

Ask AI

✦

Ask AI about Upload-Post/upload-post-mcp

Powered by Claude

Ask about Upload-Post/upload-post-mcp — answers draw on its README.

Security checks

Static checks derived from the repository 15 days ago. Heuristics on the source, not an audit.

  • ✓README presentThe repository ships documentation.
  • ✓License declaredUsable under a stated license.
  • !Tests presentNo tests found. Behaviour changes may go unnoticed between versions.
  • ✓Dependencies pinnedA lockfile pins dependency versions.
  • ✓No dynamic code executionSource scan found no eval, dynamic Function, or shell execution.

1 check has not been run yet.

Releases

v0.11.4v0.11.4 · 27 Sep 2026Full Changelog: https://github.com/Upload-Post/upload-post-mcp/compare/v0.11.3...v0.11.4
v0.11.3v0.11.3 · 27 Sep 2026Full Changelog: https://github.com/Upload-Post/upload-post-mcp/compare/v0.11.2...v0.11.3
v0.11.2v0.11.2 · 25 Sep 2026Full Changelog: https://github.com/Upload-Post/upload-post-mcp/compare/v0.11.1...v0.11.2
v0.11.1v0.11.1 · 9 Sep 2026What's Changed staging → main: 0.11.1 tool descriptions for API parity by @victorcavero14 in https://github.com/Upload-Post/upload-post-mcp/pull/18 Full Changelog: https://github.com/Upload-Post/upload-post-mcp/compare/v0.11.0...v0.11.1
v0.11.0v0.11.0 · 7 Sep 2026Full Changelog: https://github.com/Upload-Post/upload-post-mcp/compare/v0.10.0...v0.11.0

README

@upload-post/mcp

Official Model Context Protocol (MCP) server for Upload-Post.

smithery badge Glama npm

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-post SDK and the public Upload-Post REST API.


Use it in ChatGPT (no setup)

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, photos and carousels 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.

Use it in Gemini CLI

Install the extension and sign in with OAuth the first time Gemini calls a tool:

gemini extensions install https://github.com/Upload-Post/upload-post-mcp

Two ways to run it yourself

A) Local stdio (single-user) — simplest

The server runs on your machine, spawned by the MCP client. Add to ~/.claude/mcp.json (or Cursor settings, etc.):

{
  "mcpServers": {
    "upload-post": {
      "command": "npx",
      "args": ["-y", "@upload-post/mcp"],
      "env": { "UPLOAD_POST_API_KEY": "YOUR_API_KEY" }
    }
  }
}

Get your API key at https://app.upload-post.com → API Keys. Restart the client — you should see 58 upload-post tools.

B) Hosted HTTP (multi-tenant) — share one server with many users

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.

{
  "mcpServers": {
    "upload-post": {
      "url": "https://mcp.your-domain.com/mcp",
      "headers": {
        "Authorization": "ApiKey YOUR_OWN_UPLOAD_POST_API_KEY"
      }
    }
  }
}

Authorization: Bearer <key> is also accepted, for clients that only allow Bearer.


What can the agent do?

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, get_connect_link, 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, reply_to_comment, public_reply_to_comment, hide_comment, like_comment, pin_comment, edit_comment, hold_comment, approve_comment, ignore_comment, set_post_comments, comment_action
TikTok tiktok_music_trending, tiktok_music_search, tiktok_location_search, tiktok_publishing_settings
DMs send_dm, list_dm_conversations, start_autodm (Instagram DM or public auto-reply on TikTok, YouTube, Facebook, Threads, Bluesky), list_autodms, get_autodm_logs, pause_autodm, resume_autodm, stop_autodm, delete_autodm, 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.

One tool per question, not per network

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.
  • hide_comment, like_comment, pin_comment, edit_comment, hold_comment, approve_comment, ignore_comment, set_post_comments — one tool per moderation operation. comment_action does the same through a single action argument and stays available everywhere except ChatGPT, which only gets the one-operation tools (the same goes for manage_autodms).
  • comment_action — moderate a comment on TikTok (hide / like / pin), Facebook (hide / like / edit), Instagram (hide, or enable / disable comments on a post), YouTube (hide / hold) and Threads (hide / approve / ignore). Each value carries its own inverse, so nothing is permanent.
  • 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.

TikTok capabilities

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.

ChatGPT video upload UI

open_upload_studio renders a ChatGPT Apps component for file-based publishing: one video, or one or more images (up to 10, for a carousel; pass mediaType: "photos"). For each file the widget creates a short-lived Upload-Post/R2 staging upload, PUTs the file directly to R2 and completes the upload, one file at a time, then calls upload_video or upload_photos with the returned temporary media URLs in order. For photos it can instead hand the staged URLs back to ChatGPT ("Send to ChatGPT"), which then calls upload_photos itself, e.g. with a different caption per platform. upload_video and upload_photos refuse /mnt/data and sandbox attachment paths and point the model at the Studio.

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:

[
  {
    "AllowedOrigins": ["*"],
    "AllowedMethods": ["PUT", "GET", "HEAD"],
    "AllowedHeaders": ["*"],
    "ExposeHeaders": ["ETag"],
    "MaxAgeSeconds": 3600
  }
]

Local / development

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

Inspect the live tool surface with the official inspector:

npx @modelcontextprotocol/inspector node dist/index.js

Configuration

Env var Mode Default Description
UPLOAD_POST_API_KEY stdio — (required) Single user's Upload-Post API key. Ignored in --http mode — keys come per request.
UPLOAD_POST_BASE_URL both https://api.upload-post.com/api Override for self-hosted / staging.
UPLOAD_POST_MCP_PORT http 8080 Port for --http mode.
OPENAI_APPS_CHALLENGE_TOKEN http Current Upload-Post challenge token Optional override for ChatGPT Apps domain verification at /.well-known/openai-apps-challenge.

CLI flags:

  • --http — start the streamable HTTP transport instead of stdio
  • --port <n> — port for HTTP mode

HTTP endpoints:

  • POST /mcp — JSON-RPC over MCP streamable HTTP. Requires Authorization: ApiKey <key> (or Bearer <key>) on every request. The key is the user's own Upload-Post API key; the server uses it only for that session and stores nothing.
  • GET /healthz — liveness probe, always open. Returns {"ok":true}.

Auth model in --http mode is the same pattern Resend, Tavily, Brave Search and other API-key-native services use for their hosted MCPs: the upstream key is the auth.


Deploy with Docker

The repo ships with a multi-stage Dockerfile and a .dockerignore. On any Docker-capable PaaS (Fly.io, Railway, Render, Cloud Run, fly machines, your own box…):

  1. Point the PaaS at this repo and select Dockerfile as the build pack.
  2. Port: 8080 (matches EXPOSE 8080).
  3. Environment variables: none are required. Optionally set UPLOAD_POST_BASE_URL if you point at staging.
  4. Health check path: /healthz (HTTP, port 8080).
  5. Domain: attach a domain, e.g. mcp.your-domain.com, and provision TLS (most PaaS do this automatically via Let's Encrypt).

Deploy. The server is now ready for any number of users. Each user adds the endpoint to their MCP client config with their own Upload-Post API key:

{
  "mcpServers": {
    "upload-post": {
      "url": "https://mcp.your-domain.com/mcp",
      "headers": {
        "Authorization": "ApiKey USER_OWN_UPLOAD_POST_API_KEY"
      }
    }
  }
}

Without an Authorization header the server returns 401. The header is the only credential — invalid Upload-Post keys will surface as upstream errors on the first tool call.

Local test of the production image:

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)

Tips for prompting the agent

  • Prefer public URLs over local paths when uploading — local paths only work if the MCP server runs on the user's machine.
  • In ChatGPT Apps, prefer open_upload_studio for user-selected video and image files. It avoids local-path handoff issues by uploading to short-lived Upload-Post/R2 staging, then passing temporary media URLs to upload_video / upload_photos.
  • In any other client with a local file: if the client can run HTTP requests (Claude Code, Cursor, a script), stage it with create_media_upload → PUT the bytes to upload_url → complete_media_upload, then pass the returned media_url to upload_video. Hosted chats without that ability (claude.ai) need a public HTTPS URL or the dashboard at https://app.upload-post.com.
  • To send video bytes directly (a client that holds the file rather than a URL), pass videoBase64 to upload_video instead of videoPathOrUrl. The server writes it to a temp file, uploads, then deletes it. Inline bytes are capped at UPLOAD_POST_MAX_INLINE_MB (default 100 MB) — for larger videos use a public URL.
  • Always create the profile first (create_user) and connect socials in the Upload-Post dashboard before publishing.
  • For scheduled posts, pass ISO 8601 dates with timezone, e.g. "2026-12-25T10:00:00Z" + "timezone": "Europe/Madrid".

Privacy & data handling

This server is a stateless proxy to the Upload-Post API. Per request, the only data it processes is the user's API key (or OAuth access token resolved to one) and the arguments of the tool call being executed. No user data is persisted by the MCP container itself.

  • What we receive per request: the Authorization header, the MCP tool name + arguments, and any media URLs/paths the agent passes.
  • What we forward: the tool arguments to the Upload-Post API on behalf of the authenticated user.
  • What we store: nothing per-user. OAuth tokens are stored upstream in the Upload-Post backend, hashed (SHA-256), so a breach of token storage cannot impersonate users.
  • What we log: HTTP method, path, status code, and an opaque request ID. No tool arguments, no API keys, no tokens.

Full Upload-Post privacy policy (data collection, retention, third-party sharing, contact, GDPR/CCPA): https://upload-post.com/privacy

To revoke a connector's access at any time, open Connected Apps in app.upload-post.com.


Security

  • All traffic is TLS-terminated at the edge (HTTPS only).
  • /mcp requires a valid Authorization header on every request; OAuth access tokens are short-lived (1 h access + 90 d refresh with rotation per RFC 6749 §10.4).
  • The server validates the Origin header against an allow-list (claude.ai, claude.com, chatgpt.com, chat.openai.com, app.upload-post.com, localhost) to mitigate DNS-rebinding attacks from browser-based clients. Extend with OAUTH_EXTRA_ALLOWED_ORIGINS (comma-separated) when self-hosting behind a custom dashboard.
  • OAuth metadata is served both at /.well-known/oauth-protected-resource and at the path-inserted form /.well-known/oauth-protected-resource/mcp (RFC 9728 §3.1), and likewise for oauth-authorization-server.
  • In --http mode the server writes one stderr line per failed request and per OAuth/well-known request (method, path, status, auth scheme, user agent — never query strings or credentials). Set UPLOAD_POST_MCP_ACCESS_LOG=all to log every request or off to disable it.
  • If ChatGPT shows redirect_uri not on allow-list during OAuth, add the exact redirect_uri from the failing authorize request to the Upload-Post backend OAuth redirect allow-list. For ChatGPT clients this is typically on https://chatgpt.com/.../oauth/callback or https://chat.openai.com/.../oauth/callback.
  • OAuth redirect callbacks are pre-allowed for: Claude (claude.ai/claude.com), ChatGPT, Cursor, VS Code (stable + Insiders), Smithery, Glama, Toolhouse, Perplexity (standard + Enterprise), Mistral Studio debugger and Postman — plus any http://localhost/loopback redirect (RFC 8252), which covers Claude Code, Windsurf, Cline, Continue, Goose, Gemini CLI and other mcp-remote-style clients. Platforms without a documented fixed callback (e.g. Grok, Le Chat production) are added on request.
  • All tools declare MCP readOnlyHint/destructiveHint annotations so clients can surface confirmation prompts for destructive operations.

Report a security issue: info@upload-post.com (encrypted PGP available on request).


License

MIT © Upload-Post

README fetched from the repository 15 days ago. The original is authoritative.

Questions

About Upload-Post/upload-post-mcp

How do I install Upload-Post/upload-post-mcp?

No package has been published for this server, so install it from source: clone the repository and follow its README.

Is Upload-Post/upload-post-mcp safe to use with an AI agent?

Its trust score is 61 out of 100 (good). It passes 4 of the 5 static security checks run so far; the failures are listed above. It has no ConduID identity yet, so agent calls to it are not receipted.

Is Upload-Post/upload-post-mcp still maintained?

Yes — the latest release is v0.11.4 (27 Sep 2026), and the last commit was 4 days ago. The repository has 14 stars.