MCP Server (ChatGPT, Claude, Cursor)
IndReelForge hosts a Model Context Protocol (MCP) server. Connect it to an AI assistant and you can publish, schedule, check and analyse posts on Instagram, YouTube, TikTok, Facebook, X, LinkedIn, Threads, Pinterest, Reddit, Bluesky, Google Business Profile, Discord, Telegram, Slack, Mastodon and WordPress just by asking — no glue code, no custom tool schemas.
https://api.indreelforge.com/mcp
| Transport | Streamable HTTP (JSON-RPC 2.0 over POST) |
| Auth | OAuth 2.1 (sign in and approve) or an API key header |
| Plans | Works on every plan, including Free — your plan's limits still apply (e.g. 10 uploads/month and no TikTok on Free) |
| Plan / rate limits | Same as the REST API, plus 60 tool calls per minute per connection |
| Clients | claude.ai, Claude Desktop, ChatGPT, Claude Code, Cursor, Windsurf, Gemini CLI, any MCP-compatible client |
The URL must point at api.indreelforge.com/mcp. The dashboard host (indreelforge.com) does not serve MCP.
How it works
The MCP server is a thin layer over the IndReelForge REST API. Every tool call is executed as a normal API request on your account, so:
- Plan limits apply exactly as they do over the API — monthly uploads, connected profiles, FFmpeg minutes, scheduling and analytics features.
- Validation is identical — the same per-platform checks (caption length, media type, privacy values, required targets like a Pinterest board) run, and the same error messages come back to the assistant.
- Rate limits are shared with your API usage. On top of that, each MCP connection is limited to 60 calls per minute so a looping agent can't burn through your quota.
- Errors come back as tool results. A failed call returns a result flagged
isErrorcontaining the REST error message, itserror_codeand asuggestion, so the assistant can explain the problem or fix the request and try again. - Media is passed by public URL. The assistant gives the server a
video_urlorphoto_urls; IndReelForge downloads the file, stores it and publishes it. Local files on your computer can't be sent directly — upload them somewhere public first (or use the dashboard).
Authentication
There are two ways to authenticate. Pick the one your client supports.
Option 1 — OAuth 2.1 (recommended)
Used by claude.ai, Claude Desktop and ChatGPT. You never create or paste an API key: the client redirects you to IndReelForge, you sign in, review what the app is asking for and click Allow. The assistant receives a scoped access token — never your password, API keys or social platform tokens.
Under the hood the server implements:
- Dynamic Client Registration (RFC 7591) — clients register themselves, there's nothing to configure.
- PKCE with
S256on every authorization. - Discovery at
https://api.indreelforge.com/.well-known/oauth-protected-resourceandhttps://api.indreelforge.com/.well-known/oauth-authorization-server. - Token revocation — revoking an app in the dashboard invalidates its tokens on the very next call.
Manage OAuth apps at Dashboard → API Keys → Connected Apps:
- See every connected assistant and when it was last used.
- Toggle individual tools per app (for example, make an assistant read-only by turning off the upload tools).
- Revoke an app with one click.
For OAuth apps, delete_upload and cancel_scheduled start disabled. Enable them per app in Connected Apps only if you want that assistant to be able to remove posts.
Option 2 — API key
Used by Claude Code, Cursor, Windsurf, Gemini CLI, the local npm bridge, and any client that lets you set HTTP headers. Send your key on every request:
Authorization: ApiKey YOUR_API_KEY
Authorization: Bearer YOUR_API_KEY and x-api-key: YOUR_API_KEY are accepted too.
- Create a key at Dashboard → API Keys. Keys are available on every plan, including Free, but require two-factor authentication on your account.
- IP allowlists set on the key apply to MCP calls as well. If your client runs on a laptop with a changing IP, either leave the allowlist empty or use a separate key.
- API-key clients get all tools, including destructive ones. Use OAuth if you want per-tool control.
Connect your client
- claude.ai & Claude Desktop
- ChatGPT
- Claude Code
- Cursor / Windsurf / JSON
- Gemini CLI
- Local (stdio via npm)
Claude connects with OAuth — no API key needed.
- Open Settings → Connectors.
- Click Add custom connector.
- Name it
IndReelForgeand paste the URLhttps://api.indreelforge.com/mcp. - Click Add, then Connect. A browser window opens — sign in to IndReelForge if prompted.
- Review the requested access and click Allow.
- Back in a chat, enable the IndReelForge connector from the tools menu and try: "List my IndReelForge profiles."
Connectors added on claude.ai are also available in Claude Desktop when you're signed in to the same account.
ChatGPT connects with OAuth through developer mode.
- Open Settings → Apps & Connectors → Advanced and turn on Developer mode.
- Back in Apps & Connectors, click Create.
- Enter a name (
IndReelForge) and the MCP server URLhttps://api.indreelforge.com/mcp. - Set Authentication to OAuth and save.
- Sign in to IndReelForge in the window that opens and click Allow.
- In a new chat, select the IndReelForge connector from the + / tools menu and ask away.
Add the server with one command (API key auth):
claude mcp add --transport http indreelforge https://api.indreelforge.com/mcp \
--header "Authorization: ApiKey YOUR_API_KEY"
Then start Claude Code and run /mcp — indreelforge should show as connected with its tools listed.
Add --scope user to make it available in every project, or --scope project to share it via .mcp.json (don't commit a real key — reference an environment variable instead).
Cursor (~/.cursor/mcp.json or .cursor/mcp.json), Windsurf (~/.codeium/windsurf/mcp_config.json) and most other clients that accept an mcpServers JSON block use the same shape:
{
"mcpServers": {
"indreelforge": {
"url": "https://api.indreelforge.com/mcp",
"headers": {
"Authorization": "ApiKey YOUR_API_KEY"
}
}
}
}
Save the file and reload MCP servers (Cursor: Settings → MCP). The server should turn green and list its tools.
Add the server to ~/.gemini/settings.json (or .gemini/settings.json in a project):
{
"mcpServers": {
"indreelforge": {
"httpUrl": "https://api.indreelforge.com/mcp",
"headers": {
"Authorization": "ApiKey YOUR_API_KEY"
}
}
}
}
Restart Gemini CLI and run /mcp to confirm the tools are loaded.
For clients that only support stdio servers, run the npm package as a local bridge. It speaks stdio to your client and forwards every call to the hosted server at https://api.indreelforge.com/mcp — there's nothing to self-host.
{
"mcpServers": {
"indreelforge": {
"command": "npx",
"args": ["-y", "indreelforge", "mcp"],
"env": {
"INDREELFORGE_API_KEY": "YOUR_API_KEY"
}
}
}
}
Or run it directly to test:
INDREELFORGE_API_KEY=YOUR_API_KEY npx -y indreelforge mcp
Requires Node.js 18+.
Available tools
All arguments use snake_case. Wherever a tool takes profile, pass the profile name exactly as it appears in your dashboard (the same value as the REST API's user field) — the assistant can look it up with list_profiles. Arguments marked ? are optional.
Account & profiles
| Tool | What it does | Arguments |
|---|---|---|
list_profiles | Lists your profiles and which platforms each one has connected. | none |
get_account_info | Returns your plan, current usage and plan limits. | none |
get_platform_targets | Lists posting targets for a profile: Facebook Pages, LinkedIn pages, Pinterest boards or Google Business locations. | profile, platform (facebook | linkedin | pinterest | google_business) |
get_platform_limits | Per-platform daily posting limits and how much of each you've used today. | none |
get_ffmpeg_usage | FFmpeg processing minutes used and remaining this month. | none |
Use the ids returned by get_platform_targets in platform_options:
platform | Put the id in |
|---|---|
facebook | facebook_page_id |
linkedin | target_linkedin_page_id |
pinterest | pinterest_board_id |
google_business | gbp_location_id |
Publishing
| Tool | What it does | Arguments |
|---|---|---|
upload_video | Publishes or schedules a video. | profile, platforms[], video_url, plus the optional fields below and async_upload? |
upload_photos | Publishes or schedules one photo or a carousel. | profile, platforms[], photo_urls[] (1–10), plus the optional fields below |
upload_text | Publishes or schedules a text-only post. | profile, platforms[], text, plus the optional fields below |
Argument details for the upload tools:
| Argument | Type | Notes |
|---|---|---|
profile | string | Profile name. Required. |
platforms | string[] | Required. e.g. ["instagram", "tiktok", "youtube"]. Each must be connected on the profile. |
video_url | string | Required for upload_video. A publicly reachable URL to the video file. |
photo_urls | string[] | Required for upload_photos. 1–10 publicly reachable image URLs. |
text | string | Required for upload_text. The post body. |
title | string? | Used by platforms that have titles (YouTube, Reddit, Pinterest…). |
description | string? | The caption for video and photo posts. |
first_comment | string? | Posted as the first comment where the platform supports it. |
scheduled_at | string? | ISO 8601 datetime, e.g. 2026-11-03T09:00:00. Omit to publish now. |
timezone | string? | IANA timezone for scheduled_at, e.g. Asia/Kolkata, America/New_York. |
add_to_queue | boolean? | Put the post into the profile's next free queue slot instead of a fixed time. |
platform_options | object? | Platform-specific fields, using the same names as the REST API — e.g. privacy_level (TikTok), youtube_privacy, facebook_page_id, target_linkedin_page_id, pinterest_board_id, gbp_location_id. See the Platform Upload Guides. |
async_upload | boolean? | upload_video only. Default true: returns an upload_id immediately; check progress with get_upload_status. |
Status & history
| Tool | What it does | Arguments |
|---|---|---|
get_upload_status | Overall status plus per-platform status, post URLs and error messages for one upload. | upload_id |
get_history | Your recent uploads, newest first. | limit? (default 20, max 100), page? (default 1), status? (queued | processing | scheduled | completed | partial | failed | cancelled) |
retry_upload | Retries the failed platforms of an upload. | upload_id |
delete_upload | Deletes an upload. Destructive — off by default for OAuth apps. | upload_id |
Scheduling & queue
| Tool | What it does | Arguments |
|---|---|---|
list_scheduled | Lists posts that are scheduled but not yet published. | none |
edit_scheduled | Changes the time, title or description of a scheduled post. At least one change is required. | upload_id, scheduled_at?, timezone?, title?, description? |
cancel_scheduled | Cancels a scheduled post. Destructive — off by default for OAuth apps. | upload_id |
get_queue | Returns a profile's queue settings and its upcoming slots. | profile, count? (default 5, max 20) |
update_queue_settings | Updates a profile's queue. Only the fields you pass change. | profile, slots? ("HH:MM" strings, max 24), days_of_week? (0 = Sunday … 6 = Saturday), timezone?, max_posts_per_slot? |
Analytics
| Tool | What it does | Arguments |
|---|---|---|
get_analytics | Posting analytics for your account (volume, success rate, per-platform breakdown). | days? (default 30, max 365) |
get_profile_analytics | Live follower and engagement metrics pulled from the connected platforms. | profile, platforms[] (required — connected platforms, see list_profiles) |
get_post_analytics | Views, likes, comments and shares for a published post. | upload_id, platform? |
Legacy tool names
Earlier versions of the connector exposed a smaller tool set. These names still work, so existing setups keep running. Each one runs as the tool it maps to and is governed by that tool's toggle in Connected Apps — for example, disabling delete_upload also disables delete_post.
| Legacy name | Runs as |
|---|---|
create_post | upload_video / upload_photos / upload_text |
schedule_post | the upload tools with scheduled_at |
get_post_status(post_id) | get_upload_status |
delete_post(post_id) | delete_upload |
Example prompts
Once connected, just describe what you want. A few ideas:
- "Which of my IndReelForge profiles have TikTok and Instagram connected?"
- "Post this video to TikTok, Instagram Reels and YouTube Shorts on my acme profile: https://cdn.example.com/launch.mp4 — caption 'We just shipped dark mode 🌙', YouTube title 'Dark mode is here', YouTube privacy unlisted."
- "Schedule a LinkedIn and X text post for tomorrow at 9am India time announcing our webinar on Thursday. Put the registration link in the first comment."
- "Make a 4-image carousel on Instagram and Threads from these URLs, and pin it to my 'Product Shots' Pinterest board too."
- "Add this video to the queue for my brand profile instead of picking a time."
- "Did yesterday's uploads all succeed? Retry anything that failed and tell me why it failed."
- "Show me everything scheduled for next week and move Friday's post to Monday 6pm."
- "How did my last YouTube video perform, and how many followers did I gain on Instagram this month?"
You don't need to know page ids or board ids. Ask for "my Acme Facebook Page" or "the Recipes board" and the assistant will call get_platform_targets and fill in facebook_page_id, pinterest_board_id, target_linkedin_page_id or gbp_location_id itself.
Troubleshooting
Tool-level failures (validation, plan limits, platform errors) come back to the assistant as an error result with the REST API's message, error_code and a suggestion — ask the assistant to show you the exact error if it's unclear. Connection-level problems look like this:
| Symptom | Cause | Fix |
|---|---|---|
HTTP 401 with a WWW-Authenticate challenge (OAuth clients) | The access token expired or the app was revoked. | Most clients re-authenticate automatically. If not, disconnect and reconnect the connector, then sign in and Allow again. |
| HTTP 401 (API key clients) | Wrong or deleted key, or wrong header format. | Check the header is Authorization: ApiKey YOUR_API_KEY and that the key still exists in Dashboard → API Keys. |
HTTP 403 with error_code: TOTP_REQUIRED | Two-factor authentication is off on the account, which API keys require. | Turn 2FA back on in your account settings. |
HTTP 403 IP not whitelisted for this API key | The key has an IP allowlist and the request came from another IP. | Add the client's IP to the key's allowlist or use a key without one. |
The "<tool>" tool is disabled for this connection. Enable it in IndReelForge → API Keys → Connected Apps. | The tool is switched off for this OAuth app (destructive tools are off by default; legacy names follow the tool they map to). | Enable it at API Keys → Connected Apps, then retry. |
HTTP 429 Rate limit exceeded (max 60 calls/min for this app) | More than 60 calls in a minute on this connection. | Wait a minute. If an agent is looping, ask it to batch work or slow down. Your regular API rate limits also apply. |
| Platform not connected | The profile doesn't have that social account linked (or its token expired). | Connect or reconnect it in Dashboard → Profiles, then retry. Use list_profiles to check. |
| Plan limit errors | Monthly uploads are used up, or the feature or platform isn't on your plan (e.g. TikTok on Free). | Check with get_account_info, then upgrade or wait for the next cycle. |
| Media download failed | The video_url / photo_urls aren't publicly reachable (private Drive links, expiring URLs, localhost). | Use a direct, public URL that serves the file itself. |
| Tools don't appear in the client | Wrong URL (dashboard host instead of API host) or the client wasn't reloaded. | Use https://api.indreelforge.com/mcp and restart / reload MCP servers. |
Security
- Never paste an API key into a chat. Keys belong in your client's config or environment variables, not in prompts — chat history can be stored, shared or used for training.
- Prefer OAuth wherever your client supports it. You get per-tool control, destructive tools off by default, and one-click revocation, and no long-lived secret sits on disk.
- Keep destructive tools off unless a workflow needs them, and enable them only on the specific app.
- Use a dedicated API key per client (e.g. one for Cursor, one for Claude Code) so you can revoke one without breaking the others, and add an IP allowlist where your IP is stable.
- Revoke what you don't use — remove stale apps in Connected Apps and delete unused keys in Dashboard → API Keys.
- Review before publishing — ask the assistant to show you the final caption, platforms and time before it calls an upload tool, especially for scheduled campaigns.
Related
- AI Agents & function calling — build your own agent with OpenAI, Anthropic or LangChain tool calling.
- API Reference — the REST endpoints behind every MCP tool.
- Scheduling guide — how scheduled posts and queues work.