PostWire
REMOTE · POSTWIRE.IO · 2 COMPONENTS
Writes a native post per network from one idea and publishes it: TikTok, Instagram, YouTube & more
Available components
Last scanned (10 hours ago)
Scores higher than 81% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Marketing and SEO
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (post_to_social). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability75
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 9132 tokens (~351/item across 26 items; 26 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management97
- Stability observed for 29 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 26 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 27 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Checks we ran (13)
- TLS certificate
- Authorization
- HTTPS
- HSTS header
- DNSSEC
- Transport
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
Does not apply to this hosted endpoint (2)
- Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
- Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 −1
- Stability: pass → 0.97 functional
- 26 Oct 26 +1
- Stability: 0.97 → pass security
- The server rewrote its instructions, which are the text every model session reads security
- Tool “create_connect_link” rewrote its description, which is the text the model reads security
- Schema quality: 8182 → 9132 ▼ functional
- New tool “create_client_link” functional
- New tool “invite_teammate” functional
- New tool “list_clients” functional
- New tool “client_report” functional
- 24 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 23 Oct 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “create_recurring_post” rewrote its description, which is the text the model reads security
- Tool “bulk_schedule” rewrote its description, which is the text the model reads security
- Tool “get_post_status” rewrote its description, which is the text the model reads security
- “post_to_social” added an optional parameter “upload_method” cosmetic
- “schedule_post” added an optional parameter “upload_method” cosmetic
- “get_upgrade_link” reworded the description of “plan” cosmetic
- 22 Oct 26 +1
- New tool “check_video_quality” functional
- 20 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.
- 16 Oct 26 0
- Tool “bulk_schedule” no longer declares itself destructive security
- Tool “create_recurring_post” no longer declares itself destructive security
- Tool “plan_week” no longer declares itself destructive security
- Tool “schedule_post” no longer declares itself destructive security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://postwire.io/api/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=postwire.io | CN=YR1,O=Let's Encrypt,C=US | 17 Oct 2026 | 15 Jan 2027 | RSA 2048 | SHA256-RSA | 6c9f4b233380251be511c26622b98382df7 |
| SANs: postwire.io | ||||||
| CN=YR1,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | a20253f15f2691c05dc1ce13b9bcca4e |
| CN=Root YR,O=ISRG,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | RSA 4096 | SHA256-RSA | f24b6d17f9d9ad7cb1c9fea78782699f |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of postwire.io. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | Trust anchor | 20326, 38696 | 8, 8 | Verified |
| io. | DS published | 38690 | 8 | Verified |
| postwire.io. | No DS | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=31536000; includeSubDomains |
| content-security-policy | default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; media-src 'self' data: https:; font-src 'self' data:; connect-src 'self' https://fgpocadhiqhdhknmszym.supabase.co https://1d5ada8543e4486a8741866e24f976e5.r2.cloudflarestorage.com; form-action 'self' https://accounts.google.com https://appleid.apple.com; frame-ancestors 'none'; base-uri 'self'; object-src 'none' |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | geolocation=(), microphone=(), camera=(), payment=(), usb=() |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://postwire.io/api/mcp | Verified | 200 | |
| http (plaintext) | http://postwire.io/api/mcp | HTTPS enforced | 308 | https://postwire.io/api/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
bulk_schedule Schedule many posts at once (CSV or rows) ~579
Checks, and on request schedules, many posts at once: a CSV file's text (csv) or a list of rows (rows), each row one post with the columns date ("2026-10-12 09:00" in the row's or the upload's timezone, an ISO time with offset, or "next_slot"), networks ("linkedin, x"), text, optional text_<network> (each network its own text), media_urls (https links; video: or document: prefix), alt_text, first_comment (LinkedIn, Bluesky, Mastodon), x_reply and x_thread (X), title, brand and label. dry_run defaults to true: nothing is scheduled and the result lists, for every row, the time it would go out, its networks, each network's length as that network counts it, the X credits it would use, whether it would wait for approval or be held by the plan, and its errors and warnings. With dry_run false the upload is scheduled whole or not at all: if any row has an error nothing is scheduled (code bulk_rows_invalid) and each row says what to fix. The plan limits rows per upload (Free 20, Starter 500, Pro 1,000, Agency 2,000); on Free, posts past the 3 scheduled at a time are saved as held. The same upload twice is refused (code bulk_already_scheduled) unless allow_duplicate is true. The result has batch_id; DELETE /api/bulk/{batch_id} undoes the whole upload. Write the rows for the user when they describe a content plan; show them the dry run before scheduling.
| Name | Type | Req | Description |
|---|---|---|---|
| allow_duplicate | boolean | – | Schedule an upload identical to one already scheduled. |
| brand_id | string | – | Default brand for rows without a brand column. |
| csv | string | – | The CSV file's text, first line = column names. Comma, semicolon or tab separated. |
| date_format | string | – | How to read dates like 12/10/2026. Default ymd (2026-10-12). |
| dry_run | boolean | – | true (default): only check. false: schedule every row, or none. |
| fit_long_text | boolean | – | Accept a text over a network's limit and cut it at a sentence or word when published, instead of refusing the row. |
| rows | array | – | Instead of csv: the posts as objects with the same column names, e.g. [{"date":"2026-10-12 09:00","networks":"linkedin, bluesky","text":"…"}]. |
| timezone | string | – | IANA timezone for dates without one, e.g. "America/Lima". Default: each row's timezone column, else the brand's queue timezone. |
No output schema declared.
No examples provided.
cancel_scheduled_post Cancel a scheduled post ~66
Cancels a queued or held post, or withdraws one waiting for approval, so it is never published (a withdrawn post's approval links stop working). Only works before it starts publishing. Takes the id of the scheduled post.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Scheduled post id. |
No output schema declared.
No examples provided.
check_video_quality Check how TikTok will treat a video before posting it ~230
Reads the header of a video file at a public https URL (an upload's media_url works) and says what TikTok will do with it: codec and profile, width x height, fps, average bitrate (kbps), duration, HDR/10-bit, audio codec, and a verdict — keeps_quality (TikTok leaves it looking the same), recompressed (TikTok visibly re-encodes it: HEVC/AV1, HDR or 10-bit, above 1080x1920, above 30 fps, above 16 Mbps) or unknown (the header could not be read). advice lists what to change and message_for_user is one sentence with the export settings TikTok leaves almost untouched (1080x1920, H.264 High, 30 fps, 8-12 Mbps, AAC, SDR). Reads at most 768 KB of the file, nothing is published or changed. Up to 60 checks an hour per account.
| Name | Type | Req | Description |
|---|---|---|---|
| url | string | yes | The https link to the .mp4 or .mov file itself (not a share page). |
No output schema declared.
No examples provided.
client_report Get a client's monthly report ~154
Returns one brand's report for last month (or the month given): what was published on each network, the numbers each network returned, clicks on tracked links and approvals, and client_link: the client's private page opened on its Last month tab, when the brand has an active client link. Pro and above brand it for the client; on Free and Starter it is a preview under PostWire's mark and its note names the plan that includes client reports.
| Name | Type | Req | Description |
|---|---|---|---|
| brand_id | string | – | The client's brand. Omit it and give brand_name instead. |
| brand_name | string | – | The client's brand by name. |
| month | string | – | The month, e.g. 2026-09. Default last month. |
No output schema declared.
No examples provided.
create_brand Create a brand ~85
Creates a new, empty brand (a separate business with its own connected social accounts) on the PostWire account and returns its id. The plan limits the number of brands; at the limit nothing is created and the response names the plan that includes more brands, its monthly price and a checkout link.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Brand name, e.g. the client's business name. |
No output schema declared.
No examples provided.
create_client_link Get a private link for a client ~319
For agencies and freelancers posting for clients: one brand per client. Creates a private page for one brand, good for 30 days, that the client opens without a PostWire account to connect that brand's own social accounts (each network is signed in on its own page, so no password is shared with the agency), approve or ask for changes on the brand's posts waiting for approval (Pro and above; on Starter the client only sees them), see what is scheduled for the next 14 days and read last month's report. Give brand_id, or brand_name: an existing brand with that name is used, otherwise a new brand is created (the plan's brand limit applies). A brand has at most 3 active client links; past that the newest active one is returned (reused: true). Client links come with every paid plan; on Free nothing is created and the response names the plan that includes them, its monthly price and a checkout link. Returns url, expires_at, the brand, message_for_user (one plain sentence for the person) and send_to_client (a sentence to send the client together with the link). Anyone with the link can use it, so it goes only to the client; it can be turned off from the PostWire dashboard.
| Name | Type | Req | Description |
|---|---|---|---|
| brand_id | string | – | The client's brand. Omit it and give brand_name to use or create a brand by name. |
| brand_name | string | – | The client's business name: the brand with this name, or a new brand if there is none. |
No output schema declared.
No examples provided.
create_connect_link Get a link to connect a social account ~249
Creates a one-hour link the user opens in a browser to connect social accounts (TikTok, Instagram, YouTube, Facebook Pages, LinkedIn, Bluesky…) to their PostWire account: the page shows each network as a button, signs in to it on the network's own page, and then offers the next one, so several networks can be connected from one link. Nothing is connected until the user completes it on the page. With platform the page offers only that network; with brand_id the accounts are connected to that brand. Instagram opens with Log in with Instagram (a Business or Creator account, no Facebook Page needed), and the page also offers connecting through a Facebook Page. The link works for one hour and is for the person in the chat; a client connecting their own accounts gets a client link instead: a private page for their brand that works for 30 days. Returns the url of that page and message_for_user: one plain sentence telling the person what to do.
| Name | Type | Req | Description |
|---|---|---|---|
| brand_id | string | – | Brand to connect it to. Omit for the default brand. |
| platform | string | – | Platform to connect. Omit to let the user choose on the page. |
No output schema declared.
No examples provided.
create_recurring_post Set up a recurring post ~428
Sets up a post that repeats on a schedule: daily, weekly on some weekdays, or monthly on some days of the month (31 falls on the last day of shorter months; -1 = the last day), every N days, weeks or months, at 1-4 times a day in a timezone (daylight saving handled), from a start date until an end date or for a number of times. variants (a list of texts) are used in turn, so the same text does not repeat every time. The duplicate guard (guard_days, default 3, 0 = off) skips a network where the same text went out in the last guard_days when an occurrence is published: networks flag repeated posts. Occurrences are put in the queue up to 7 days ahead as ordinary scheduled posts (each can be edited or canceled alone), and go through the brand's approval rules and the plan's limits like any post. On every paid plan (Starter 25, Pro 100, Agency 500 at a time); not on Free. Returns the recurring post with its next occurrences and any warnings (for example: one text every day with a 3-day guard would be skipped).
| Name | Type | Req | Description |
|---|---|---|---|
| brand_id | string | – | Brand whose accounts to use; omit for the default brand. |
| guard_days | integer | – | Skip a network where the same text went out in the last N days. Default 3; 0 = off. |
| label | string | – | Name shown in the queue, e.g. "Monday tip". |
| photo_url | string | – | Optional image (public https link). |
| platforms | array | yes | Connected platforms to post to. |
| rule | object | yes | When it repeats. |
| text | string | – | The post, when there is one text. |
| variants | array | – | Texts used in turn: the 1st occurrence uses the 1st, the 2nd the 2nd, and so on, starting again after the last. |
| video_url | string | – | Optional video (public https link). |
No output schema declared.
No examples provided.
create_upload_link Get a link to upload a photo or video ~175
Creates a single-use link, valid for 24 hours, to a PostWire page where the user picks one photo or video from any device (JPG, PNG, WebP, GIF, MP4, MOV or WebM, up to 1 GB; big videos upload in parts automatically). The file stays in the account's PostWire media storage while a scheduled post needs it, is deleted the day after that post is published, and 7 days after upload if no post uses it (2 days on the Free plan; so post or schedule it soon). A file attached to a chat does not reach PostWire; this page is how it gets there. Returns the page url, an upload_id for checking the upload's status, and message_for_user: one plain sentence telling the person what to open and do.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
generate_posts Write a native draft for each platform ~333
Writes one draft per platform from a single idea, adapted to each network's rules (character limit, hashtags, title and tags for YouTube, hook-first caption for TikTok and Reels, link placement for LinkedIn, Slack formatting, plain text for Nostr). For the blogs (wordpress, devto, hashnode) the draft is a full article: title (<= 70 characters), summary (120-160 characters), a Markdown body with H2 sections, and 3-5 tags (Dev.to: 4). Nothing is published. Returns { drafts: { <platform>: { text, title?, tags?, summary?, thread?, first_comment? } } } and, if the writer skipped a platform, { missing: [...] }. thread (the posts after text) comes back when the user asks for a thread (X, Bluesky, Mastodon), or on Bluesky and Mastodon when the idea is too long for one post there; first_comment comes with it when the idea has a link (LinkedIn, X, Bluesky, Mastodon), so the link goes in the first comment. Counts toward the account's daily AI limit.
| Name | Type | Req | Description |
|---|---|---|---|
| brand_voice | string | – | Optional tone or style notes, e.g. "friendly, no emojis, first person plural". |
| media_url | string | – | Optional public https URL of the photo or video the post is about. |
| platforms | array | yes | Platforms to write for, e.g. ["linkedin","x","bluesky"]. |
| prompt | string | yes | The idea or message to communicate. More detail gives better drafts. |
No output schema declared.
No examples provided.
get_post_performance Show what works: best posts, times and patterns ~431
Returns what the account's own numbers say works, over the last 90 days, computed from the numbers each network reports (no estimates): the published posts ranked against the median of the same social account on the same network, each with its network, brand, link, excerpt, metric (views where the network reports them, otherwise likes + reposts + replies), value, that median, n (posts in the median), a verdict (winner at 2x the median or more, under at half or less) and what the post had (format, first-line type, question, emoji, number up front, day and time, length, hashtags); best_times: the time of day and day of week whose posts did best, with the size of the effect and both sample sizes, or — below 8 measured posts or without a clear difference — two hours to post at to learn it; streak: weeks in a row with at least one post; headline_pattern: the strongest pattern, as a sentence with its numbers; next: three concrete suggestions for the next post, each with the numbers behind it; competitors: public accounts the user watches (YouTube, Bluesky, Mastodon; TikTok captions only), their posts against their own median and what their best posts share; measurable: what each network lets PostWire read, and why the rest is not measurable. Posts younger than 24 hours are not ranked; patterns need at least 10 measured posts and 3 per group. Depending on the account's plan it also returns every pattern, the per-network detail and which formats to double down on or rethink; on a plan without them, locked.patterns_preview says which further patterns are ready and how large each effect is, without the winning value. Read-only; nothing here uses AI.
| Name | Type | Req | Description |
|---|---|---|---|
| brand_id | string | – | Only this brand's posts. Omit for all brands. |
| platform | string | – | Only posts on this network. |
| timezone | string | – | IANA timezone for the day and time patterns, e.g. "America/Lima". Default UTC. |
No output schema declared.
No examples provided.
get_post_status Check a post's publishing status ~367
Returns the status and link of a published post, by platform and the post id returned when it was published, plus `verification`: PostWire's own independent read-back of the post from the network (state live / processing / accepted / not_public / gone / failed / unverifiable, with what the network answered and when), separate from the API response the publish got. PostWire re-reads every post 10 min, 1 h, 6 h, 24 h and 72 h after publishing; this call reads it again now. For a post that is waiting for approval or scheduled, pass the id PostWire returned for it (platform can then be omitted): the status is pending_approval (with who was asked and the review link), rejected (with the reason), scheduled, or each network's result once it went out. For TikTok and YouTube it asks the platform for the processing status and returns the public link once there is one. For an Instagram video returned as "processing", pass the id it returned: the answer is processing, published (with its id and link) or failed (with the reason). For networks that publish immediately it returns status "published" and, where the id allows it, the post's link (Telegram channels, including private ones as t.me/c/<channel>/<message>; Bluesky; LinkedIn; Facebook).
| Name | Type | Req | Description |
|---|---|---|---|
| brand_id | string | – | Brand whose account published it; omit for the default brand. |
| id | string | yes | The post id returned when it was published on that platform, or the id PostWire returned for a post waiting for approval or scheduled. |
| platform | string | – | Platform of the post, e.g. "tiktok". Can be omitted for a post waiting for approval or scheduled. |
No output schema declared.
No examples provided.
get_upgrade_link Show plans and get an upgrade link ~179
Returns PostWire's paid plans with their monthly price and what each includes (posts a month, brands, AI drafts a day, networks per post, scheduled posts at a time), the account's current plan, and a checkout link for one plan (the next plan up when none is given). The link opens a Stripe payment page in the browser and nothing is charged unless the user pays there; for an account that already has a subscription it opens the plan page of the PostWire dashboard.
| Name | Type | Req | Description |
|---|---|---|---|
| interval | string | – | Billing period of the link: month (default) or year (20% off, billed once a year). |
| plan | string | – | Plan to check out. Omit for the next plan up. Enterprise (more than 50 clients, custom limits, invoicing) is agreed by email: hello@postwire.io. |
No output schema declared.
No examples provided.
get_uploaded_file Check an uploaded file ~97
Returns the status of a file uploaded through a PostWire upload link, by upload_id: "waiting" until the file has arrived, then "done" with its media_url (an https URL valid for 6 hours, renewed when the post goes out, that works as video_url or photo_url), kind (photo or video), size and content type.
| Name | Type | Req | Description |
|---|---|---|---|
| upload_id | string | yes | The upload_id returned with the upload link. |
No output schema declared.
No examples provided.
get_x_credits Show my X (Twitter) credits ~273
Shows what posting to X (Twitter) costs this account and what it has left. X is a pay-per-use add-on of the paid plans (Starter, Pro, Agency, Scale; not Free, not during a trial): 1 X credit = 1 plain X post, a post with a link uses 10, each image or video adds 1. Returns mode (paid, free, trial or internal), the plan's monthly X credits, used and left, top-up credits, X posts today against the daily limit, the price table, the last movements, and links to buy top-up credits (80 credits for $5, 340 for $20; each opens a Stripe payment page, nothing is charged unless paid there). With text, it also returns how many credits that post would use (with thread or reply: the whole chain).
| Name | Type | Req | Description |
|---|---|---|---|
| images | integer | – | Optional: images attached to that post. |
| reply | string | – | Optional: a reply under the post (or the thread), priced with it. |
| text | string | – | Optional: an X post to price before sending it. |
| thread | array | – | Optional: the posts of a thread after text, to price the whole thread. |
| video | boolean | – | Optional: a video attached to that post. |
No output schema declared.
No examples provided.
invite_teammate Invite a teammate ~279
Invites a person by email to work in this PostWire workspace with a role: admin (Everything except billing and ownership: members, brands, connections, approval rules, keys); editor (Writes, schedules and publishes posts, within each brand's approval rules); contributor (Drafts and schedules posts; every one waits for approval before it goes out); approver (Only the approvals inbox: sees the previews, approves or rejects); viewer (Read-only: sees posts, the queue, accounts and activity). Editors, contributors, approvers and viewers can be limited to some brands (brand_ids). Seats are members plus open invitations; the plan sets how many. For safety only a person signed in to the PostWire dashboard can add people: from an AI assistant or an API key nothing is sent, and the result gives instead the seats free on the plan (or, when they are all in use, the plan with more seats, its price and a checkout link), the dashboard link and the steps (Settings, Team) with this email and role, for the person to send it there.
| Name | Type | Req | Description |
|---|---|---|---|
| brand_ids | array | – | Only these brands (editor, contributor, approver, viewer). Omit for every brand. |
| string | yes | The teammate's email address. | |
| role | string | – | Their role. Default editor. |
No output schema declared.
No examples provided.
list_brands List brands and their connected accounts ~74
Lists the account's brands (one business each) with the social accounts connected to each: platform, the handle, display name, picture and profile link the network reports, when it was connected, and whether posts to it need only text, a video, or a photo or video. Also returns the plan's brand limit.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_clients List clients: brands, their client links and waiting posts ~76
Lists the account's brands (one per client) with, for each: the social accounts connected to it, its active client links (url, expiry, how many times opened and when last), and how many of its posts wait for approval. Also says whether the plan includes client links and how many brands have no social account connected yet.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_platforms List supported platforms ~76
Lists the social platforms and destinations PostWire can publish to and, for each, whether it connects with OAuth or with credentials (fields, plus optional_fields), and kind "article" for the blogs (WordPress, Dev.to, Hashnode), where a post is an article with a title. Does not need a PostWire account.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_scheduled_posts List scheduled posts ~104
Lists the account's scheduled posts (queued, held, pending_approval = waiting for a person to approve it, publishing, processing = sent and Instagram is still processing the video, done, failed, rejected = not approved, or canceled) with their id, time, platforms and status. Optional from/to limit the time range.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | – | Only posts scheduled at or after this time. |
| to | string | – | Only posts scheduled before this time. |
No output schema declared.
No examples provided.
make_video_from_text Make a short video from a post's words ~363
Makes a short vertical video from the words of a post, for networks that take only video (YouTube) or video or photos (TikTok): an MP4 of 1080x1920, 8 to 12 seconds, H.264 with AAC sound. The first line appears as a large heading and up to two more sentences appear one after another over a softly moving plain background, with royalty-free background music or silence; an optional footer line (for example the brand's name) sits under the text. Emoji, links and trailing hashtags are left out and no PostWire mark is added. Draws Latin, Greek and Cyrillic text. No AI is used and nothing is published. The file stays in the account's PostWire media storage while a scheduled post needs it, is deleted the day after that post is published, and 7 days after upload if no post uses it (2 days on the Free plan; so post or schedule it soon). Returns media_url (an https URL valid for 6 hours, renewed when the post goes out, that works as video_url), duration_s, text_on_video (the lines shown) and message_for_user. Up to 10 videos an hour per account, and per day 10 on the Free plan and 60 on paid plans.
| Name | Type | Req | Description |
|---|---|---|---|
| footer | string | – | Optional short line under the text, such as the brand or shop name. Omit for none. |
| music | string | – | Background music: auto picks one of the three beds; none gives a silent track. Default auto. |
| style | string | – | Light (warm off-white, default) or dark background. |
| text | string | yes | The post's words. The first line or sentence becomes the heading. |
No output schema declared.
No examples provided.
my_account Show my PostWire account ~266
Shows the signed-in PostWire account: plan, usage against each plan limit (posts this month, brands, AI drafts today, networks per post, scheduled posts waiting), brands, and which social accounts are connected, each with its brand and the handle, display name and picture the network reports for it. When a limit is at least 80 % used, the result includes the plan that raises it, its monthly price and a checkout link. On the free plan it also includes insights_teaser: how many What works patterns are ready and how strong they are. When no social account is connected, it includes a one-hour link to a page where several networks can be connected, and message_for_user: one plain sentence for the person. While the account has not published anything yet, next_step.say_this is one exact sentence the person can say to get the first post out (for example: connect a network and post, or post a first video). A free account that has not had a trial gets trial_offer: Pro now with the first month 50% off ("Get Pro today: first month $14.50 (50% off), then $29/month. Cancel anytime."), its terms in one sentence and its link; a trial that is running is described in trial.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
plan_week Plan and schedule a week of posts ~502
Writes one post per day for 1 to 7 days from a single topic, each day from a different angle and each platform in its own native format, and queues them to be published publicly at the given hour on each day starting tomorrow, through the connected accounts. Text only: platforms that require a video or photo (TikTok, YouTube, Instagram) are refused. Every platform must already be connected. The whole week counts as one AI draft toward the daily AI limit. Every day is written; days that do not fit in the plan's monthly post limit or in its scheduled-posts limit (Free: 3 waiting at a time) are saved as held (never published on the current plan; each says held_for) and are scheduled automatically when the plan is upgraded; the result then also gives that plan, its price and a checkout link. On a plan with a networks-per-post limit (Free: 2) each day goes out to the first platforms only, named in held_networks. Returns the queued and held items with their id, time and a preview of each platform's text; any of them can be canceled before it runs. If the brand's approval rules or a limit on this API key or connected app hold the post, nothing is published: the result has status "pending_approval", the post's id and approval_id, who was notified and a review link, and the post goes out once a person approves it from the emailed link or the PostWire dashboard — an AI assistant or an API key cannot approve it. A limit on this key or app can also refuse a post with code key_network_not_allowed, key_brand_not_allowed or key_monthly_cap_reached.
| Name | Type | Req | Description |
|---|---|---|---|
| brand_id | string | – | Brand whose accounts to use; omit for the default brand. |
| brand_voice | string | – | Optional tone or style notes. |
| days | integer | – | How many days, starting tomorrow. Default 5. |
| hour | integer | – | Hour of the day to publish, on the timezone's clock. Default 10. |
| platforms | array | yes | Text-capable platforms to post to each day, e.g. ["linkedin","bluesky"]. |
| timezone | string | – | IANA timezone of that hour, e.g. "America/Lima". Default UTC. |
| topic | string | yes | What the week is about, e.g. "our new autumn menu and the farmers behind it". |
No output schema declared.
No examples provided.
post_to_social Publish a post now ~1,343
Publishes a post immediately and publicly to the listed platforms through the social accounts connected to the user's PostWire account. A published post cannot be withdrawn from PostWire. Accepts one text for all platforms or a separate per_platform draft for each. YouTube requires video_url; TikTok requires video_url or photos (photo_url or media); Instagram requires a photo or video, and two or more media items make a carousel. Every platform must already be connected; otherwise nothing is published and the error names the missing ones. The same payload sent twice within 2 minutes is refused as a duplicate unless idempotency_key differs. When a platform is connected in more than one brand and brand_id is omitted, nothing is published and the error lists the brands. Returns { posted, published_to, results: [{ platform, ok, id?, url?, account?, error? }] }, where account and published_to name the handle and brand each post went to. After the account's first post through this connection, next_step proposes a week of posts on the same topic for the text networks it went to (its topic and platforms); nothing is queued until the person asks for it. The plan sets how many networks one post goes out to (Free: 2): only the first platforms in the list are published and each of the others comes back with ok: false, held: true and code networks_per_post (its version was written and not sent), listed in held_networks with a one-sentence held_message, and message_for_user says it in plain words for the person; every network can still be connected and written for. TikTok and Instagram videos may still be processing when this returns (status processing, no url yet). When the networks-per-post or the monthly post limit stops a platform, the result also names the plan that lifts it, its price and a checkout link, and, for a free account that has not had one, a link to Pro with the first month 50% off (trial_offer: paid today, then the regular monthly price, cancel anytime). Such a…
| Name | Type | Req | Description |
|---|---|---|---|
| brand_id | string | – | Which brand's accounts to use. Omit to use the default brand. |
| idempotency_key | string | – | Optional unique key; a repeat with the same key within 24 h is refused instead of posted twice. |
| media | array | – | Several images (or images and videos) in one post, in order: an Instagram carousel (up to 10), TikTok photo post (up to 35 images; PNG is converted to JPEG automatically for Instagram and TikTok), Bl… |
| per_platform | object | – | Per-platform drafts: { "<platform>": { "text": "…", "title": "…", "tags": ["…"] } }. X, Bluesky and Mastodon also take "thread" (the posts after text, in order, each a reply to the one before; media… |
| photo_url | string | – | Public https URL of an image. |
| platforms | array | yes | Platforms to publish to, all in one call, e.g. ["linkedin","bluesky"]. |
| privacy | string | – | Who can see the TikTok and YouTube posts: public (everyone), unlisted (YouTube), friends (TikTok mutual followers) or private (only the account owner). TikTok asks that the account owner choose this… |
| text | string | – | Post text used for every platform that has no per_platform draft. |
| title | string | – | Title, used by YouTube. |
| upload_method | string | – | TikTok only, videos only: the "upload method" editors use so TikTok leaves the file as exported. PostWire rewrites the MP4 header on the way to TikTok (nothing is re-encoded, no size limit beyond the… |
| video_url | string | – | Public https URL of a video. Required for YouTube; TikTok takes a video or photos. |
No output schema declared.
No examples provided.
replicate_top_post Draft new posts modelled on a top post ~205
Writes new drafts, one per platform, that reuse the structure, opening type, length, format and tone of one of the account's published posts, on a new topic or a new angle; the reference post's sentences are not reused. Nothing is published or scheduled. Takes the id of a published post of the account (the ids that the account's post performance results list). Counts toward the account's daily AI limit. Available depending on the account's plan. Returns { drafts: { <platform>: { text, title?, tags? } }, reference }.
| Name | Type | Req | Description |
|---|---|---|---|
| brand_voice | string | – | Optional tone or style notes. |
| platforms | array | – | Platforms to write for. Default: the reference post's platform. |
| post_id | string | yes | The id of the reference post: one of the account's published posts, as listed in its post performance results. |
| topic | string | – | Optional new topic. Omit for a new angle on the same subject. |
No output schema declared.
No examples provided.
schedule_post Schedule a post ~1,220
Queues a post to be published at a future time (run_at, ISO 8601 with timezone, up to 365 days ahead), or in the brand's next free queue slot (run_at "next_slot": the earliest weekly slot all its platforms share that no other waiting post of the brand uses; the result gives the time chosen) through the connected accounts. Takes the same content fields as publishing now. Every platform must already be connected and media must suit each platform, or it is refused now instead of failing later. When a platform is connected in more than one brand and brand_id is omitted, nothing is queued and the error lists the brands. Returns the queued item with its id and, for each platform, the handle and brand it will publish to. The plan sets how many posts can wait in the queue at once (Free: 3): past that the post is not refused but saved as held (code queue_limit, status held) — kept, never published on the current plan, and scheduled automatically when the plan is upgraded; the result then also gives that plan, its price and a checkout link. On a plan with a networks-per-post limit (Free: 2) only the first platforms are published when it runs; the result names the others in held_networks. A queued or held post can be canceled before it runs. X (Twitter) is a pay-per-use add-on on paid plans: each X post uses X credits (1 for a plain post, 10 for a post with a link, +1 per image or video) from the plan's monthly X credits, then from top-up credits; a post without enough credits is not sent to X and its result says how to get more. An X thread: per_platform.x.thread is the list of posts after per_platform.x.text (up to 25, each at most 280 characters as X counts them, a link counts 23); per_platform.x.reply is one more post under the last one, the usual place for a link. Each post of a thread or reply is an X post: it uses credits by the same rule and counts toward the daily X limit, and the whole chain is reserved before anything is sent. Write a thread only when the user asks…
| Name | Type | Req | Description |
|---|---|---|---|
| brand_id | string | – | Brand whose accounts to use; omit for the default brand. |
| label | string | – | Optional short label shown in the PostWire queue. |
| media | array | – | Several images (or images and videos) in one post, in order: an Instagram carousel (up to 10), TikTok photo post (up to 35 images; PNG is converted to JPEG automatically for Instagram and TikTok), Bl… |
| per_platform | object | – | Per-platform drafts: { "<platform>": { "text": "…" } }. X, Bluesky and Mastodon also take "thread": ["…"] (the posts after text; X max 25, Bluesky and Mastodon max 9 more, each within the network's l… |
| photo_url | string | – | Public https URL of an image. |
| platforms | array | yes | Platforms to publish to. |
| privacy | string | – | Who can see the TikTok and YouTube posts: public (everyone), unlisted (YouTube), friends (TikTok mutual followers) or private (only the account owner). TikTok asks that the account owner choose this… |
| run_at | string | yes | When to publish: ISO 8601 with offset, e.g. "2026-10-01T09:00:00-05:00", or "next_slot" for the brand's next free queue slot. |
| text | string | – | Post text for platforms without a per_platform draft. |
| timezone | string | – | With run_at next_slot: the IANA timezone to read the slots in when the brand has none saved, e.g. "America/Lima". |
| title | string | – | Title, used by YouTube. |
| upload_method | string | – | TikTok only, videos only: the "upload method" editors use so TikTok leaves the file as exported. PostWire rewrites the MP4 header on the way to TikTok (nothing is re-encoded, no size limit beyond the… |
| video_url | string | – | Public https URL of a video (YouTube needs one; TikTok takes a video or photos). |
No output schema declared.
No examples provided.
How do I install the PostWire MCP server?
PostWire is a hosted endpoint at https://postwire.io/api/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · postwire.io
claude mcp add --transport http perufitlife-postwire-mcp 'https://postwire.io/api/mcp'
What is the PostWire MCP server?
PostWire is an MCP server listed in the public MCP registry as io.github.Perufitlife/postwire-mcp. Writes a native post per network from one idea and publishes it: TikTok, Instagram, YouTube & more. This page covers its hosted endpoint (https://postwire.io/api/mcp).
Is the PostWire MCP server safe to use?
PostWire scores 80 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the PostWire MCP server expose?
PostWire exposes 26 tools: list_platforms, my_account, generate_posts, post_to_social, schedule_post, and 21 more. Their descriptions and schemas cost roughly 8,473 tokens of context every time the server is loaded.
Does the PostWire MCP server require authentication?
No. We connected to PostWire without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the PostWire MCP server still maintained?
PostWire is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What did VerifyMCP test on the PostWire MCP server?
VerifyMCP ran 13 checks on PostWire, covering TLS certificate, Authorization, HTTPS, HSTS header and 9 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.