Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,537Letters: 14Defects: 1,323counted 4 min ago
teppi

Server definition

Hash
sha256:6eb5e8f13a34718adf3c9c0886a6d8b4cc08cb755fc94037efe978967d0f2c92
What it is
What a remote MCP server returned when asked what it offers: 18 tools

The blob, as servednamed by its sha256

{ "instructions": "PostWire publishes and schedules posts to the social accounts a user connected at postwire.io (TikTok, YouTube, Instagram, Facebook Pages, LinkedIn, Bluesky, Mastodon, Telegram, Discord).\nMany of its users are not technical: results carry message_for_user, one plain sentence that can be passed on as it is, and message_link, the link that goes with it ({ text, url }: a short label and a long address meant to be opened in a browser).\nmy_account lists the connected social accounts by brand. With none connected it returns next_step.connect_url: one page where the person taps each network and signs in to it; several networks can be connected from that one link. Connecting happens on that page, not in the chat.\nA file attached to the chat does not reach PostWire. create_upload_link returns a page where the person picks the photo or video from their phone or computer; get_uploaded_file then returns its media_url (status waiting until it has arrived).\nYouTube takes only video and TikTok video or photos. When the person has words but no video, make_video_from_text turns the post's words into a 10-second vertical video and returns a media_url that works as video_url.\npost_to_social sends one post to every connected network of a brand in a single call (platforms takes them all), with a per_platform caption written for each network; without per_platform every network gets the same text.\nTikTok asks that the account owner choose who can see each TikTok post (everyone, friends, or only them); without privacy PostWire posts it as private. YouTube uses the channel's default unless privacy is given.\nOn the Free plan one post is sent to 2 networks: the first two in the platforms list are published, the other captions are kept, and the result carries held_message and, when a free trial is available, a trial link.\nResults include each post's link. TikTok and Instagram videos are still processing when the post returns; get_post_status returns their link once the network has it.", "tools": [ { "description": "Cancels a queued or held post so it is never published. Only works before it starts publishing. Takes the id of the scheduled post.", "inputSchema": { "additionalProperties": false, "properties": { "id": { "description": "Scheduled post id.", "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "cancel_scheduled_post", "outputSchema": null }, { "description": "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.", "inputSchema": { "additionalProperties": false, "properties": { "name": { "description": "Brand name, e.g. the client's business name.", "maxLength": 80, "minLength": 1, "type": "string" } }, "required": [ "name" ], "type": "object" }, "name": "create_brand", "outputSchema": null }, { "description": "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. Returns the url of that page and message_for_user: one plain sentence telling the person what to do.", "inputSchema": { "additionalProperties": false, "properties": { "brand_id": { "description": "Brand to connect it to. Omit for the default brand.", "type": "string" }, "platform": { "description": "Platform to connect. Omit to let the user choose on the page.", "enum": [ "telegram", "bluesky", "mastodon", "discord", "tiktok", "youtube", "reddit", "linkedin", "facebook", "instagram" ], "type": "string" } }, "type": "object" }, "name": "create_connect_link", "outputSchema": null }, { "description": "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 is kept in the account's PostWire media storage for 30 days. 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.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "create_upload_link", "outputSchema": null }, { "description": "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). Nothing is published. Returns { drafts: { <platform>: { text, title?, tags? } } } and, if the writer skipped a platform, { missing: [...] }. Counts toward the account's daily AI limit.", "inputSchema": { "additionalProperties": false, "properties": { "brand_voice": { "description": "Optional tone or style notes, e.g. \"friendly, no emojis, first person plural\".", "maxLength": 1500, "type": "string" }, "media_url": { "description": "Optional public https URL of the photo or video the post is about.", "format": "uri", "type": "string" }, "platforms": { "description": "Platforms to write for, e.g. [\"linkedin\",\"x\",\"bluesky\"].", "items": { "enum": [ "telegram", "bluesky", "mastodon", "discord", "tiktok", "youtube", "reddit", "linkedin", "facebook", "instagram" ], "type": "string" }, "minItems": 1, "type": "array" }, "prompt": { "description": "The idea or message to communicate. More detail gives better drafts.", "maxLength": 4000, "minLength": 1, "type": "string" } }, "required": [ "prompt", "platforms" ], "type": "object" }, "name": "generate_posts", "outputSchema": null }, { "description": "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.", "inputSchema": { "additionalProperties": false, "properties": { "brand_id": { "description": "Only this brand's posts. Omit for all brands.", "type": "string" }, "platform": { "description": "Only posts on this network.", "enum": [ "telegram", "bluesky", "mastodon", "discord", "tiktok", "youtube", "reddit", "linkedin", "facebook", "instagram" ], "type": "string" }, "timezone": { "description": "IANA timezone for the day and time patterns, e.g. \"America/Lima\". Default UTC.", "maxLength": 60, "type": "string" } }, "type": "object" }, "name": "get_post_performance", "outputSchema": null }, { "description": "Returns the status and link of a published post, by platform and the post id returned when it was published. 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).", "inputSchema": { "additionalProperties": false, "properties": { "brand_id": { "description": "Brand whose account published it; omit for the default brand.", "type": "string" }, "id": { "description": "The post id returned when it was published on that platform.", "type": "string" }, "platform": { "description": "Platform of the post, e.g. \"tiktok\".", "enum": [ "telegram", "bluesky", "mastodon", "discord", "tiktok", "youtube", "reddit", "linkedin", "facebook", "instagram" ], "type": "string" } }, "required": [ "platform", "id" ], "type": "object" }, "name": "get_post_status", "outputSchema": null }, { "description": "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.", "inputSchema": { "additionalProperties": false, "properties": { "plan": { "description": "Plan to check out. Omit for the next plan up.", "enum": [ "starter", "pro", "agency", "scale" ], "type": "string" } }, "type": "object" }, "name": "get_upgrade_link", "outputSchema": null }, { "description": "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 24 hours that works as video_url or photo_url), kind (photo or video), size and content type.", "inputSchema": { "additionalProperties": false, "properties": { "upload_id": { "description": "The upload_id returned with the upload link.", "maxLength": 40, "minLength": 8, "type": "string" } }, "required": [ "upload_id" ], "type": "object" }, "name": "get_uploaded_file", "outputSchema": null }, { "description": "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.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "list_brands", "outputSchema": null }, { "description": "Lists the social platforms PostWire can publish to and, for each, whether it connects with OAuth or with credentials. Does not need a PostWire account.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "list_platforms", "outputSchema": null }, { "description": "Lists the account's scheduled posts (queued, publishing, processing = sent and Instagram is still processing the video, done, failed or canceled) with their id, time, platforms and status. Optional from/to limit the time range.", "inputSchema": { "additionalProperties": false, "properties": { "from": { "description": "Only posts scheduled at or after this time.", "format": "date-time", "type": "string" }, "to": { "description": "Only posts scheduled before this time.", "format": "date-time", "type": "string" } }, "type": "object" }, "name": "list_scheduled_posts", "outputSchema": null }, { "description": "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 is kept in the account's PostWire media storage for 30 days. Returns media_url (an https URL valid for 24 hours 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.", "inputSchema": { "additionalProperties": false, "properties": { "footer": { "description": "Optional short line under the text, such as the brand or shop name. Omit for none.", "maxLength": 40, "type": "string" }, "music": { "description": "Background music: auto picks one of the three beds; none gives a silent track. Default auto.", "enum": [ "auto", "lofi", "piano", "upbeat", "none" ], "type": "string" }, "style": { "description": "Light (warm off-white, default) or dark background.", "enum": [ "light", "dark" ], "type": "string" }, "text": { "description": "The post's words. The first line or sentence becomes the heading.", "maxLength": 5000, "minLength": 3, "type": "string" } }, "required": [ "text" ], "type": "object" }, "name": "make_video_from_text", "outputSchema": null }, { "description": "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.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "my_account", "outputSchema": null }, { "description": "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.", "inputSchema": { "additionalProperties": false, "properties": { "brand_id": { "description": "Brand whose accounts to use; omit for the default brand.", "type": "string" }, "brand_voice": { "description": "Optional tone or style notes.", "maxLength": 1500, "type": "string" }, "days": { "description": "How many days, starting tomorrow. Default 5.", "maximum": 7, "minimum": 1, "type": "integer" }, "hour": { "description": "Hour of the day to publish, on the timezone's clock. Default 10.", "maximum": 23, "minimum": 0, "type": "integer" }, "platforms": { "description": "Text-capable platforms to post to each day, e.g. [\"linkedin\",\"bluesky\"].", "items": { "enum": [ "telegram", "bluesky", "mastodon", "discord", "tiktok", "youtube", "reddit", "linkedin", "facebook", "instagram" ], "type": "string" }, "minItems": 1, "type": "array" }, "timezone": { "description": "IANA timezone of that hour, e.g. \"America/Lima\". Default UTC.", "maxLength": 60, "type": "string" }, "topic": { "description": "What the week is about, e.g. \"our new autumn menu and the farmers behind it\".", "maxLength": 2000, "minLength": 1, "type": "string" } }, "required": [ "topic", "platforms" ], "type": "object" }, "name": "plan_week", "outputSchema": null }, { "description": "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. 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 a 3-day free trial (trial_offer). Such an account also gets the trial link once after its first post from an assistant, with a one-sentence trial_message.", "inputSchema": { "additionalProperties": false, "properties": { "brand_id": { "description": "Which brand's accounts to use. Omit to use the default brand.", "type": "string" }, "idempotency_key": { "description": "Optional unique key; a repeat with the same key within 24 h is refused instead of posted twice.", "maxLength": 200, "type": "string" }, "media": { "description": "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), Bluesky (up to 4 images), Mastodon (up to 4), LinkedIn (up to 20 images, or one PDF document). Networks that take one item get the first. Each item: { url, type: image|video|document, alt? }.", "items": { "additionalProperties": false, "properties": { "alt": { "description": "Alt text (used by Bluesky, Mastodon and LinkedIn).", "maxLength": 1500, "type": "string" }, "title": { "description": "Document title, used by LinkedIn.", "maxLength": 200, "type": "string" }, "type": { "description": "Default image.", "enum": [ "image", "video", "document" ], "type": "string" }, "url": { "description": "Public https URL of the file.", "format": "uri", "type": "string" } }, "required": [ "url" ], "type": "object" }, "maxItems": 35, "minItems": 1, "type": "array" }, "per_platform": { "additionalProperties": { "properties": { "tags": { "items": { "type": "string" }, "type": "array" }, "text": { "type": "string" }, "title": { "type": "string" } }, "type": "object" }, "description": "Per-platform drafts: { \"<platform>\": { \"text\": \"…\", \"title\": \"…\", \"tags\": [\"…\"] } }.", "type": "object" }, "photo_url": { "description": "Public https URL of an image.", "format": "uri", "type": "string" }, "platforms": { "description": "Platforms to publish to, all in one call, e.g. [\"linkedin\",\"bluesky\"].", "items": { "enum": [ "telegram", "bluesky", "mastodon", "discord", "tiktok", "youtube", "reddit", "linkedin", "facebook", "instagram" ], "type": "string" }, "minItems": 1, "type": "array" }, "privacy": { "description": "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 for each TikTok post. Without it a TikTok post goes out private and YouTube uses the channel default.", "enum": [ "public", "unlisted", "friends", "private" ], "type": "string" }, "text": { "description": "Post text used for every platform that has no per_platform draft.", "type": "string" }, "title": { "description": "Title, used by YouTube.", "type": "string" }, "video_url": { "description": "Public https URL of a video. Required for YouTube; TikTok takes a video or photos.", "format": "uri", "type": "string" } }, "required": [ "platforms" ], "type": "object" }, "name": "post_to_social", "outputSchema": null }, { "description": "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 }.", "inputSchema": { "additionalProperties": false, "properties": { "brand_voice": { "description": "Optional tone or style notes.", "maxLength": 1500, "type": "string" }, "platforms": { "description": "Platforms to write for. Default: the reference post's platform.", "items": { "enum": [ "telegram", "bluesky", "mastodon", "discord", "tiktok", "youtube", "reddit", "linkedin", "facebook", "instagram" ], "type": "string" }, "minItems": 1, "type": "array" }, "post_id": { "description": "The id of the reference post: one of the account's published posts, as listed in its post performance results.", "type": "string" }, "topic": { "description": "Optional new topic. Omit for a new angle on the same subject.", "maxLength": 1000, "type": "string" } }, "required": [ "post_id" ], "type": "object" }, "name": "replicate_top_post", "outputSchema": null }, { "description": "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.", "inputSchema": { "additionalProperties": false, "properties": { "brand_id": { "description": "Brand whose accounts to use; omit for the default brand.", "type": "string" }, "label": { "description": "Optional short label shown in the PostWire queue.", "maxLength": 120, "type": "string" }, "media": { "description": "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), Bluesky (up to 4 images), Mastodon (up to 4), LinkedIn (up to 20 images, or one PDF document). Networks that take one item get the first. Each item: { url, type: image|video|document, alt? }.", "items": { "additionalProperties": false, "properties": { "alt": { "description": "Alt text (used by Bluesky, Mastodon and LinkedIn).", "maxLength": 1500, "type": "string" }, "title": { "description": "Document title, used by LinkedIn.", "maxLength": 200, "type": "string" }, "type": { "description": "Default image.", "enum": [ "image", "video", "document" ], "type": "string" }, "url": { "description": "Public https URL of the file.", "format": "uri", "type": "string" } }, "required": [ "url" ], "type": "object" }, "maxItems": 35, "minItems": 1, "type": "array" }, "per_platform": { "additionalProperties": { "type": "object" }, "description": "Per-platform drafts: { \"<platform>\": { \"text\": \"…\" } }.", "type": "object" }, "photo_url": { "description": "Public https URL of an image.", "format": "uri", "type": "string" }, "platforms": { "description": "Platforms to publish to.", "items": { "enum": [ "telegram", "bluesky", "mastodon", "discord", "tiktok", "youtube", "reddit", "linkedin", "facebook", "instagram" ], "type": "string" }, "minItems": 1, "type": "array" }, "privacy": { "description": "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 for each TikTok post. Without it a TikTok post goes out private and YouTube uses the channel default.", "enum": [ "public", "unlisted", "friends", "private" ], "type": "string" }, "run_at": { "description": "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.", "type": "string" }, "text": { "description": "Post text for platforms without a per_platform draft.", "type": "string" }, "timezone": { "description": "With run_at next_slot: the IANA timezone to read the slots in when the brand has none saved, e.g. \"America/Lima\".", "type": "string" }, "title": { "description": "Title, used by YouTube.", "type": "string" }, "video_url": { "description": "Public https URL of a video (YouTube needs one; TikTok takes a video or photos).", "format": "uri", "type": "string" } }, "required": [ "run_at", "platforms" ], "type": "object" }, "name": "schedule_post", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:6eb5e8f13a34718adf3c9c0886a6d8b4cc08cb755fc94037efe978967d0f2c92 | sha256sum