Skip to Content
SdksMCP Server

MCP Server

The @voxburst/mcp-server package lets AI assistants (Claude, Cursor, Windsurf, and others) manage your VoxBurst workspace through the Model Context Protocol (MCP) .

Installation

npm install -g @voxburst/mcp-server

Or run directly without installing:

npx @voxburst/mcp-server

Configuration

Environment Variables

VariableRequiredDefaultDescription
VOXBURST_API_KEYYesYour VoxBurst API key (vb_live_…)
VOXBURST_API_URLNohttps://api.voxburst.ioAPI base URL (override for self-hosted)

Get your API key from VoxBurst Settings . Use a key with the scopes your agent needs (at minimum posts:write and accounts:read).

Pass your API key via the env block in the MCP config — never hard-code it in the config file, which may be committed to source control.

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{ "mcpServers": { "voxburst": { "command": "npx", "args": ["@voxburst/mcp-server"], "env": { "VOXBURST_API_KEY": "vb_live_xxxxxxxxxxxxx" } } } }

Restart Claude Desktop after saving the config.

Cursor

Add to your Cursor MCP settings (.cursor/mcp.json or the global MCP config):

{ "mcpServers": { "voxburst": { "command": "npx", "args": ["@voxburst/mcp-server"], "env": { "VOXBURST_API_KEY": "vb_live_xxxxxxxxxxxxx" } } } }

Windsurf / VS Code with MCP Extension

{ "mcp.servers": { "voxburst": { "command": "npx", "args": ["@voxburst/mcp-server"], "env": { "VOXBURST_API_KEY": "vb_live_xxxxxxxxxxxxx" } } } }

Available Tools

Post Management

create_post

Create a new post or schedule it for later.

ParameterTypeRequiredDescription
contentstringYesPost content
accountIdsstring[]YesTarget account IDs
scheduledForstringNoISO 8601 datetime for scheduling
mediaUrlsstring[]NoPublic HTTPS URLs for images or videos to attach. Each URL is automatically registered with VoxBurst. Local file paths are not supported.
mediaIdsstring[]NoVoxBurst media IDs for files already uploaded via POST /v1/media/upload. Use this when you have pre-uploaded media.
saveAsDraftbooleanNoSave as draft without publishing
contentTypestringNoIMAGE, VIDEO, CAROUSEL, REEL, STORY, TEXT, or THREAD. Required for Instagram — omitting it will cause the post to be rejected.
firstCommentstringNoText to auto-post as a comment immediately after publishing (max 2,200 chars). Supported on Instagram, LinkedIn, YouTube. Facebook support is pending Meta API approval — posts with this field set will publish normally, but the comment is silently skipped on Facebook until approval is granted.
firstCommentDelayintegerNoSeconds to wait before posting the first comment (0–3600, default 0)

Media: Use mediaUrls for publicly accessible HTTPS image/video URLs — the MCP server registers them with VoxBurst automatically. Use mediaIds if you have already uploaded files to VoxBurst and have their IDs. You can pass both in the same request. Local file paths are not accepted.

list_posts

List recent posts from the workspace.

ParameterTypeRequiredDescription
statusstringNoFilter by status: draft, approved, scheduled, publishing, published, failed, partial, cancelled, unpublished, archived, or all
accountIdstringNoFilter posts by a specific account ID
limitintegerNoNumber of posts to return (1–100, default: 20)
cursorstringNoPagination cursor from the previous response for fetching the next page

get_post

Get a single post by ID.

delete_post

Delete a post by ID. Only draft and scheduled posts can be deleted — published posts cannot be deleted through this tool.

update_post

Update a draft or scheduled post.

ParameterTypeRequiredDescription
postIdstringYesPost ID to update
contentstringNoNew post text
scheduledForstringNoNew ISO 8601 scheduled time
accountIdsstring[]NoReplace target accounts
contentTypestringNoNew content type (IMAGE, VIDEO, CAROUSEL, REEL, STORY, TEXT, THREAD)
firstCommentstringNoNew first comment text
firstCommentDelayintegerNoSeconds before first comment (0–3600)
mediastring[]NoReplace attached media — pass VoxBurst media IDs
platformOverridesobjectNoPer-platform content overrides, e.g. { "INSTAGRAM": { "content": "..." } }

cancel_post

Cancel a scheduled or draft post by postId. Cannot cancel posts that are already published or being published.

retry_post

Retry a post by postId. Works on posts with status failed (all platforms failed) or partial (some platforms failed, others succeeded). Successfully-published platforms are never re-posted — only failed platforms are re-queued.

validate_content

Validate content against platform-specific rules before posting.

ParameterTypeRequiredDescription
contentstringYesContent to validate
platformsstring[]YesPlatform constants to validate against — e.g. ["TWITTER", "INSTAGRAM"]. Not account IDs.

Example response:

{ "valid": false, "platforms": { "TWITTER": { "valid": false, "errors": [ { "code": "CONTENT_TOO_LONG", "message": "Content exceeds Twitter's 280 character limit (current: 312)" } ], "warnings": [] }, "INSTAGRAM": { "valid": true, "errors": [], "warnings": [ { "code": "NO_MEDIA", "message": "Instagram feed posts require at least one image or video" } ] } } }

The top-level valid is false if any platform has errors. warnings do not fail validation but indicate potential issues. Check per-platform errors to know exactly what to fix before posting.

Account Management

list_accounts

List all connected social media accounts. No parameters required.

get_account

Get details of a specific account by accountId.

Analytics

get_post_metrics

Get engagement metrics for a post (impressions, likes, shares, comments, clicks).

get_account_metrics

Get metrics for an account (followers, following, total posts, average engagement rate).


Available Resources

Resources provide read-only access to VoxBurst data via URI:

URIDescription
accounts://listAll connected accounts
accounts://{accountId}Single account details
posts://recentLast 20 posts
posts://{postId}Single post details

Example Usage

Once configured, you can ask your AI assistant to:

  • “Post ‘Just shipped a new feature!’ to my Twitter and LinkedIn accounts.”
  • “Schedule a post for next Monday at 10 AM: ‘Monday motivation…’”
  • “How did my last post perform?”
  • “Show me all my scheduled posts.”
  • “Delete the draft post I created earlier.”

The MCP server handles translating these requests into VoxBurst API calls automatically.

Instagram

Instagram requires media on every post and a contentType to specify the post format. Always call list_accounts first to get the account ID — Instagram account IDs start with acc_.

Instagram feed posts require at least one image or video. Text-only posts will be rejected. Always specify contentType.

Single image post

create_post( content: "Behind the scenes 📸", accountIds: ["acc_instagram_123"], contentType: "IMAGE", mediaUrls: ["https://cdn.example.com/photo.jpg"] )
create_post( content: "Swipe to see more →", accountIds: ["acc_instagram_123"], contentType: "CAROUSEL", mediaUrls: [ "https://cdn.example.com/slide-1.jpg", "https://cdn.example.com/slide-2.jpg", "https://cdn.example.com/slide-3.jpg" ] )

Reel (short-form video)

create_post( content: "Our latest drop 🔥", accountIds: ["acc_instagram_123"], contentType: "REEL", mediaUrls: ["https://cdn.example.com/reel.mp4"], firstComment: "#reels #newdrop #launch" )

Scheduled post

create_post( content: "Launch day. Shipping now.", accountIds: ["acc_instagram_123"], contentType: "CAROUSEL", mediaUrls: [ "https://cdn.example.com/launch-1.jpg", "https://cdn.example.com/launch-2.jpg" ], scheduledFor: "2026-06-01T15:00:00Z" )

First comment with delay

create_post( content: "New product just dropped.", accountIds: ["acc_instagram_123"], contentType: "IMAGE", mediaUrls: ["https://cdn.example.com/product.jpg"], firstComment: "Shop the link in bio 👆", firstCommentDelay: 30 )

firstCommentDelay is in seconds. The example above posts the comment 30 seconds after the photo publishes.


Post Status Lifecycle

Understanding how post status flows helps you know which tool actions are valid at each point.

draft ──────────────→ scheduled ──→ publishing ──→ published ↑ ↑ ↓ ↓ │ │ failed partial │ │ ↓ ↓ └── update_post └── (after retry retry └── cancel_post unschedule) ↓ ↓ └── delete_post published published

Which tools are available from each status:

Statusupdate_postcancel_postretry_postdelete_post
draft
approved
scheduled
publishing
published
failed
partial
cancelled
archived

retry_post re-queues only platforms with status: "failed". Platforms that already published are never re-posted — it is safe to call even on a partial post.


Security Notes

  • API keys are passed via environment variables and never logged
  • All API communication uses HTTPS
  • The server has no persistent state between calls
  • Runs in stdio mode — no network port is opened

Troubleshooting

ErrorCauseFix
VOXBURST_API_KEY environment variable is requiredKey not set in env blockAdd VOXBURST_API_KEY to the env section of your MCP config
VoxBurst API Error (401): Invalid API keyKey invalid or expiredGenerate a new API key in VoxBurst Settings 
VoxBurst API Error (429): Rate limit exceededToo many requestsWait and retry; the server does not auto-retry rate limits
VoxBurst API Error (400): Content exceeds platform limitPost too longShorten the content or use platform overrides

Tool Response Shapes

What each tool returns so your agent knows what to expect.

list_accounts

[ { "id": "acc_instagram_abc123", "platform": "instagram", "username": "mybrand", "displayName": "My Brand", "connected": true, "lastSync": "2026-05-30T10:00:00Z" }, { "id": "acc_twitter_xyz456", "platform": "twitter", "username": "mybrand_x", "displayName": "My Brand X", "connected": true } ]

create_post — success

{ "id": "post_abc123", "content": "Launch day. Shipping now.", "status": "scheduled", "scheduledFor": "2026-06-01T15:00:00Z", "contentType": "CAROUSEL", "platforms": [ { "platform": "instagram", "accountId": "acc_instagram_abc123", "status": "pending", "platformPostId": null, "platformPostUrl": null, "publishedAt": null, "error": null } ], "createdAt": "2026-05-30T10:05:00Z" }

get_post — after publishing

{ "id": "post_abc123", "content": "Launch day. Shipping now.", "status": "published", "publishedAt": "2026-06-01T15:00:05Z", "platforms": [ { "platform": "instagram", "status": "published", "platformPostUrl": "https://www.instagram.com/p/ABC123/", "publishedAt": "2026-06-01T15:00:05Z", "error": null } ] }

get_post — partial failure

{ "id": "post_abc123", "status": "partial", "platforms": [ { "platform": "instagram", "status": "published", "platformPostUrl": "https://www.instagram.com/p/ABC123/", "error": null }, { "platform": "twitter", "status": "failed", "platformPostUrl": null, "error": "Content exceeds Twitter's 280 character limit", "retryCount": 1 } ] }

list_posts

{ "data": [ { "id": "post_abc123", "content": "Launch day.", "status": "published", "publishedAt": "2026-06-01T15:00:05Z" }, { "id": "post_def456", "content": "Coming soon...", "status": "scheduled", "scheduledFor": "2026-06-03T10:00:00Z" } ], "pagination": { "has_more": true, "next_cursor": "eyJpZCI6InBvc3RfZGVmNDU2In0", "limit": 20 } }

validate_content — with errors

{ "valid": false, "platforms": { "TWITTER": { "valid": false, "errors": [ { "code": "CONTENT_TOO_LONG", "message": "Content exceeds Twitter's 280 character limit (current: 312)" } ], "warnings": [] }, "INSTAGRAM": { "valid": true, "errors": [], "warnings": [ { "code": "NO_MEDIA", "message": "Instagram feed posts require at least one image or video" } ] } } }

valid: false at the top level means at least one platform has errors. Warnings are advisory — they do not block posting.

retry_post

{ "id": "post_abc123", "status": "publishing", "retriedPlatforms": [ { "platform": "twitter", "retryCount": 2, "nextRetryAt": "2026-06-01T15:04:00Z" } ], "skippedPlatforms": [] }

If a platform has exhausted all 3 retries, it appears in skippedPlatforms with reason: "max_retries_exceeded". Use the REST API /v1/posts/:id/platforms/:platformId/fix to reset and resubmit.


Field Mapping Across Surfaces

Use this table when switching between MCP, REST API, TypeScript SDK, and Go SDK to avoid confusion.

ConceptMCPREST APITypeScript SDKGo SDK
Target accountsaccountIdsaccountIdsaccountIdsAccountIds
Public URL mediamediaUrlsregister via /media/register, then mediaregister, then mediaMedia.RequestUploadURL
Pre-uploaded mediamediaIdsmediamediaMedia
Post formatcontentTypecontentTypecontentTypeContentType
Platform overridesplatformOverridesplatformOverridesplatformOverridesPlatformOverrides
First commentfirstCommentfirstCommentfirstCommentFirstComment
Delay before commentfirstCommentDelayfirstCommentDelayfirstCommentDelayFirstCommentDelay
Schedule timescheduledForscheduledForscheduledForScheduledFor
Save without publishingsaveAsDraft: truesaveAsDraft: truesaveAsDraft: trueSaveAsDraft: true
Validate contentvalidate_content(content, platforms)POST /v1/posts/validateclient.posts.validate()REST API directly
Retry failed postretry_post(postId)POST /v1/posts/:id/retryclient.posts.retry(id)client.Posts.Retry(ctx, id)

Key differences to remember:

  • MCP mediaUrls accepts public HTTPS URLs and registers them automatically. The REST API has no mediaUrls field — you must register or upload first, then pass the resulting mediaId as media.
  • accountIds is always an array, even when posting to a single account: ["acc_abc123"].
  • Platform constants are uppercase: "INSTAGRAM", "TWITTER". The account.platform field in responses is lowercase: "instagram", "twitter".

Common Failures Cookbook

Post fails immediately (validation error)

Your agent receives a 400 error before the post is created. Check validate_content first:

validate_content( content: "your caption", platforms: ["INSTAGRAM"] )

Common causes: caption too long, wrong contentType, missing media for Instagram.

Post is created but status stays pending for a long time

Normal — posts go through a scheduling queue. Use get_post to poll. If status is still pending after 5 minutes, check the VoxBurst dashboard for queue status.

Post status is failed

get_post(postId: "post_abc123")

Read platforms[].error for the specific failure reason per platform. Common Instagram failures:

platforms[].errorMeaningFix
MEDIA_REQUIREDNo media on an Instagram postAdd mediaUrls or mediaIds
ASPECT_RATIO_INVALIDImage ratio outside 4:5–1.91:1Re-crop image
CONTENT_TYPE_NOT_SUPPORTEDSTORY used for InstagramChange to IMAGE, VIDEO, CAROUSEL, or REEL
ACCOUNT_DISCONNECTEDOAuth token expiredRe-connect account in VoxBurst settings
Error code 9004Instagram rejected the image bytesVoxBurst auto-normalizes; use /fix with a fresh media URL

Then retry:

retry_post(postId: "post_abc123")

Post status is partial

Some platforms published, others failed. retry_post re-queues only the failed platforms — it will not re-post to platforms that already succeeded.

Platform has retryCount: 3 and is skipped by retry

The platform has exhausted automatic retries. Use the REST API directly:

curl -X POST https://api.voxburst.io/v1/posts/post_abc123/platforms/pp_xyz789/fix \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx" \ -d '{ "mediaUrl": "https://cdn.example.com/corrected-image.jpg" }'

Replace pp_xyz789 with the postPlatformId from get_post’s platforms array.


Consistency Reference

The MCP server, REST API, TypeScript SDK, and Go SDK all interact with the same VoxBurst backend. Each surface uses the same field semantics — only the naming conventions differ slightly.

If you are using the MCP server: Follow MCP field names only (accountIds, mediaUrls, mediaIds, contentType). The server handles the REST API translation.

If you are using the REST API directly: Use accountIds, media (for IDs), contentType. Register external URLs via POST /v1/media/register first.

If you are using the TypeScript SDK: Same field names as REST (accountIds, media, contentType). Use client.posts.create(), client.media.requestUploadURL().

If you are using the Go SDK: Same concepts, Go-idiomatic capitalization (AccountIds, Media, ContentType). Use client.Posts.Create(), client.Media.RequestUploadURL().

A post created via MCP, checked via REST, and monitored via the TypeScript SDK will have the same post.id and the same status values throughout.

Last updated on