Does Cadenus have an MCP server?
It does, at https://app.cadenus.io/api/mcp, with 29 tools over streamable HTTP. It works with Claude, Claude Code, ChatGPT, Cursor, Codex and any other MCP client.
Developers and AI agents
Cadenus holds the connections to Instagram, Facebook, TikTok, LinkedIn, YouTube and X, and hands you three ways to use them: an MCP server your agent can call, a small skill for agents that live in a terminal, and four plain HTTP calls for everything else. Same accounts, same rules, one token.
01 · Connect your agent
Pick the client you actually use. Every one of them ends in the same place: your agent can list your channels, schedule a post and read back what happened. Setup takes about a minute.
Add the server, then approve access in the browser. No token to copy.
$ claude mcp add --transport http \ cadenus https://app.cadenus.io/api/mcp # then, inside the session /mcp # pick Cadenus, Authenticate, approve
Settings, then Connectors, then Add custom connector. Paste the URL and sign in.
https://app.cadenus.io/api/mcp
# Claude registers itself and opens our
# consent screen. You choose read or write.Settings, Connectors, Create. Use the apps mount: it hides the four tools that publish, because ChatGPT reviews connectors that post on your behalf.
https://app.cadenus.io/api/mcp-apps
# 25 tools. Drafting and reading, not posting.
# Use /api/mcp anywhere else for all 29.Add it to ~/.codex/config.toml with a token from Settings.
[mcp_servers.cadenus] url = "https://app.cadenus.io/api/mcp" http_headers = { Authorization = "Bearer cdn_…" }
OpenClaw has your files and a shell, so give it the skill rather than a connector. It reads the skill file and runs the script.
$ export CADENUS_TOKEN=cdn_… $ cadenus post ./clip.mp4 --to tiktok \ --caption "…"
Anything that can send an HTTP request. Four calls, described below.
$ curl -X POST https://app.cadenus.io/api/agent/posts \ -H "Authorization: Bearer $CADENUS_TOKEN" \ -H "Content-Type: application/json" \ -d '{"caption":"…","channels":["tiktok"]}'
/api/mcp is the full server, 29 tools, for Claude, Cursor, Codex and your own client. /api/mcp-apps is the same server with publish_post, schedule_post, reschedule_post and cancel_post removed, for the ChatGPT app directory. Both take the same credentials.02 · Authentication
Not if your client speaks OAuth. Claude and ChatGPT register themselves, send you to a consent screen, and you approve. If your client does not, or you are writing a script, make a token by hand.
Standard OAuth 2.1 with dynamic client registration and PKCE. Your client discovers everything it needs from these two documents, so in most tools you only ever paste the MCP URL.
# what the client reads, in this order GET /api/.well-known/oauth-protected-resource/api/mcp GET /api/.well-known/oauth-authorization-server # then the normal dance POST /api/register # the client registers itself GET /api/authorize # you log in and approve, read or write POST /api/token # code + PKCE S256 to access token POST /api/revoke
A token issued this way is a normal Cadenus token: it shows up in Settings under the tool's name, and deleting it there disconnects the tool immediately.
Settings, then API & MCP, then New token. The full value is shown once and never again, because we only keep its hash.
# every request, MCP or REST Authorization: Bearer cdn_0Td… # scopes read # look and report. Cannot change anything. write # upload, publish, schedule, cancel.
03 · The tools
Twenty-nine, and most of them read. A read token can call everything marked read. Anything marked write needs a write token and says so when it is refused.
| Tool | What it does | Scope |
|---|---|---|
| list_channels | The connected accounts a post can go to, and what each one accepts, including that platform's caption limit. | read |
| create_media_upload | Reserve a signed address so the agent can upload a file straight from its own disk, past the API. | write |
| confirm_media_upload | Make an uploaded file usable. Checks it is what it claims to be and rewrites video Instagram would refuse. | write |
| import_media_from_url | Pull a file from a link into the workspace instead of uploading it. | write |
| publish_post | Create and schedule in one call, on accounts whose brand does not require client approval. | write |
| schedule_post | Schedule an approved draft on its proposed channels. | write |
| reschedule_post | Move a scheduled post to another time, on every channel it was queued for. | write |
| cancel_post | Cancel a scheduled post before it goes out. | write |
| get_post_result | What actually happened, per channel, with the link to the live post. | read |
| list_media | Files already in the workspace, newest first, with the reference to pass as media. | read |
| get_connect_link | A link the person opens to connect a social account, when there are none yet. | read |
| Tool | What it does | Scope |
|---|---|---|
| create_draft | Create a post as a draft. Nothing publishes until it is scheduled. | write |
| update_draft_caption | Replace a draft's caption. | write |
| submit_draft_for_review | Send a draft to the client's approval portal. | write |
| approve_draft | Approve internally, without client review. | write |
| list_pending_approvals | Posts waiting on someone, with client and thumbnail. | read |
| list_posts | Drafts and posts with status, type and proposed date. | read |
| get_post_details | One post in full: caption, first comment, channels, date. | read |
| get_content_calendar | What is planned for the next N days. | read |
| get_workspace_info | The workspace, the person behind the token, the token's scope, and every connected account. | read |
| list_clients | Clients with retainer and production health signals. | read |
| Tool | What it does | Scope |
|---|---|---|
| list_production_items | Video items with stage, deadline and priority. | read |
| list_stalled_items | Items stuck in a stage for at least N days. | read |
| promote_idea_to_production | Turn a saved idea into a production item, carrying its script. | write |
| list_content_ideas | Ideas saved from the Radar research feed. | read |
| list_outlier_videos | Videos from the watchlist that beat their channel's median by a wide margin. | read |
| find_creator | Find the accounts matching a person or brand name. | read |
| get_creator_top_videos | A creator's top videos, ranked against their own median. | read |
| get_financial_summary | Income, expense and margin over a period, against the one before it. | read |
04 · REST reference
The file does not travel through the API. We hand out a signed address, your code uploads to it, and we check the file before anything is queued. That is why there is no base64 anywhere and no request-size wall to hit.
POST /api/agent/media { "filename": "clip.mp4", "content_type": "video/mp4", "size": 52428800 } to 200 { "media_id": "Ge…", "upload_url": "https://…", "content_type": "video/mp4", "expires_in": 3600 }
PUT <upload_url> Content-Type: video/mp4 # the same one you reserved: the signature covers it <raw bytes>
This is where a phone's HEVC becomes H.264. Instagram accepts HEVC and then fails it in processing hours later, so we rewrite it here instead. The converted copy gets a new name, and you get that name back.
POST /api/agent/media/confirm { "media_id": "Ge…", "content_type": "video/mp4" } to 200 { "ref": "https://app.cadenus.io/api/media/acme/Ge….mp4", "kind": "video", "normalized": true }
POST /api/agent/posts { "caption": "Three things I stopped doing after 100 posts", "channels": ["instagram", "@studio.north"], # handle, platform, native:39, or all "media": ["<ref from step 3>"], "post_type": "reel", # post or reel "when": "2026-09-10T09:00:00+03:00", # omit to go on the next pass "first_comment": "Links below" } # Instagram and Facebook only to 200 { "ok": true, "scheduled": [ { "channel": "native:39", "post_id": 453, "status": "scheduled" } ], "errors": [] }
get_post_result. Publishing is queued, not instant: the publisher sends each channel when it is due, and the live link exists only after the network accepts it. A post that failed on one channel and went out on another says exactly that, per channel.05 · Limits and rules
Everything here is checked on our side before a post is queued, so a mistake comes back in seconds instead of arriving as a platform error hours later.
| Platform | Characters | Hashtags |
|---|---|---|
| 2,200 | 30 | |
| TikTok | 2,200 | no limit |
| 3,000 | no limit | |
| YouTube | 5,000 | no limit |
| X | 280 | no limit |
| 63,206 | no limit |
Only rules the network itself enforces are here. Advice like LinkedIn's five hashtags is advice, and refusing a post over advice would invent a failure that would not have happened.
| Accepted | mp4 · mov · jpg · png · webp |
| Maximum size | 300 MB |
| Signed address valid | 1 hour |
| Converted for you | HEVC to H.264 |
| Stored | EU object storage |
| MCP calls | 120 / minute per token |
| Upload reservations | 60 / hour per person, 200 / day per workspace |
| Publishes | 120 / hour per person |
Anywhere channels are accepted, you can write them the way a person would. A bare platform name only resolves when it is unambiguous; when it is not, the error names the candidates instead of guessing.
"all" # every connected account "tiktok" # the platform, if you have one account there "@studio.north" # a handle "native:39" # the exact channel ref from list_channels
06 · Errors
Errors are written to be passed on. If your agent repeats ours to the person, the sentence tells them what to do.
| Status | error | What it means |
|---|---|---|
| 401 | invalid_token | Missing, wrong or revoked token. The response also carries a WWW-Authenticate header pointing at the OAuth metadata, which is how Claude and ChatGPT offer to reconnect. |
| 402 | billing_required | The subscription is not active. The agent is told to open Cadenus and settle it. |
| 403 | plan_upgrade_required | This plan does not include the agent connection. |
| 403 | read-only token | A write tool was called with a read token. |
| 403 | approval required | The brand behind that channel requires client approval. The message names the draft flow to use instead. |
| 429 | rate_limited | Too many calls. Retry-After says how long to wait. |
07 · What it will not do
These are not settings on the API. They live in the workspace, next to the people who set them, and they apply the same whether a post comes from a browser, a Notion row or an agent.
If the brand requires client approval, publish_post refuses and names the draft flow. The agent can create and submit a draft; the client approves in their portal, as always.
Send the same post again by mistake and you get the first one back, with its original id. Retrying is safe.
A token is bound to one workspace and carries its creator's role. Rows are isolated in the database itself, not only in the code that queries them.
Delete the token and every call stops at once, OAuth ones included. Whatever the agent scheduled stays in the calendar under the token's name, so you can cancel or move it.
08 · FAQ
It does, at https://app.cadenus.io/api/mcp, with 29 tools over streamable HTTP. It works with Claude, Claude Code, ChatGPT, Cursor, Codex and any other MCP client.
Only if your client cannot do OAuth. Claude and ChatGPT register themselves and send you to a consent screen, where you pick read or write. Everyone else uses a bearer token from Settings.
In three steps: reserve an address, PUT the bytes to it, confirm. The file never travels inside a tool argument or a JSON body, so there is no base64 and the ceiling is 300 MB.
Instagram, Facebook, TikTok, LinkedIn and YouTube, plus X as a per-account add-on because X charges for its API. Photos, carousels and video, as posts or reels.
Yes, for the things a tool call cannot carry: reserving an upload, confirming it, and publishing in one call. Four endpoints under /api/agent, same token, same limits.
120 MCP calls a minute per token, 60 upload reservations an hour per person with 200 a day per workspace, and 120 publishes an hour per person. A 429 tells you how long to wait.
Connect, at €19 a month, is the smallest one that does: eight channels, the MCP server, the skill and the API. It is also on Starter, Agency and Scale.
In the EU. Media sits in EU object storage, and video is removed once it has been published. Each workspace's rows are isolated at the database level.
Reference
The same values as on the pricing page, in llms.txt and in the MCP server's own description.
Start
Updated 7 September 2026