MCP Tool Reference
The PostFuze MCP server exposes 32 tools across six categories plus 2 read-only resources. Every tool is a thin authenticated wrapper over an endpoint in the REST API — it forwards your Authorization: Bearer sk_… key and inherits the exact same validation, scoping and response envelope. The parameters below mirror the request bodies and query strings documented in the API reference. Follow the setup guide to connect a client first.
A tool result is the raw JSON the REST API returned, serialized as text. Non-2xx responses come back with an isError flag set and the problem+json body intact, so the agent can read the failure and recover.
Catalog at a glance
| Category | Count | Tools |
|---|---|---|
| Posts & replies | 7 | create_post, list_posts, get_post, get_post_analytics, delete_post, create_reply, get_replies |
| Social accounts | 7 | list_social_accounts, get_social_account, delete_social_account, connect_bluesky, get_account_metrics, get_account_health, list_pinterest_boards |
| Media | 6 | upload_media, confirm_media_upload, list_media, get_media, set_media_thumbnail, delete_media |
| Social networks & connections | 8 | create_social_network, list_social_networks, get_social_network, update_social_network, delete_social_network, get_auth_url, list_pending_pages, finalize_connection |
| Webhooks | 3 | register_webhook, list_webhooks, test_webhook |
| Account & usage | 1 | get_account_usage |
| Resources | 2 | PostFuze://social-accounts, PostFuze://supported-networks |
Naming
network maps to the API’s platform, client_key to client_id, and social_account_ids to the post accounts[] array. You always use the MCP names listed below.Posts & replies
Create, schedule, inspect and delete posts, and post native replies (first comments and threads). See the Posts and Replies API pages for the underlying contracts.
create_post
Create (and optionally schedule) a post, fanned out to one or more connected accounts. The MCP-only first_comment and thread_content sugar is compiled down to the REST containers array: the root post becomes container 0, the first comment container 1, and each thread entry a subsequent reply.
| Parameter | Type | Required | Description |
|---|---|---|---|
content | string | Yes | Text body of the root post. |
social_account_ids | string[] | Yes | IDs of the connected social accounts to publish to (at least one). |
scheduled_at | string | No | ISO 8601 time to publish at (max 30 days out). Omit to publish immediately. |
media_ids | string[] | No | Media IDs to attach to the root post. |
first_comment | string | No | Text posted as the first comment/reply after the root post lands. |
thread_content | string[] | No | Additional thread entries published as sequential replies. |
is_draft | boolean | No | Save as a draft instead of queueing for publication. |
{
"content": "Launch day is here 🚀",
"social_account_ids": ["a1b2c3d4-…", "b7c8d9e0-…"],
"scheduled_at": "2026-06-10T15:00:00.000Z",
"media_ids": ["m_9f8e7d6c"],
"first_comment": "Full write-up: https://acme.com/blog/launch"
}list_posts
List posts, most recent first. Supports status/account filtering and keyset (cursor) pagination.
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | No | Filter by post status (e.g. draft, scheduled, queued, published). |
social_account_id | string | No | Only posts targeting this connected account. |
limit | integer | No | Page size (default 25, max 100). |
cursor | string | No | Keyset cursor — pass a previous response’s next_cursor to fetch the next page. |
get_post
Fetch a single post with its containers and per-account publication targets.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | Yes | The post ID. |
get_post_analytics
Per-account and aggregated engagement metrics for a published post. Mirrors GET /posts/{id}/analytics.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | Yes | The post ID. |
delete_post
Delete a post. Scheduled, queued and draft posts are canceled; content already published to a platform stays live on that platform.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | Yes | The post ID. |
create_reply
Post a reply/comment under a published post — replied to on each of the post’s published accounts whose platform supports replies. Returns one row per target.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | Yes | The id of the published post to reply under. |
content | string | Yes | Reply text. |
get_replies
List replies/comments recorded under a published post.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | Yes | The id of the published post to read replies from. |
Social accounts
Inspect, disconnect and read metrics for the accounts your key can publish to. To connect a new account via OAuth, use get_auth_url in the next section. See Social accounts.
list_social_accounts
List connected social accounts the org can publish to.
| Parameter | Type | Required | Description |
|---|---|---|---|
network | string | No | Filter by network/platform (e.g. x, linkedin, instagram). |
username | string | No | Filter by account username. |
get_social_account
Fetch a single connected social account by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The social account ID. |
delete_social_account
Disconnect a social account (revokes/disables it).
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The social account ID. |
connect_bluesky
Connect a Bluesky account using a handle and an app password (Bluesky uses app passwords, not OAuth).
| Parameter | Type | Required | Description |
|---|---|---|---|
handle | string | Yes | Bluesky handle, e.g. alice.bsky.social. |
app_password | string | Yes | A Bluesky app password generated in account settings. |
get_account_metrics
Follower/engagement metrics for a connected account, optionally over a date range.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The social account ID. |
start_date | string | No | Range start (unix seconds or ISO 8601). |
end_date | string | No | Range end (unix seconds or ISO 8601). |
get_account_health
Check whether a connected account is currently publish-ready: it reports a healthy flag plus the account’s status and token state, so an agent can verify a channel before scheduling — and prompt the user to reconnect when a token has expired. Mirrors GET /social-accounts/{id}/health.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The social account ID. |
list_pinterest_boards
List the Pinterest boards on a connected Pinterest account (needed to pick a board when posting to Pinterest).
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The connected Pinterest social account ID. |
Media
Upload images and video, then reference the returned media_id from create_post. Uploads are a two-step flow: begin the upload to get a presigned URL, PUT the bytes to it, then confirm. See Media.
upload_media
Begin a media upload: returns a presigned upload_url and a media_id. PUT the file to the URL, then confirm.
| Parameter | Type | Required | Description |
|---|---|---|---|
file_name | string | Yes | The original file name. |
content_type | string | No | MIME type, e.g. image/png or video/mp4. |
confirm_media_upload
Confirm a media upload after PUTting the file. Images and GIFs become ready immediately; videos enter processing while a cover frame is extracted, then become ready (re-fetch with get_media until then). Returns the media with thumbnail_url + thumbnail when available.
| Parameter | Type | Required | Description |
|---|---|---|---|
media_id | string | Yes | The media ID returned by upload_media. |
list_media
List uploaded media assets, most recent first.
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Page size (max 100). |
offset | integer | No | Number of items to skip. |
get_media
Fetch a single media asset and its public URL.
| Parameter | Type | Required | Description |
|---|---|---|---|
media_id | string | Yes | The media ID. |
set_media_thumbnail
Set or regenerate a media item’s thumbnail/cover. Pass source_media_id to use an existing image as a custom cover, or frame_time_ms to regenerate from a specific video frame (the two are mutually exclusive). The asset re-enters processing and the cover is reused automatically at publish time (Instagram Reels, YouTube, Facebook, Pinterest, TikTok). Mirrors POST /media/{id}/thumbnail.
| Parameter | Type | Required | Description |
|---|---|---|---|
media_id | string | Yes | The video/image media ID to set a thumbnail for. |
source_media_id | string | No | An existing image media ID to use as a custom cover. Mutually exclusive with frame_time_ms. |
frame_time_ms | integer | No | Video frame offset (ms) to regenerate the thumbnail from. Video media only. |
delete_media
Delete a media asset.
| Parameter | Type | Required | Description |
|---|---|---|---|
media_id | string | Yes | The media ID. |
Social networks & connections
Configure your own OAuth app credentials per platform (bring-your-own-keys) and drive the hosted OAuth flow to connect accounts. Client secrets are encrypted at rest and never returned. See Social networks and the connecting-accounts guide.
Connecting an account is a chain: get_auth_url returns an authorize URL for a human to approve. When the callback comes back status=connected the account is already linked. When it returns status=pending&session=<token> (multi-account platforms like Facebook Pages or Google Business locations), call list_pending_pages with the session token to see the choices, then finalize_connection with the chosen page IDs. (For Bluesky, skip OAuth entirely and use connect_bluesky.)
create_social_network
Configure BYOK OAuth app credentials for a platform. The client secret is encrypted and never returned.
| Parameter | Type | Required | Description |
|---|---|---|---|
network | string | Yes | Platform, e.g. x, linkedin, instagram, pinterest. |
client_key | string | Yes | OAuth app client ID / key. |
client_secret | string | Yes | OAuth app client secret. |
list_social_networks
List configured BYOK social network app credentials (secrets are never returned). Takes no parameters.
get_social_network
Fetch a single configured social network by its ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
network_id | string | Yes | The social network record ID. |
update_social_network
Update BYOK credentials for a configured social network. Provide whichever fields you want to change.
| Parameter | Type | Required | Description |
|---|---|---|---|
network_id | string | Yes | The social network record ID. |
client_key | string | No | New OAuth client ID / key. |
client_secret | string | No | New OAuth client secret. |
delete_social_network
Delete a configured social network (soft delete).
| Parameter | Type | Required | Description |
|---|---|---|---|
network_id | string | Yes | The social network record ID. |
get_auth_url
Start the hosted OAuth flow for a platform: returns an authorize URL with signed state to connect an account.
| Parameter | Type | Required | Description |
|---|---|---|---|
network | string | Yes | Platform to connect, e.g. x, linkedin, facebook. |
callback_url | string | No | Where to redirect after the OAuth flow completes. |
list_pending_pages
After get_auth_url and a callback with status=pending&session=<token>, list the pages/accounts available to connect (e.g. Facebook Pages, Google Business locations). Returns the network and an availablePages array (id, type, name, username, profilePictureUrl). Pass the chosen IDs to finalize_connection.
| Parameter | Type | Required | Description |
|---|---|---|---|
session_token | string | Yes | The pending-connection session token from the OAuth callback (the session query param). |
finalize_connection
Complete a pending multi-account connection by selecting which pages/accounts to link. Call after list_pending_pages, passing the chosen page IDs. Returns the connectedAccounts that were linked.
| Parameter | Type | Required | Description |
|---|---|---|---|
session_token | string | Yes | The pending-connection session token from the OAuth callback. |
selected_page_ids | string[] | Yes | IDs of the pages/accounts to connect (from list_pending_pages availablePages[].id). At least one. |
Webhooks
Register HTTPS endpoints and have PostFuze deliver signed events (post.published, post.error, account.token_expired, …) so an agent can react to outcomes instead of polling. See Webhooks.
register_webhook
Register a webhook endpoint. The one-time signing_secret is returned only on creation — store it to verify delivery signatures. Endpoint URLs must be public HTTPS (loopback/private/metadata addresses are rejected).
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The HTTPS endpoint to deliver events to. |
events | string[] | Yes | Event types to subscribe to (at least one). |
description | string | No | A human-readable label for the endpoint. |
list_webhooks
List the configured webhook endpoints (signing secrets are never returned). Takes no parameters.
test_webhook
Send a signed webhook.test event to a registered endpoint synchronously and return the delivery result, so you can verify an endpoint is reachable and your signature check works.
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string | Yes | The webhook endpoint ID to send the test event to. |
Account & usage
Read your plan’s consumption for the current billing period. See Usage.
get_account_usage
Current billing-period usage: posts published vs. included, connected account count, and the billing period window. Takes no parameters.
Resources
Beyond tools, the server exposes two read-only MCP resources. Clients fetch them with resources/read; they return application/json and are handy as context an agent can pull in without making a tool call.
| URI | Name | Contents |
|---|---|---|
PostFuze://social-accounts | Connected social accounts | The connected social accounts this API key can publish to (live, same data as list_social_accounts). |
PostFuze://supported-networks | Supported social networks | The 11 platforms PostFuze can publish to, each with its display name and per-post character limit. |
{
"data": [
{ "network": "x", "name": "X (Twitter)", "char_limit": 280 },
{ "network": "linkedin", "name": "LinkedIn", "char_limit": 3000 },
{ "network": "instagram", "name": "Instagram", "char_limit": 2200 },
{ "network": "tiktok", "name": "TikTok", "char_limit": 2200 },
{ "network": "facebook", "name": "Facebook", "char_limit": null },
{ "network": "threads", "name": "Threads", "char_limit": 500 },
{ "network": "bluesky", "name": "Bluesky", "char_limit": 300 },
{ "network": "youtube", "name": "YouTube", "char_limit": 5000 },
{ "network": "pinterest", "name": "Pinterest", "char_limit": 800 },
{ "network": "google_business", "name": "Google Business", "char_limit": 1500 },
{ "network": "reddit", "name": "Reddit", "char_limit": 40000 }
]
}Publishing a video with an agent
Video is a three-tool chain because media is uploaded out-of-band and a video isn’t publish-ready until its cover frame is extracted. Have the agent run, in order:
upload_mediawith the file name andcontent_type(e.g.video/mp4) → returns a presignedupload_urlandmedia_id. The agent (or your app) PUTs the bytes to that URL.confirm_media_uploadwith themedia_id. A video comes backprocessing; re-fetch withget_mediauntilstatus: "ready"(andthumbnail_urlappears). Optionally callset_media_thumbnailto pick a different cover frame.create_postwith themedia_idinmedia_idsand the targetsocial_account_ids.
Wait for ready, and size for the strictest platform
ready, or one that exceeds a target platform’s limits, fails validation. The same asset must satisfy everytarget — a clip fine for LinkedIn (5 GB) is rejected for the same post’s X target (512 MB cap). See the per-platform media-requirements matrix and size the asset accordingly, or fan the video out to one platform per post.Per-platform configuration
Some platforms need an extra field at publish time — a Pinterest board_id, a YouTube title/privacy, a TikTok privacy level. create_postaccepts these through the post’s configuration, and the agent can discover the values it needs first: e.g. call list_pinterest_boards to pick a board before posting to Pinterest, or get_account_health to confirm a channel is connected and its token is valid before scheduling. See Configurations for the full per-platform field reference and the platform pages under Platformsfor each network’s requirements.
Next steps
- MCP setup — connect a client and verify the tool count.
- OpenClaw, Claude Desktop, Cursor & Windsurf — per-client configs.
- n8n & Make — drive the same actions from no-code automation over REST.