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.

You can use Postproxy’s hosted remote MCP (no install) or run the postproxy-mcp npm package locally with stdio transport—both expose the same tools.


Postproxy runs the MCP server for you at a public HTTPS endpoint. Point your client at that URL and authenticate with your API key. You skip installing Node, postproxy-mcp, and maintaining a local stdio process.

Register the hosted server with HTTP transport:

Terminal window
claude mcp add --transport http postproxy \
https://mcp.postproxy.dev/mcp?api_key=YOUR_KEY

Replace YOUR_KEY with your Postproxy API key.

  • Query parameter: append api_key=YOUR_KEY to the MCP URL (as in the example above).
  • Header: alternatively, many clients can send X-Postproxy-API-Key: YOUR_KEY instead of putting the key in the URL.

Use whichever method your MCP client supports.

  1. Restart your Claude Code session if the client requires it.
  2. Test with a prompt such as: “Check my Postproxy authentication status.”
  3. If the Postproxy tools appear, you can publish and manage posts the same way as with the local server.

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.


The steps below apply to the local postproxy-mcp package (stdio transport). If you use the hosted remote MCP instead, you only need the HTTP URL and API key—no npm install or env vars on your machine.

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 post ID
post_updateUpdate an existing draft or scheduled post
post_publish_draftPublish a draft post
post_deleteDelete a post by post ID
post_statsGet stats snapshots for one or more posts
queues_listList all posting queues
queues_getGet details of a single posting queue
queues_createCreate a new posting queue with weekly timeslots
queues_updateUpdate a queue’s settings, timeslots, or pause/unpause it
queues_deleteDelete a posting queue
queues_next_slotGet the next available timeslot for a queue
comments_listList comments on a published post
comments_getGet a single comment with its replies
comments_createCreate a comment or reply on a published post
comments_deleteDelete a comment from the platform
comments_hideHide a comment on the platform
comments_unhideUnhide a previously hidden comment
comments_likeLike a comment on the platform
comments_unlikeRemove a like from a comment
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. Supports text content, media attachments, scheduling, drafts, threads (X and Threads only), and platform-specific customization.

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. Do not use together with queue_id.
mediastring[]No-Array of media URLs or local file paths (absolute, relative, or ~/ paths)
idempotency_keystringNo-Idempotency key for deduplication
require_confirmationbooleanNofalseIf true, return summary without publishing (dry run)
draftbooleanNofalseIf true, creates a draft post that won’t publish automatically
threadarrayNo-Array of thread child posts (X/Twitter and Threads only). Each item has body (string, required) and media (string[], optional). The parent post is published first, then each child is published as a reply in order.
queue_idstringNo-Queue ID to add the post to. The queue will automatically assign a timeslot. Do not use together with schedule.
queue_prioritystringNo"medium"Priority when adding to a queue: "high", "medium", or "low". Higher priority posts get earlier timeslots.
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
}
}
{
"post_id": "job-123",
"status": "pending",
"draft": true,
"scheduled_at": null,
"created_at": "2024-01-01T12:00:00Z"
}
FieldTypeDescription
post_idstringUnique post identifier for tracking the post
statusstringInitial status of the post: pending, processing, processed
draftbooleanWhether the post was created as a draft
scheduled_atstring|nullISO 8601 timestamp if scheduled
created_atstringISO 8601 timestamp when the post was created
warningstring|nullWarning message if the API may have ignored the draft parameter

Get status of a published post by post ID.

NameTypeRequiredDescription
post_idstringYesPost ID from post.publish response
{
"post_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
post_idstringPostproxy post identifier
overall_statusstringOverall status: draft, pending, processing, complete, failed, media_processing_failed
draftbooleanWhether the post is a draft
statusstringPost status: pending, processing, processed, draft, scheduled, media_processing_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
platforms[].insightsobject|nullPlatform-specific insights (if available)
mediaarray|undefinedArray of media objects (only present if the post has media)
threadarray|undefinedArray of thread child posts (only present if the post has thread children)

Update an existing post. Only drafts or scheduled posts (more than 5 minutes before publish) can be updated. Only send fields you want to change — omitted fields are left unchanged.

NameTypeRequiredDefaultDescription
post_idstringYes-Post ID to update
contentstringNo-Updated text content
profilesstring[]No-Replace all profiles (array of profile IDs or platform names). Full replace — omit to keep existing.
schedulestringNo-Updated ISO 8601 scheduled time
draftbooleanNo-Set or unset draft status
mediastring[]No-Replace all media (array of media URLs). Full replace — send empty array to remove all. Omit to keep existing.
platformsobjectNo-Platform-specific parameters (merged with existing). Same structure as post_publish.
threadarrayNo-Replace all thread children (full replace). Send empty array to remove all. Omit to keep existing.
queue_idstringNo-Queue ID to assign the post to
queue_prioritystringNo-Queue priority: "high", "medium", or "low"
{
"post_id": "job-123",
"status": "draft",
"draft": true,
"scheduled_at": null,
"created_at": "2024-01-01T12:00:00Z",
"message": "Post updated successfully"
}
FieldTypeDescription
post_idstringPost identifier
statusstringPost status after update
draftbooleanWhether the post is a draft
scheduled_atstring|nullISO 8601 timestamp if scheduled
created_atstringISO 8601 timestamp when the post was created
messagestringSuccess message

Delete a post by post ID.

NameTypeRequiredDescription
post_idstringYesPost ID to delete
{
"post_id": "job-123",
"deleted": true
}
FieldTypeDescription
post_idstringPost 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
post_idstringYesPost ID of the draft post to publish
{
"post_id": "job-123",
"status": "processed",
"draft": false,
"scheduled_at": null,
"created_at": "2024-01-01T12:00:00Z",
"message": "Draft post published successfully"
}
FieldTypeDescription
post_idstringPost identifier
statusstringPost status after publishing
draftbooleanWill be false after publishing
scheduled_atstring|nullISO 8601 timestamp if scheduled
created_atstringISO 8601 timestamp when the post 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": [
{
"post_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[].post_idstringUnique post 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

Queues automatically schedule posts into recurring weekly timeslots with priority-based ordering.

List all posting queues.

NameTypeRequiredDescription
profile_group_idstringNoFilter queues by profile group
{
"queues": [
{
"id": "q1abc",
"name": "Morning Posts",
"description": "Daily morning content",
"timezone": "America/New_York",
"enabled": true,
"jitter": 10,
"profile_group_id": "pg123",
"timeslots": ["Monday at 09:00 (id: 1)", "Wednesday at 09:00 (id: 2)"],
"posts_count": 5
}
]
}

Get details of a single posting queue including its timeslots and post count.

NameTypeRequiredDescription
queue_idstringYesQueue ID

Create a new posting queue with weekly timeslots.

NameTypeRequiredDefaultDescription
profile_group_idstringYes-Profile group ID to connect the queue to (use profiles_list to find this)
namestringYes-Queue name
descriptionstringNo-Optional description
timezonestringNo"UTC"IANA timezone name (e.g. "America/New_York")
jitternumberNo0Random offset in minutes (0-60) applied to scheduled times for natural posting patterns
timeslotsarrayNo-Initial weekly timeslots. Each object has day (0=Sunday through 6=Saturday) and time (24-hour HH:MM format).
{
"profile_group_id": "pg123",
"name": "Weekday Mornings",
"timezone": "America/New_York",
"jitter": 10,
"timeslots": [
{ "day": 1, "time": "09:00" },
{ "day": 2, "time": "09:00" },
{ "day": 3, "time": "09:00" },
{ "day": 4, "time": "09:00" },
{ "day": 5, "time": "09:00" }
]
}

Update a queue’s settings, timeslots, or pause/unpause it. Changes to timezone or timeslots trigger rearrangement of all queued posts.

NameTypeRequiredDescription
queue_idstringYesQueue ID to update
namestringNoNew queue name
descriptionstringNoNew description
timezonestringNoIANA timezone name
enabledbooleanNoSet to false to pause the queue, true to unpause
jitternumberNoRandom offset in minutes (0-60)
timeslotsarrayNoTimeslots to add or remove. To add: { "day": 1, "time": "09:00" }. To remove: { "id": 42, "_destroy": true }.

Delete a posting queue. Posts in the queue will have their queue reference removed but will not be deleted.

NameTypeRequiredDescription
queue_idstringYesQueue ID to delete

Get the next available timeslot for a queue.

NameTypeRequiredDescription
queue_idstringYesQueue ID
{
"next_slot": "2026-03-11T14:00:00Z"
}

When publishing a post with post_publish, you can add it to a queue instead of scheduling it manually using the queue_id and queue_priority parameters:

{
"content": "Queued post content",
"profiles": ["twitter", "linkedin"],
"queue_id": "q1abc",
"queue_priority": "high"
}

List comments on a published post. Returns paginated top-level comments with nested replies.

NameTypeRequiredDefaultDescription
post_idstringYes-Post ID
profile_idstringYes-Profile ID to identify which platform’s comments to retrieve
pagenumberNo0Page number, zero-indexed
per_pagenumberNo20Number of top-level comments per page
{
"total": 42,
"page": 0,
"per_page": 20,
"data": [
{
"id": "cmt_abc123",
"external_id": "17858893269123456",
"body": "Great post!",
"status": "synced",
"author_username": "someuser",
"like_count": 3,
"is_hidden": false,
"posted_at": "2026-03-25T10:00:00.000Z",
"replies": [
{
"id": "cmt_def456",
"body": "Thanks!",
"author_username": "author",
"parent_external_id": "17858893269123456"
}
]
}
]
}

Get a single comment with its replies.

NameTypeRequiredDescription
post_idstringYesPost ID
comment_idstringYesComment ID (Postproxy ID or platform external ID)
profile_idstringYesProfile ID

Create a comment or reply on a published post. The comment is published to the platform asynchronously.

NameTypeRequiredDescription
post_idstringYesPost ID
profile_idstringYesProfile ID
textstringYesComment text content
parent_idstringNoID of comment to reply to (Postproxy ID or external ID). Omit to comment on the post itself.
{
"id": "cmt_ghi789",
"body": "Thanks for the feedback everyone!",
"status": "pending",
"external_id": null
}

The comment is created with status: "pending". Once published to the platform, it becomes "published". If publishing fails, it becomes "failed".


Delete a comment from the platform asynchronously. Supported on Instagram, Facebook, YouTube, and LinkedIn. Not supported on Threads.

NameTypeRequiredDescription
post_idstringYesPost ID
comment_idstringYesComment ID (Postproxy ID or external ID)
profile_idstringYesProfile ID

Hide a comment on the platform asynchronously. Supported on Instagram, Facebook, and Threads.

NameTypeRequiredDescription
post_idstringYesPost ID
comment_idstringYesComment ID
profile_idstringYesProfile ID

Unhide a previously hidden comment. Supported on Instagram, Facebook, and Threads.

NameTypeRequiredDescription
post_idstringYesPost ID
comment_idstringYesComment ID
profile_idstringYesProfile ID

Like a comment on the platform asynchronously. Currently only supported on Facebook.

NameTypeRequiredDescription
post_idstringYesPost ID
comment_idstringYesComment ID
profile_idstringYesProfile ID

Remove a like from a comment. Currently only supported on Facebook.

NameTypeRequiredDescription
post_idstringYesPost ID
comment_idstringYesComment ID
profile_idstringYesProfile ID

ActionInstagramFacebookThreadsYouTubeLinkedIn
ListYesYesYesYesYes
ReplyYesYesYesYesYes
DeleteYesYesNoYesYes
Hide/UnhideYesYesYesNoNo
Like/UnlikeNoYesNoNoNo

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
formatstringContent format: "video" or "image"
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, image only)
auto_add_musicbooleanEnable automatic music (image only)
made_with_aibooleanMark content as AI-generated (video only)
disable_commentbooleanDisable comments
disable_duetbooleanDisable duets (video only)
disable_stitchbooleanDisable stitches (video only)
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", "story", or "reel"
titlestringTitle for reels (reel format only)
first_commentstringComment to add after posting
page_idstringPage ID for posting to company pages (use profiles_placements to get available 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 post 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
Update the content of draft post job-123 to "Updated content here"
Delete post job-123
Show me all my posting queues
Create a queue called "Weekday Mornings" for profile group pg123, timezone America/New_York, with timeslots Monday through Friday at 9am
Add a post to queue q1abc with high priority: "Check out our latest feature!"
Pause queue q1abc
What's the next available slot for queue q1abc?
Show me the comments on post abc123 for my Instagram profile prof456
Reply to comment cmt_abc123 on post abc123 with "Thanks for the feedback!" using profile prof456
Hide comment cmt_abc123 on post abc123 for profile prof456
Publish a thread on Twitter: first post "Part 1: Introduction to our new feature", then "Part 2: Here's how it works", then "Part 3: Try it out today!"
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