post2all
Schedule one post and publish it to 13 social networks at once - X, LinkedIn, Instagram, TikTok, YouTube and more. Includes a content calendar, per-account captions, analytics, and an MCP server for AI agents.
Documentation
Get Started
Connect post2all to AI agents via the Model Context Protocol (MCP). This page covers connecting from coding tools like Cursor, Claude Code, and Codex.
Prerequisites
- Sign in to your post2all workspace in the browser.
- Make sure you have an active workspace selected before authorizing MCP access.
- Use the MCP server URL:
https://mcp.post2all.com/mcp
The MCP endpoint uses OAuth 2.1. Add the server URL in your client, then complete the browser-based sign-in and consent flow when the client prompts you. Long-lived sessions depend on the client requesting refresh-token-capable OAuth scopes such as offline_access.
Cursor
Create or update .cursor/mcp.json in your project, or ~/.cursor/mcp.json for a global setup:
{
"mcpServers": {
"post2all": {
"url": "https://mcp.post2all.com/mcp"
}
}
}
After adding the server, restart Cursor if needed and follow the OAuth prompt to sign in to post2all.
Claude Code
Add post2all as a remote HTTP MCP server:
claude mcp add --transport http post2all https://mcp.post2all.com/mcp
You can verify it from Claude Code with:
claude mcp list
Alternatively, add the JSON config to .mcp.json for a project-level setup:
{
"mcpServers": {
"post2all": {
"type": "http",
"url": "https://mcp.post2all.com/mcp"
}
}
}
When Claude Code first connects, complete the OAuth sign-in flow in the browser window it opens.
Codex CLI
Add the server to ~/.codex/config.toml:
[mcp_servers.post2all]
url = "https://mcp.post2all.com/mcp"
When Codex connects to the server, approve the OAuth flow and sign in to post2all in the browser.
OpenCode
Add the server to your opencode.json or opencode.jsonc config:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"post2all": {
"type": "remote",
"url": "https://mcp.post2all.com/mcp",
"enabled": true
}
}
}
When OpenCode prompts for authorization, continue in the browser and grant MCP access to your active workspace.
Testing the connection
Restart your coding tool after changing MCP config, then ask the agent something like:
What post2all tools are available?
or:
List my connected post2all social accounts.
Prefer the CLI for media workflows. The MCP protocol does not support file uploads (a known protocol limitation). For image and video posts with tools like Claude Code, Cursor, or Codex, use the post2all CLI instead:
npx @post2all/cli media upload ./photo.jpg --json npx @post2all/cli post create \ --media '[{"id":"<media-id>"}]' \ --targets '[{"platform":"instagram","accountId":"<account-id>","settings":{}}]' \ --delivery nowThe CLI and MCP server both upload media directly to storage, then create posts using validated media IDs.
If the server fails to connect, check that the URL is exactly https://mcp.post2all.com/mcp, that your browser completed the sign-in flow, and that you had an active workspace selected when granting access.
Analytics tools
The MCP server exposes three read-only analytics tools in addition to the publishing workflow:
analytics_account— account-level normalized metrics, time series, metric definitions, and previous-period comparisons. Defaults to the latest 30 inclusive UTC days; maximum 90 days.analytics_account_posts— provider-wide post performance with pagination and metric sorting. Supported platforms can return posts published outside post2all; useoriginto distinguish matched post2all posts from external provider posts.analytics_post— per-target analytics for one post2all post. One failed or unavailable provider does not hide successful analytics from other targets.
Use refresh: true only when the user explicitly wants the freshest provider data. Otherwise allow post2all's analytics cache to protect provider rate limits and improve response time.
Never infer a zero from an empty metric list. Check the returned status or analyticsStatus first, especially for no_data, reconnect_required, coming_soon, unavailable, and provider_error.
Dynamic options and lookups
publishing_schema returns discoveries (Pinterest boards, Discord and Slack destinations, TikTok creator restrictions) and, when present, lookups for each account. Call publishing_options once, only for accounts that return either. Instagram accounts connected through Facebook Login list "lookups": ["reelAudio"], and their reelAudioId field carries "lookup": "reelAudio"; pass reelAudioSearch to search Instagram's audio catalog:
{
"accountIds": ["acc_instagram_123"],
"reelAudioSearch": { "query": "lofi", "audioType": "music" }
}
Omit query for trending audio and use audioType: "original_sound" for creators' sounds. Each returned reelAudio track has id, title, artist, imageUrl, durationMs, and a temporary previewUrl. Put the chosen id in settings.reelAudioId on a target with exactly one video, optionally with reelAudioVolume and reelVideoVolume (1–100, default 100). Accounts without the lookup omit reelAudio, and post_validate rejects reelAudioId for them with a reconnect message. Instagram collaborators (up to 3 usernames without @) and Facebook video title are fixed fields in the schema and need no lookup. See Instagram collaborators and Reel audio.
Stories
Instagram and Facebook accounts return capability.story from publishing_schema. Set settings.placement to "story" to publish one image or video as a 24-hour Story: validate the media against capability.story.media instead of capability.media, omit every setting in capability.story.unsupportedFields (including caption, firstComment, and the Instagram Reel options), and tell the user that a Story never shows the post text. Run post_validate before post_create as usual.
First comments
X, Instagram, Facebook Pages, Threads, Bluesky, and Wircle targets accept an optional firstComment that the same account posts after that target publishes, plus firstCommentDelaySeconds (integer, 0–86400, counted from the moment that target is published). A non-zero delay without a comment is rejected. Comment limits are X 280, Instagram 2,200, Facebook 2,000, Threads 500, Bluesky 300, and Wircle 2,000 characters; the schema's capability.fields.firstComment.maxLength is authoritative. Instagram Story accounts and YouTube do not support first comments.
Agents follow the usual publishing workflow and check eligibility before adding the fields:
accounts_listto find the selected account IDs.publishing_schemaonce with every selected account ID. Each account returnsfirstComment: { available, reason }. Whenavailableisfalse(for example"Reconnect with comment permissions"on accounts connected before first comments launched), tell the user the reason and leave both fields out for that account.post_validatewith the constructed targets.- After the user confirms,
post_create.
publishing_schema arguments:
{ "accountIds": ["acc_x_123", "acc_threads_123"] }
post_validate arguments, then the same arguments for post_create:
{
"content": "post2all v3 is live.",
"targets": [
{
"platform": "twitter",
"accountId": "acc_x_123",
"settings": {
"firstComment": "Release notes: https://example.com/release-notes",
"firstCommentDelaySeconds": 60
}
},
{
"platform": "threads",
"accountId": "acc_threads_123",
"settings": { "firstComment": "What should we build next?" }
}
],
"delivery": { "mode": "now" }
}
post_get returns each target's firstComment delivery (status, dueAt, sentAt, platformCommentId, error), separate from the target's publish status. The MCP server does not expose first-comment retry or cancel tools: use the dashboard, the REST endpoints, the SDK, or the CLI. On X, each first comment is one additional X API create billed like a post, including the URL rate when the comment contains a link; mention this when you preview an X post with a first comment.