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
| Tool | Description |
|---|---|
| account_get | Get timezone, plan end date, and publish_at format |
Profiles
| Tool | Description |
|---|---|
| profiles_list | List all connected social media profiles |
| profiles_get | Get a specific profile by ID |
| profiles_platforms_list | List all supported platforms |
| profiles_get_pinterest_boards | List Pinterest boards for a profile |
| profiles_get_youtube_categories | List YouTube categories for a profile |
Posts
| Tool | Description |
|---|---|
| posts_create | Create a post β draft, scheduled, or publish immediately |
| posts_create_story | Create a Story (Instagram, Facebook, VK) |
| posts_create_reels | Create Instagram/Facebook Reels |
| posts_create_shorts | Create YouTube Shorts |
| posts_publish_now | Publish immediately (shortcut for posts_create) |
| posts_cross_post | Post the same content to 2+ profiles at once |
| posts_list | List posts with optional status and profile filters |
| posts_list_failed | List all posts that failed to publish |
| posts_get | Get a single post by ID |
| posts_update | Update a draft or scheduled post |
| posts_delete | Delete a draft or scheduled post |
| posts_retry | Retry a specific failed post |
| posts_retry_all_failed | Retry all failed posts (optionally filter by profile) |
| posts_limits | Per-platform posting limits (char/media limits) + global max file size |
Hashtags
| Tool | Description |
|---|---|
| hashtags_list | List a profile's saved hashtag sets, with tags |
| hashtags_create | Add a tag to a set (creates a default set if none exists) |
| hashtags_delete | Delete a tag |
| hashtag_groups_create | Create a new hashtag set |
| hashtag_groups_update | Rename a hashtag set |
| hashtag_groups_delete | Delete a hashtag set and its tags |
Media
| Tool | Description |
|---|---|
| media_get_upload_url | Browser upload URL β remote MCP or manual upload by user |
| media_upload_file | Direct upload from local file path β @onlypult/mcp stdio only (not hosted mcp.onlypult.com) |
| media_check_status | Poll 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:
| Field | Description |
|---|---|
| timezone | Account timezone β publish_at is interpreted in this timezone |
| plan_active | Whether the current plan is active |
| plan_end_date | Last date posts can be scheduled (Y-m-d) |
| plan_end_at | Last datetime posts can be scheduled (Y-m-d H:i) |
| publish_at_format | Required 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
| Parameter | Type | Description | Required |
|---|---|---|---|
| profile_id | string | Profile ID from profiles_list | Yes |
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.
| Parameter | Type | Description | Required |
|---|---|---|---|
| profile_id | string | Pinterest profile ID from profiles_list | Yes |
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.
| Parameter | Type | Description | Required |
|---|---|---|---|
| profile_id | string | YouTube profile ID from profiles_list | Yes |
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_atas"Y-m-d H:i"in account timezone β callaccount_getfirst fortimezoneandplan_end_at.
| Parameter | Type | Description | Required | Default |
|---|---|---|---|---|
| profile_ids | string[] | Profile IDs to post to (from profiles_list) | Yes | β |
| content | string | Post text. Required unless media_ids or media_urls provided | No* | β |
| is_draft | boolean | Save as draft without publishing or scheduling | No | false |
| publish_now | boolean | Publish immediately | No | false |
| publish_at | string | Schedule time in account timezone, format "Y-m-d H:i", e.g. "2026-07-07 14:00". Required if not draft and not publish_now | No | β |
| title | string | Post title (required for YouTube, recommended for Pinterest) | No | β |
| first_comment | string | Follow-up comment. Works on Instagram, Facebook, LinkedIn; ignored elsewhere | No | β |
| delete_at_enable | boolean | Auto-delete this post after publishing (every platform) | No | β |
| delete_at_offset_value | integer | Paired with delete_at_offset_unit | No | β |
| delete_at_offset_unit | integer | Seconds per unit: 60=min, 3600=hour, 86400=day, 604800=week | No | β |
| post_options | object | Generic settings bag β show_caption_above_media (Telegram), primary_attachments_mode (carousel|grid, VK) | No | β |
| media_ids | string[] | Media file IDs from media_check_status | No | β |
| media_urls | string[] | Public image/video URLs (downloaded server-side, up to 10) | No | β |
| platform_options | object | Per-platform settings β see platform_options | No | β |
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.
| Parameter | Type | Description | Required |
|---|---|---|---|
| profile_ids | string[] | Profile IDs to post to | Yes |
| content | string | Post text | No* |
| title | string | Post title (required for YouTube) | No |
| first_comment | string | Follow-up comment (Instagram/Facebook/LinkedIn) | No |
| delete_at_enable / delete_at_offset_value / delete_at_offset_unit | boolean/integer/integer | Auto-delete β see posts_create | No |
| post_options | object | Generic settings bag β see posts_create | No |
| media_ids | string[] | Media file IDs | No |
| media_urls | string[] | Public media URLs | No |
| platform_options | object | Per-platform settings | No |
posts_cross_post
Post the same content to multiple profiles at once.
| Parameter | Type | Description | Required | Default |
|---|---|---|---|---|
| profile_ids | string[] | At least 2 profile IDs | Yes | β |
| content | string | Post text | No* | β |
| publish_now | boolean | Publish immediately to all profiles | No | false |
| publish_at | string | Schedule time in account timezone, format "Y-m-d H:i" | No | β |
| first_comment | string | Follow-up comment (Instagram/Facebook/LinkedIn) | No | β |
| delete_at_enable / delete_at_offset_value / delete_at_offset_unit | boolean/integer/integer | Auto-delete β see posts_create | No | β |
| post_options | object | Generic settings bag β see posts_create | No | β |
| media_ids | string[] | Media file IDs | No | β |
| media_urls | string[] | Public media URLs | No | β |
| platform_options | object | Per-platform settings | No | β |
posts_list
| Parameter | Type | Description | Required | Default |
|---|---|---|---|---|
| status | string | Filter: draft, scheduled, published, failed | No | β |
| profile_id | string | Filter by profile ID | No | β |
| limit | integer | Max posts to return (1β100) | No | 20 |
| page | integer | Page number | No | 1 |
| publish_after | string | Lower bound for publish date. Accepts "Y-m-d", "Y-m-d H:i", or ISO-8601 | No | β |
| publish_before | string | Upper bound for publish date. Same formats as publish_after | No | β |
| post_filter | string | Comma-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 group | No | β |
posts_list_failed
| Parameter | Type | Description | Required | Default |
|---|---|---|---|---|
| profile_id | string | Filter by profile ID | No | β |
| limit | integer | Max posts to return (1β100) | No | 20 |
| publish_after / publish_before | string | Same as posts_list | No | β |
posts_get / posts_delete / posts_retry
| Parameter | Type | Description | Required |
|---|---|---|---|
| post_id | string | The post ID | Yes |
posts_update
Update a draft or scheduled post. Cannot update published posts.
| Parameter | Type | Description | Required |
|---|---|---|---|
| post_id | string | The post ID to update | Yes |
| content | string | New post text | No |
| publish_at | string | New schedule time in account timezone, format "Y-m-d H:i" | No |
| title | string | New title | No |
| first_comment | string | New follow-up comment (Instagram/Facebook/LinkedIn) | No |
| delete_at_enable / delete_at_offset_value / delete_at_offset_unit | boolean/integer/integer | Auto-delete β see posts_create | No |
| post_options | object | Generic settings bag β see posts_create | No |
| media_ids | string[] | New media file IDs (replaces existing) | No |
| media_urls | string[] | Public URLs merged with media_ids | No |
| platform_options | object | Per-platform settings | No |
posts_retry_all_failed
| Parameter | Type | Description | Required |
|---|---|---|---|
| profile_id | string | Only retry failed posts for this profile | No |
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.
| Parameter | Type | Description | Required |
|---|---|---|---|
| profile_id | string | Profile ID from profiles_list | Yes |
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" }
}
| Field | Type | Description |
|---|---|---|
| is_story | boolean | Instagram/Facebook/VK Story (mutually exclusive with is_reels, is_shorts) |
| is_reels | boolean | Instagram/Facebook Reels |
| is_shorts | boolean | YouTube Shorts |
| title | string | Platform-specific title (overrides top-level title) |
| privacy | string | YouTube: public|unlisted|private. TikTok: PUBLIC_TO_EVERYONE|SELF_ONLY|β¦ |
| category | string | YouTube category ID |
| disable_comment | boolean | Disable comments (TikTok, VK, Instagram) |
| disable_duet | boolean | TikTok: disable duet |
| disable_stitch | boolean | TikTok: disable stitch |
| pin_message | boolean | Telegram/Max: pin after publish |
| board_id | string | Pinterest board ID |
| link | string | Pinterest destination link |
| graduation_strategy | string | Instagram 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 |
| eventEnabled | boolean | Google My Business: enable the event fields below |
| startDateTimeAt / endDateTimeAt | string | Google My Business event start/end, format "Y-m-d H:i" |
| callToActionEnabled | boolean | Google My Business: enable the CTA button below |
| callToActionType | string | Google My Business: BOOK|ORDER|SHOP|LEARN_MORE|SIGN_UP |
| callToActionUrl | string | Google 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
| Parameter | Type | Description | Required |
|---|---|---|---|
| profile_id | string | Profile ID from profiles_list | Yes |
hashtags_create
| Parameter | Type | Description | Required |
|---|---|---|---|
| profile_id | string | Profile ID from profiles_list | Yes |
| tag | string | Hashtag text (without #) | Yes |
| group_id | integer | Target set from hashtags_list. Omit to use/create the default set | No |
hashtags_delete
| Parameter | Type | Description | Required |
|---|---|---|---|
| profile_id | string | Profile ID from profiles_list | Yes |
| tag_id | integer | Hashtag ID from hashtags_list | Yes |
hashtag_groups_create
| Parameter | Type | Description | Required |
|---|---|---|---|
| profile_id | string | Profile ID from profiles_list | Yes |
| title | string | Name for the new set | Yes |
hashtag_groups_update
| Parameter | Type | Description | Required |
|---|---|---|---|
| profile_id | string | Profile ID from profiles_list | Yes |
| group_id | integer | Hashtag set ID from hashtags_list | Yes |
| title | string | New name for the set | Yes |
hashtag_groups_delete
| Parameter | Type | Description | Required |
|---|---|---|---|
| profile_id | string | Profile ID from profiles_list | Yes |
| group_id | integer | Hashtag set ID from hashtags_list | Yes |
Media
Which upload tool?
- Local stdio (
@onlypult/mcpon 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_urlsinposts_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:
- Call
profiles_listβ pickprofile_id - Call this tool with
profile_idβ getupload_urlandtoken - Ask the user to open the URL in their browser
- User uploads files through the drag & drop web page
- Call
media_check_statuswith the token to get uploaded file IDs - Use those IDs in
media_idswhen callingposts_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).
| Parameter | Type | Description | Required | Default |
|---|---|---|---|---|
| profile_id | string | Profile ID from profiles_list (same as posts_create) | Yes | β |
| is_story | boolean | Upload as Instagram/Facebook story | No | false |
| is_reels | boolean | Upload as Instagram Reels | No | false |
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.
| Parameter | Type | Description | Required |
|---|---|---|---|
| file_path | string | Local path readable by MCP server | Yes |
| profile_id | string | Profile ID from profiles_list (required when token omitted) | No* |
| token | string | Upload session token from media_get_upload_url (strongly recommended; auto-created if omitted) | No |
| is_story | boolean | Upload as story | No |
| is_reels | boolean | Upload as Reels | No |
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.
| Parameter | Type | Description | Required |
|---|---|---|---|
| token | string | Upload token from media_get_upload_url | Yes |
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
You: Post "Just launched our new feature!" to Instagram now
Assistant: calls profiles_list β posts_publish_now with profile_ids
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"
You: Post "Big news coming soonβ¦" to Instagram and Facebook
Assistant: calls posts_cross_post with two profile_ids
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
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.
| Situation | Method |
|---|---|
Local stdio (@onlypult/mcp), file on disk | media_upload_file |
mcp.onlypult.com, Claude.ai, ChatGPT | media_get_upload_url β browser β media_check_status |
| File already at public URL | media_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.
Ask to create an upload link
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.
- No Onlypult login required β the link is tied to your API key session
- The link expires in 10 minutes
- After upload, the page shows each file with its ID
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
- Images: JPG, PNG, WebP, GIF
- Videos: MP4, MOV, WebM
Maximum file size: depends on your Onlypult plan (shown on the upload page).
Example: posting with an image
I want to post a product photo to Instagram with the caption "New collection is live!"
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.
done
Upload completed β 1 file ready (ID: 98765). Publishing to Instagramβ¦
Post published successfully.
Example: Reels with video
Post this vertical video as an Instagram Reel: "Behind the scenes π¬"
Calls media_get_upload_url with is_reels=true β you upload in browser β media_check_status β posts_create_reels with media_ids and caption.