A side-by-side look at the Linkedctl and Upload Post MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Linkedctl for social media work as a local process; choose Upload Post for social media as a local process. You can also run both side by side in one mcpServers block.
whoami, auth_status, auth_revoke.UPLOAD_POST_API_KEY, UPLOAD_POST_STUDIO_CLIENTS.upload_video, upload_photos, upload_text.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Social Media | Social Media |
| Quality signal | 53/100 · Good | 64/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | Not declared |
| Pricing | Not declared | Not declared |
| Required env vars | None listed | UPLOAD_POST_API_KEYUPLOAD_POST_STUDIO_CLIENTS |
| Verified owner | Community listing | Community listing |
| GitHub stars | 2 | 10 |
| Directory activity | 1 views 0 installs 0 upvotes | 1 views 0 installs 0 upvotes |
| Tools | 22 | 57 |
| Full listing | View Linkedctl | View Upload Post |
whoamiShow the current user's name, email, and profile picture URLauth_statusShow authentication status for a profileauth_revokeRevoke the access token server-side and clear local credentialspost_createCreate a post on LinkedIn with optional media, poll, or article attachmentpost_getFetch a single post by URNpost_listList posts with pagination (supports `as_org` for organization posts)post_updateUpdate the commentary text of an existing postpost_deleteDelete a post by URNcomment_createCreate a comment on a post (supports `as_org`)comment_listList comments on a postcomment_getGet a specific comment by URNcomment_deleteDelete a comment by URNupload_videoPublish 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_photosPublish 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_textPublish 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_documentPublish a document (PDF / PPT / PPTX / DOC / DOCX) to LinkedIn. Title is required.get_statusCheck the status of an async upload by `request_id`. Poll this until `status` is 'success' or 'failed'.get_job_statusCheck the status of a scheduled or queued upload by `job_id`. Use this for posts created with `addToQueue` or `scheduledDate`.get_historyPaginated history of uploads across all profiles.get_mediaRetrieve 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_scheduledList all currently scheduled (not-yet-published) posts.cancel_scheduledCancel a scheduled post by its `job_id`.edit_scheduledEdit a pending scheduled post in place, keeping its job ID and media: reschedule it (scheduledDate/timezone) and/or fix its text. `title` and `caption` rewrite the text for EVERY platform of the post; to change only some platforms, send `platformContent` instead, e.g. {"instagram":{"caption":"..."},"tiktok":{"caption":"..."}} — platforms not listed keep their text. First comments cannot be edited on a pending post.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): `follower_demographics` for the account's followers and `engaged_audience_demographics` for the accounts that engaged with its content.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"linkedctl": {
"command": "npx",
"args": [
"-y",
"linkedctl"
]
}
}
}
{
"mcpServers": {
"upload-post": {
"command": "npx",
"args": [
"-y",
"@upload-post/mcp"
],
"env": {
"UPLOAD_POST_API_KEY": "YOUR_UPLOAD_POST_API_KEY_HERE",
"UPLOAD_POST_STUDIO_CLIENTS": "YOUR_UPLOAD_POST_STUDIO_CLIENTS_HERE"
}
}
}
}