Skip to content

MCP Server

The Postproxy MCP Server provides tools for publishing posts, checking statuses, managing social media profiles, and retrieving post statistics through Claude Code. This server implements the Model Context Protocol (MCP) to enable seamless integration between Postproxy and Claude Code.


Install the MCP server globally using npm:

Terminal window
npm install -g postproxy-mcp

Install the MCP server locally in your project:

Terminal window
npm install postproxy-mcp

Claude Code stores MCP server configuration under ~/.claude/plugins/. After installing postproxy-mcp, Claude will automatically detect the server on restart.


After installing postproxy-mcp, register it with Claude Code using the claude mcp add command:

Terminal window
claude mcp add --transport stdio postproxy-mcp --env POSTPROXY_API_KEY=your-api-key --env POSTPROXY_BASE_URL=https://api.postproxy.dev/api -- postproxy-mcp

Replace your-api-key with your actual Postproxy API key.

The configuration will be automatically saved to ~/.claude/plugins/. After running this command:

  1. Restart your Claude Code session
  2. Test the connection by asking Claude: “Check my Postproxy authentication status”
  3. If tools are available, Claude will be able to use them automatically

For non-technical users, you can use the interactive setup command:

Terminal window
postproxy-mcp setup

This will guide you through the setup process step by step and register the server using claude mcp add automatically.


The MCP server provides the following tools for interacting with Postproxy:

ToolDescription
auth.statusCheck authentication status and API configuration
profiles.listList all available social media profiles
profiles.placementsList available placements for a profile (Facebook pages, LinkedIn orgs, Pinterest boards)
post.publishPublish a post to specified profiles
post.statusGet status of a published post by job ID
post.publish_draftPublish a draft post
post.deleteDelete a post by job ID
post.statsGet stats snapshots for one or more posts
history.listList recent post jobs

Check authentication status, API configuration, and workspace information.

NameTypeRequiredDescription
None--This tool requires no parameters
{
"authenticated": true,
"base_url": "https://api.postproxy.dev/api",
"profile_groups_count": 2
}
FieldTypeDescription
authenticatedbooleanWhether the API key is valid and authenticated
base_urlstringBase URL of the Postproxy API
profile_groups_countintegerNumber of profile groups in the account

List all available social media profiles (targets) for posting.

NameTypeRequiredDescription
None--This tool requires no parameters
{
"targets": [
{
"id": "profile-123",
"name": "My Twitter Account",
"platform": "twitter",
"profile_group_id": 1
}
]
}
FieldTypeDescription
targetsarrayArray of available profile objects
targets[].idstringUnique profile identifier
targets[].namestringDisplay name of the connected account
targets[].platformstringPlatform identifier (twitter, facebook, instagram, etc.)
targets[].profile_group_idintegerID of the profile group this profile belongs to

List available placements for a profile. For Facebook profiles, placements are business pages. For LinkedIn profiles, placements include the personal profile and organizations. For Pinterest profiles, placements are boards. Available for facebook, linkedin, and pinterest profiles.

NameTypeRequiredDescription
profile_idstringYesProfile ID
{
"placements": [
{
"id": null,
"name": "Personal Profile"
},
{
"id": "108520199",
"name": "Acme Marketing"
}
]
}
FieldTypeDescription
placementsarrayArray of placement objects
placements[].idstring|nullPlacement identifier (null for personal profiles)
placements[].namestringDisplay name of the placement

Publish a post to specified social media profiles.

NameTypeRequiredDefaultDescription
contentstringYes-Post content text
profilesstring[]Yes-Array of profile IDs or platform names (e.g., "linkedin", "instagram", "twitter"). When using platform names, posts to the first connected profile for that platform.
schedulestringNo-ISO 8601 scheduled time
mediastring[]No-Array of media URLs or local file paths
idempotency_keystringNo-Idempotency key for deduplication
require_confirmationbooleanNofalseIf true, return summary without publishing
draftbooleanNofalseIf true, creates a draft post that won’t publish automatically
platformsobjectNo-Platform-specific parameters. Key is platform name (e.g., “instagram”, “youtube”, “tiktok”), value is object with platform-specific options. See Platform Parameters Reference for full documentation.
{
"instagram": {
"format": "reel",
"collaborators": ["username1", "username2"],
"first_comment": "Link in bio!"
},
"youtube": {
"title": "My Video Title",
"privacy_status": "public"
},
"tiktok": {
"privacy_status": "PUBLIC_TO_EVERYONE",
"auto_add_music": true
}
}
{
"job_id": "job-123",
"accepted_at": "2024-01-01T12:00:00Z",
"status": "pending",
"draft": true
}
FieldTypeDescription
job_idstringUnique job identifier for tracking the post
accepted_atstringISO 8601 timestamp when the post was accepted
statusstringInitial status of the post: pending, processing, complete
draftbooleanWhether the post was created as a draft
warningstring|nullWarning message if the API may have ignored the draft parameter

Get status of a published post by job ID.

NameTypeRequiredDescription
job_idstringYesJob ID from post.publish response
{
"job_id": "job-123",
"overall_status": "complete",
"draft": false,
"status": "processed",
"platforms": [
{
"platform": "twitter",
"status": "published",
"url": "https://twitter.com/status/123",
"post_id": "123",
"error": null,
"attempted_at": "2024-01-01T12:00:00Z"
}
]
}
FieldTypeDescription
job_idstringJob identifier
overall_statusstringOverall status: draft, pending, processing, complete, failed
draftbooleanWhether the post is a draft
statusstringJob status: pending, processed, failed
platformsarrayArray of platform-specific posting results
platforms[].platformstringPlatform identifier
platforms[].statusstringPlatform posting status: pending, processing, published, failed, deleted
platforms[].urlstring|nullURL of the published post (if available)
platforms[].post_idstring|nullPlatform-specific post ID (if available)
platforms[].errorstring|nullError message if publishing failed (null if successful)
platforms[].attempted_atstringISO 8601 timestamp when posting was attempted

Delete a post by job ID.

NameTypeRequiredDescription
job_idstringYesJob ID to delete
{
"job_id": "job-123",
"deleted": true
}
FieldTypeDescription
job_idstringJob identifier that was deleted
deletedbooleanWhether the deletion was successful

Publish a draft post. Only posts with draft: true status can be published using this endpoint.

NameTypeRequiredDescription
job_idstringYesJob ID of the draft post to publish
{
"job_id": "job-123",
"status": "processed",
"draft": false,
"scheduled_at": null,
"created_at": "2024-01-01T12:00:00Z",
"message": "Draft post published successfully"
}
FieldTypeDescription
job_idstringJob identifier
statusstringJob status after publishing
draftbooleanWill be false after publishing
scheduled_atstring|nullISO 8601 timestamp if scheduled
created_atstringISO 8601 timestamp when the job was created
messagestringSuccess message

Get stats snapshots for one or more posts. Returns all matching snapshots so you can see trends over time. Supports filtering by profiles/networks and timespan.

NameTypeRequiredDefaultDescription
post_idsstring[]Yes-Array of post IDs (max 50)
profilesstringNo-Comma-separated list of profile IDs or network names (e.g. instagram,twitter or abc123,def456 or mixed)
fromstringNo-ISO 8601 timestamp — only include snapshots recorded at or after this time
tostringNo-ISO 8601 timestamp — only include snapshots recorded at or before this time
{
"data": {
"abc123": {
"platforms": [
{
"profile_id": "prof_abc",
"platform": "instagram",
"records": [
{
"stats": {
"impressions": 1200,
"likes": 85,
"comments": 12,
"saved": 8
},
"recorded_at": "2026-02-20T12:00:00Z"
}
]
}
]
}
}
}
FieldTypeDescription
dataobjectObject keyed by post ID
data[].platformsarrayArray of platform-specific stats
data[].platforms[].profile_idstringProfile identifier
data[].platforms[].platformstringPlatform name
data[].platforms[].recordsarrayArray of stat snapshots over time
data[].platforms[].records[].statsobjectStats object (fields vary by platform)
data[].platforms[].records[].recorded_atstringISO 8601 timestamp when stats were recorded
PlatformAvailable Fields
Instagramimpressions, likes, comments, saved, profile_visits, follows
Facebookimpressions, clicks, likes
Threadsimpressions, likes, replies, reposts, quotes, shares
Twitterimpressions, likes, retweets, comments, quotes, saved
YouTubeimpressions, likes, comments, saved
LinkedInimpressions
TikTokimpressions, likes, comments, shares
Pinterestimpressions, likes, comments, saved, outbound_clicks

List recent post jobs.

NameTypeRequiredDefaultDescription
limitnumberNo10Maximum number of jobs to return
{
"jobs": [
{
"job_id": "job-123",
"content_preview": "Post content preview...",
"created_at": "2024-01-01T12:00:00Z",
"overall_status": "complete",
"draft": false,
"platforms_count": 2
}
]
}
FieldTypeDescription
jobsarrayArray of job objects
jobs[].job_idstringUnique job identifier
jobs[].content_previewstringPreview of the post content
jobs[].created_atstringISO 8601 timestamp when the job was created
jobs[].overall_statusstringOverall status of the job
jobs[].draftbooleanWhether the post is a draft
jobs[].platforms_countintegerNumber of platforms the post was published to

The platforms parameter in post.publish allows you to specify platform-specific options for each social media platform. This enables advanced features like Instagram Reels, YouTube video titles, TikTok privacy settings, and more.

ParameterTypeDescription
formatstringPost format: "post", "reel", or "story"
collaboratorsstring[]Array of usernames (max 10 for posts, 3 for reels)
first_commentstringComment to add after posting
cover_urlstringThumbnail URL for reels
audio_namestringAudio track name for reels
trial_strategystringTrial strategy for reels: "MANUAL" or "SS_PERFORMANCE"
thumb_offsetstringThumbnail offset in milliseconds for reels
{
"content": "Amazing content!",
"profiles": ["instagram"],
"media": ["https://example.com/image.jpg"],
"platforms": {
"instagram": {
"format": "post",
"collaborators": ["username1", "username2"],
"first_comment": "What do you think? 🔥"
}
}
}
{
"content": "Check out this reel! #viral",
"profiles": ["instagram"],
"media": ["https://example.com/video.mp4"],
"platforms": {
"instagram": {
"format": "reel",
"collaborators": ["collaborator_username"],
"cover_url": "https://example.com/thumbnail.jpg",
"audio_name": "Trending Audio",
"first_comment": "Link in bio!"
}
}
}
ParameterTypeDescription
titlestringVideo title
privacy_statusstringPrivacy setting: "public", "unlisted", or "private"
cover_urlstringCustom thumbnail URL
made_for_kidsbooleanMark content as made for kids
{
"content": "This is the video description with links and details",
"profiles": ["youtube"],
"media": ["https://example.com/video.mp4"],
"platforms": {
"youtube": {
"title": "My Tutorial: How to Build an API",
"privacy_status": "public",
"cover_url": "https://example.com/custom-thumbnail.jpg"
}
}
}
ParameterTypeDescription
privacy_statusstringPrivacy setting: "PUBLIC_TO_EVERYONE", "MUTUAL_FOLLOW_FRIENDS", "FOLLOWER_OF_CREATOR", or "SELF_ONLY"
photo_cover_indexintegerIndex of photo to use as cover (0-based)
auto_add_musicbooleanEnable automatic music
made_with_aibooleanMark content as AI-generated
disable_commentbooleanDisable comments
disable_duetbooleanDisable duets
disable_stitchbooleanDisable stitches
brand_content_togglebooleanMark as paid partnership (third-party)
brand_organic_togglebooleanMark as paid partnership (own brand)
{
"content": "Check this out! #fyp",
"profiles": ["tiktok"],
"media": ["https://example.com/video.mp4"],
"platforms": {
"tiktok": {
"privacy_status": "PUBLIC_TO_EVERYONE",
"auto_add_music": true,
"disable_comment": false,
"disable_duet": false,
"disable_stitch": false
}
}
}
ParameterTypeDescription
formatstringPost format: "post" or "story"
first_commentstringComment to add after posting
page_idstringPage ID for posting to company pages
{
"content": "Check out our new product!",
"profiles": ["facebook"],
"media": ["https://example.com/product.jpg"],
"platforms": {
"facebook": {
"format": "post",
"first_comment": "Link to purchase: https://example.com/shop"
}
}
}
ParameterTypeDescription
organization_idstringOrganization ID for company page posts
{
"content": "We're hiring! Join our team",
"profiles": ["linkedin"],
"media": ["https://example.com/careers.jpg"],
"platforms": {
"linkedin": {
"organization_id": "company-id-12345"
}
}
}
{
"content": "Product launch video",
"profiles": ["instagram", "youtube", "tiktok"],
"media": ["https://example.com/video.mp4"],
"platforms": {
"instagram": {
"format": "reel",
"first_comment": "Link in bio!"
},
"youtube": {
"title": "Product Launch 2024",
"privacy_status": "public",
"cover_url": "https://example.com/yt-thumbnail.jpg"
},
"tiktok": {
"privacy_status": "PUBLIC_TO_EVERYONE",
"auto_add_music": true
}
}
}

For complete documentation, see the Platform Parameters Reference.


Here are some example prompts you can use with Claude Code:

Check my Postproxy authentication status
Show me all my available social media profiles

Using profile IDs:

Publish this post: "Check out our new product!" to profiles ["profile-123"]

Using platform names:

Publish "Exciting news!" to linkedin and twitter
Create a draft post: "Review this before publishing" to linkedin
Publish draft post job-123
What's the status of job job-123?

This will show detailed status including draft status, platform-specific errors, and publishing results.

Show me the stats for post abc123
Get stats for posts abc123 and def456 filtered to Instagram only, from February 1st to today
Show me the placements for my LinkedIn profile prof123
Delete post job-123
Show me the last 5 posts I published

  • Check API Key: Ensure POSTPROXY_API_KEY is set when registering with claude mcp add
  • Check Node Version: Requires Node.js >= 18.0.0
  • Check Installation: Verify postproxy-mcp is installed and in PATH
  • Check Registration: Ensure the server is registered via claude mcp add and configuration is saved in ~/.claude/plugins/
  • AUTH_MISSING: API key is not configured. Make sure you included --env POSTPROXY_API_KEY=... when running claude mcp add
  • AUTH_INVALID: API key is invalid. Verify your API key is correct.
  • TARGET_NOT_FOUND: One or more profile IDs don’t exist. Use profiles.list to see available profiles.
  • VALIDATION_ERROR: Post content or parameters are invalid. The API now returns detailed error messages:
    • 400 errors: {"status":400,"error":"Bad Request","message":"..."}
    • 422 errors: {"errors": ["Error 1", "Error 2"]} - Array of validation error messages
    • Check the error message for specific validation issues
  • API_ERROR: Postproxy API returned an error. Check the error message for details.
  • Timeout: Request took longer than 30 seconds. Check your network connection and API status.

When checking post status with post.status, platform-specific errors are now available in the error field of each platform object:

  • error: null - Post published successfully
  • error: "Error message" - Detailed error message from the platform API
  • Common errors include authentication issues, rate limits, content violations, etc.

If you create a draft post (draft: true) but receive draft: false in the response:

  • The response will include a warning field explaining that the API may have ignored the draft parameter
  • This can happen if:
    • The API does not support drafts with media attachments
    • The API has specific limitations for draft posts under certain conditions
  • Check the warning field in the response for details
  • Enable debug mode (POSTPROXY_MCP_DEBUG=1) to see detailed logging about draft parameter handling

Enable debug logging by setting POSTPROXY_MCP_DEBUG=1 when registering the server:

Terminal window
claude mcp add --transport stdio postproxy-mcp --env POSTPROXY_API_KEY=your-api-key --env POSTPROXY_BASE_URL=https://api.postproxy.dev/api --env POSTPROXY_MCP_DEBUG=1 -- postproxy-mcp