Skip to main content
Glama
Upload-Post

Upload-Post

Official

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
UPLOAD_POST_API_KEYNoYour Upload-Post API key. Required for stdio mode; ignored in --http mode.
UPLOAD_POST_BASE_URLNoOverride base URL for the Upload-Post API (default: https://api.upload-post.com/api).https://api.upload-post.com/api
UPLOAD_POST_MCP_PORTNoPort for HTTP mode (default: 8080).8080
OPENAI_APPS_CHALLENGE_TOKENNoOptional override for ChatGPT Apps domain verification token.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
resources
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
upload_videoA

Publish a video to one or more platforms. Use videoPathOrUrl only for public/signed HTTPS URLs, or for absolute local paths when the MCP server runs on the same machine as the file. videoBase64 is only for clients that can provide raw bytes directly and is capped by UPLOAD_POST_MAX_INLINE_MB (default 100). Returns a request_id you can poll with get_status. Supports per-platform overrides (tiktokPrivacyLevel, youtubePrivacyStatus, youtubePlaylistId, youtubeThumbnailUrl, youtubeTags, facebookPageId, instagramMediaType, etc.). Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target. A hosted MCP server cannot read files on the user's machine or chat attachments (/mnt/data, sandbox paths). To publish a local file: (1) if this client can run HTTP requests itself (for example a coding agent with a shell), stage it with create_media_upload (returns upload_id + upload_url), PUT the raw file bytes to upload_url with the same Content-Type, call complete_media_upload and pass the returned media_url as the media URL; (2) otherwise ask the user for a public HTTPS URL of the file, or tell them to publish it from the dashboard at https://app.upload-post.com. Staged media is deleted after 24 hours.

upload_photosA

Publish one or more photos (single image or carousel). Each item in photosPathsOrUrls may be a public URL or a local path. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target.

upload_textA

Publish a text-only post. linkUrl (or platform-specific *LinkUrl) attaches a link preview where supported. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target.

upload_documentA

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

get_statusA

Check the status of an async upload by request_id. Poll this until status is 'success' or 'failed'.

get_job_statusA

Check the status of a scheduled or queued upload by job_id. Use this for posts created with addToQueue or scheduledDate.

get_historyB

Paginated history of uploads across all profiles.

get_mediaA

Retrieve recent media (videos, photos, text posts) pulled directly from a profile's connected social accounts. Supports instagram, tiktok, youtube, linkedin, facebook, x, threads, pinterest, bluesky, reddit. Useful for browsing what already exists on a platform before posting more. Paginated: the response carries pagination = { limit, next_cursor, has_more }; pass next_cursor back as cursor for the next page (the last page returns next_cursor null and has_more false).

list_scheduledA

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

cancel_scheduledB

Cancel a scheduled post by its job_id.

edit_scheduledA

Reschedule a post: change date and/or timezone.

get_analyticsA

Aggregated analytics for a profile across selected platforms (followers, views, engagement). Instagram also returns two audience breakdowns with the same shape (age / gender / country / city): follower_demographics for the account's followers and engaged_audience_demographics for the accounts that engaged with its content.

get_total_impressionsB

Sum of impressions for a profile from daily snapshots. Use period for presets, or startDate/endDate for custom ranges.

get_post_analyticsA

Per-platform metrics for a specific post identified by request_id. post_metrics carries whatever each platform reports, so its shape is not the same everywhere: on TikTok it adds retention (the curve, second by second), impression_sources (For You, following, search, profile…), audience_types (followers vs non-followers), new_followers won by the post, reach and the watch times (average_time_watched, total_time_watched, full_video_watched_rate) on top of the usual counters.

get_cached_post_analyticsA

Replays per-post metrics Upload-Post already fetched, instead of calling the platforms again. ONLY contains posts previously fetched through get_post_analytics; there is no background refresh, so captured_at is the last time that post was read live and a post never queried live will be absent. Unlike get_post_analytics it never hits the platforms, so it is not subject to the live analytics rate limit (100 requests / 5 minutes) — prefer it when scanning many posts or paging through a profile's history. Paginated: pass next_cursor from the response back as cursor until has_more is false.

get_platform_metricsA

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

get_audienceA

Who follows the profile, when they are online and what they tap on it. One endpoint for every network, chosen with platform. Returns audience.countries / .cities / .ages / .genders, activity_by_hour (followers online per hour of the day — use it to pick posting times), followers_daily (total / new / lost), profile_actions and bio_description. It always returns benchmark_categories (the 25 values benchmark_category accepts), and when benchmark_category is set it adds a benchmark object with that niche's averages (engagement rate, likes, views, follower growth…) to compare the account against. The window is clamped by the server — at most 60 days, always ending before today — so a wider range is trimmed, not rejected; range in the response says which window was actually used. Requires the 'profile_analytics' capability on the profile's TikTok account (see the capabilities array in list_users).

get_suggestionsA

What to write about: the hashtags or the searches a network suggests around a word. One endpoint for both questions, told apart by type, and one endpoint for every network, chosen with platform. type: 'hashtags' returns { hashtags: [{ name, view_count }] } — pick tags that actually have reach for a caption; type: 'keywords' returns { keywords: [...] }, what people really search around q, useful for the next video topic. Requires the 'profile_analytics' capability on the profile's TikTok account (see the capabilities array in list_users). Keyword suggestions need 'trend_search' instead, granted the same way.

get_account_infoA

Validate the current API key and return account information. Useful as a first call to confirm credentials before doing real work.

list_usersA

List all Upload-Post profiles in the account, with their connected social accounts. The TikTok account object carries a capabilities array (music, location, cover_image, cover_timestamp, draft, photo_privacy, video_privacy, inbox_fallback, profile_analytics) telling which optional TikTok fields that connection accepts.

create_userB

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

delete_userA

Permanently delete a profile and disconnect its socials.

generate_jwtA

Generate a JWT + connection URL so an end-user can connect socials inside an embedded Upload-Post flow (white-label integration).

validate_jwtA

Verify a JWT previously issued by generate_jwt. The returned profile object echoes the connection page settings, including language and any ui_labels.

get_facebook_pagesC

Facebook pages connected to a profile.

get_linkedin_pagesA

LinkedIn company pages connected to a profile.

get_pinterest_boardsC

Pinterest boards available to a profile.

tiktok_music_trendingA

Trending tracks from the TikTok Commercial Music Library, to soundtrack a TikTok video. Pass the returned track id as tiktokMusicId in upload_video's platformOptions (not commercial_music_id, which TikTok rejects on public posts). Available on TikTok connections that declare the music capability (see capabilities on the TikTok account in list_users).

tiktok_music_searchA

Find a TikTok Commercial Music Library track by song title or artist, to soundtrack a TikTok video. Pass the returned track id as tiktokMusicId in upload_video's platformOptions (not commercial_music_id, which TikTok rejects on public posts). IMPORTANT: TikTok has no music search endpoint, so this searches the trending charts Upload-Post caches per genre/country/period, NOT TikTok's whole catalogue — a song that is not trending in the chart you query will not be found; widening the search means trying another genre, country or period. Matching is case- and accent-insensitive and every word must match. Available on TikTok connections that declare the music capability (see capabilities on the TikTok account in list_users).

tiktok_location_searchA

Search TikTok places to tag on a post. TikTok needs both parts, so pass the returned location_id as tiktokLocationId and location_name as tiktokLocationName in upload_video's platformOptions. Available on TikTok connections that declare the location capability (see capabilities on the TikTok account in list_users).

tiktok_publishing_settingsA

What the connected TikTok account is allowed to publish. Call this before setting tiktokPrivacyLevel: TikTok narrows the four privacy values per account (a private account has no PUBLIC_TO_EVERYONE), and sending one the account does not have fails the upload with error_code tiktok_privacy_unavailable. Returns privacy_level_options plus the account's max video duration and its comment/duet/stitch switches.

get_google_business_locationsB

Google Business Profile locations the profile can post to.

get_google_business_reviewsA

List reviews for a Google Business Profile location. Pass the profile that owns the connected Google Business account; location_id defaults to the account's selected location.

reply_to_google_business_reviewA

Create 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.

get_reddit_detailed_postsC

Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target. Recent Reddit posts published from a profile, with the platform-side metadata (subreddit, flair, score, …).

get_post_commentsA

List comments on a post. One endpoint for every network, chosen with platform. Identify the post by either postId or postUrl (YouTube: postId=videoId; LinkedIn: postId=the post urn; TikTok: postId=the video id, postUrl is not accepted). Add commentId to get the REPLIES hanging off that one comment instead of the post's top-level comments — replies are the same question with one more parameter, not another tool. TikTok: Requires the 'comments' capability on the profile's TikTok account (see the capabilities array in list_users). It is granted at connection time, so an account connected earlier has to reconnect TikTok before this works.

reply_to_commentA

Send a private DM to the author of an Instagram comment (within Instagram's 7-day reply window).

public_reply_to_commentC

Post a public reply visible under the original Instagram comment.

create_commentA

Post a top-level comment or a reply on a post. Provide exactly ONE of commentId (reply to a comment), postId, or postUrl (top-level). LinkedIn: postId=the post urn. Instagram requires commentId (replies only). TikTok always needs postId (the video id); add commentId on top of it to reply inside that thread. TikTok: Requires the 'comments' capability on the profile's TikTok account (see the capabilities array in list_users). It is granted at connection time, so an account connected earlier has to reconnect TikTok before this works.

delete_commentA

Delete a comment by commentId. LinkedIn also requires postId (the post urn); TikTok needs only the commentId. TikTok: Requires the 'comments' capability on the profile's TikTok account (see the capabilities array in list_users). It is granted at connection time, so an account connected earlier has to reconnect TikTok before this works.

comment_actionA

Moderate or react to a comment on one of the profile's own posts: hide it from other viewers, like it as the account, or pin it to the top. One endpoint for every network, chosen with platform; a network that cannot do it answers 400 platform_not_supported with the list of the ones that can. Every action carries its own inverse (hide/unhide, like/unlike, pin/unpin), so nothing here is permanent. postId is required for hide/unhide and pin/unpin, and must NOT be sent for like/unlike. Deleting a comment is a different tool: delete_comment. TikTok: Requires the 'comments' capability on the profile's TikTok account (see the capabilities array in list_users). It is granted at connection time, so an account connected earlier has to reconnect TikTok before this works.

retry_postB

Retry a failed upload. Identify it by either requestId (async upload) or jobId (scheduled/queued upload).

unpublish_postA

Delete a post already published to a platform. Instagram and TikTok are not supported.

send_dmA

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

list_dm_conversationsC

Recent DM conversations for a profile on a given platform.

manage_autodmsA

Control Instagram AutoDM monitors. For action='start', provide post_url, reply_message, and profile_username. For stop/pause/resume/delete/logs, provide monitor_id. For status, optionally set include_inactive=true.

submit_ffmpeg_jobA

Submit a private FFmpeg processing job through Upload-Post. Provide input_url for one input, or files for multiple public URLs. Optionally provide full_command beginning with ffmpeg for explicit trim/transcode/watermark/thumbnail commands. Returns a job_id you can poll with get_ffmpeg_job.

get_ffmpeg_jobA

Poll the status of an FFmpeg job. When status is 'completed', call download_ffmpeg_result to obtain the file.

download_ffmpeg_resultA

Returns the download URL and metadata for a completed FFmpeg job without streaming the processed file through MCP.

get_ffmpeg_consumptionA

Monthly FFmpeg processing minutes used vs. plan allowance.

get_queue_settingsC

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

update_queue_settingsA

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

preview_queueA

Preview the upcoming queue slots and what would land in them. Optionally nextSlot=true returns just the next available slot timestamp.

create_media_uploadA

Step 1 of staging a local file for publishing. Returns upload_id and a short-lived upload_url; the caller must then PUT the raw file bytes to upload_url (same Content-Type and size as declared here) and call complete_media_upload. Only useful when this client can perform the HTTP PUT itself (for example a coding agent with a shell); the model cannot read chat attachments or /mnt/data paths, so for those ask the user for a public HTTPS URL or send them to https://app.upload-post.com. Staging media is deleted after 24 hours; scheduled posts are safe because upload_video copies the media into durable scheduler storage.

complete_media_uploadA

Step 2 of staging a local file. Call it only after the file bytes were actually PUT to the upload_url from create_media_upload; without that PUT it fails or yields no publishable media. Returns a temporary media_url to pass straight to upload_video / upload_photos / upload_document.

get_media_uploadA

Internal/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.

delete_media_uploadA

Internal/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.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

B3.3/5.0

Scored across 57 tools

Disambiguation3/5

Most tools are distinct, but there are several overlapping pairs: get_status vs get_job_status, get_analytics vs get_post_analytics vs get_cached_post_analytics vs get_total_impressions, and reply_to_comment vs public_reply_to_comment vs create_comment vs send_dm. The descriptions help, but an agent could easily pick the wrong analytics or comment tool.

Naming Consistency4/5

The set mostly follows a verb_noun pattern (upload_photos, list_scheduled, get_analytics, delete_comment, cancel_scheduled). Minor deviations exist: tiktok_music_trending and tiktok_music_search are noun-first rather than verb-first, and get_google_business_locations is a bit verbose, but the overall pattern is consistent and readable.

Tool Count2/5

57 tools is a very large surface for a single MCP server. While the domain is broad (publishing, scheduling, analytics, comments, DMs, FFmpeg processing, user management), the count is heavy and includes internal/app staging helpers (get_media_upload, delete_media_upload) that add clutter. The scope could be split into separate servers.

Completeness4/5

The publishing lifecycle is well covered: create, schedule, retry, status, history, cancel, edit, unpublish. Analytics, comments, DMs, and queue management are also present. Minor gaps exist: no tool to update a published post, no tool to list failed uploads specifically, and Reddit is explicitly unavailable, but the core workflows are complete.

Maintenance

ActivityActive
ResponsivenessUnresponsive