Skip to main content
Glama

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 bulkpublish

Node.js

npm install bulkpublish

Homebrew (macOS/Linux)

brew tap azeemkafridi/bulkpublish && brew install bulkpublish

Or 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:

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 a 0 is never mistaken for a measurement — see Metrics by Platform

  • Link tracking — Opt in per organization, or per post via linkTrackingOverride, to rewrite links through bulkpubli.sh and count the clicks. Reported as linkClicks / totalLinkClicks and measured by BulkPublish rather than the platform, so it works even where the platform reports nothing — see Character Limits

  • Labels — 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 postTypeOverrides

  • Per-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.com

Authentication

Authorization: Bearer bp_your_key_here

Core Endpoints

Method

Endpoint

Description

POST

/api/posts

Create a post (draft, scheduled, or immediate)

GET

/api/posts

List posts (paginated, filterable by status/date/channel/label)

GET

/api/posts/:id

Get a post with platform statuses and metrics

PUT

/api/posts/:id

Update a draft or scheduled post

DELETE

/api/posts/:id

Delete a post

POST

/api/posts/:id/publish

Publish a draft immediately

POST

/api/posts/:id/retry

Retry failed platforms

POST

/api/posts/:id/approve

Approve a post awaiting team approval (roles with post:approve)

POST

/api/posts/:id/reject

Reject a pending post back to draft, with an optional reason

POST

/api/posts/bulk

Bulk delete, retry or reschedule (up to 100 posts per request)

GET

/api/channels

List connected social media channels

GET

/api/channels/:id/health

Check channel token health

GET

/api/channels/:id/options

Get platform options (Pinterest boards, YouTube playlists, Tumblr blogs, Discord channels, Threads ?q= place search)

GET

/api/channels/:id/mentions

Search accounts for @mention (X, Bluesky, Mastodon, LinkedIn Pages — LinkedIn results are @[Name](urn:li:organization:ID) tokens plus the vanityName slug they matched on)

GET/POST

/api/templates

Saved post templates (get/update/delete via /api/templates/:id)

GET/POST

/api/calendar-notes

Notes pinned to calendar days, ?from&to range (update/delete via /api/calendar-notes/:id)

POST/DELETE

/api/posts/:id/share

Create or revoke the post's read-only review link (/p/<token>)

GET/POST

/api/hashtag-groups

Saved hashtag groups, 1-30 hashtags each (get/update/delete via /api/hashtag-groups/:id)

GET/POST

/api/channel-sets

Saved channel groups for one-click targeting (update/delete via /api/channel-sets/:id)

GET/POST

/api/rss-feeds

RSS/Atom autopost feeds — new items become posts (update/delete via /api/rss-feeds/:id)

POST

/api/media

Upload a media file (multipart form, up to 100MB)

POST

/api/media/multipart/create

Start a chunked upload for large media (videos up to 1GB, 10MB parts)

POST

/api/media/multipart/complete

Assemble uploaded parts and record the media file

GET

/api/media

List uploaded media

GET

/api/analytics/summary

Analytics summary for a date range

GET

/api/analytics/engagement

Engagement totals, per-day / per-platform / per-channel breakdowns, ranked and full post lists — filterable by channels, platforms, labels, format and media type; compare=1 adds the previous period

GET

/api/analytics/post-history

Every stored metrics snapshot for one post, per platform (trend since publish)

GET

/api/analytics/links

Tracked bulkpubli.sh links with click counts

POST

/api/schedules

Create a recurring schedule

GET

/api/quotas/usage

Check current plan limits and usage

GET

/api/inbox/conversations

Inbox: direct messages, reviews and comment threads, with filters and cursor paging (Pro and Business)

GET/POST

/api/inbox/conversations/:id/messages

Read a conversation, or send a reply to the person on the platform

PATCH

/api/inbox/conversations/:id

Mark read, archive, snooze or assign a conversation

GET

/api/posts/:id/engagement

Comments and reactions on a published post, per channel

POST

/api/posts/:id/comments/reply

Reply to a comment on a published post

POST

/api/posts/:id/comments/moderate

Like, unlike, hide, unhide or delete a comment

See the OpenAPI spec for the complete endpoint list.

Supported Platforms

Platform

Post Types

Media

Facebook

Post, Story

Images, Videos

Instagram

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

Pinterest

Pin

Images, Videos

Google Business Profile

Post, Event, Offer

Images

LinkedIn

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 bulkpublish

Supports sync and async. Rich docstrings on every method for IDE and LLM consumption.

Node.js / TypeScript

npm install bulkpublish

Full TypeScript types, zero dependencies, native fetch (Node 18+).

Homebrew (macOS/Linux)

brew tap azeemkafridi/bulkpublish && brew install bulkpublish

Installs 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

Integrations

Platform

Package

Install

Zapier

BulkPublish on Zapier

Search "BulkPublish" in Zapier

n8n

n8n-nodes-bulkpublish

Settings > Community Nodes > n8n-nodes-bulkpublish

Homebrew

homebrew-bulkpublish

brew tap azeemkafridi/bulkpublish && brew install bulkpublish

License

MIT

Available Tools

51 tools
abort_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 actionsA
Destructive
Inspect

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 setA
DestructiveIdempotent
Inspect

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 labelA
DestructiveIdempotent
Inspect

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 mediaA
DestructiveIdempotent
Inspect

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 postA
DestructiveIdempotent
Inspect

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 feedA
DestructiveIdempotent
Inspect

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 scheduleA
DestructiveIdempotent
Inspect

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 analyticsA
Read-only
Inspect

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 healthA
Read-only
Inspect

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 optionsA
Read-only
Inspect

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 fileA
Read-only
Inspect

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 postA
Read-only
Inspect

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 metricsA
Read-only
Inspect

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 slotA
Read-only
Inspect

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 usageA
Read-only
Inspect

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 channelsA
Read-only
Inspect

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 setsA
Read-only
Inspect

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 labelsA
Read-only
Inspect

List all labels available for tagging posts and media. Use this when the user wants their post labels/tags.

Inputs: type.

list_mediaList mediaA
Read-only
Inspect

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 platformsA
Read-onlyIdempotent
Inspect

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 postsA
Read-only
Inspect

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 feedsA
Read-only
Inspect

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 schedulesA
Read-only
Inspect

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 mentionsA
Read-only
Inspect

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 setA
Idempotent
Inspect

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 labelA
Idempotent
Inspect

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 postA
Idempotent
Inspect

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 feedA
Idempotent
Inspect

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 scheduleA
Idempotent
Inspect

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 dashboardA
Read-only
Inspect

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_channelsChannelsA
Read-only
Inspect

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 libraryA
Read-only
Inspect

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_postsPostsA
Read-only
Inspect

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 usageA
Read-only
Inspect

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

    A3.8/5.0

    Scored across 51 tools

    Disambiguation4/5

    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.

    Naming Consistency5/5

    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.

    Tool Count1/5

    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.

    Completeness4/5

    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

    ActivityActive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      SocialCrawl 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.
      5
      583 npm
      28
      MIT
    • A
      license
      B
      quality
      B
      maintenance
      Upload-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, Facebook
      82
      218 npm
      21
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables 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