Onlypult MCP Server

Connect AI agents β€” Claude, Cursor, ChatGPT, Windsurf, Codex, Antigravity, and any MCP-compatible client β€” directly to your Onlypult account via Model Context Protocol. Let AI publish, schedule, and manage your social content.

πŸ“„

AI-readable version: mcp.md β€” plain Markdown for agents and LLMs. Index: llms.txt

πŸ”—

Hosted MCP URL: https://mcp.onlypult.com/mcp (Streamable HTTP β€” no install)
Local package (disk uploads): npx -y @onlypult/mcp@latest β€” stdio on your machine; works in any client that supports command + args MCP config (Cursor, Claude Desktop, Windsurf, Codex, Antigravity, …).

What you can do

Ask your AI assistant things like:

Setup

The hosted MCP server at mcp.onlypult.com requires no local installation. Configure your AI client to connect over HTTP, then authenticate.

1

Get your API key

Create a personal API key in Onlypult. See the Authentication guide for step-by-step instructions.

Quick link: app.onlypult.com/settings β†’ API Keys.

2

Configure your client

Pick your client below. Hosted HTTP needs no install; local stdio (@onlypult/mcp) adds media_upload_file from disk paths.

3

Restart your client

After saving MCP config, restart the client completely so the integration loads.

πŸ’‘

OAuth path: For Claude.ai and ChatGPT, skip the API key β€” add the MCP URL and sign in via the browser consent page. See OAuth 2.1.

Authentication

The MCP server supports two authentication methods depending on how your AI client connects.

Method When to use How it works
API Key Hosted HTTP (Cursor, Windsurf, …) or local stdio (@onlypult/mcp) Authorization: Bearer op_... header, or ONLYPULT_API_KEY in stdio env
OAuth 2.1 Claude.ai, ChatGPT, Claude Desktop (Connectors) OAuth Authorization Code + PKCE β€” user logs in once via browser

OAuth 2.1

When adding the hosted MCP server to Claude.ai, ChatGPT or other cloud AI platforms, authentication happens via OAuth 2.1 Authorization Code + PKCE. The AI client redirects the user to the Onlypult consent page β€” no manual API key setup required.

How the flow works

AI client β†’ Discovers OAuth server at GET /.well-known/oauth-authorization-server
AI client β†’ Starts flow: GET /authorize?client_id=claude&code_challenge=...&state=...
MCP server β†’ Redirects user to app.onlypult.com/mcp-oauth/authorize?session_id=...
Dashboard β†’ User logs in (if needed) and clicks Allow access
Dashboard β†’ Redirects to mcp.onlypult.com/callback?code=AUTH_CODE&session_id=...
MCP server β†’ Forwards AUTH_CODE to AI client via redirect_uri?code=...&state=...
AI client β†’ Exchanges code: POST /token {code, code_verifier}
MCP server β†’ Calls POST /v1/oauth/mcp/exchange-code {code} on Onlypult API (internal, protected by shared secret)
Onlypult API β†’ Returns omt_... access token + opr_... refresh β€” MCP server returns OAuth token response (expires_in: 30 days)
AI client β†’ All subsequent requests use Authorization: Bearer omt_... β€” refresh via POST /token when access expires

OAuth endpoints

MethodPathDescription
GET/authorizeStart OAuth flow, redirect to consent page
GET/callbackReceive auth code from dashboard after consent
POST/tokenExchange code + PKCE verifier for access token
POST/registerDynamic client registration (RFC 7591)

Pre-registered clients

These clients are pre-registered and don't need dynamic registration:

Any other client can register dynamically via POST /register per RFC 7591.

Connect Cursor

Cursor supports two setups. Pick based on whether you need local file upload (media_upload_file) from disk paths in your project.

SetupBest forMedia from disk
@onlypult/mcp (stdio)Posting images/videos by file path (./assets/photo.jpg)media_upload_file
Hosted HTTPProfiles, posts, scheduling β€” no local pathsBrowser flow (media_get_upload_url)

Option A β€” Local package (recommended for file uploads)

Installs automatically via npx. The MCP server runs on your machine (stdio), so it can read workspace files and upload them with media_upload_file.

Add to .cursor/mcp.json in your project root, or to global Cursor MCP settings:

{
  "mcpServers": {
    "onlypult": {
      "command": "npx",
      "args": ["-y", "@onlypult/mcp@latest"],
      "env": {
        "ONLYPULT_API_KEY": "op_your_api_key_here"
      }
    }
  }
}

Requires Node.js 18+. No separate npm install β€” Cursor runs the package on first use.

Option B β€” Hosted HTTP (no install)

Connect directly to mcp.onlypult.com. Same tools except local disk upload β€” use the browser upload flow for images and videos.

{
  "mcpServers": {
    "onlypult": {
      "type": "http",
      "url": "https://mcp.onlypult.com/mcp",
      "headers": {
        "Authorization": "Bearer op_your_api_key_here"
      }
    }
  }
}

Get your API key β€” see Authentication guide.

Connect Claude Desktop

Claude Desktop supports the same two modes as Cursor. claude_desktop_config.json is stdio-only (command + args) β€” use the local package there. For the hosted server, add a connector in the app UI (not type: http in the JSON file).

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

{
  "mcpServers": {
    "onlypult": {
      "command": "npx",
      "args": ["-y", "@onlypult/mcp@latest"],
      "env": {
        "ONLYPULT_API_KEY": "op_your_api_key_here"
      }
    }
  }
}

Requires Node.js 18+. Enables media_upload_file from paths on your machine.

Open Claude Desktop β†’ Settings β†’ Connectors β†’ Add custom connector:

  • Name: Onlypult
  • URL: https://mcp.onlypult.com/mcp

Click Connect β†’ sign in with Onlypult β†’ Allow access (OAuth). No API key paste. Use browser upload for media (media_get_upload_url).

Same flow as Claude.ai β€” see step-by-step guide if Connectors look different on your build.

Restart Claude Desktop after saving the config file or adding a connector.

Other MCP clients

Any MCP-compatible app can connect to Onlypult. Config file location varies; the JSON shape is the same.

GoalConfig
No install β€” posts, scheduling, browser media uploadHosted https://mcp.onlypult.com/mcp + API key header or OAuth (if the client supports remote MCP)
Upload files by disk path (media_upload_file)Local stdio β€” npx -y @onlypult/mcp@latest + ONLYPULT_API_KEY

Examples: Windsurf (.windsurf/mcp.json), Cursor (.cursor/mcp.json), Claude Desktop (claude_desktop_config.json), OpenAI Codex, Google Antigravity β€” check your app's MCP / Integrations settings and paste the same block as in Cursor local setup or hosted HTTP setup, depending on whether the client supports remote servers.

Local stdio template (copy into your client's MCP config):

{
  "mcpServers": {
    "onlypult": {
      "command": "npx",
      "args": ["-y", "@onlypult/mcp@latest"],
      "env": {
        "ONLYPULT_API_KEY": "op_your_api_key_here"
      }
    }
  }
}

Connect Claude.ai

Claude.ai connects to Onlypult via OAuth 2.1 β€” no API key needed. Add a custom connector in settings, authorize once, then use MCP tools directly in chat.

πŸ“–

Step-by-step guide with screenshots: Connect Onlypult to Claude.ai β†’

Quick summary:

  1. Settings β†’ Connectors β€” click Add β†’ Add custom connector
  2. Name Onlypult, URL https://mcp.onlypult.com/mcp β†’ Add
  3. Click Connect β†’ sign in with Onlypult β†’ Allow access
  4. In chat, ask e.g. Show my connected social profiles β€” approve tool calls when prompted
πŸ’‘

Free plan: Claude.ai allows one custom connector on the free tier. Remove an existing connector first if the slot is taken.

Connect ChatGPT

ChatGPT connects to Onlypult via OAuth 2.1 β€” no API key paste. There are two ways to add the MCP server, depending on your ChatGPT plan and available settings.

Option A β€” Custom Connectors (Plus / Pro)

Available on paid plans: Settings β†’ Connectors β†’ Add custom connector.

1

Open ChatGPT Connectors

Go to Settings β†’ Connectors β†’ Add custom connector.

2

Enter the server URL

https://mcp.onlypult.com/mcp
3

Complete authorization

ChatGPT will redirect you to the Onlypult login and consent page. After approval the integration is active.

Option B β€” Developer mode (free)

πŸ› οΈ

No Connectors menu? Use ChatGPT Developer mode instead β€” enable it under Settings β†’ App Preferences β†’ Apps, create a private app with the MCP URL, authorize via OAuth, then mention @Onlypult in chat.

πŸ“–

Step-by-step guide with screenshots: Connect Onlypult to ChatGPT β†’

Quick summary:

  1. Settings β†’ App Preferences β†’ Apps β€” enable Developer mode in Advanced settings
  2. Create app β€” name Onlypult, Server URL https://mcp.onlypult.com/mcp, Authentication OAuth
  3. Connect β†’ Sign in with Onlypult β†’ Allow access
  4. In chat, type @Onlypult before your request (e.g. @Onlypult Show my connected social profiles)

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.

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)

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.

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, bluesky, threads, pinterest, googleGmb, wordpress, vkontakte). No parameters.

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 scheduled_at in ISO 8601 format.
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
scheduled_atstringSchedule time in ISO 8601, e.g. 2026-07-10T09:00:00. Required if not draft and not publish_nowNoβ€”
timezonestringTimezone name, e.g. Europe/MoscowNoUTC
titlestringPost title (required for YouTube, recommended for Pinterest)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.

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
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
scheduled_atstringSchedule time in ISO 8601Noβ€”
timezonestringTimezone nameNoUTC
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

posts_list_failed

ParameterTypeDescriptionRequiredDefault
profile_idstringFilter by profile IDNoβ€”
limitintegerMax posts to return (1–100)No20

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
scheduled_atstringNew schedule time (ISO 8601)No
timezonestringNew timezoneNo
titlestringNew titleNo
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

platform_options

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

{
  "instagram": { "is_reels": true },
  "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_commentbooleanTikTok: disable comments
disable_duetbooleanTikTok: disable duet
disable_stitchbooleanTikTok: disable stitch
disable_notificationbooleanTelegram: send silently
pin_messagebooleanTelegram: pin after publish
visibilitystringLinkedIn: PUBLIC or CONNECTIONS
board_idstringPinterest board ID
linkstringPinterest destination link
alt_textstringPinterest image alt text

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 posts_create with scheduled_at and timezone

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.