Upload-Post

com.upload-post由 upload-post.com 發布官方發布者v0.10.0更新於 Nov 2, 2026

Social media MCP: publish, schedule & analyze posts on TikTok, Instagram, YouTube, LinkedIn & X

已驗證Streamable HTTP可網頁執行溝通與協作資料與分析商業與電商

概覽

AI 產生的概覽

Upload-Post MCP 伺服器,讓 AI 助理在 TikTok、Instagram、YouTube、LinkedIn、Facebook 等平台發佈、排程、管理留言並分析社群媒體內容。

可以做什麼
  • 一次向多個平台發佈或排程影片、照片、文字與文件,發佈前需確認
  • 暫存媒體上傳,並查詢任務狀態、歷史紀錄與已排程貼文
  • 讀取單篇貼文與帳號分析、受眾資料、主題標籤與關鍵字建議
  • 管理留言、公開回覆、傳送私訊並執行自動回覆流程
  • 管理使用者、粉絲頁、圖版以及 Google Business 地點與評論
  • 執行 FFmpeg 編碼任務並調整發佈佇列設定
適用情境
適合想讓助理端到端處理社群媒體工作的情境:跨多個平台草擬並發佈內容、安排內容行事曆、回覆或審核留言,以及把互動數據帶回對話中分析。
執行需求
使用 mcp.upload-post.com 的遠端端點(streamable HTTP),或自架副本(npm 套件或 Docker)。需要 Upload-Post 帳號,並透過 OAuth 登入或使用 Upload-Post API 金鑰(放在 Authorization 標頭中,ApiKey 或 Bearer 形式)。需要能連線至 Upload-Post API 的網路。
安裝前請注意
API 金鑰或 OAuth 權杖是唯一憑證,具備完整帳號權限,須視為機密保管。許多工具會以使用者身分執行操作:發佈內容、傳送私訊、回覆留言、刪除使用者與貼文、變更留言審核狀態;多數需要 confirmed: true,但仍應仔細核對預覽。FFmpeg 任務依處理時長計費,媒體會上傳至 Upload-Post/R2 暫存儲存並轉送至各社群平台。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Upload-Post,將其新增到工作區。
  2. 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/com.upload-post%2Fmcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。

{
  "mcpServers": {
    "upload-post": {
      "type": "http",
      "url": "https://mcp.upload-post.com/mcp"
    }
  }
}

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 plugin reviewed by OpenAI, listed in ChatGPT's Plugins (formerly Apps). Open Upload-Post in ChatGPT or search for Upload-Post in Plugins, click Install, then Connect, and sign in with OAuth. There is no MCP URL to paste, and you get the Upload Studio widget for publishing video files, photos and carousels straight from your computer. OpenAI dots use the same plugin: select it in your dot's Customize → Plugins and review its permissions.

Prefer to wire it up by hand? In ChatGPT on the web, open Plugins, click +, choose Add custom MCP server, point it at https://mcp.upload-post.com/mcp and set authentication to OAuth. Custom MCP servers get write actions on Business, Enterprise and Edu workspaces.

Use it in Claude (no setup)

Upload-Post is an official connector in Claude's connector directory. Add Upload-Post to Claude, or in claude.ai, Claude Desktop or Claude Cowork open Customize → Connectors, browse the directory and search for Upload-Post, then click Connect and sign in with OAuth. There is no MCP URL to paste. On Team and Enterprise an owner may need to allow it first in Organization settings.

Prefer to wire it up by hand? Open Customize → Connectors, click + Add, then Add custom connector, paste https://mcp.upload-post.com/mcp, click Continue and sign in with OAuth. Custom connectors work on every Claude plan (the Free plan allows one). In Claude Code: claude mcp add --transport http upload-post https://mcp.upload-post.com/mcp, or install the official Upload-Post plugin from the Claude directory.

Use it in Perplexity Computer

Open Plugins in the sidebar (or Customize → Connectors), then Add custom → Connector → Add MCP connector → Remote. Use https://mcp.upload-post.com/mcp with the Streamable HTTP transport and OAuth (or your Upload-Post API key), click Add, then click the Upload-Post card to sign in.

Use it in Gemini CLI

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

bash
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.):

jsonc
{  "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.

jsonc
{  "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.

GroupTools
Uploadupload_video, upload_photos, upload_text, upload_document, open_upload_studio
Media stagingcreate_media_upload, complete_media_upload, get_media_upload, delete_media_upload
Statusget_status, get_job_status, get_history, get_media
Schedulelist_scheduled, cancel_scheduled, edit_scheduled
Analyticsget_analytics, get_total_impressions, get_post_analytics, get_cached_post_analytics, get_platform_metrics
Audienceget_audience, get_suggestions
Usersget_account_info, list_users, get_connect_link, create_user, delete_user, generate_jwt, validate_jwt
Pages/boardsget_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
Commentsget_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
TikToktiktok_music_trending, tiktok_music_search, tiktok_location_search, tiktok_publishing_settings
DMssend_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
FFmpegsubmit_ffmpeg_job, get_ffmpeg_job, download_ffmpeg_result, get_ffmpeg_consumption
Queueget_queue_settings, update_queue_settings, preview_queue

Async uploads return a request_id. The agent should poll get_status until success: true.

Per-platform: TikTok / YouTube / Instagram / LinkedIn / Facebook

One server covers every network; this is what each of the big five uses. Publishing always goes through the same upload tools with a platform list, so a single call can post one video to TikTok, Reels and Shorts at once.

PlatformPublishNetwork-specific helpersEngage and measure
TikTokupload_video (videos, drafts), upload_photos (photo carousels)tiktok_publishing_settings, tiktok_music_trending, tiktok_music_search, tiktok_location_searchget_post_comments, create_comment, comment_action, get_post_analytics, get_audience, start_autodm (public auto-reply)
YouTubeupload_video (videos and Shorts, with title, description and tags)get_post_comments, comment_action (hide / hold), get_post_analytics, get_analytics, start_autodm (public auto-reply)
Instagramupload_video (Reels, Stories), upload_photos (posts, carousels, Stories)get_post_comments, reply_to_comment, comment_action, send_dm, list_dm_conversations, start_autodm (comment-to-DM), get_post_analytics
LinkedInupload_text, upload_photos, upload_video, upload_document (PDF, PPT, DOCX documents)get_linkedin_pages (post as a company page)get_post_comments, get_post_analytics, get_analytics
Facebookupload_video, upload_photos, upload_textget_facebook_pages (pick the page)get_post_comments, comment_action (hide / like / edit), start_autodm (public auto-reply), get_post_analytics

Search terms people use for these: TikTok MCP server, YouTube MCP server / YouTube uploader MCP, Instagram MCP server, LinkedIn MCP server, Facebook MCP server.

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. Reads are cached for up to 60 seconds (up to 2 minutes on X); a comment created or deleted through Upload-Post by the same account shows up on the next read.
  • create_comment on X — links are removed unless the account is allowed links on X (reported in warnings); a message that was only links fails with 400 x_links_not_allowed. Replies, post edits and reposts on X share a daily limit per X account (20 on the free plan, 200 on paid plans, reset at 00:00 UTC); past it the API answers 429 x_daily_write_limit with retry_after and a Retry-After header.
  • 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. They run on Upload-Post's encoding servers, each in its own working directory. full_command is a single ffmpeg invocation with {input} (or {input0}, {input1}…) and {output} placeholders, run without a shell: it must start with ffmpeg, every -i must be an {input}/{inputN} placeholder or a -f lavfi source, and {output} is the only output. Protocols or URLs inside the command (file:, concat:, subfile,…), the movie=/amovie=/sendcmd filters, absolute paths other than fonts under /usr/share/fonts, .., -safe 0 and shell metacharacters are rejected with a 400. Endless commands (-stream_loop -1, -loop 1, a lavfi source without a duration) need -t, -shortest or -frames, and -stream_loop goes from -1 to 100. Usage is charged at the longer of the input and output durations. Poll get_ffmpeg_job until completion, then call download_ffmpeg_result; it returns the result URL without streaming the processed binary through MCP. Nothing is posted until you pass that URL to an upload tool.

Confirmation before acting

Tools that publish or reach other people as the user run in two steps. Called without confirmed: true, they return status: "confirmation_required" with a preview of exactly what would go out (text, media, platforms or recipients, buttons, keywords, timing) and do nothing; the model shows it to the user and repeats the call with confirmed: true once they approve. This covers upload_video, upload_photos, upload_text, upload_document, send_dm, reply_to_comment, public_reply_to_comment, create_comment, reply_to_google_business_review, edit_comment, unpublish_post, start_autodm and manage_autodms with action: "start", plus comment_action / hide_comment when they edit a comment or ban its author. delete_user deletes only when confirm_username repeats the profile name. ChatGPT, which asks the user before every write tool, keeps the single-step tools.

Reddit publishing is switched off while the Reddit app is unavailable: reddit is not offered as a platform and asking for it fails with reddit_unavailable. Self-hosters can set UPLOAD_POST_REDDIT_ENABLED=true once it is back.

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:

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

Local / development

bash
git clone https://github.com/Upload-Post/upload-post-mcp.gitcd upload-post-mcpnpm installnpm 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:

bash
npx @modelcontextprotocol/inspector node dist/index.js

Configuration

Env varModeDefaultDescription
UPLOAD_POST_API_KEYstdio— (required)Single user's Upload-Post API key. Ignored in --http mode — keys come per request.
UPLOAD_POST_BASE_URLbothhttps://api.upload-post.com/apiOverride for self-hosted / staging.
UPLOAD_POST_MCP_PORThttp8080Port for --http mode.
UPLOAD_POST_MCP_MAX_BODY_MBhttp10Largest /mcp request body accepted; bigger ones get 413.
UPLOAD_POST_MCP_VALIDATE_API_KEYShttptrueCheck a pasted API key once against GET /uploadposts/me (cached) before opening a session for it; a rejected key gets 401.
UPLOAD_POST_MCP_KEY_CHECK_TTL_MShttp600000How long an accepted key is trusted before it is checked again.
UPLOAD_POST_MCP_MAX_SESSIONShttp2000Live sessions kept in memory; past it the longest-idle one is closed.
UPLOAD_POST_MCP_MAX_SESSIONS_PER_KEYhttp200Live sessions per credential; past it that credential's own longest-idle session is closed.
UPLOAD_POST_MCP_SESSION_TTL_MShttp1800000Idle time after which a session is closed.
UPLOAD_POST_MCP_AUTH_FAIL_MAXhttp20401s on /mcp one client IP may collect per window; past it that IP gets 429 + Retry-After (sessions and keys already verified still pass; one request per probe interval is checked normally). 0 turns it off.
UPLOAD_POST_MCP_AUTH_FAIL_WINDOW_Shttp300Window for the count above; a held IP is released this long after its last failure.
UPLOAD_POST_MCP_AUTH_FAIL_PROBE_Shttp30While held, one request per this many seconds goes through the normal auth path.
UPLOAD_POST_MCP_TRUST_PROXYhttpautoWhether the client IP is the last X-Forwarded-For hop: auto (only when the peer is a private address, i.e. a local reverse proxy), true or false.
UPLOAD_POST_MCP_ALLOW_LOCAL_FILEShttpfalseLet tools read media from file paths on the server's disk. Off for a shared host (only http(s) URLs are accepted); turn it on only when the HTTP server runs next to your own files. stdio always allows paths.
OPENAI_APPS_CHALLENGE_TOKENhttpCurrent Upload-Post challenge tokenOptional 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:

jsonc
{  "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:

bash
docker build -t upload-post-mcp .docker run --rm -p 8080:8080 upload-post-mcpcurl 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), and in --http mode the whole request at UPLOAD_POST_MCP_MAX_BODY_MB (default 10 MB, roughly 7 MB of video once base64-encoded) — 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, and the tools that publish or message people also require an explicit confirmed: true (see Confirmation before acting).

Report a security issue: [email protected] (encrypted PGP available on request).


License

MIT © Upload-Post

來源:README.md,提交 bb8c9b4

工具

0
該伺服器需要登入,因此 SourceWeft 無法在沒有帳號的情況下讀取其工具,也未收錄。已連接帳號所能看到的內容可能因帳號及其權限而異。

版本歷史

1
  1. v0.10.0最新Sep 16, 2026

評分

已滿足適用檢查項的 85%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分