uplika
REMOTE · API.UPLIKA.COM · SCANNED SEP 20
Publish to social channels from your AI agent. Threads is live; nine more await review.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security89
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability63
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 10616 tokens (~241/item across 44 items; 44 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage94
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 83% of tool parameters carry a description.Partial
Tool Safety96
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 5 of 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "get_publish_options" implies "publish" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
- An AI judge read all 44 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the uplika MCP server?
uplika is a hosted endpoint at https://api.uplika.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · api.uplika.com
claude mcp add --transport http com-uplika-uplika 'https://api.uplika.com/mcp'
{
"mcpServers": {
"com-uplika-uplika": {
"url": "https://api.uplika.com/mcp"
}
}
} {
"servers": {
"com-uplika-uplika": {
"type": "http",
"url": "https://api.uplika.com/mcp"
}
}
} [mcp_servers.com-uplika-uplika] url = "https://api.uplika.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-uplika-uplika": {
"type": "remote",
"url": "https://api.uplika.com/mcp",
"enabled": true
}
}
} openclaw mcp add com-uplika-uplika --url 'https://api.uplika.com/mcp' --transport streamable-http
mcp_servers:
com-uplika-uplika:
url: "https://api.uplika.com/mcp" {
"McpServers": {
"com-uplika-uplika": {
"Transport": "http",
"Url": "https://api.uplika.com/mcp"
}
}
} assistant mcp add com-uplika-uplika -t streamable-http -u 'https://api.uplika.com/mcp'
{
"mcpServers": {
"com-uplika-uplika": {
"type": "http",
"url": "https://api.uplika.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 −1
- New tool “approve_reply”, which the server declares destructive security
- New tool “enable_automation”, which the server declares destructive security
- New tool “put_automation”, which the server declares destructive security
- New tool “send_dm”, which the server declares destructive security
- Tool “list_platforms” rewrote its description, which is the text the model reads security
- Tool coverage: 98% → 83% ▼ functional
- Schema quality: 282 → 241 ▲ functional
- New tool “create_automation” functional
- New tool “create_comment_to_dm” functional
- New tool “disable_automation” functional
- New tool “get_automation” functional
- New tool “get_contact” functional
- New tool “list_automation_runs” functional
- New tool “list_automation_templates” functional
- New tool “list_automations” functional
- New tool “list_conversations” functional
- New tool “list_mentions” functional
- New tool “read_conversation” functional
- “publish” added an optional parameter “automation” cosmetic
- 18 Sept 26 0
- New tool “delete_reply”, which the server declares destructive security
- Tool “publish” rewrote its description, which is the text the model reads security
- Tool “retry_post” rewrote its description, which is the text the model reads security
- Tool “update_post” rewrote its description, which is the text the model reads security
- Destructive annotations: 75% → 80% ▲ functional
- 17 Sept 26 0
- New tool “follow”, which the server declares destructive security
- New tool “like”, which the server declares destructive security
- Tool “media_upload_status” rewrote its description, which is the text the model reads security
- Tool “publish” rewrote its description, which is the text the model reads security
- Tool “retry_post” rewrote its description, which is the text the model reads security
- Tool “update_post” rewrote its description, which is the text the model reads security
- Schema quality: 6379 → 7540 ▼ functional
- New tool “naver_layout” functional
- “media_upload_status” added an optional parameter “offset” cosmetic
- “reply” added an optional parameter “secret” cosmetic
- 16 Sept 26 +56
- Authorization: unverified → pass ▲ security
- Injection markers: unverified → pass ▲ security
- Stability: unverified → pass ▲ security
- New tool “publish_now”, which the server declares destructive security
- Tool “delete_post” rewrote its description, which is the text the model reads security
- Tool “list_channel_posts” rewrote its description, which is the text the model reads security
- Tool “list_platforms” rewrote its description, which is the text the model reads security
- Tool “list_posts” rewrote its description, which is the text the model reads security
- Tool “media_presign” rewrote its description, which is the text the model reads security
- Tool “publish” rewrote its description, which is the text the model reads security
- Schema quality: 5107 → 6379 ▼ functional
- Endpoint reachability: behind authorisation → reachable ▲ functional
- MCP protocol: unverified → pass ▲ functional
- Tool coverage: unverified → 100 ▲ functional
- Destructive annotations: 3 of 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "get_publish_options" implies "publish" and declares readOnlyHint instead, contradicting what its own name says it does. functional
- New tool “get_publish_options” functional
- New tool “update_post” functional
- “list_posts” added an optional parameter “since” cosmetic
- “list_posts” added an optional parameter “sort” cosmetic
- “list_posts” added an optional parameter “until” cosmetic
- “publish” added an optional parameter “batchId” cosmetic
- “publish” added an optional parameter “draft” cosmetic
- “publish” added an optional parameter “scheduledAt” cosmetic
- “list_posts” reworded the description of “status” cosmetic
- “media_presign” reworded the description of “contentType” cosmetic
- “publish” reworded the description of “options” cosmetic
- “publish” reworded the description of “wait” cosmetic
- 15 Sept 26 −57
- Endpoint reachability: reachable → behind authorisation ▼ security
- Authorization: pass → unverified ▼ security
- Stability: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: Schema blocked by authentication: the endpoint requires auth we don't have to read it. functional
- 14 Sept 26 0
- Tool “publish” rewrote its description, which is the text the model reads security
- Tool “retry_post” rewrote its description, which is the text the model reads security
- “publish” reworded the description of “mediaIds” cosmetic
- 13 Sept 26 0
- New tool “bridge_status” functional
- 11 Sept 26 0
- Tool “delete_post” rewrote its description, which is the text the model reads security
- Tool “media_presign” rewrote its description, which is the text the model reads security
- Tool “publish” rewrote its description, which is the text the model reads security
- New tool “refresh_account” functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Probed https://api.uplika.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=uplika.com | CN=WE1,O=Google Trust Services,C=US | 1 Sept 2026 | 30 Nov 2026 | ECDSA 256 | ECDSA-SHA256 | 88e5206531d3697c13503c38224fc38c |
| SANs: uplika.com, *.uplika.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of api.uplika.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| uplika.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer resource_metadata="https://api.uplika.com/.well-known/oauth-protected-resource", scope="accounts:read posts:read posts:write offline_access"
Bearer resource_metadata="https://api.uplika.com/.well-known/oauth-protected-resource", scope="accounts:read posts:read posts:write offline_access" Protected resource metadata
| Document | https://api.uplika.com/.well-known/oauth-protected-resource |
|---|---|
| Retrieved | Yes |
| Resource | https://api.uplika.com |
| Authorisation server | https://api.uplika.com/api/auth |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.uplika.com/mcp | Verified | 200 | |
| http (plaintext) | http://api.uplika.com/mcp | HTTPS enforced | 301 | https://api.uplika.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
approve_reply Approve a held reply (Threads) ~126
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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | yes | – |
| approve | boolean | – | Default true. |
| replyId | string | – | Omit to list the pending queue instead. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
bridge_status Check the Naver Blog extension and how to wake Chrome ~209
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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | – | Limit to one Naver Blog account. Omit to cover every connected Naver Blog account. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
create_automation Create an automation from a template (draft) ~154
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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | yes | Connected account id from list_accounts. |
| enabled | boolean | – | Default false. |
| name | string | – | – |
| params | object | yes | The template's params. |
| templateId | string | yes | Template id from list_automation_templates. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
create_comment_to_dm Create a comment-to-DM automation (draft) ~461
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).
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | yes | Connected Instagram or Facebook account id from list_accounts. |
| buttonTitle | string | – | Button under the private reply, at most 20 characters. |
| deliver | object | yes | What to send after the tap: text, link, and/or a media id. |
| enabled | boolean | – | Default false. Prefer leaving it off and calling enable_automation after the person confirms. |
| keywords | array | – | Trigger words in the comment. Empty means every comment. |
| match | string | – | – |
| message | string | yes | The private reply. One message. |
| name | string | – | – |
| notFollowingMessage | string | – | – |
| post | – | yes | Our post id, the platform post id, a link to the post, "any", or "next". |
| publicReply | array | – | Optional public replies under the comment; one is picked at random. |
| recheckTitle | string | – | – |
| requireFollow | boolean | – | Instagram only. Deliver only to followers; others are asked to follow and check again. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
delete_post Delete a post ~340
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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 acco… |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
delete_reply Delete a reply ~223
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.
| Name | Type | Req | Description |
|---|---|---|---|
| postId | string | yes | 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 o… |
| replyId | string | yes | Reply id from list_replies |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
disable_automation Stop an automation ~82
Stop an automation. Runs already waiting for a button stay waiting but nothing new starts.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | – |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
enable_automation Turn an automation live ~117
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | – |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
follow Follow a blog ~227
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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | – | Which connected account to act as. Only needed when the workspace has more than one Naver Blog. |
| blog | string | yes | The blog to follow: its id (the part after blog.naver.com/) or any link to it. |
| message | string | – | Message sent with a mutual request. Naver shows it to the other blog. Ignored otherwise. |
| mutual | boolean | – | true for a mutual-neighbor request. Default false. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
get_automation Read one automation ~106
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Automation id from list_automations. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
get_contact Read a contact ~140
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | – |
| refresh | boolean | – | Re-read the profile from the channel first. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
get_insights Get post metrics ~155
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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 acco… |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
get_post Get one post ~142
One publish: per-target status and the reason any target failed. For a post link you probably want open_post instead.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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 acco… |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
get_publish_options Check what a channel needs before publishing ~201
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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | yes | The connected account to ask about. Required: these values are per account. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
get_quota Get remaining publishing quota ~147
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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | – | Limit to one account. Omit to cover every connected channel. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
hide_reply Hide a reply ~194
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.
| Name | Type | Req | Description |
|---|---|---|---|
| hide | boolean | – | true hides it, false shows it again. Defaults to true. |
| postId | string | yes | 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 o… |
| replyId | string | yes | Reply id from list_replies |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
like Like a post or a reply ~252
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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 acco… |
| replyTo | string | – | Reply id from list_replies to like that reply instead of the post. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
list_accounts List connected accounts ~141
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.
| Name | Type | Req | Description |
|---|---|---|---|
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
list_automation_runs List an automation's runs ~138
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.
| Name | Type | Req | Description |
|---|---|---|---|
| before | string | – | – |
| id | string | yes | – |
| limit | integer | – | – |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
list_automation_templates List automation templates ~121
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.
| Name | Type | Req | Description |
|---|---|---|---|
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
list_automations List automations ~94
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.
| Name | Type | Req | Description |
|---|---|---|---|
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
list_channel_posts List posts on the channel ~189
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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | – | Limit to one account. Omit to cover every connected channel. |
| limit | number | – | 1-100, defaults to 25 |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
list_conversations List inbox conversations ~148
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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | – | – |
| kind | string | – | – |
| limit | integer | – | – |
| search | string | – | – |
| state | string | – | – |
| unread | boolean | – | – |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
list_mentions List Threads mentions ~103
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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | – | – |
| unread | boolean | – | – |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
list_platforms List platform limits ~218
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.
| Name | Type | Req | Description |
|---|---|---|---|
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
list_posts List posts published here ~341
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.
| Name | Type | Req | Description |
|---|---|---|---|
| before | string | – | A publish id from a previous page's nextBefore. Returns the ones older than it. |
| limit | number | – | 1-100, defaults to 20 |
| since | string | – | 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. |
| sort | string | – | scheduled orders by the post's date ascending (soonest first) and drops paging. Omit for newest first. |
| status | string | – | Narrow to one or more statuses, comma separated: scheduled, draft, publishing, published, partial, failed or cancelled. Omit for everything. |
| until | string | – | YYYY-MM-DD or ISO 8601. Only posts dated at or before this (a date means the whole day). |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
list_replies List replies to a post ~161
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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 acco… |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
media_complete Finish a media upload ~109
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Media id from media_presign |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
media_from_url Add media from a public URL ~190
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.
| Name | Type | Req | Description |
|---|---|---|---|
| altText | string | – | What the image shows, for people using screen readers. Applied to carousel items. |
| url | string | yes | Public https URL of the image or video file itself. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
media_presign Start a direct media upload ~323
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.
| Name | Type | Req | Description |
|---|---|---|---|
| altText | string | – | What the image shows, for people using screen readers. Write it whenever you can see the image. Applied to carousel items. |
| bytes | number | yes | File size in bytes |
| contentType | string | yes | image/jpeg or image/png or image/webp or image/gif or video/mp4 or video/quicktime or video/webm |
| fileName | string | yes | – |
| height | number | – | Pixel height, if you know it |
| width | number | – | Pixel width, if you know it |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
media_upload_link Create an upload link ~171
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.
| Name | Type | Req | Description |
|---|---|---|---|
| note | string | – | One line shown on the upload page, e.g. what you need them to upload. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
media_upload_status Check upload status ~190
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.
| Name | Type | Req | Description |
|---|---|---|---|
| offset | integer | – | Skip this many images before returning previews (default 0). |
| token | string | yes | The token from media_upload_link. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
naver_layout Preview the Naver Blog layout before publishing ~352
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.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | The markdown body you plan to publish. |
| form | string | – | Form preset id (default photo-story). GET /v1/naver/forms lists them. |
| forms | – | – | "all" for every preset, or a list of preset ids. Returns layouts[] instead of one layout. |
| mediaIds | array | – | The media ids you will attach. Photos not referenced in the body get placed. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
open_post Open a post with replies and metrics ~167
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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 acco… |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
publish Publish a post ~1,798
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…
| Name | Type | Req | Description |
|---|---|---|---|
| accountIds | array | yes | Account ids from select_channels |
| automation | object | – | Attach an automation to this post in the same call. template defaults to comment_to_dm; params are that template's params (see list_automation_templates) minus post, which is this post. Created as a… |
| batchId | string | – | 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 | string | – | Post text |
| draft | boolean | – | 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. |
| mediaIds | array | – | Media ids from media_presign (confirmed with media_complete), media_from_url or media_upload_link. On Naver Blog you can leave out ids the body already points at with media:<id>; we pick those up fro… |
| options | object | – | Per-channel settings, keyed by channel id. Only the channels you are posting to need an entry. Every channel takes content to override the shared text for that channel alone. |
| scheduledAt | string | – | ISO 8601 time with a timezone offset (2026-09-20T09:00:00+09:00) to send the post at, on every channel. 10 minutes to 365 days from now. We keep the post as scheduled until then; the person can still… |
| threadItems | array | – | Split a long post into a chain instead of calling publish and then reply. The first item is the root and the rest become replies under it, in order. We handle the ordering and the waiting. Each item… |
| topicTag | string | – | One topic to tag the post with, like a category. Only some channels take one, and those reject periods and ampersands in it. If any channel in accountIds does not take topics the whole call is refuse… |
| wait | boolean | – | 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 g… |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
publish_now Send a scheduled or draft post now ~192
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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 acco… |
| wait | boolean | – | Hold the response until the post is really out, same as on publish. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
put_automation Replace an automation's flow ~249
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.
| Name | Type | Req | Description |
|---|---|---|---|
| doc | object | yes | One automation flow. triggers start it, nodes are the steps, start names the first node. Waiting is not a node: a send node with buttons and next: null waits for the person to tap one, and that butto… |
| id | string | yes | – |
| name | string | – | – |
| version | integer | yes | – |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
read_conversation Read a conversation ~101
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | – |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
refresh_account Re-read a channel's metadata ~167
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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | yes | The account id from list_accounts. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
reply Reply to a post ~239
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.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | – |
| id | string | yes | 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 acco… |
| replyTo | string | – | Reply id from list_replies. Omit to reply to the post itself. |
| secret | boolean | – | Naver Blog only: post it as a secret comment that only the blog owner can read. Other channels refuse it. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
retry_post Retry a failed post ~392
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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 acco… |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
select_channels Select channels to post to ~257
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.
| Name | Type | Req | Description |
|---|---|---|---|
| scope | – | – | Omit to list candidates, "all" for every active channel, or an array of platform names, handles or account ids. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
send_dm Send a message in a conversation ~195
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.
| Name | Type | Req | Description |
|---|---|---|---|
| draftId | string | – | Message id of an AI draft to send instead of new text. |
| id | string | yes | Conversation id from list_conversations. |
| mediaId | string | – | Optional media id from media_presign. |
| text | string | – | – |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
update_post Edit a scheduled or draft post ~594
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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountIds | array | – | New target accounts, from select_channels. Replaces the current set. |
| content | string | – | New post text. |
| draft | boolean | – | true turns a scheduled post back into a draft. |
| id | string | yes | 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 acco… |
| mediaIds | array | – | New media, in order. Replaces the current set. |
| options | object | – | Per-channel settings, same shape as on publish. Replaces the whole object. |
| scheduledAt | string|null | – | New send time (ISO 8601 with offset, 10 minutes to 365 days out), or null to keep the post as a draft instead. |
| workspaceId | string | – | 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. |
No output schema declared.
No examples provided.
What is the uplika MCP server?
uplika is an MCP server listed in the public MCP registry as com.uplika/uplika. Publish to social channels from your AI agent. Threads is live; nine more await review. This page covers its hosted endpoint (https://api.uplika.com/mcp).
Is the uplika MCP server safe to use?
uplika scores 88 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the uplika MCP server expose?
uplika exposes 44 tools: list_accounts, select_channels, list_platforms, list_posts, list_channel_posts, and 39 more. Their descriptions and schemas cost roughly 10,616 tokens of context every time the server is loaded.
Does the uplika MCP server require authentication?
Yes. uplika asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the uplika MCP server still maintained?
uplika is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.