Talandor
Public MCP report

uplika

https://api.uplika.com/mcp

Official Registry

Official Registry · com.uplika/uplika · Publisher: com.uplika

Last observed

Usable now
Can I use it?

Usable now

A public MCP contract was observed. Add the endpoint to a compatible client below. A Watch can alert you if this contract changes.

https://api.uplika.com/mcp
Tools44
AuthNo authentication challenge observed
Protocol2025-11-25
EvidencePublic contract observed
Latency11285 ms

See the measured evidence

Client fit

Compatibility is inferred from published configuration rules and is not manually verified in each client.

Claude
Observed 2025-11-25.
Likely compatible · inferred
Cursor
Streamable HTTP and public HTTPS were observed.
Likely compatible · inferred
ChatGPT
Public tool names, descriptions and schemas were observed. Plan and workspace access still apply.
Likely compatible · inferred
VS Code
Public remote HTTP configuration can be assessed.
Likely compatible · inferred
Generic MCP
Observed 2025-11-25.
Likely compatible · inferred
Show compatibility evidence

Rule evidence: Remote HTTPS rule v0.2 · reviewed 2026-09-12 · Remote HTTP rule v0.2 · reviewed 2026-09-12 · Remote app rule v0.2 · reviewed 2026-09-12 · Protocol and transport rule v0.2 · reviewed 2026-09-12

What changed

Public contract stable since
Last compared · No semantic contract change since the previous complete snapshot.
Info
approve_reply was removed
· critical · high confidence · approve_reply · Rule: tool-removed
Critical
create_automation was removed
· critical · high confidence · create_automation · Rule: tool-removed
Critical
create_comment_to_dm was removed
· critical · high confidence · create_comment_to_dm · Rule: tool-removed
Critical
disable_automation was removed
· critical · high confidence · disable_automation · Rule: tool-removed
Critical
enable_automation was removed
· critical · high confidence · enable_automation · Rule: tool-removed
Critical
get_automation was removed
· critical · high confidence · get_automation · Rule: tool-removed
Critical
get_contact was removed
· critical · high confidence · get_contact · Rule: tool-removed
Critical
list_automation_runs was removed
· critical · high confidence · list_automation_runs · Rule: tool-removed
Critical
list_automation_templates was removed
· critical · high confidence · list_automation_templates · Rule: tool-removed
Critical
list_automations was removed
· critical · high confidence · list_automations · Rule: tool-removed
Critical
list_conversations was removed
· critical · high confidence · list_conversations · Rule: tool-removed
Critical
list_mentions was removed
· critical · high confidence · list_mentions · Rule: tool-removed
Critical
put_automation was removed
· critical · high confidence · put_automation · Rule: tool-removed
Critical
read_conversation was removed
· critical · high confidence · read_conversation · Rule: tool-removed
Critical
send_dm was removed
· critical · high confidence · send_dm · Rule: tool-removed
Critical
publish changed its input schema
· warning · medium confidence · publish · Rule: input-schema-changed
Warning

A Watch would alert only if this change may affect the selected client.

Show 35 quieter observations
approve_reply was added
· info · high confidence · approve_reply · Rule: tool-added
Info
create_automation was added
· info · high confidence · create_automation · Rule: tool-added
Info
create_comment_to_dm was added
· info · high confidence · create_comment_to_dm · Rule: tool-added
Info
disable_automation was added
· info · high confidence · disable_automation · Rule: tool-added
Info
enable_automation was added
· info · high confidence · enable_automation · Rule: tool-added
Info
get_automation was added
· info · high confidence · get_automation · Rule: tool-added
Info
get_contact was added
· info · high confidence · get_contact · Rule: tool-added
Info
list_automation_runs was added
· info · high confidence · list_automation_runs · Rule: tool-added
Info
list_automation_templates was added
· info · high confidence · list_automation_templates · Rule: tool-added
Info
list_automations was added
· info · high confidence · list_automations · Rule: tool-added
Info
list_conversations was added
· info · high confidence · list_conversations · Rule: tool-added
Info
list_mentions was added
· info · high confidence · list_mentions · Rule: tool-added
Info
list_platforms changed its title or description
· info · high confidence · list_platforms · Rule: documentation-changed
Info
publish added an optional input field automation
· info · high confidence · publish · Rule: optional-input-added
Info
put_automation was added
· info · high confidence · put_automation · Rule: tool-added
Info
read_conversation was added
· info · high confidence · read_conversation · Rule: tool-added
Info
send_dm was added
· info · high confidence · send_dm · Rule: tool-added
Info
list_platforms changed its title or description
· info · high confidence · list_platforms · Rule: documentation-changed
Info
approve_reply was added
· info · high confidence · approve_reply · Rule: tool-added
Info
create_automation was added
· info · high confidence · create_automation · Rule: tool-added
Info
create_comment_to_dm was added
· info · high confidence · create_comment_to_dm · Rule: tool-added
Info
disable_automation was added
· info · high confidence · disable_automation · Rule: tool-added
Info
enable_automation was added
· info · high confidence · enable_automation · Rule: tool-added
Info
get_automation was added
· info · high confidence · get_automation · Rule: tool-added
Info
get_contact was added
· info · high confidence · get_contact · Rule: tool-added
Info
list_automation_runs was added
· info · high confidence · list_automation_runs · Rule: tool-added
Info
list_automation_templates was added
· info · high confidence · list_automation_templates · Rule: tool-added
Info
list_automations was added
· info · high confidence · list_automations · Rule: tool-added
Info
list_conversations was added
· info · high confidence · list_conversations · Rule: tool-added
Info
list_mentions was added
· info · high confidence · list_mentions · Rule: tool-added
Info
list_platforms changed its title or description
· info · high confidence · list_platforms · Rule: documentation-changed
Info
publish added an optional input field automation
· info · high confidence · publish · Rule: optional-input-added
Info
put_automation was added
· info · high confidence · put_automation · Rule: tool-added
Info
read_conversation was added
· info · high confidence · read_conversation · Rule: tool-added
Info
send_dm was added
· info · high confidence · send_dm · Rule: tool-added
Info
Evidence and limitations

Method: anonymous Streamable HTTP probe. We never invoke a tool.

Attempted protocols: 2026-07-28, 2025-11-25

Protocol2025-11-25
TransportStreamable HTTP
AuthNo authentication challenge observed
EvidencePublic contract observed
Total latency11285 ms
Response bytes78851

No diagnostic errors.

Server-provided content. Tool names, descriptions and schemas below are copied from the MCP server. They may be in another language. Talandor does not translate or verify them.
Tools and declared exposure

Server annotations are declarations, not verified behavior.

Show 44 of 44 server-provided tool definitions
approve_reply
Declared destructive
Show server-provided details
Approve a held reply (Threads)
Server description (copied; language not verified)
Threads only: approve (or ignore) a reply held by reply approval on one of the account's posts. Approving makes it public. Read the queue with pending: true.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "accountId"
  ],
  "properties": {
    "approve": {
      "type": "boolean",
      "description": "Default true."
    },
    "replyId": {
      "type": "string",
      "description": "Omit to list the pending queue instead."
    },
    "accountId": {
      "type": "string"
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
bridge_status
Declared read-only
Show server-provided details
Check the Naver Blog extension and how to wake Chrome
Server description (copied; language not verified)
Naver Blog only. Posts to Naver Blog are written by the uplika browser extension inside the user's own Chrome, so nothing goes out while that Chrome is closed. Call this before publishing to Naver Blog. If online is false, the response carries wake commands per OS that open Chrome on the user's computer in the profile that has the extension (found by extension id). If you have a shell on that computer, run the one for its OS, then call this again or get_post; the extension reconnects within about a minute and queued posts go out. publish also returns the same bridge object when the extension is offline.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "properties": {
    "accountId": {
      "type": "string",
      "description": "Limit to one Naver Blog account. Omit to cover every connected Naver Blog account."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
create_automation
Annotation present; effect not classified
Show server-provided details
Create an automation from a template (draft)
Server description (copied; language not verified)
Create an automation from any template in list_automation_templates by passing its params. Creates a draft. For a flow no template covers, build the document yourself and call put_automation on the draft.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "accountId",
    "params",
    "templateId"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "params": {
      "type": "object",
      "description": "The template's params."
    },
    "enabled": {
      "type": "boolean",
      "description": "Default false."
    },
    "accountId": {
      "type": "string",
      "description": "Connected account id from list_accounts."
    },
    "templateId": {
      "type": "string",
      "description": "Template id from list_automation_templates."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
create_comment_to_dm
Annotation present; effect not classified
Show server-provided details
Create a comment-to-DM automation (draft)
Server description (copied; language not verified)
The most common automation: when someone comments on a post, DM them. **Creates a draft; nothing goes out until enable_automation.** How Meta works: a DM cannot be started by the account. The only automatic door is a private reply to a comment, one per comment, within 7 days of the comment, and once the person answers the 24-hour window opens for the rest. Instagram can check whether the person follows the account (requireFollow); Facebook cannot, so requireFollow is rejected there. Threads has no DMs at all; use create_automation with comment_public_reply. Files go through media_presign first and are passed as deliver.mediaId. post can be our post id, the post's own id on the platform, a link to the post, "any" for every post, or "next" for the next post you publish (or pass automation on publish to do both in one call).
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "accountId",
    "deliver",
    "message",
    "post"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "post": {
      "description": "Our post id, the platform post id, a link to the post, \"any\", or \"next\"."
    },
    "match": {
      "enum": [
        "contains",
        "is",
        "whole_word",
        "begins_with",
        "thumbs_up",
        "not_contains"
      ],
      "type": "string"
    },
    "deliver": {
      "type": "object",
      "properties": {
        "link": {
          "type": "string"
        },
        "text": {
          "type": "string"
        },
        "mediaId": {
          "type": "string"
        },
        "mediaKind": {
          "enum": [
            "file",
            "image",
            "video"
          ],
          "type": "string"
        }
      },
      "description": "What to send after the tap: text, link, and/or a media id."
    },
    "enabled": {
      "type": "boolean",
      "description": "Default false. Prefer leaving it off and calling enable_automation after the person confirms."
    },
    "message": {
      "type": "string",
      "description": "The private reply. One message."
    },
    "keywords": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Trigger words in the comment. Empty means every comment."
    },
    "accountId": {
      "type": "string",
      "description": "Connected Instagram or Facebook account id from list_accounts."
    },
    "buttonTitle": {
      "type": "string",
      "description": "Button under the private reply, at most 20 characters."
    },
    "publicReply": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional public replies under the comment; one is picked at random."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    },
    "recheckTitle": {
      "type": "string"
    },
    "requireFollow": {
      "type": "boolean",
      "description": "Instagram only. Deliver only to followers; others are asked to follow and check again."
    },
    "notFollowingMessage": {
      "type": "string"
    }
  }
}
delete_post
Declared destructive
Show server-provided details
Delete a post
Server description (copied; language not verified)
Delete a post from the channel for good. This is not reversible, so confirm with the person first. Daily delete limits differ per channel: Threads 100 a day, Instagram only on accounts connected via Facebook, with no documented daily cap, YouTube 20 a day, Facebook 50 a day, Bluesky 35000 a day, Telegram only within 48 hours of publishing, with no documented daily cap, Naver Blog through the browser extension, with no documented daily cap, TikTok has no delete API; posts can only be removed in the app. On a scheduled or draft post nothing is on any channel yet, so this simply cancels it and removes our record. On Threads and YouTube this also works on posts written in the channel's own app, given the link. Instagram only lets us delete on accounts connected via Facebook: an account connected with Instagram login cannot be deleted through us at all, so tell the person to delete it in the Instagram app. Facebook only lets us delete Page posts this app published, so a post made in the Facebook app cannot be deleted through us.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
delete_reply
Declared destructive
Show server-provided details
Delete a reply
Server description (copied; language not verified)
Delete a comment for good. This is not hide_reply: it cannot be undone. What it reaches differs by channel and list_platforms says which ones support it at all. On Instagram and Facebook it removes anyone's comment on your post; on Threads and Bluesky a reply is itself a post, so it only removes replies the connected account wrote. Prefer hide_reply when the person just wants it out of sight.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "postId",
    "replyId"
  ],
  "properties": {
    "postId": {
      "type": "string",
      "description": "The post the reply sits under. A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."
    },
    "replyId": {
      "type": "string",
      "description": "Reply id from list_replies"
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
disable_automation
Annotation present; effect not classified
Show server-provided details
Stop an automation
Server description (copied; language not verified)
Stop an automation. Runs already waiting for a button stay waiting but nothing new starts.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
enable_automation
Declared destructive
Show server-provided details
Turn an automation live
Server description (copied; language not verified)
Turn an automation live. **This is the moment messages start going to real people.** Confirm with the person first. Refuses with reconsent_required if the account was connected before DM permissions, and warns if the account is not subscribed to webhooks.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
follow
Declared destructive
Show server-provided details
Follow a blog
Server description (copied; language not verified)
Follow an account on the channel. Naver Blog only today: adds the blog as a neighbor. mutual: true sends a mutual-neighbor request that the other blog has to accept, so the result is pending until they do; without it the blog is added as a plain neighbor right away. Already a neighbor comes back as already. There is no unfollow.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "blog"
  ],
  "properties": {
    "blog": {
      "type": "string",
      "description": "The blog to follow: its id (the part after blog.naver.com/) or any link to it."
    },
    "mutual": {
      "type": "boolean",
      "description": "true for a mutual-neighbor request. Default false."
    },
    "message": {
      "type": "string",
      "description": "Message sent with a mutual request. Naver shows it to the other blog. Ignored otherwise."
    },
    "accountId": {
      "type": "string",
      "description": "Which connected account to act as. Only needed when the workspace has more than one Naver Blog."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
get_automation
Declared read-only
Show server-provided details
Read one automation
Server description (copied; language not verified)
One automation as a document: triggers, nodes, start. Also returns version, which put_automation needs, and templateParams when the flow still has its template shape.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Automation id from list_automations."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
get_contact
Declared read-only
Show server-provided details
Read a contact
Server description (copied; language not verified)
One contact: name, username, whether they follow the account and whether it follows them (Instagram only, and only for people who have messaged), follower count, tags, opt-out, and when the messaging window closes. Follower lists do not exist on any channel; this is the closest thing.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "refresh": {
      "type": "boolean",
      "description": "Re-read the profile from the channel first."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
get_insights
Declared read-only
Show server-provided details
Get post metrics
Server description (copied; language not verified)
Views, likes, replies, reposts, quotes and shares for one publish. Views and shares can be null when the platform does not report them yet — null is not zero.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
get_post
Declared read-only
Show server-provided details
Get one post
Server description (copied; language not verified)
One publish: per-target status and the reason any target failed. For a post link you probably want open_post instead.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
get_publish_options
Declared read-only
Show server-provided details
Check what a channel needs before publishing
Server description (copied; language not verified)
What a channel needs to know before you publish to it. Only TikTok has this today; every other channel returns not_supported, which is not an error to work around. For TikTok it returns the creator nickname the post will go out as, the privacy levels this account may use right now, whether it can post at all, and its video length limit. Call it before every TikTok publish: the values are per account and change when the person edits their TikTok settings. options.tiktok.privacyLevel is required and has no default, so this is where you get the value to pass.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "accountId"
  ],
  "properties": {
    "accountId": {
      "type": "string",
      "description": "The connected account to ask about. Required: these values are per account."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
get_quota
Declared read-only
Show server-provided details
Get remaining publishing quota
Server description (copied; language not verified)
How much of the 24 hour allowance is already used for posts, replies and deletes. Check this before a burst of publishing. This is live usage from the platform, not the static limits in list_platforms. We also cap how fast one account can publish, so publish can return rate_limited even when the platform allowance still has room.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "properties": {
    "accountId": {
      "type": "string",
      "description": "Limit to one account. Omit to cover every connected channel."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
hide_reply
Declared destructive
Show server-provided details
Hide a reply
Server description (copied; language not verified)
Hide a reply on the channel, or show it again with hide: false. The reply id comes from list_replies, and postId is the publish it belongs to.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "postId",
    "replyId"
  ],
  "properties": {
    "hide": {
      "type": "boolean",
      "description": "true hides it, false shows it again. Defaults to true."
    },
    "postId": {
      "type": "string",
      "description": "The post the reply sits under. A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."
    },
    "replyId": {
      "type": "string",
      "description": "Reply id from list_replies"
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
like
Declared destructive
Show server-provided details
Like a post or a reply
Server description (copied; language not verified)
Like a post, or a reply under it when you pass replyTo. Idempotent: if it is already liked the call succeeds with already: true and nothing is toggled. There is no unlike. Naver Blog only today; other channels answer not_supported. On Naver Blog the post can belong to another blog: pass its link and we act as the connected account. Naver ignores liking your own post, and that comes back as naver_not_allowed rather than a fake success.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here. On Naver Blog a link to someone else's post works too."
    },
    "replyTo": {
      "type": "string",
      "description": "Reply id from list_replies to like that reply instead of the post."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
list_accounts
Declared read-only
Show server-provided details
List connected accounts
Server description (copied; language not verified)
Connected social accounts. **Call this before publishing anything.** Each item has id, platform (threads etc.), handle and status. The accountIds you pass to publish are these ids, and only "active" ones publish. If the person did not name a channel, target every active account. If the list is empty, no channel is connected yet. Send the person to https://uplika.com/dashboard/connections.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "properties": {
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
list_automation_runs
Declared read-only
Show server-provided details
List an automation's runs
Server description (copied; language not verified)
Runs of one automation with their status and a step log. Status names why a run stopped: blocked_window (24-hour window closed), blocked_opt_out, blocked_paused (a person is handling that conversation), blocked_burst, failed_channel, expired, superseded, waiting, done.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "limit": {
      "type": "integer"
    },
    "before": {
      "type": "string"
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
list_automation_templates
Declared read-only
Show server-provided details
List automation templates
Server description (copied; language not verified)
Ready-made automation templates with the params each one takes. Read this before create_automation. Every template lists the channels it works on. The most used one is comment_to_dm: a comment on a post gets one private reply with a button, and tapping it delivers a link or file inside the messaging window.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "properties": {
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
list_automations
Declared read-only
Show server-provided details
List automations
Server description (copied; language not verified)
Automations on the connected accounts: name, channel, whether it is live or a draft, triggers, run count. Use get_automation to read one flow's document.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "properties": {
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
list_channel_posts
Declared read-only
Show server-provided details
List posts on the channel
Server description (copied; language not verified)
What is actually on the channel right now, including posts written in the channel's own app. Use this to find a post when you do not have its link. Each item carries a permalink you can pass straight to open_post, reply or delete_post. An empty list does not always mean the account has no posts: on TikTok this reads public videos only, so it stays empty while the app is awaiting TikTok's Content Posting audit and every post goes out private.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "number",
      "description": "1-100, defaults to 25"
    },
    "accountId": {
      "type": "string",
      "description": "Limit to one account. Omit to cover every connected channel."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
list_conversations
Declared read-only
Show server-provided details
List inbox conversations
Server description (copied; language not verified)
The inbox: DM conversations on Instagram and Facebook and mention threads on Threads. Each item says whether the 24-hour window is open and how long is left. state: open (default) or closed. kind: dm or mention.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "properties": {
    "kind": {
      "enum": [
        "dm",
        "mention"
      ],
      "type": "string"
    },
    "limit": {
      "type": "integer"
    },
    "state": {
      "enum": [
        "open",
        "closed"
      ],
      "type": "string"
    },
    "search": {
      "type": "string"
    },
    "unread": {
      "type": "boolean"
    },
    "accountId": {
      "type": "string"
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
list_mentions
Declared read-only
Show server-provided details
List Threads mentions
Server description (copied; language not verified)
Threads posts that mention the connected account, delivered by webhook. Same shape as list_conversations with kind mention. Reply with send_dm, which posts publicly.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "properties": {
    "unread": {
      "type": "boolean"
    },
    "accountId": {
      "type": "string"
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
list_platforms
Declared read-only
Show server-provided details
List platform limits
Server description (copied; language not verified)
Every channel and its rules: character limit, whether media is required, image and video limits, and what state the channel is in. Read this instead of guessing a platform's limits. status says who can connect: live means anyone; beta means the channel is in platform review and only accounts registered as testers on our app can connect yet, though publishing works normally for those accounts; bridge means it needs the user's browser extension running; soon means it is not connectable at all. charCount tells you how that channel counts a character, so you can check the length before calling publish instead of after it fails. options is the JSON Schema of what options.<channel> takes on publish: which fields exist, which are required, and the allowed values. Read it instead of guessing a channel's settings.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "properties": {
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
list_posts
Declared read-only
Show server-provided details
List posts published here
Server description (copied; language not verified)
Recent publishes made through us and the per-target status of each, scheduled and draft posts included (their status says so and scheduledAt says when). Newest first, 20 by default. Pass limit for more or fewer, up to 100. hasMore means the list was cut short; pass the returned nextBefore as before to keep going. To answer "what is scheduled this week", pass status scheduled with since and until and sort scheduled. Posts that already existed on the channel are not here. Use list_channel_posts for those.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "properties": {
    "sort": {
      "enum": [
        "scheduled"
      ],
      "type": "string",
      "description": "scheduled orders by the post's date ascending (soonest first) and drops paging. Omit for newest first."
    },
    "limit": {
      "type": "number",
      "description": "1-100, defaults to 20"
    },
    "since": {
      "type": "string",
      "description": "YYYY-MM-DD or ISO 8601. Only posts dated at or after this. A scheduled post is dated by its scheduledAt, a sent post by when it was created."
    },
    "until": {
      "type": "string",
      "description": "YYYY-MM-DD or ISO 8601. Only posts dated at or before this (a date means the whole day)."
    },
    "before": {
      "type": "string",
      "description": "A publish id from a previous page's nextBefore. Returns the ones older than it."
    },
    "status": {
      "type": "string",
      "description": "Narrow to one or more statuses, comma separated: scheduled, draft, publishing, published, partial, failed or cancelled. Omit for everything."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
list_replies
Declared read-only
Show server-provided details
List replies to a post
Server description (copied; language not verified)
The whole reply thread under a post, nested replies included. `truncated` tells you we stopped before the end. The count here can differ from the replies metric in get_insights, which is normal.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
media_complete
Annotation present; effect not classified
Show server-provided details
Finish a media upload
Server description (copied; language not verified)
Step 2 of attaching an image or video. Call it after the upload finishes. We check the file really landed before marking it ready. Only a ready media id can be passed to publish.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Media id from media_presign"
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
media_from_url
Annotation present; effect not classified
Show server-provided details
Add media from a public URL
Server description (copied; language not verified)
Attach an image or video that is already on the public web. We download it, copy it into our storage and give you a media id you can pass to publish. One step, no upload needed. https only. Google Drive and Dropbox **share** links do not work: they return an HTML preview page, not the file. Use a direct file URL that ends in the file itself. If you can see the image, write altText describing it.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "Public https URL of the image or video file itself."
    },
    "altText": {
      "type": "string",
      "description": "What the image shows, for people using screen readers. Applied to carousel items."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
media_presign
Annotation present; effect not classified
Show server-provided details
Start a direct media upload
Server description (copied; language not verified)
Step 1 of attaching an image or video. Returns a media id and a one-time uploadUrl. PUT the file bytes to uploadUrl with the same contentType, then call media_complete. Images: image/jpeg, image/png, image/webp, image/gif, up to 20MB. Video: video/mp4, video/quicktime, video/webm, up to 8GB, 43200 seconds, 4096px wide. Aspect ratio up to 20:1. Any image pixel width is fine. If you can see the image, write altText describing it. The response has mediaExpiresAt: this media id disappears after that time if it was never published, and publish will then fail with media_expired.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "bytes",
    "contentType",
    "fileName"
  ],
  "properties": {
    "bytes": {
      "type": "number",
      "description": "File size in bytes"
    },
    "width": {
      "type": "number",
      "description": "Pixel width, if you know it"
    },
    "height": {
      "type": "number",
      "description": "Pixel height, if you know it"
    },
    "altText": {
      "type": "string",
      "description": "What the image shows, for people using screen readers. Write it whenever you can see the image. Applied to carousel items."
    },
    "fileName": {
      "type": "string"
    },
    "contentType": {
      "type": "string",
      "description": "image/jpeg or image/png or image/webp or image/gif or video/mp4 or video/quicktime or video/webm"
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
media_upload_link
Annotation present; effect not classified
Show server-provided details
Create an upload link
Server description (copied; language not verified)
Ask the person to upload files from their own device. Returns a short-lived link. **Give the link to the person, then wait.** Poll media_upload_status with the token until it returns ready, and only then call publish with the media ids it gives you. Do not publish before the status is ready. Use this when the file is on their computer or phone; use media_from_url when the file already has a public https address.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "properties": {
    "note": {
      "type": "string",
      "description": "One line shown on the upload page, e.g. what you need them to upload."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
media_upload_status
Declared read-only
Show server-provided details
Check upload status
Server description (copied; language not verified)
Has the person uploaded yet? Returns waiting, ready or expired, plus every media id uploaded through that link. Pass those ids to publish as mediaIds. Ready images also come back as image blocks so you can SEE each photo and place it in the right paragraph: previewIds[i] is the media id of the i-th image. Up to 20 images per call; pass offset to see the rest. A media with duplicateOf is the same bytes as that other id — use one of them.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "token"
  ],
  "properties": {
    "token": {
      "type": "string",
      "description": "The token from media_upload_link."
    },
    "offset": {
      "type": "integer",
      "description": "Skip this many images before returning previews (default 0)."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
naver_layout
Declared read-only
Show server-provided details
Preview the Naver Blog layout before publishing
Server description (copied; language not verified)
Naver Blog only. Shows how publish will lay the body out before anything goes out. By default (layout: template) publish reshapes the markdown into the blog's house form: #/## titles become underlined quote headings, a thin rule sits between sections, photos you did not place with media: references go one per section and the rest pair up at the end. Text never changes. Call this with the same content and mediaIds you will publish, show the person the result if they care about structure, then publish (it applies the same layout) or pass options.naver_blog.layout: "as-is" to publish exactly what you wrote. To let the person choose a form, pass forms: "all" (or a list of ids): you get every preset laid out side by side with its name, when to use it and a summary (sections, photos). Show them, let the person pick, then publish with options.naver_blog.form set to the chosen id. The server never picks for you.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "content"
  ],
  "properties": {
    "form": {
      "type": "string",
      "description": "Form preset id (default photo-story). GET /v1/naver/forms lists them."
    },
    "forms": {
      "anyOf": [
        {
          "enum": [
            "all"
          ],
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ],
      "description": "\"all\" for every preset, or a list of preset ids. Returns layouts[] instead of one layout."
    },
    "content": {
      "type": "string",
      "description": "The markdown body you plan to publish."
    },
    "mediaIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The media ids you will attach. Photos not referenced in the body get placed."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
open_post
Declared read-only
Show server-provided details
Open a post with replies and metrics
Server description (copied; language not verified)
Everything about one post in a single call: the text, the whole reply thread, and its metrics. This is the right tool when someone hands you a post link. Replies or metrics can come back null if the platform refused just that part.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
publish
Declared destructive
Show server-provided details
Publish a post
Server description (copied; language not verified)
Post to social channels. Channels open today: threads, instagram, youtube, facebook, bluesky, telegram, naver_blog, tiktok. Get accountIds from select_channels — do not guess which channel the person meant. Naver Blog caps how many posts one ID publishes; when it does, this returns 429 naver_rate_limited with retryAfterSeconds. Do not call again before that, the draft is already in Naver. Naver Blog asks which form to publish with, every post: if options.naver_blog.form is missing this returns 400 naver_form_required with forms (id, name, when). The form is the house style to use when the person has no style of their own, so read the conversation first. If they dictated the structure or you laid it out yourself, pass options.naver_blog.layout: "as-is" and the markdown goes out unchanged. Otherwise show them the forms (naver_layout with forms: "all" lays every one out side by side) and call again with the one they pick. Do not pick for them. Text limits differ per channel: Threads 500 characters, Instagram 2200 characters, YouTube 5000 UTF-8 bytes, Facebook 63206 characters, Bluesky 300 graphemes and 3000 UTF-8 bytes, Telegram 4096 characters (1024 with media attached), Naver Blog 30000 characters, TikTok 2200 characters. Over the limit nothing goes out to any channel, so shorten it before calling. Images and video both work on the channels that take them. How several items sit in one post differs per channel: Threads groups up to 20 items in one post, Instagram groups up to 10 items in one post, YouTube takes 1 video and no images, Facebook groups up to 10 items in one post, Bluesky has no carousel and places up to 4 images in the post itself, Telegram groups up to 10 items in one post, Naver Blog has no carousel and places up to 40 images in the post itself, TikTok groups up to 35 items in one post. More than a channel takes is not refused: the first items up to its limit go out and that target's warning says what was left out. A channel that cannot mix images and video keeps the video. YouTube is different: it takes exactly one video, no images, and it needs options.youtube.title. Its description is measured in UTF-8 bytes, so Korean and Japanese cost three per character. Instagram cannot publish text alone: every post needs at least one image or video. A single video becomes a reel there. Set options.instagram.contentType to story for a story; stories show no caption. Non-JPEG images are converted for Instagram automatically. Facebook publishes to a Page, never a personal profile. options.facebook.link makes a link post (no media alongside), and a single video becomes a reel (3-90 seconds). Bluesky counts graphemes, not characters, and also caps UTF-8 bytes, so a post of 300 emoji can fail on the byte limit. Set options.bluesky.langs to the language of the text (1-3 BCP-47 codes like ["ko"]): without it the post never appears in language-scoped feeds, and Bluesky has no post editing to fix it later. Links, @mentions and #hashtags in the text are made clickable for you, and a link gets a preview card, so write the URL plainly. There are three ways to get a media id, pick by where the file is: media_from_url when it already has a public https address, media_upload_link when it is on the person's own device, media_presign plus media_complete when you can PUT the bytes yourself. Then pass the media ids here. On Naver Blog the body can also place media itself with ![alt](media:<id>) and @video(media:<id>), each on a line of its own. Ids you reference that way are picked up even if you leave them out of mediaIds, and media you pass but never reference goes at the end of the post. Those references only work when every target is Naver Blog: other channels would publish the markup as literal text, so we refuse instead. This publishes immediately unless you pass scheduledAt (we hold the post and send it at that time, on every channel) or draft: true (nothing goes out; the person or update_post finishes it later). scheduledAt needs a … [server-provided text truncated]
Input schema (truncated preview — do not copy)
{
  "type": "object",
  "required": [
    "accountIds"
  ],
  "properties": {
    "wait": {
      "type": "boolean",
      "description": "Hold the response until the post is really out. Text waits up to 10 seconds, posts with media up to 90 seconds. If it is still going after that you get the usual publishing response and should poll get_post. Defaults to false. Ignored with scheduledAt or draft."
    },
    "draft": {
      "type": "boolean",
      "description": "true saves the post as a draft on uplika without sending anything. Use it when the person wants to review before it goes out. They finish it in the dashboard, or you call update_post and publish_now."
    },
    "batchId": {
      "type": "string",
      "description": "Optional tag (letters, digits, - or _) to group posts made together, for example the same text sent to two workspaces. Pass the same value on each call."
    },
    "content": {
      "type": "string",
      "description": "Post text"
    },
    "options": {
      "type": "object",
      "properties": {
        "tiktok": {
          "type": "object",
          "properties": {
            "title": {
              "type": "string",
              "maxLength": 90,
              "description": "Required for a photo post, up to 90 characters. A video post has no title field at all and passing one is rejected; a video's text comes from content."
            },
            "isAigc": {
              "type": "boolean",
              "description": "Declare that the content was generated by AI. Worth setting when you made the video or images."
            },
            "content": {
              "type": "string",
              "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content."
            },
            "postMode": {
              "enum": [
                "direct",
                "draft"
              ],
              "type": "string",
              "description": "direct (default) posts to the profile. draft sends it to the creator's TikTok inbox; they open the notification and finish it in the app, choosing the visibility themselves. While this app awaits the Content Posting audit this is the only way to get something out publicly: a direct post can only be SELF_ONLY, but on this path we send no visibility at all. The trade is that it is not on the profile until the person finishes it, so there is no link and no metrics in the meantime."
            },
            "disableDuet": {
              "type": "boolean",
              "description": "Turn duets off for this post. Video posts only."
            },
            "privacyLevel": {
              "type": "string",
              "description": "Required unless postMode is draft. One of the values that get_publish_options returns for this account, e.g. PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR or SELF_ONLY. The list differs per account, so do not hard-code it."
            },
            "disableStitch": {
              "type": "boolean",
              "description": "Turn stitches off for this post. Video posts only."
            },
            "disableComment": {
              "type": "boolean",
              "description": "Turn comments off for this post. Cannot be set to false if the creator disabled comments account-wide."
            },
            "brandContentToggle": {
              "type": "boolean",
              "description": "Declare paid partnership content (\"Branded Content\"). TikTok does not allow branded content to be private, so this cannot be combined with privacyLevel SELF_ONLY."
            },
            "brandOrganicToggle": {
              "type": "boolean",
              "description": "Declare that the post promotes the creator's own brand (\"Your Brand\"). Leave it out rather than sending false: not declaring and declaring 'no' are different statements."
            },
            "videoCoverTimestampMs": {
              "type": "number",
              "minimum": 0,
              "description": "Which frame to use as the cover, in milliseconds into the video. TikTok does not accept a cover image file, only a timestamp."
            }
          },
          "description": "TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. While this app is awaiting TikTok's Content Posting audit a direct post can only be SELF_ONLY and comes back with no link and no metrics; if the person wants it public in the meantime, use postMode draft instead."
        },
        "bluesky": {
          "type": "object",
          "properties": {
            "langs": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$",
                "description": "One BCP-47 code."
              },
              "maxItems": 3,
              "description": "The language of the text, 1-3 BCP-47 codes like [\"ko\"] or [\"en\", \"ko\"]. Feed generators filter on this, so without it the post never appears in language-scoped feeds. Bluesky has no post editing, so this cannot be fixed after publishing. Set it to the language the text is actually written in."
            },
            "content": {
              "type": "string",
              "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content."
            }
          },
          "description": "Bluesky settings. Optional, but langs is worth setting on every post."
        },
        "threads": {
          "type": "object",
          "properties": {
            "content": {
              "type": "string",
              "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content."
            },
            "topicTag": {
              "type": "string",
              "maxLength": 64,
              "description": "One topic to tag the post with, like a category. Threads takes exactly one and rejects periods and ampersands in it. On a thread it goes on the first piece only. Leave it out unless the person asked for a topic."
            }
          },
          "description": "Threads settings. Optional."
        },
        "youtube": {
          "type": "object",
          "required": [
            "title"
          ],
          "properties": {
            "tags": {
              "type": "array",
              "items": {
                "type": "string",
                "description": "One search tag."
              },
              "description": "Search tags. 500 characters across all of them; a tag with a space costs two extra for the quotes YouTube adds."
            },
            "title": {
              "type": "string",
              "maxLength": 100,
              "description": "Video title, up to 100 characters. Required. Cannot contain < or >."
            },
            "content": {
              "type": "string",
              "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content."
            },
            "publishAt": {
              "type": "string",
              "description": "ISO 8601 time to make the video public. Only works with privacyStatus private, and only on a video that was never public. This is YouTube's own scheduling; for scheduling across channels use scheduledAt on the post."
            },
            "categoryId": {
              "type": "string",
              "description": "YouTube category id. Defaults to 22 (People & Blogs). Leave it out unless the person named a category."
            },
            "madeForKids": {
              "type": "boolean",
              "description": "Whether this video is directed at children. This is a legal declaration about someone else's channel. Leave it out unless the person tells you, and the channel's own default applies."
            },
            "privacyStatus": {
              "enum": [
                "public",
                "unlisted",
                "private"
              ],
              "type": "string",
              "description": "Defaults to private. We pass this through as you set it. If YouTube applies something else, the result carries a warning saying what it actually applied."
            },
            "thumbnailMediaId": {
              "type": "string",
              "description": "Media id of a JPEG or PNG up to 2MB to use as the thumbnail. Long-form only: YouTube does not take custom thumbnails on Shorts, and a vertical video of three minutes or less becomes a Short. The channel also has to be verified before YouTube accepts one."
            },
            "containsSyntheticMedia": {
              "type": "boolean",
              "description": "Set true when the video contains realistic altered or synthetic content, including AI generated footage of real-looking people, places or events."
            }
          },
          "description": "Required when a YouTube account is in accountIds. The post content becomes the video description."
        },
        "facebook": {
          "type": "object",
          "properties": {
            "link": {
              "type": "string",
              "description": "Makes a link post with a preview card. Cannot be combined with media."
            },
            "title": {
              "type": "string",
              "description": "Reel title, separate from the caption."
            },
            "content": {
              "type": "string",
              "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content."
            },
            "contentType": {
              "enum": [
                "feed",
                "story",
                "reel"
              ],
              "type": "string",
              "description": "What kind of post. Defaults to reel for a single video and feed otherwise. A Facebook story is rejected if you send any text: publish the story with no content, and put the words in a feed post instead. A story also takes exactly one image or video and no first comment."
            },
            "firstComment": {
              "type": "string",
              "description": "A comment we post right after publishing. Not on stories, and not on scheduled posts. If it fails the post still goes up, with a warning."
            },
            "scheduledPublishTime": {
              "type": "string",
              "description": "ISO 8601 time to publish a feed post later, 10 minutes to 28 days from now. Feed posts only, not reels or stories. Cannot be combined with firstComment (a scheduled post is not live yet, so nothing to comment on). This is Facebook's own scheduling; for scheduling across channels use scheduledAt on the post."
            }
          },
          "description": "Facebook Page settings. Optional: plain text publishes without it."
        },
        "telegram": {
          "type": "object",
          "properties": {
            "content": {
              "type": "string",
              "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to us
… [server-provided details truncated]
publish_now
Declared destructive
Show server-provided details
Send a scheduled or draft post now
Server description (copied; language not verified)
Send a scheduled or draft post right now instead of waiting. Returns while it is still publishing, like publish; pass wait: true to hold for the result. A draft needs at least one target account first. Posts that already went out return post_not_editable.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."
    },
    "wait": {
      "type": "boolean",
      "description": "Hold the response until the post is really out, same as on publish."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
put_automation
Declared destructive
Show server-provided details
Replace an automation's flow
Server description (copied; language not verified)
Replace an automation's whole document. Pass the version you got from get_automation; a stale version is refused with version_conflict so a concurrent edit is not overwritten. Node types: send (mode window | private_reply | public_reply), condition, action, delay, random, goto, ai. Waiting is a send node with buttons and next: null; the tapped button's next continues. A loop must pass through such a wait. Validation problems come back with paths. Changing a live flow changes what goes out to people.
Input schema (truncated preview — do not copy)
{
  "type": "object",
  "required": [
    "doc",
    "id",
    "version"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "doc": {
      "type": "object",
      "required": [
        "nodes",
        "start",
        "triggers",
        "v"
      ],
      "properties": {
        "v": {
          "type": "integer",
          "const": 1
        },
        "nodes": {
          "type": "object",
          "additionalProperties": {
            "type": "object",
            "required": [
              "type"
            ],
            "properties": {
              "all": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "field",
                    "op"
                  ],
                  "properties": {
                    "op": {
                      "enum": [
                        "eq",
                        "ne",
                        "gt",
                        "lt",
                        "has",
                        "not_has",
                        "contains"
                      ],
                      "type": "string"
                    },
                    "key": {
                      "type": "string"
                    },
                    "field": {
                      "enum": [
                        "tag",
                        "follows_us",
                        "we_follow",
                        "follower_count",
                        "verified",
                        "window_open",
                        "opted_in",
                        "last_interaction_hours",
                        "field",
                        "intent",
                        "sentiment",
                        "text"
                      ],
                      "type": "string"
                    },
                    "value": {}
                  }
                }
              },
              "else": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Id of the next node, or null to stop."
              },
              "flow": {
                "type": "string"
              },
              "mode": {
                "enum": [
                  "window",
                  "private_reply",
                  "public_reply"
                ],
                "type": "string",
                "description": "send: window = inside the 24-hour window, private_reply = one DM to a commenter, public_reply = comment under the post."
              },
              "next": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Id of the next node, or null to stop."
              },
              "then": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Id of the next node, or null to stop."
              },
              "type": {
                "enum": [
                  "send",
                  "condition",
                  "action",
                  "delay",
                  "random",
                  "goto",
                  "ai"
                ],
                "type": "string"
              },
              "items": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "type"
                  ],
                  "properties": {
                    "key": {
                      "type": "string"
                    },
                    "tag": {
                      "type": "string"
                    },
                    "type": {
                      "enum": [
                        "add_tag",
                        "remove_tag",
                        "set_field",
                        "clear_field",
                        "opt_in",
                        "opt_out",
                        "open_conversation",
                        "close_conversation",
                        "assign",
                        "hide_reply",
                        "approve_reply"
                      ],
                      "type": "string"
                    },
                    "value": {
                      "type": "string"
                    },
                    "userId": {
                      "type": "string"
                    }
                  }
                }
              },
              "blocks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "type"
                  ],
                  "properties": {
                    "url": {
                      "type": "string"
                    },
                    "text": {
                      "type": "string"
                    },
                    "type": {
                      "enum": [
                        "text",
                        "image",
                        "video",
                        "audio",
                        "file",
                        "delay",
                        "card",
                        "gallery"
                      ],
                      "type": "string"
                    },
                    "cards": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "title": {
                      "type": "string"
                    },
                    "buttons": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "id",
                          "kind",
                          "title"
                        ],
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "url": {
                            "type": "string"
                          },
                          "kind": {
                            "enum": [
                              "postback",
                              "url"
                            ],
                            "type": "string"
                          },
                          "next": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Id of the next node, or null to stop."
                          },
                          "title": {
                            "type": "string",
                            "description": "At most 20 characters."
                          }
                        }
                      }
                    },
                    "mediaId": {
                      "type": "string"
                    },
                    "seconds": {
                      "type": "number"
                    },
                    "imageUrl": {
                      "type": "string"
                    },
                    "subtitle": {
                      "type": "string"
                    }
                  }
                }
              },
              "buttons": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "id",
                    "kind",
                    "title"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string"
                    },
                    "kind": {
                      "enum": [
                        "postback",
                        "url"
                      ],
                      "type": "string"
                    },
                    "next": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Id of the next node, or null to stop."
                    },
                    "title": {
                      "type": "string",
                      "description": "At most 20 characters."
                    }
                  }
                },
                "maxItems": 3
              },
              "seconds": {
                "type": "number"
              },
              "branches": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "weight"
                  ],
                  "properties": {
                    "next": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Id of the next node, or null to stop."
                    },
                    "weight": {
                      "type": "number"
                    }
                  }
                }
              },
              "escalate": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Id of the next node, or null to stop."
              },
              "maxTurns": {
                "type": "integer"
              },
              "usePersona": {
                "type": "boolean"
              },
              "instruction": {
                "type": "string"
              },
              "quickReplies": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "id",
                    "title"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "next": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Id of the next node, or null to stop."
                    },
                    "title": {
                      "type": "string"
                    }
                  }
                },
                "maxItems": 13
              }
            }
          }
        },
        "start": {
          "type": [
            "string",
            "null"
          ]
        },
        "layout": {
          "type": "object",
          "additionalProperties": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              }
            }
          }
        },
        "template": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "params": {
              "type": "object"
            }
          }
        },
        "triggers": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "kind"
            ],
            "properties": {
              "at": {
                "type": "string"
              },
              "ref": {
                "type": "string"
              },
              "tag": {
                "type": "string"
              },
              "kind": {
                "enum": [
                  "comment",
                  "live_comment",
                  "message",
                  "story_reply",
                  "story_mention",
                  "referral",
              
… [server-provided details truncated]
read_conversation
Declared read-only
Show server-provided details
Read a conversation
Server description (copied; language not verified)
One conversation with its recent messages and the contact: name, whether they follow the account (Instagram only), tags, opt-out. AI drafts waiting for approval show as status draft.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
refresh_account
Annotation present; effect not classified
Show server-provided details
Re-read a channel's metadata
Server description (copied; language not verified)
Re-read one connected channel's metadata. On Naver Blog this re-reads the blog's categories through the user's browser extension and waits up to a minute for it; list_accounts then shows the new list under naverBlog.categories. Call this when a category the person mentions is not in list_accounts yet. If the extension is offline you get 202 and the refresh runs when that browser comes back. Other channels return refresh_unsupported because their metadata is live on every call.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "accountId"
  ],
  "properties": {
    "accountId": {
      "type": "string",
      "description": "The account id from list_accounts."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
reply
Declared destructive
Show server-provided details
Reply to a post
Server description (copied; language not verified)
Reply to a post or to a reply. Leave replyTo empty to reply to the post itself; pass a reply id from list_replies to nest a reply under that reply.Like publish, this returns before the reply is live. Call get_post with the returned id to see the final status and link.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "content",
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."
    },
    "secret": {
      "type": "boolean",
      "description": "Naver Blog only: post it as a secret comment that only the blog owner can read. Other channels refuse it."
    },
    "content": {
      "type": "string"
    },
    "replyTo": {
      "type": "string",
      "description": "Reply id from list_replies. Omit to reply to the post itself."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
retry_post
Declared destructive
Show server-provided details
Retry a failed post
Server description (copied; language not verified)
Retry the targets that failed on a publish. Targets that already went out are left alone. Naver Blog caps how many posts one ID publishes; when it does, this returns 429 naver_rate_limited with retryAfterSeconds. Do not call again before that, the draft is already in Naver. Naver Blog asks which form to publish with, every post: if options.naver_blog.form is missing this returns 400 naver_form_required with forms (id, name, when). The form is the house style to use when the person has no style of their own, so read the conversation first. If they dictated the structure or you laid it out yourself, pass options.naver_blog.layout: "as-is" and the markdown goes out unchanged. Otherwise show them the forms (naver_layout with forms: "all" lays every one out side by side) and call again with the one they pick. Do not pick for them. If nothing failed you get nothing_to_retry. Only applies to posts published through us. This replays the same payload, so read errorCode and retryable on get_post first: when retryable is false the arguments have to change and you should call publish again instead. On Naver Blog a failed target may still have left a post or a draft in the editor, so check the blog before retrying.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
select_channels
Declared read-only
Show server-provided details
Select channels to post to
Server description (copied; language not verified)
Pick which connected channels to post to. **Call this before publish and show the result to the person.** Leave scope empty to get the candidate list and let them choose. Use scope: "all" for every active channel, or an array mixing platform names ("threads"), handles ("@vibe.trender") and account ids. Duplicates are folded, expired and not-yet-live channels are dropped into `skipped` with a reason, a sentence you can read to the person, and a link to reconnect. Pass the returned accountIds to publish unchanged. `limits` is the tightest rule across the chosen channels, so write to that. If both accountIds and candidates come back empty, nothing is connected yet. Send the person to https://uplika.com/dashboard/connections to connect a channel, then call this again.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "properties": {
    "scope": {
      "description": "Omit to list candidates, \"all\" for every active channel, or an array of platform names, handles or account ids."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
send_dm
Declared destructive
Show server-provided details
Send a message in a conversation
Server description (copied; language not verified)
Send a message in a conversation as the account. **Only inside the 24-hour window** after the person's last message; outside it the call is refused with window_closed and nothing can be done until they write again. On a mention thread (Threads) this posts a public reply. Pass draftId to send an AI draft that was waiting for approval. Sending pauses automations on that conversation for 30 minutes.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Conversation id from list_conversations."
    },
    "text": {
      "type": "string"
    },
    "draftId": {
      "type": "string",
      "description": "Message id of an AI draft to send instead of new text."
    },
    "mediaId": {
      "type": "string",
      "description": "Optional media id from media_presign."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}
update_post
Annotation present; effect not classified
Show server-provided details
Edit a scheduled or draft post
Server description (copied; language not verified)
Change a scheduled or draft post before it goes out: content, mediaIds, accountIds, Naver Blog caps how many posts one ID publishes; when it does, this returns 429 naver_rate_limited with retryAfterSeconds. Do not call again before that, the draft is already in Naver. Naver Blog asks which form to publish with, every post: if options.naver_blog.form is missing this returns 400 naver_form_required with forms (id, name, when). The form is the house style to use when the person has no style of their own, so read the conversation first. If they dictated the structure or you laid it out yourself, pass options.naver_blog.layout: "as-is" and the markdown goes out unchanged. Otherwise show them the forms (naver_layout with forms: "all" lays every one out side by side) and call again with the one they pick. Do not pick for them. If the Naver editor shows a "missing image" error when you open an already-published post for editing, calling update_post on that post rewrites it in place and fixes it; the URL stays the same. options, scheduledAt or draft. Fields you leave out keep their current value; options you pass replace the whole options object. scheduledAt moves the send time (same rules as publish), null turns it into a draft, and draft: true does the same. A thread only takes schedule changes. Posts that already went out return post_not_editable, except Naver Blog: a published Naver post is rewritten in place (same URL, same logNo) when you pass content, mediaIds or options — list the media ids again to keep the photos.
Input schema (server-provided preview — do not copy)
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."
    },
    "draft": {
      "type": "boolean",
      "description": "true turns a scheduled post back into a draft."
    },
    "content": {
      "type": "string",
      "description": "New post text."
    },
    "options": {
      "type": "object",
      "description": "Per-channel settings, same shape as on publish. Replaces the whole object."
    },
    "mediaIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "New media, in order. Replaces the current set."
    },
    "accountIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "New target accounts, from select_channels. Replaces the current set."
    },
    "scheduledAt": {
      "type": [
        "string",
        "null"
      ],
      "description": "New send time (ISO 8601 with offset, 10 minutes to 365 days out), or null to keep the post as a draft instead."
    },
    "workspaceId": {
      "type": "string",
      "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again."
    }
  }
}

How to use this MCP

Talandor checks the server; it does not connect the server to your assistant.

Choose your client below, then copy the endpoint or configuration. Authentication is completed with the MCP provider, never inside Talandor.

Open the official client guide (opens in a new tab)
Observation history
Operational
· stable since
2025-11-25 · 44 tools · no change · 4 checks
Operational
2025-11-25 · 29 tools
Operational
2025-11-25 · 44 tools
Unreachable now
No protocol
Operational
· stable since
2025-11-25 · 29 tools · no change · 3 checks
Unreachable now
No protocol
Operational
· stable since
2025-11-25 · 29 tools · no change · 2 checks
Unreachable now
No protocol
Operational
2025-11-25 · 29 tools
Complete public contract · 2025-11-25 · 44 tools
dcef36533ef2
Complete public contract · 2025-11-25 · 29 tools
4f328bcb8cfb
Complete public contract · 2025-11-25 · 44 tools
dcef36533ef2
Complete public contract · 2025-11-25 · 29 tools
4f328bcb8cfb

Deep monitoring eligibility

Eligible for deep monitoring

A complete public tools/list contract was observed, so a future deep-monitoring baseline can be compared safely.

Personal Watch is not open yet. This report does not start a Watch or a payment.

See public monitoring
Watch · 9 €/month

Watch this MCP

Your agent depends on this MCP. We tell you before a change breaks it.

  • Know when it goes downWe confirm an outage before we alert you, so a single failed check is not treated as a lasting outage.
  • Know when its contract changesWe compare complete public tool catalogs and authentication surfaces over time.
  • Know what changed and what to fixAn alert names the change and the next step for the client you selected.

Full public-contract coverage: Availability, protocol, auth and public tool contract changes can be compared.

Full WatchAvailability, protocol, auth and public tool contract changes
Surface WatchAvailability, TLS, protocol and auth surface — no private tool diff

When Watch is open, you will be able to add, pause, resume, replace, or remove up to five endpoints. Watch checkout is not open. This page does not start a payment. You can sign in from the header; that creates an account, not a Watch. Opening date: not announced yet. Hosted checkout remains closed.

See Watch price, terms and refunds