Profiles, posts, scheduling, hashtags and media uploads. Setup and authentication are on the main MCP page.

πŸ“„

AI-readable version: mcp.md β€” the complete reference in one plain-Markdown file, for agents and LLMs. Index: llms.txt

Available Tools

The MCP server exposes hand-crafted tools for profiles, posts, and media. Call profiles_list first to discover profile IDs before creating posts.

Account

ToolDescription
account_getGet timezone, plan end date, and publish_at format

Profiles

ToolDescription
profiles_listList all connected social media profiles
profiles_getGet a specific profile by ID
profiles_platforms_listList all supported platforms
profiles_get_pinterest_boardsList Pinterest boards for a profile
profiles_get_youtube_categoriesList YouTube categories for a profile

Posts

ToolDescription
posts_createCreate a post β€” draft, scheduled, or publish immediately
posts_create_storyCreate a Story (Instagram, Facebook, VK)
posts_create_reelsCreate Instagram/Facebook Reels
posts_create_shortsCreate YouTube Shorts
posts_publish_nowPublish immediately (shortcut for posts_create)
posts_cross_postPost the same content to 2+ profiles at once
posts_listList posts with optional status and profile filters
posts_list_failedList all posts that failed to publish
posts_getGet a single post by ID
posts_updateUpdate a draft or scheduled post
posts_deleteDelete a draft or scheduled post
posts_retryRetry a specific failed post
posts_retry_all_failedRetry all failed posts (optionally filter by profile)
posts_limitsPer-platform posting limits (char/media limits) + global max file size

Hashtags

ToolDescription
hashtags_listList a profile's saved hashtag sets, with tags
hashtags_createAdd a tag to a set (creates a default set if none exists)
hashtags_deleteDelete a tag
hashtag_groups_createCreate a new hashtag set
hashtag_groups_updateRename a hashtag set
hashtag_groups_deleteDelete a hashtag set and its tags

Media

ToolDescription
media_get_upload_urlBrowser upload URL β€” remote MCP or manual upload by user
media_upload_fileDirect upload from local file path β€” @onlypult/mcp stdio only (not hosted mcp.onlypult.com)
media_check_statusPoll browser upload session and retrieve file IDs

Tool Reference

Detailed parameters for each MCP tool. Required fields must always be provided; optional fields can be omitted.

Account

account_get

No parameters. Returns scheduling context β€” call this before scheduling posts to avoid plan limit errors:

FieldDescription
timezoneAccount timezone β€” publish_at is interpreted in this timezone
plan_activeWhether the current plan is active
plan_end_dateLast date posts can be scheduled (Y-m-d)
plan_end_atLast datetime posts can be scheduled (Y-m-d H:i)
publish_at_formatRequired format for publish_at β€” always "Y-m-d H:i"

Profiles

profiles_list

List all connected social media profiles. No parameters. Returns profile id, name, platform, username, and status for each account.

profiles_get

ParameterTypeDescriptionRequired
profile_idstringProfile ID from profiles_listYes

profiles_platforms_list

List supported platforms (instagram, facebook, twitter, tiktok, youtube, linkedin, telegram, max, bluesky, threads, pinterest, googleGmb, wordpress, vkontakte). No parameters.

profiles_get_pinterest_boards

List Pinterest boards for a profile. Returns id and name for each board β€” use id in platform_options.pinterest.board_id when creating a post.

ParameterTypeDescriptionRequired
profile_idstringPinterest profile ID from profiles_listYes

profiles_get_youtube_categories

List YouTube video categories for a profile. Returns id and name β€” use id in platform_options.youtube.category when creating a post.

ParameterTypeDescriptionRequired
profile_idstringYouTube profile ID from profiles_listYes

Posts

When you have multiple profiles on the same platform, pass explicit profile_ids to target the right account. Call profiles_list first to discover IDs.

posts_create

Create a social media post. Can be saved as draft, scheduled, or published immediately.

Choose the correct mode based on user intent:

  • DRAFT MODE (is_draft=true): user says "draft", "save for later", "don't publish". Post is saved but not scheduled or published.
  • IMMEDIATE MODE (publish_now=true): user says "publish now", "post now", "immediately". Post goes live right away.
  • SCHEDULED MODE (default): user says "schedule", "tomorrow at 9am". Provide publish_at as "Y-m-d H:i" in account timezone β€” call account_get first for timezone and plan_end_at.
ParameterTypeDescriptionRequiredDefault
profile_idsstring[]Profile IDs to post to (from profiles_list)Yesβ€”
contentstringPost text. Required unless media_ids or media_urls providedNo*β€”
is_draftbooleanSave as draft without publishing or schedulingNofalse
publish_nowbooleanPublish immediatelyNofalse
publish_atstringSchedule time in account timezone, format "Y-m-d H:i", e.g. "2026-07-07 14:00". Required if not draft and not publish_nowNoβ€”
titlestringPost title (required for YouTube, recommended for Pinterest)Noβ€”
first_commentstringFollow-up comment. Works on Instagram, Facebook, LinkedIn; ignored elsewhereNoβ€”
delete_at_enablebooleanAuto-delete this post after publishing (every platform)Noβ€”
delete_at_offset_valueintegerPaired with delete_at_offset_unitNoβ€”
delete_at_offset_unitintegerSeconds per unit: 60=min, 3600=hour, 86400=day, 604800=weekNoβ€”
post_optionsobjectGeneric settings bag β€” show_caption_above_media (Telegram), primary_attachments_mode (carousel|grid, VK)Noβ€”
media_idsstring[]Media file IDs from media_check_statusNoβ€”
media_urlsstring[]Public image/video URLs (downloaded server-side, up to 10)Noβ€”
platform_optionsobjectPer-platform settings β€” see platform_optionsNoβ€”

posts_create_story

Same parameters as posts_create. Automatically sets is_story=true for Instagram, Facebook, and VK. Requires image or video media.

posts_create_reels

Same parameters as posts_create. Automatically sets is_reels=true for Instagram and Facebook. Requires vertical video media. Optional: platform_options.instagram.graduation_strategy (MANUAL or SS_PERFORMANCE) for an Instagram trial Reel.

posts_create_shorts

Same parameters as posts_create. Automatically sets youtube.is_shorts=true. Requires short vertical video.

posts_publish_now

Convenience wrapper β€” sets publish_now=true.

ParameterTypeDescriptionRequired
profile_idsstring[]Profile IDs to post toYes
contentstringPost textNo*
titlestringPost title (required for YouTube)No
first_commentstringFollow-up comment (Instagram/Facebook/LinkedIn)No
delete_at_enable / delete_at_offset_value / delete_at_offset_unitboolean/integer/integerAuto-delete β€” see posts_createNo
post_optionsobjectGeneric settings bag β€” see posts_createNo
media_idsstring[]Media file IDsNo
media_urlsstring[]Public media URLsNo
platform_optionsobjectPer-platform settingsNo

posts_cross_post

Post the same content to multiple profiles at once.

ParameterTypeDescriptionRequiredDefault
profile_idsstring[]At least 2 profile IDsYesβ€”
contentstringPost textNo*β€”
publish_nowbooleanPublish immediately to all profilesNofalse
publish_atstringSchedule time in account timezone, format "Y-m-d H:i"Noβ€”
first_commentstringFollow-up comment (Instagram/Facebook/LinkedIn)Noβ€”
delete_at_enable / delete_at_offset_value / delete_at_offset_unitboolean/integer/integerAuto-delete β€” see posts_createNoβ€”
post_optionsobjectGeneric settings bag β€” see posts_createNoβ€”
media_idsstring[]Media file IDsNoβ€”
media_urlsstring[]Public media URLsNoβ€”
platform_optionsobjectPer-platform settingsNoβ€”

posts_list

ParameterTypeDescriptionRequiredDefault
statusstringFilter: draft, scheduled, published, failedNoβ€”
profile_idstringFilter by profile IDNoβ€”
limitintegerMax posts to return (1–100)No20
pageintegerPage numberNo1
publish_afterstringLower bound for publish date. Accepts "Y-m-d", "Y-m-d H:i", or ISO-8601Noβ€”
publish_beforestringUpper bound for publish date. Same formats as publish_afterNoβ€”
post_filterstringComma-separated, at most one value per group: feed|story|reels|shorts|autodelete and photo|video|text. Groups are AND'd; send separate requests instead of combining two values from the same groupNoβ€”

posts_list_failed

ParameterTypeDescriptionRequiredDefault
profile_idstringFilter by profile IDNoβ€”
limitintegerMax posts to return (1–100)No20
publish_after / publish_beforestringSame as posts_listNoβ€”

posts_get / posts_delete / posts_retry

ParameterTypeDescriptionRequired
post_idstringThe post IDYes

posts_update

Update a draft or scheduled post. Cannot update published posts.

ParameterTypeDescriptionRequired
post_idstringThe post ID to updateYes
contentstringNew post textNo
publish_atstringNew schedule time in account timezone, format "Y-m-d H:i"No
titlestringNew titleNo
first_commentstringNew follow-up comment (Instagram/Facebook/LinkedIn)No
delete_at_enable / delete_at_offset_value / delete_at_offset_unitboolean/integer/integerAuto-delete β€” see posts_createNo
post_optionsobjectGeneric settings bag β€” see posts_createNo
media_idsstring[]New media file IDs (replaces existing)No
media_urlsstring[]Public URLs merged with media_idsNo
platform_optionsobjectPer-platform settingsNo

posts_retry_all_failed

ParameterTypeDescriptionRequired
profile_idstringOnly retry failed posts for this profileNo

posts_limits

Per-platform text/hashtag/mention/media limits, plus the account's global max upload size. Call before posts_create to validate content length/media count instead of only discovering limits via a 422.

ParameterTypeDescriptionRequired
profile_idstringProfile ID from profiles_listYes

platform_options

Per-platform settings object passed to post create/update tools. Keys match platform: instagram, facebook, youtube, tiktok, telegram, max, linkedin, pinterest, twitter, threads, bluesky, wordpress, google_my_business, vkontakte.

{
  "instagram": { "is_reels": true, "graduation_strategy": "SS_PERFORMANCE" },
  "youtube": { "is_shorts": true, "privacy": "public", "category": "22" }
}
FieldTypeDescription
is_storybooleanInstagram/Facebook/VK Story (mutually exclusive with is_reels, is_shorts)
is_reelsbooleanInstagram/Facebook Reels
is_shortsbooleanYouTube Shorts
titlestringPlatform-specific title (overrides top-level title)
privacystringYouTube: public|unlisted|private. TikTok: PUBLIC_TO_EVERYONE|SELF_ONLY|…
categorystringYouTube category ID
disable_commentbooleanDisable comments (TikTok, VK, Instagram)
disable_duetbooleanTikTok: disable duet
disable_stitchbooleanTikTok: disable stitch
pin_messagebooleanTelegram/Max: pin after publish
board_idstringPinterest board ID
linkstringPinterest destination link
graduation_strategystringInstagram Reels trial (instagram key only): MANUAL (graduate in the Instagram app) or SS_PERFORMANCE (auto-graduate if it performs well). Omit or empty for a regular Reel
eventEnabledbooleanGoogle My Business: enable the event fields below
startDateTimeAt / endDateTimeAtstringGoogle My Business event start/end, format "Y-m-d H:i"
callToActionEnabledbooleanGoogle My Business: enable the CTA button below
callToActionTypestringGoogle My Business: BOOK|ORDER|SHOP|LEARN_MORE|SIGN_UP
callToActionUrlstringGoogle My Business CTA button URL

Hashtags

Saved hashtag sets ("groups") for a profile β€” reuse a set in content instead of retyping the same hashtags every time.

hashtags_list

ParameterTypeDescriptionRequired
profile_idstringProfile ID from profiles_listYes

hashtags_create

ParameterTypeDescriptionRequired
profile_idstringProfile ID from profiles_listYes
tagstringHashtag text (without #)Yes
group_idintegerTarget set from hashtags_list. Omit to use/create the default setNo

hashtags_delete

ParameterTypeDescriptionRequired
profile_idstringProfile ID from profiles_listYes
tag_idintegerHashtag ID from hashtags_listYes

hashtag_groups_create

ParameterTypeDescriptionRequired
profile_idstringProfile ID from profiles_listYes
titlestringName for the new setYes

hashtag_groups_update

ParameterTypeDescriptionRequired
profile_idstringProfile ID from profiles_listYes
group_idintegerHashtag set ID from hashtags_listYes
titlestringNew name for the setYes

hashtag_groups_delete

ParameterTypeDescriptionRequired
profile_idstringProfile ID from profiles_listYes
group_idintegerHashtag set ID from hashtags_listYes

Media

🧭

Which upload tool?

  • Local stdio (@onlypult/mcp on your machine) + file path on disk β†’ media_upload_file
  • Hosted MCP (mcp.onlypult.com), Claude.ai, ChatGPT β†’ media_get_upload_url + browser + media_check_status
  • Public HTTP(S) URL β†’ media_urls in posts_create (no upload tools)

media_get_upload_url

When to use: hosted MCP or when the user must upload manually in a browser. Call profiles_list first β€” pass profile_id for the target post (drives platform-specific media processing).

When NOT to use: local stdio with a readable file_path (use media_upload_file) or public URL (use media_urls).

The flow is:

  1. Call profiles_list β†’ pick profile_id
  2. Call this tool with profile_id β†’ get upload_url and token
  3. Ask the user to open the URL in their browser
  4. User uploads files through the drag & drop web page
  5. Call media_check_status with the token to get uploaded file IDs
  6. Use those IDs in media_ids when calling posts_create, posts_update, or story/reels tools

If posting a Story or Reels, set matching flags here and in platform_options when creating the post (e.g. is_story=true + posts_create_story).

ParameterTypeDescriptionRequiredDefault
profile_idstringProfile ID from profiles_list (same as posts_create)Yesβ€”
is_storybooleanUpload as Instagram/Facebook storyNofalse
is_reelsbooleanUpload as Instagram ReelsNofalse

media_upload_file

When to use: local stdio via @onlypult/mcp (npx -y @onlypult/mcp@latest) β€” Cursor, Claude Desktop, Windsurf, Codex, Antigravity, and other clients that run MCP on your machine. Pass a path the server can read (workspace-relative or absolute).

When NOT to use: hosted mcp.onlypult.com (server cannot read your disk), Claude.ai, ChatGPT β€” use browser flow. Chat-only attachments without a disk path.

Reliable flow: profiles_list β†’ media_get_upload_url(profile_id) β†’ media_upload_file with file_path + token β†’ posts_create with same profile_ids.

ParameterTypeDescriptionRequired
file_pathstringLocal path readable by MCP serverYes
profile_idstringProfile ID from profiles_list (required when token omitted)No*
tokenstringUpload session token from media_get_upload_url (strongly recommended; auto-created if omitted)No
is_storybooleanUpload as storyNo
is_reelsbooleanUpload as ReelsNo

Returns file id immediately for media_ids. Files > 5MB use multipart upload internally.

media_check_status

When to use: after browser upload when the user says "done". Not needed after media_upload_file.

ParameterTypeDescriptionRequired
tokenstringUpload token from media_get_upload_urlYes

Returns file IDs to use in media_ids when calling posts_create. Supported: JPG, PNG, WebP, GIF, MP4, MOV, WebM. Max file size depends on your Onlypult plan.

Example conversations

Simple post

You: Post "Just launched our new feature!" to Instagram now

Assistant: calls profiles_list β†’ posts_publish_now with profile_ids

Scheduled post

You: Schedule a LinkedIn post for tomorrow at 9am: "Excited to announce our Series A!"

Assistant: calls account_get (check plan_end_at and timezone) β†’ posts_create with publish_at "2026-07-07 09:00"

Cross-posting

You: Post "Big news coming soon…" to Instagram and Facebook

Assistant: calls posts_cross_post with two profile_ids

With local file (stdio)

You: Post ./assets/hero.png to Instagram with caption "Launch day"

Assistant: media_upload_file(file_path="./assets/hero.png") β†’ posts_create with media_ids

With image (browser / remote MCP)

You: I want to post a product photo to Instagram

Assistant: media_get_upload_url β†’ user uploads in browser β†’ media_check_status β†’ posts_create with media_ids

Uploading images & videos

Onlypult supports three ways to attach media. The assistant picks the right one based on where the MCP server runs and where the file lives.

SituationMethod
Local stdio (@onlypult/mcp), file on diskmedia_upload_file
mcp.onlypult.com, Claude.ai, ChatGPTmedia_get_upload_url β†’ browser β†’ media_check_status
File already at public URLmedia_urls in posts_create

Local file upload (stdio / @onlypult/mcp)

With the local npm package in any stdio-capable MCP client, give a file path on your machine, for example:

Post ./marketing/video.mp4 to Instagram as a Reel

The assistant calls media_upload_file, gets a file ID, and creates the post β€” no browser step.

Browser upload (remote MCP)

For hosted MCP connections, the server cannot read your disk. The assistant generates a one-time link; you upload in the browser; the assistant picks up file IDs.

πŸ’‘

Alternatively, if the image or video is already hosted at a public URL, the assistant can use media_urls in posts_create β€” no browser upload needed.

Say something like: "I want to post an image to Instagram" or "Attach this video to my scheduled post".

The assistant calls media_get_upload_url and returns a unique link, for example:

https://app.onlypult.com/mcp-upload?token=abc123...

For Stories or Reels, mention it upfront β€” the assistant will pass is_story or is_reels to the upload tool and use the matching post tool (posts_create_story, posts_create_reels).

Upload your file

Open the link in any browser. You'll see a simple upload page where you can choose files or drag & drop. Multiple files can be uploaded in one session.

Confirm upload

Return to your AI assistant and say "done" or "uploaded". The assistant calls media_check_status with the token, retrieves file IDs, and creates or updates the post with media_ids.

If upload is still processing, the assistant will ask you to wait a moment and check again.

Supported file types

Maximum file size: depends on your Onlypult plan (shown on the upload page).

Example: posting with an image

You

I want to post a product photo to Instagram with the caption "New collection is live!"

Assistant

Upload link generated! Open this link in your browser to upload your photo:

https://app.onlypult.com/mcp-upload?token=…

Say "done" when you've finished uploading.

You

done

Assistant

Upload completed β€” 1 file ready (ID: 98765). Publishing to Instagram…

Post published successfully.

Example: Reels with video

You

Post this vertical video as an Instagram Reel: "Behind the scenes 🎬"

Assistant

Calls media_get_upload_url with is_reels=true β†’ you upload in browser β†’ media_check_status β†’ posts_create_reels with media_ids and caption.