Posteora connector brief (for an AI agent setting up a custom integration) Server: https://posteora.com/mcp Protocol: Model Context Protocol, streamable HTTP, remote. POST only, stateless JSON responses (a GET returns 405 by design; there is no SSE stream to open). Auth: one request header -> Authorization: Bearer The user copies the key from https://posteora.com/Account#mcpSection Keep it in your secure credential store. Never echo it into chat or logs. A wrong or missing key returns HTTP 401. Regenerating the key on that page revokes it. Also available: OAuth 2.1 with PKCE and dynamic client registration (metadata under /.well-known/). Use the API key unless the user asks for OAuth. What it does: Posteora publishes and schedules posts to the user's own connected social networks (X, Bluesky, Mastodon, LinkedIn, Pinterest, TikTok) and writes in their trained voice. Rules: call accounts.list first; when you first use Posteora from a project or repo, call connection.label once with its folder name so the user can tell this connection apart from their other projects; ALWAYS post.preview before post.publish or post.schedule and tell the user the credit cost; never invent TikTok options — ask; generate a fresh idempotency_key per publish; at most 2 posts per day on X; never put links in X post text unless the user insists (13 credits and downranked). To add a link under a post, schedule a second post with reply_to set to that post's URL or id (X only; a link there still costs 13). Replies under the user's own X posts are the only replies this server publishes: replies to other people's posts are drafted with voice.write kind="reply" but posted by the user on X. To attach a picture or video the user gave you as a file: upload it first with HTTP POST https://posteora.com/mcp/media (multipart field "file", same Authorization header; images up to 5 MB, MP4/MOV up to 100 MB) or, for images, the media.upload tool; then pass the returned id as media_ids. media_url is only for files that are already public. Tools: - accounts.list: List the social networks connected to this Posteora account, with per-platform limits. Free. Call this first; "needs_reauth" means the user must reconnect on the website. - connection.label: Name THIS connection so the user can tell it apart from their other assistants/projects on their AI Assistants page (e.g. the project folder or repo name). Call it once when you first use Posteora from a new project, and whenever the user asks to rename the connection. Free. - credits.get: Current AI credits and post credits. Free. - voice.write: Write a post or a reply in the user's trained voice (their persona). Costs 1 AI credit. For kind="reply" pass the tweet being replied to as tweet_text. Returns the text plus any signal-guard warnings (links, bait, generic openers) you should mention. - media.upload: Upload a local IMAGE as base64 and get a media_id to pass in media_ids. Free. JPEG, PNG, WebP or GIF, up to 5 MB. For a video, or any file you can send without base64, use plain HTTP instead: POST https://posteora.com/mcp/media with the same Authorization header and the file as multipart field "file" (MP4/MOV up to 100 MB); it returns the same media_id. - post.preview: Validate a post before publishing: per-platform character fit, exact post-credit cost (an X post containing a link costs 13 credits instead of 1), signal-guard warnings, and whether TikTok options are complete. Free. ALWAYS call this before post.publish or post.schedule and tell the user the cost. - post.publish: Publish now to the given platforms. Spends post credits (see post.preview). idempotency_key must be a fresh random string per user intent — retries with the same key return the original result instead of posting twice. TikTok returns pending=true; check post.status a minute later. - post.schedule: Queue a post for later. scheduled_for is ISO-8601 WITH timezone offset. Credits are spent when it sends. Refuses a 3rd X post on the same day (author-diversity rule) and TikTok posts without options. - post.queue: List queued (pending) and draft posts, soonest first. Free. - post.cancel: Cancel a queued post (drafts are deleted). Free. - post.status: Outcome of a scheduled post or a single publish record, with URLs. Free. - radar.find: Trend Radar: find rising posts in the user's lane worth replying to right now (reply early = the small account's best distribution). 3 AI credits, first 5 finds free, results cached 15 minutes (a repeat call inside that window is free), 10 finds/day. Empty results are refunded. Pair with voice.write kind="reply". Media (pictures and video): the user will often hand you a FILE, not a link. 1. Upload it over plain HTTP, same Authorization header: curl -sS -X POST https://posteora.com/mcp/media \ -H "Authorization: Bearer $XPOSTERAI_API_KEY" -F "file=@/path/to/photo.jpg" -> {"ok": true, "media_id": 123, "kind": "image", ...} JPEG/PNG/WebP/GIF up to 5 MB, MP4/MOV up to 100 MB. A raw body with its Content-Type works too. Images may instead go through the media.upload tool (base64). 2. Pass "media_ids": [123] to post.preview, then to post.schedule or post.publish. media_url is only for files that are ALREADY public on https. Uploading is free. Never put the user's files on a third-party host (filebin, imgur, ...) to get a link: that publishes their private media. Upload to /mcp/media instead. One video per post; the networks set how many images fit (preview tells you). Threads: post.preview and post.schedule accept "thread": ["tweet 1", "tweet 2", ...] (2-25 items) instead of "text". It is queued as ONE item; every tweet is billed as a post. Only networks whose accounts.list entry has supports_threads=true. Times: scheduled_for must be ISO-8601 WITH a timezone offset, e.g. 2026-10-01T09:00:00-07:00. Errors: tool failures come back as a normal result with isError=true and a plain-English message (for example "Too long for X / Twitter (300/280)."). Show it to the user. Costs: accounts.list, credits.get, post.preview, post.queue, post.status, post.cancel are free. Spending tools say so in their description. Credits belong to the user. A good first test: call accounts.list, then credits.get, and show both results. Do not publish or schedule during setup. Human-readable page: https://posteora.com/muse Full tool docs: https://posteora.com/docs/mcp Support: support@posteora.com