BulkPublish
This BulkPublish MCP server lets you manage multi-platform social media publishing, media, schedules, labels, RSS feeds, channel sets, analytics, and account usage from an AI/agent context.
List connected channels, channel health, platform options, and supported/available platforms.
Create, update, list, delete, publish, retry, approve, reject, and bulk-manage posts.
Schedule posts, create recurring schedules, and get the next queue slot.
Upload, list, fetch, and delete media, including chunked uploads for large files.
Create, list, update, and delete labels for posts and media.
Create, list, update, and delete saved channel sets.
Create, list, update, enable/disable, and delete RSS autopost feeds.
View analytics summaries, post-level metrics, and interactive dashboards.
Search mentions and fetch platform-specific channel post options.
Use interactive UI tools to compose posts and visually view posts, channels, media, analytics, and quota usage.
Check quota/plan usage and team-approval workflows.
Enables publishing posts and threads with image media to the Bluesky platform, including scheduling and analytics capabilities.
Supports publishing posts and stories with images and videos to Facebook, including scheduling, draft management, and engagement analytics.
Provides integration with Google Business Profile for publishing posts, events, and offers with images, plus analytics tracking.
Enables publishing feed posts, reels, stories, and carousels with images and videos to Instagram, including support for collaborators and scheduling.
Supports publishing posts and threads with images and videos to Mastodon instances, with scheduling and retry capabilities.
Enables publishing pins with images and videos to Pinterest, including board selection and scheduling options.
Supports publishing posts, threads, and quote posts with images and videos to Threads, with full scheduling and analytics support.
Enables publishing videos and photo slideshows to TikTok, with privacy settings and scheduling capabilities.
Supports publishing videos and shorts to YouTube, accepting various video formats including MP4, MOV, WebM, AVI, WMV, and FLV.
This server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
Programmatically publish to 15 platforms from a single API call. Built for developers, AI agents, LLMs, and agentic workflows that need reliable social media automation without browser sessions or manual interaction.
from bulkpublish import BulkPublish
bp = BulkPublish("bp_your_key_here")
bp.posts.create(
content="Launching our new product today!",
channels=[{"channelId": 1, "platform": "x"}, {"channelId": 2, "platform": "linkedin"}],
status="scheduled",
scheduled_at="2026-04-10T09:00:00Z",
)Why BulkPublish?
Most social media tools are built for humans clicking buttons. BulkPublish is built for code — whether that code is written by a developer, an AI agent, an LLM with tool use, or an autonomous workflow.
Headless by design — No browser, no UI, no OAuth pop-ups at runtime. Connect accounts once in the dashboard, then automate everything via API.
AI-native — MCP server for Claude, tool definitions for GPT and LangChain, structured JSON responses that LLMs parse reliably.
Agentic-ready — Deterministic API with clear error codes. AI agents can create posts, check status, retry failures, and read analytics autonomously.
15 platforms, one endpoint — Facebook, Instagram, X/Twitter, TikTok, YouTube, Threads, Bluesky, Pinterest, Google Business Profile, LinkedIn, Mastodon, Discord, Telegram, Tumblr, Snapchat.
Related MCP server: Publora MVP MCP Server
Use Cases
AI social media managers — Let Claude, GPT, or custom agents schedule and publish posts autonomously
Content pipelines — RSS-to-social, blog-to-social, newsletter-to-social automation
Bulk scheduling — Upload a CSV or feed a content calendar and schedule weeks of posts programmatically
Cross-platform syndication — Publish once to all platforms with per-platform content optimization
Analytics dashboards — Pull engagement data into your own tools, spreadsheets, or AI analysis
Zapier/n8n/Make alternatives — Direct API access without middleware, lower latency, more control
LLM-powered content creation — Generate content with AI, publish it with BulkPublish, track performance, iterate
Quick Start
1. Sign up
Create a free account at app.bulkpublish.com.
2. Get your API key
Go to Settings > Developer in the dashboard and create an API key. Keys start with bp_ and are shown only once — save it securely.
3. Connect platforms
Connect your social accounts in the dashboard under Channels. The API uses your connected channels to publish.
4. Install an SDK
Python
pip install bulkpublishNode.js
npm install bulkpublishHomebrew (macOS/Linux)
brew tap azeemkafridi/bulkpublish && brew install bulkpublishOr call the REST API directly with curl, fetch, requests, or any HTTP client.
5. Make your first API call
curl -X POST https://app.bulkpublish.com/api/posts \
-H "Authorization: Bearer bp_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"content": "Hello from the BulkPublish API!",
"channels": [{"channelId": 1, "platform": "linkedin"}],
"status": "draft"
}'AI Agent Integration
MCP Server (Claude, Cursor, Windsurf, Claude Code)
BulkPublish ships an MCP server so AI assistants can manage your social media directly:
{
"mcpServers": {
"bulkpublish": {
"command": "npx",
"args": ["-y", "@bulkpublish/mcp-server"],
"env": {
"BULKPUBLISH_API_KEY": "bp_your_key_here"
}
}
}
}80 tools in the local (stdio) server: create_post, list_channels, upload_media, get_analytics, the interactive compose_post composer (MCP Apps), and more. The hosted server at https://mcp.bulkpublish.com/mcp (OAuth 2.1) serves the 26-tool core profile: channels, posts, media, analytics, labels, approvals, post comments and the interactive panels. The 32-tool inbox profile adds reading and answering direct messages, reviews and comments. See mcp-server/README.md.
Social Media Content Skills
BulkPublish includes a skill library for AI agents to plan, adapt, review, schedule, publish and fix social media content: Social Media Content Skills for the full tool set, and core-profile skills for the hosted connector. Both are generated from skills/src.
LLM Tool Use / Function Calling
Ready-made tool definitions for autonomous AI agents:
Claude tool_use example — Anthropic SDK with tool definitions for scheduling posts
OpenAI function calling example — GPT-4 with functions for post management
LangChain tool example — LangChain agent with BulkPublish tools
All examples are complete, runnable scripts with error handling.
Code Examples
Create a Post
from bulkpublish import BulkPublish
bp = BulkPublish("bp_your_key_here")
post = bp.posts.create(
content="Check out our latest update!",
channels=[
{"channelId": 1, "platform": "facebook"},
{"channelId": 2, "platform": "x"},
{"channelId": 3, "platform": "linkedin"},
],
status="draft",
)import { BulkPublish } from 'bulkpublish';
const bp = new BulkPublish({ apiKey: 'bp_your_key_here' });
const post = await bp.posts.create({
content: 'Check out our latest update!',
channels: [
{ channelId: 1, platform: 'facebook' },
{ channelId: 2, platform: 'x' },
{ channelId: 3, platform: 'linkedin' },
],
status: 'draft',
});Schedule a Post
post = bp.posts.create(
content="This will go out tomorrow morning.",
channels=[{"channelId": 1, "platform": "instagram"}],
status="scheduled",
scheduled_at="2026-04-10T09:00:00Z",
timezone="America/New_York",
)Upload Media and Publish
media = bp.media.upload("./product-photo.jpg")
post = bp.posts.create(
content="Our newest product is here.",
channels=[{"channelId": 1, "platform": "instagram"}],
media_files=[media["file"]["id"]],
status="scheduled",
scheduled_at="2026-04-10T12:00:00Z",
)Automation Example: Bulk Schedule from CSV
import csv
from bulkpublish import BulkPublish
bp = BulkPublish("bp_your_key_here")
channels = bp.channels.list()["channels"]
with open("content-calendar.csv") as f:
for row in csv.DictReader(f):
bp.posts.create(
content=row["content"],
channels=[{"channelId": ch["id"], "platform": ch["platform"]} for ch in channels],
status="scheduled",
scheduled_at=row["scheduled_at"],
timezone="America/New_York",
)More examples in examples/ — including Python automation scripts, Node.js examples, curl reference, and AI agent integrations.
Features
15 platforms — Facebook, Instagram, X/Twitter, TikTok, YouTube, Threads, Bluesky, Pinterest, Google Business Profile, LinkedIn, Mastodon, Discord, Telegram, Tumblr, Snapchat
Scheduling — Schedule posts for any future time with timezone support, or let queue slots pick optimal times
Media uploads — Images (JPEG, PNG, WebP, GIF) and videos (MP4, MOV, WebM) up to 100 MB
Recurring schedules — Repeat posts daily, weekly, biweekly, or monthly at a set time of day
Analytics — Track impressions, likes, comments, shares, and engagement. Each platform reports a different subset of metrics, and the response says which (
supportedMetrics/supportedTotals) so a0is never mistaken for a measurement — see Metrics by PlatformLink tracking — Opt in per organization, or per post via
linkTrackingOverride, to rewrite links throughbulkpubli.shand count the clicks. Reported aslinkClicks/totalLinkClicksand measured by BulkPublish rather than the platform, so it works even where the platform reports nothing — see Character LimitsLabels — Organize posts and media with color-coded labels
Hashtag groups — Save sets of hashtags and drop them into a post in one call
Templates — Save post text and start new posts from it
Review links — Share a read-only page of a post with someone who has no account
Calendar notes — Pin campaigns, holidays and reminders to calendar days
Bulk operations — Delete or retry multiple posts in a single request
Threads — Multi-part thread posts for X, Threads, Bluesky, and Mastodon
Auto first comment — Automatically add a comment after publishing on any platform
All post types — Reels, Stories, Carousels, Threads, Shorts, Video — set per-platform via
postTypeOverridesPer-platform content — Customize text and options per platform in a single post
Platform-specific options — Instagram collaborators, TikTok privacy, YouTube categories, Pinterest boards, and more
API Reference
Full interactive API documentation: app.bulkpublish.com/docs
Base URL
https://app.bulkpublish.comAuthentication
Authorization: Bearer bp_your_key_hereCore Endpoints
Method | Endpoint | Description |
|
| Create a post (draft, scheduled, or immediate) |
|
| List posts (paginated, filterable by status/date/channel/label) |
|
| Get a post with platform statuses and metrics |
|
| Update a draft or scheduled post |
|
| Delete a post |
|
| Publish a draft immediately |
|
| Retry failed platforms |
|
| Approve a post awaiting team approval (roles with post:approve) |
|
| Reject a pending post back to draft, with an optional reason |
|
| Bulk delete, retry or reschedule (up to 100 posts per request) |
|
| List connected social media channels |
|
| Check channel token health |
|
| Get platform options (Pinterest boards, YouTube playlists, Tumblr blogs, Discord channels, Threads |
|
| Search accounts for @mention (X, Bluesky, Mastodon, LinkedIn Pages — LinkedIn results are |
|
| Saved post templates (get/update/delete via |
|
| Notes pinned to calendar days, |
|
| Create or revoke the post's read-only review link ( |
|
| Saved hashtag groups, 1-30 hashtags each (get/update/delete via |
|
| Saved channel groups for one-click targeting (update/delete via |
|
| RSS/Atom autopost feeds — new items become posts (update/delete via |
|
| Upload a media file (multipart form, up to 100MB) |
|
| Start a chunked upload for large media (videos up to 1GB, 10MB parts) |
|
| Assemble uploaded parts and record the media file |
|
| List uploaded media |
|
| Analytics summary for a date range |
|
| Engagement totals, per-day / per-platform / per-channel breakdowns, ranked and full post lists — filterable by channels, platforms, labels, format and media type; |
|
| Every stored metrics snapshot for one post, per platform (trend since publish) |
|
| Tracked bulkpubli.sh links with click counts |
|
| Create a recurring schedule |
|
| Check current plan limits and usage |
|
| Inbox: direct messages, reviews and comment threads, with filters and cursor paging (Pro and Business) |
|
| Read a conversation, or send a reply to the person on the platform |
|
| Mark read, archive, snooze or assign a conversation |
|
| Comments and reactions on a published post, per channel |
|
| Reply to a comment on a published post |
|
| Like, unlike, hide, unhide or delete a comment |
See the OpenAPI spec for the complete endpoint list.
Supported Platforms
Platform | Post Types | Media |
Post, Story | Images, Videos | |
Feed, Reel, Story, Carousel | Images (JPEG), Videos (MP4, MOV) | |
X / Twitter | Tweet, Thread | Images, Videos, GIFs |
TikTok | Video, Photo Slideshow | Videos (MP4, MOV), Images |
YouTube | Video, Short | Videos (MP4, MOV, WebM, AVI, WMV, FLV) |
Threads | Post, Thread, Quote Post | Images, Videos |
Bluesky | Post, Thread | Images |
Pin | Images, Videos | |
Google Business Profile | Post, Event, Offer | Images |
Post, Multi-image, PDF Carousel, Article, Document, Poll, Reshare | Images (JPEG, PNG, GIF), Videos (MP4), Documents (PDF, Word, PowerPoint) | |
Mastodon | Post, Thread | Images, Videos |
Snapchat | Story, Saved Story, Spotlight | Exactly 1 image (JPG, PNG) or video (MP4, MOV, vertical, max 1GB; story video 5–60s, Spotlight 6–60s) |
SDKs
Python
pip install bulkpublishSupports sync and async. Rich docstrings on every method for IDE and LLM consumption.
Node.js / TypeScript
npm install bulkpublishFull TypeScript types, zero dependencies, native fetch (Node 18+).
Homebrew (macOS/Linux)
brew tap azeemkafridi/bulkpublish && brew install bulkpublishInstalls the Node SDK via Homebrew.
REST API
No SDK needed — any HTTP client works:
curl https://app.bulkpublish.com/api/channels \
-H "Authorization: Bearer bp_your_key_here"Rate Limits
Limit | Free | Pro | Business |
Writes/min | 60 | 60 | 60 |
Reads/min | 300 | 300 | 300 |
Daily API requests | 10 | 5,000 | 50,000 |
API keys | 1 | 5 | 10 |
| Recurring schedules | — | 10 | Unlimited |
See the rate limits guide for headers, backoff strategies, and best practices.
Guides
Authentication — API keys, authorization, key management
Scheduling — Scheduled posts, queue slots, recurring schedules, timezones
Media Uploads — File uploads, supported formats, using media in posts
Platform Options — Per-platform configuration and quirks
Rate Limits — Burst limits, daily quotas, best practices
Inbox and Comments — Read and answer direct messages, reviews and comments
Integrations
Platform | Package | Install |
Zapier | Search "BulkPublish" in Zapier | |
n8n | Settings > Community Nodes > | |
Homebrew |
|
Links
Resource | URL |
Dashboard | |
API Docs | |
Website | |
License
MIT
Available Tools
51 toolsabort_multipart_uploadAbort chunked media uploadBInspect
Abort an in-progress chunked upload and free its stored parts. Use this when a chunked upload should be cancelled and its stored parts freed.
Inputs: r2Key (required), uploadId (required).
approve_postApprove pending postAInspect
Approve a post awaiting team approval. Requires a role with post:approve (owner, admin, approver). Releases a post with approvalStatus 'pending': it publishes at its scheduled time, or immediately if that time has already passed. The author is notified in-app. Errors: 400 if the post is not awaiting approval, 403 if the role lacks post:approve, 404 if not found. Use this when the user (an owner/admin/approver) wants to approve a post awaiting team approval.
Inputs: postId (required).
bulk_postsBulk post actionsADestructiveInspect
Perform a bulk action on multiple posts. Supports deleting, retrying, or rescheduling multiple posts at once. Use this when the user wants to delete, retry, or reschedule many posts in a single request.
Inputs: action (required), postIds (required), scheduledAt.
complete_multipart_uploadComplete chunked media uploadAInspect
Complete a chunked upload: the server assembles the uploaded parts, verifies the stored object (existence, size, magic bytes, storage quota) and records the media file — same verification and response shape as finalize_media_upload. A failed assembly automatically aborts the upload. Use this when all parts of a chunked upload are PUT and their ETags collected.
Inputs: parts (required), r2Key (required), fileName (required), mimeType (required), +5 more.
compose_postCompose a postAInspect
Open an interactive composer to draft or schedule a social media post. Shows the user's connected channels to pick from and pre-fills any provided text. The user finishes in the UI; on submit it creates the post via create_post. Use this when the user wants to compose a post interactively in a UI — prefer this over create_post when they'd review before posting.
Inputs: content. Returns: media, channels
create_channel_setCreate channel setAInspect
Create a channel set — a saved channel grouping for one-click multi-channel targeting. Names are unique per organization (a duplicate fails with a 409, code DUPLICATE_NAME); an organization can have up to 50 sets. Use this when the user wants to save a group of channels for one-click targeting.
Inputs: name (required), channelIds (required).
create_labelCreate labelAInspect
Create a new label for organizing posts or media files. Use this when the user wants a new label/tag.
Inputs: name (required), type, color.
create_media_uploadStart media uploadAInspect
Reserve a presigned R2 upload URL for a direct browser upload (used by the composer UI). For scripted uploads use upload_media instead. Use this when you need a presigned URL for a large direct upload (advanced; prefer upload_media for normal files).
Inputs: sizeBytes (required), contentType (required).
create_multipart_uploadStart chunked media uploadAInspect
Start a chunked (multipart) direct-to-storage upload for large media — videos up to 1GB, images up to 100MB. Returns r2Key, uploadId, the fixed partSize (10485760 bytes = 10MB), and one presigned PUT URL per part (valid 3600s). PUT each 10MB slice to its URL, collect each response's ETag header, then call complete_multipart_upload. For ordinary files prefer upload_media. Use this when a file is too large for a single upload (e.g. a video over 100MB, up to 1GB) and must be sent in 10MB chunks.
Inputs: sizeBytes (required), contentType (required).
create_postCreate postAInspect
Create a new social media post. Can be saved as a draft or scheduled for a specific time. Supports platform-specific content overrides, media attachments, labels, and thread format. IMPORTANT: YouTube and TikTok REQUIRE video — do not include them when posting images only. Instagram defaults to feed_photo — set postTypeOverrides for video content (reel, feed_video). Use this when the user wants to draft or schedule one new post (do not publish immediately unless asked).
Inputs: channels (required), labels, status, content, +10 more.
create_rss_feedAdd RSS feedAInspect
Add an RSS autopost feed. The feed is polled every 15 minutes and new items become posts on the chosen channels. The server validates that feedUrl is a reachable public RSS 2.0 or Atom feed. An organization can have up to 20 feeds. Use this when the user wants new items from an RSS/Atom feed to become posts automatically.
Inputs: name (required), feedUrl (required), channelIds (required), mode, +2 more.
create_scheduleCreate recurring scheduleAInspect
Create a new recurring post schedule. Posts are automatically created and published on the chosen frequency. The schedule is visible in the web app (Repeat Posts page, with upcoming runs on the Calendar); a post record exists only once an occurrence fires, carrying recurringScheduleId. Use this when the user wants a recurring posting schedule.
Inputs: name (required), frequency (required), timeOfDay (required), channelIds (required), +7 more.
delete_channel_setDelete channel setADestructiveIdempotentInspect
Delete a channel set by ID. Does not affect the channels themselves. Use this when the user wants to remove a saved channel set.
Inputs: setId (required).
delete_labelDelete labelADestructiveIdempotentInspect
Delete a label by ID. Removes the label from all associated posts or media. Use this when the user wants to delete a label.
Inputs: labelId (required).
delete_mediaDelete mediaADestructiveIdempotentInspect
Delete a media file by ID. Removes the file from storage and detaches it from any posts. Use this when the user wants to delete a media file.
Inputs: mediaId (required).
delete_postDelete postADestructiveIdempotentInspect
Delete a post by ID. Only draft and failed posts can be deleted. Use this when the user wants to permanently remove a post.
Inputs: postId (required).
delete_rss_feedDelete RSS feedADestructiveIdempotentInspect
Delete an RSS autopost feed by ID. Stops polling; already-created posts are kept. Use this when the user wants to stop and remove an RSS autopost feed.
Inputs: feedId (required).
delete_scheduleDelete recurring scheduleADestructiveIdempotentInspect
Delete a recurring schedule by ID. Stops all future posts from this schedule. Use this when the user wants to stop and delete a recurring schedule.
Inputs: scheduleId (required).
finalize_media_uploadFinalize media uploadAInspect
Record an uploaded R2 object as a media file after the browser PUT (pairs with create_media_upload; used by the composer UI). Use this when a presigned direct upload finished and the file must be registered (advanced).
Inputs: r2Key (required), fileName (required), mimeType (required), sizeBytes (required), +3 more.
get_analyticsGet analyticsARead-onlyInspect
Get an analytics summary for a date range. Returns total posts, status breakdown (published, failed, scheduled), per-platform stats, and daily post counts. Use this when the user asks how their content performed overall, across channels and over a date range.
Inputs: to (required), from (required).
get_channel_healthGet channel healthARead-onlyInspect
Check the health status of a connected channel. Returns token validity, connection status, and any issues. Use this when the user asks whether a channel's connection/token is healthy.
Inputs: channelId (required).
get_channel_optionsGet channel post-type optionsARead-onlyInspect
Get platform-specific options for a channel (e.g. available post types, character limits, media requirements). Use this when you need a platform's valid post types before creating a post for it.
Inputs: channelId (required).
get_mediaGet media fileARead-onlyInspect
Get details of a single media file by ID. Returns metadata, URL, dimensions, and labels. Use this when the user references one specific media file by ID.
Inputs: mediaId (required).
get_postGet postARead-onlyInspect
Get a single post by ID with full details including platform statuses, labels, media files, recurring schedule info, and metrics. Use this when the user references one specific post by its ID.
Inputs: postId (required).
get_post_metricsGet post metricsARead-onlyInspect
Get engagement metrics for a published post. Returns likes, comments, shares, impressions, and other platform-specific metrics. IMPORTANT: every platform entry carries metricsSupported and supportedMetrics — a metric key NOT in supportedMetrics is stored as 0 because that platform's API has no such field, so report it as unavailable rather than as zero. X reports impressions/likes/comments/shares/saves (bookmarks); Bluesky and Mastodon report no impressions; Pinterest reports no reach; YouTube reports no shares or reach; Reddit reports likes (score), comments and shares (crossposts); Discord reports likes (reaction counts) and comments (thread replies); Google Business, Telegram, Tumblr and LinkedIn personal profiles report nothing readable at all. Each platform entry also carries linkClicks (summed in totals.linkClicks): clicks on bulkpubli.sh short links in this post, measured by BulkPublish rather than reported by the platform. It sits OUTSIDE latest and is distinct from the platform's own clicks — one visit can register in both, so never add them together. It is therefore available even for the platforms that report nothing, and supportedMetrics always includes it. Bot and link-preview traffic is excluded; it is 0 for organizations without Link Tracking enabled. Use this when the user asks how a specific post performed (likes, views, engagement).
Inputs: postId (required).
get_queue_slotGet next queue slotARead-onlyInspect
Get the organization's next available queue slot. Useful for finding the next optimal scheduling time. Use this when the user asks when the next available scheduling slot is.
Inputs: timezone.
get_quota_usageGet quota usageARead-onlyInspect
Check current account usage. Returns daily/monthly post counts, scheduled post counts, channel counts, and media storage usage. Also returns channelSlots — purchased extra channel slots ($2.99/month each, available on every plan; a seat-based subscription whose unused slots are auto-canceled before renewal): each active slot raises the effective total channel limit by one and allows one channel above the per-platform cap; per-slot autoRenews says whether it renews or lapses at expiresAt. Use this when the user asks about plan limits or current usage.
Inputs: no named parameters.
list_channelsList channelsARead-onlyInspect
List all connected social media channels (X/Twitter, Instagram, LinkedIn, Facebook, TikTok, etc.). Returns channel ID, platform, account name, and token status. Use this when the user wants to see which social accounts are connected.
Inputs: active.
list_channel_setsList channel setsARead-onlyInspect
List saved channel sets — named channel groupings for one-click multi-channel targeting. Returns id, name, and channelIds for each set, ordered by name. Use this when the user wants their saved channel groups (channel sets).
Inputs: no named parameters.
list_labelsList labelsARead-onlyInspect
List all labels available for tagging posts and media. Use this when the user wants their post labels/tags.
Inputs: type.
list_mediaList mediaARead-onlyInspect
List uploaded media files with optional search and pagination. Returns file metadata including URLs, dimensions, and labels. Use this when the user wants a list of their uploaded media files.
Inputs: page, type, limit, search.
list_platformsList platformsARead-onlyIdempotentInspect
List every social platform BulkPublish supports and whether it is currently available. Check this before telling a user they can connect a platform or scheduling a post to one: a platform in state 'off' rejects post creation with a 403 PLATFORM_DISABLED error and holds any already-scheduled posts until it is re-enabled, and one in state 'connect_off' cannot accept new connections although existing channels keep publishing. Disabled platforms are still listed, with enabled=false and a reason. A platform may also carry a 'variants' object keyed by channel accountType for sub-platforms gated on their own: LinkedIn reports variants.organization for company pages (a separate LinkedIn app with its own review), while the platform-level state covers personal profiles — so pages can be paused while personal-profile posting is live. A variant is never more permissive than its parent, and when a variant blocks a write the 403 PLATFORM_DISABLED error carries an accountType field naming it. Use this when the user asks which platforms are supported or available, or a connect/publish attempt failed with PLATFORM_DISABLED.
Inputs: no named parameters.
list_postsList postsARead-onlyInspect
List posts with optional filters for status, search text, date range, channel, and label. Returns paginated results with platform statuses and metrics, ordered newest-first by publishedAt if the post is live, else scheduledAt, else createdAt. Use this when the user wants to browse, filter, or check the status of existing posts as raw data (not the visual dashboard).
Inputs: to, from, page, limit, +7 more.
list_rss_feedsList RSS feedsARead-onlyInspect
List RSS autopost feeds — RSS/Atom feeds polled every 15 minutes whose new items automatically become posts. Returns name, feedUrl, channelIds, mode, fieldMapping (how items are rendered into posts; null = default), enabled, lastCheckedAt, and lastError for each feed. Use this when the user wants their RSS autopost feeds.
Inputs: no named parameters.
list_schedulesList recurring schedulesARead-onlyInspect
List all recurring post schedules. Returns schedule name, frequency/timeOfDay timing fields, target channels, active status, and nextRunAt. These schedules also appear in the web app: managed on the Repeat Posts page, with upcoming runs shown on the Calendar. Use this when the user wants their recurring posting schedules.
Inputs: no named parameters.
publish_postPublish post nowAInspect
Publish a draft or scheduled post immediately. The post will be queued for publishing to all its target channels. Requires a role with post:publish — contributors get 403 APPROVAL_REQUIRED and must submit the post for approval instead (create/update with requestApproval, then a teammate approves). Publishing a pending/rejected post as an approver implicitly approves it. Use this when the user wants to publish an existing draft or scheduled post right now.
Inputs: postId (required).
publish_storyPublish storyAInspect
Publish a post as a story on Facebook or Instagram. Use this when the user wants to post an Instagram/Facebook story.
Inputs: postId (required), platform (required).
reject_postReject pending postAInspect
Reject a post awaiting team approval. Requires a role with post:approve. The post returns to draft with approvalStatus 'rejected' and the optional reason; the author is notified and can edit + reschedule to resubmit for approval. Errors: 400 if the post is not awaiting approval, 403 if the role lacks post:approve, 404 if not found. Use this when the user (an owner/admin/approver) wants to reject a post awaiting team approval, optionally with a reason.
Inputs: postId (required), reason.
retry_postRetry failed postAInspect
Retry publishing a failed or partially failed post. Only retries the platforms that failed, not the ones that already succeeded. Platforms in status 'unconfirmed' (the publish request may have reached the platform but its response was lost — the post may already be live) are NOT retried unless republish is true; if the post has unconfirmed platforms and no failed ones, the call fails with a 400 and code UNCONFIRMED_REQUIRES_REPUBLISH — ask the user to check the account on the platform, and only pass republish: true after they confirm the post is not live. Use this when a post failed on some platforms and the user wants to retry just those.
Inputs: postId (required), republish.
search_mentionsSearch mentionsARead-onlyInspect
Search for @mention suggestions on a channel. Useful for finding users/pages to mention in posts. Use this when you need @mention suggestions from a connected channel while drafting a post.
Inputs: query (required), channelId (required).
update_channel_setUpdate channel setAIdempotentInspect
Update a channel set's name and/or channels (partial update — at least one field is required). A name that collides with another set fails with a 409, code DUPLICATE_NAME. Use this when the user wants to rename a channel set or change its channels.
Inputs: setId (required), name, channelIds.
update_labelUpdate labelAIdempotentInspect
Update an existing label's name or color. Use this when the user wants to rename or recolor a label.
Inputs: labelId (required), name, color.
update_postUpdate postAIdempotentInspect
Update an existing post. Can change content, schedule, media, labels, status, and platform-specific settings. Only draft, scheduled, failed, or partial posts can be edited; editing a failed/partial post resets it to draft. Set status to 'draft' or 'scheduled' to move the post between those states — use publish_post to publish immediately. Use this when the user wants to edit an existing post.
Inputs: postId (required), status, content, labelIds, +7 more.
update_rss_feedUpdate RSS feedAIdempotentInspect
Update an RSS autopost feed (partial update). Note: changing feedUrl re-baselines the feed — its check state resets and only items published after the change are posted, so the new feed's backlog is not flooded. Use this when the user wants to change, pause, or re-point an RSS autopost feed.
Inputs: feedId (required), mode, name, enabled, +4 more.
update_scheduleUpdate recurring scheduleAIdempotentInspect
Update an existing recurring schedule. Can change name, content template, frequency/timing, timezone, media, or active status. The next run time is recomputed by the server when timing changes. Use this when the user wants to change a recurring schedule.
Inputs: scheduleId (required), name, isActive, timezone, +7 more.
upload_mediaUpload mediaAInspect
Upload a media file (image or video) from a URL or local file path. The file is stored in BulkPublish for use in posts. Supported formats: JPEG, PNG, WebP, GIF, MP4, MOV, WebM. Max 100MB. Provide either url OR filePath, not both. Use this when the user provides an image/video to attach to a post.
Inputs: url, filePath, filename.
view_analyticsAnalytics dashboardARead-onlyInspect
Open an interactive analytics dashboard for a date range — totals, status breakdown, per-platform stats, and daily post counts. Use this when the user wants an interactive analytics dashboard — prefer over get_analytics for a visual view.
Inputs: to, from. Returns: to, from, summary
view_channelsChannelsARead-onlyInspect
Open an interactive view of connected social channels with platform, account, and connection/token status. Use this when the user wants an interactive view of their connected channels.
Inputs: no named parameters. Returns: channels
view_mediaMedia libraryARead-onlyInspect
Open an interactive gallery of uploaded media files with thumbnails and metadata. Use this when the user wants to browse their media library visually.
Inputs: limit. Returns: media
view_postsPostsARead-onlyInspect
Open an interactive list of posts with their status, schedule, and channels. Optionally filter by status. Use this when the user wants to see their posts as an interactive dashboard — prefer over list_posts for a visual view.
Inputs: limit, status. Returns: posts, total
view_quotaAccount usageARead-onlyInspect
Open an interactive view of current account usage — daily/monthly post counts, channel counts, and media storage. Use this when the user wants a visual view of their plan usage.
Inputs: no named parameters. Returns: usage
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 51 tools
Most tools have distinct purposes, but there are some potentially confusing overlaps: multiple ways to create posts (create_post vs compose_post vs create_schedule) and multiple upload methods (upload_media, create_media_upload, create_multipart_upload). However, the descriptions clearly differentiate these scenarios, so misinterpretation is unlikely.
All tools follow a consistent verb_noun snake_case pattern (e.g., list_channels, create_label, delete_post). There are no naming style deviations or ambiguous verbs, making the toolset predictable and easy to navigate.
With 51 tools, this is an extreme count for an MCP server. Although the domain is broad (social media management), many tools are highly specialized (e.g., multipart upload steps, interactive view tools, quota details) and could be consolidated or exposed via additional parameters. The sheer volume risks overwhelming agents and increasing misselection.
The toolset covers the core lifecycle for posts (create, read, update, delete, publish, approve, reject, retry, bulk), schedules, RSS feeds, media, labels, channels, and analytics. Minor gaps exist, such as no explicit channel connection management (only list/health/options) and no update operation for media, but these are typically handled in the web app and do not cripple the agent's workflow.
Maintenance
Related MCP Connectors
Publish and schedule social media posts and read analytics across 12 networks through one API.
Social media APIs for scheduling, analytics, and DM automation.
Publish, schedule, and manage social media posts across major platforms via the Postproxy API.
Schedule and publish social posts with OAuth, drafts, media, workspaces, and brand memory.
Related MCP Servers
AlicenseAqualityCmaintenanceSocialCrawl provides the "best" quality public web data on the internet. Access 65+ real-time social media, e-commerce and public web data from a single API with a single schema.5583 npm28MIT- FlicenseNot gradedqualityDmaintenanceEnables AI agents to create, schedule, and manage social media posts across 10 platforms via a unified API.-

Upload-Postofficial
AlicenseBqualityBmaintenanceUpload-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, Facebook82218 npm21MIT- AlicenseNot gradedqualityCmaintenanceEnables posting to multiple social media platforms (X, LinkedIn, Facebook, Instagram, etc.) via a unified API, handling OAuth, media, and scheduling for each network.AGPL 3.0