Complete reference for all 18 active PostPost MCP tools with parameters, examples, and code snippets. Three additional tools (linkedin_posts, linkedin_post_comments, linkedin_post_reactions) are temporarily disabled pending LinkedIn approval of the r_member_social permission — see LinkedIn Feed Retrieval Tools below.
Note: Most tools return the full { success, ... } backend API response as shown in the examples below. A few tools — list_connections, list_workspace_users, and create_workspace_user — return a different response shape (e.g., an array or object without the success wrapper) because the underlying API endpoints use a different response format. The MCP server does not do any post-processing on responses. The response examples below reflect the actual format returned by each tool.
Create and schedule a post to one or more platforms.
Parameters:
Parameter
Type
Required
Description
content
string
Yes
Post text content
platforms
string[]
Yes
Array of platform connection IDs (from list_connections)
scheduledTime
string
Yes
When to publish (ISO 8601): 2026-03-01T14:00:00Z
MCP vs REST difference:scheduledTime is required in the MCP schema to ensure AI agents always specify a publish time. In the REST API, this field is optional — omitting it creates a draft post instead.
MCP limitation:platformSettings is NOT available via MCP. To configure platform-specific settings (TikTok privacy level, YouTube title, Instagram videoType, Threads replyControl), use the REST API directly.
platformSettings schema reference — only these 4 platforms support settings; settings for other platforms are silently ignored:
"Schedule 'Hello world!' to LinkedIn for tomorrow at 9am""Post 'We're hiring!' to Twitter and LinkedIn right now""Schedule this announcement to all my accounts for Monday"
Python example:
import asynciofrom datetime import datetime, timedeltafrom mcp import ClientSessionfrom mcp.client.streamable_http import streamablehttp_clientasync def schedule_post(): headers = {"Authorization": "Bearer sk_YOUR_API_KEY"} async with streamablehttp_client("https://mcp.postpost.dev", headers=headers) as (read, write, _): async with ClientSession(read, write) as session: await session.initialize() # First get connections to find platform IDs connections = await session.call_tool("list_connections", {}) # Schedule a post for tomorrow at 9am UTC tomorrow_9am = (datetime.utcnow() + timedelta(days=1)).replace( hour=9, minute=0, second=0, microsecond=0 ).isoformat() + "Z" result = await session.call_tool("create_post", { "content": "Excited to share our latest product update!", "platforms": ["linkedin-abc123"], "scheduledTime": tomorrow_9am }) print(result.content[0].text)asyncio.run(schedule_post())
You can @mention people and companies in LinkedIn posts using this syntax in your content:
@{urn:li:person:12345678|John Doe} # Mention a person@{urn:li:organization:12345678|Acme Corp Inc} # Mention a company
Example:
"Great insights from @{urn:li:person:12345678|John Doe} at @{urn:li:organization:12345678|Acme Corp}!"
Important: The display name must exactly match the LinkedIn profile name (case-sensitive), including company suffixes like "Inc", "LLC", etc.
Platform limits:
Platform
Characters
Images
Video
Special Features
LinkedIn
3,000
10
500MB
Documents, @mentions
X/Twitter
280 (25K premium)
4
120s
Auto-threading
Instagram
2,200
10
3 min (180s) Reels, 60s carousel
Reels & Stories supported
Threads
500 (10,000 with text attachment)
10
5min
Auto-threading
TikTok
2,200
N/A
10min
Video-only platform
YouTube
5,000 desc
N/A
12h
Shorts support
Facebook
63,206
10
45min
Page posts, Reels
Bluesky
300
4
3 min / 100 MB
Auto-facet detection
Mastodon
500*
4
~99 MB
Instance-variable
Telegram
4,096 (1,024 captions)
Unlimited
2GB
Markdown/HTML support
*Varies by instance
Note: LinkedIn's "10 images" is the multi-image upload limit, not a carousel. Organic carousels on LinkedIn are not supported via the API (carousels are only available for sponsored/ad content). To share multi-page content organically, use LinkedIn document (PDF) posts instead.
Note: Multi-threaded nested posts on Threads are temporarily unavailable. Single posts and carousel posts to Threads continue to work normally.
Note: The get_post response returns per-platform post fields (platform, platformId, content, status, postedId, error) — not scheduledTime. The scheduledTime is a post-group-level field available via list_posts.
Note: At least one of status or scheduledTime must be provided, otherwise the backend returns a 400 error.
Example prompts:
"Reschedule post 67a1b2c3d4e5f6a7b8c9d0e1 to Friday at 3pm""Change my draft to scheduled""Move tomorrow's post to next week""Update the post to publish at 10am instead"
Python example:
async def reschedule_post(): headers = {"Authorization": "Bearer sk_YOUR_API_KEY"} async with streamablehttp_client("https://mcp.postpost.dev", headers=headers) as (read, write, _): async with ClientSession(read, write) as session: await session.initialize() result = await session.call_tool("update_post", { "postGroupId": "67a1b2c3d4e5f6a7b8c9d0e1", "scheduledTime": "2026-03-01T15:00:00Z" }) print(result.content[0].text)
Note: The scheduledTime field in the response is only included when the post has a scheduled time set. Draft posts without a scheduled time will omit this field.
Note: Only posts with status draft or scheduled can be updated. Attempting to update a post in any other status (e.g., published, failed, partially_published) returns a 400 error: "Cannot update post: post is currently in {status} status".
Get engagement metrics for a specific LinkedIn post.
Parameters:
Parameter
Type
Required
Description
postedId
string
Yes
LinkedIn post URN (e.g., urn:li:share:123456)
platformId
string
Yes
Platform connection ID
queryTypes
string[]
No
Metrics to fetch: IMPRESSION, REACTION, COMMENT, SHARE (the backend may accept additional types)
Example prompts:
"How did my last LinkedIn post perform?""Get impressions for my LinkedIn post""Show engagement on my recent LinkedIn update""What's the reach of my LinkedIn announcement?"
Python example:
async def get_linkedin_post_stats(): headers = {"Authorization": "Bearer sk_YOUR_API_KEY"} async with streamablehttp_client("https://mcp.postpost.dev", headers=headers) as (read, write, _): async with ClientSession(read, write) as session: await session.initialize() result = await session.call_tool("linkedin_post_stats", { "postedId": "urn:li:share:7123456789", "platformId": "linkedin-abc123", "queryTypes": ["IMPRESSION", "REACTION", "COMMENT", "SHARE"] }) print(result.content[0].text)
"How many LinkedIn followers do I have?""Show my follower growth this month""What's my LinkedIn follower count?""Track my follower growth over the last 30 days"
Status: DISABLED - These tools are not yet available. They require the r_member_social permission, which is RESTRICTED and requires LinkedIn approval. The implementation is ready and will be enabled once LinkedIn approves the permission for PostPost.
LinkedIn post URN (e.g., urn:li:share:123456 or urn:li:ugcPost:123456)
platformId
string
Yes
Platform connection ID
start
number
No
Starting index for pagination (default: 0)
count
number
No
Number of comments to retrieve (default: 20, max: 100)
Example prompts:
"Show comments on my last LinkedIn post""Get all comments on this LinkedIn post""What are people saying about my post?""List comments on post urn:li:share:123456"
Python example:
async def get_post_comments(): headers = {"Authorization": "Bearer sk_YOUR_API_KEY"} async with streamablehttp_client("https://mcp.postpost.dev", headers=headers) as (read, write, _): async with ClientSession(read, write) as session: await session.initialize() result = await session.call_tool("linkedin_post_comments", { "postedId": "urn:li:ugcPost:7429953213384187904", "platformId": "linkedin-abc123", "count": 50 }) print(result.content[0].text)