Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

uplika

REMOTE · API.UPLIKA.COM

Your AI agent publishes to Threads, Instagram, YouTube and the other social channels you connect.

Available components

0 this week 36 Trust /100

Last scanned (4 hours ago)

Scores higher than 19% of remote servers

Reachable. Last reached 5 Nov 2026.

Category Marketing and SEO

Trust breakdown (7 categories)

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
Transport & Reachability0
Schema Quality & AI Usability0
  • Schema blocked by authentication: the endpoint requires auth we don't have to read it. See how to fix → Unverified
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage0
  • Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Tool Safety0
  • Tool safety blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Capabilities0
  • Capabilities blocked by authentication: the endpoint requires auth we don't have to read them. See how to fix → Unverified

Unverified: 6 categories

Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm. Claim this server and supply a read-only token to verify it and lift the score.

Changelog

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.

  • 16 Oct 26 −52
    • Endpoint reachability: reachable → behind authorisation ▼ security
    • Tool safety: pass → unverified ▼ security
    • Transport: pass → unverified ▼ security
    • Stability: 0.97 → unverified ▼ security
    • Authorization: The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata. security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
  • 15 Oct 26 0
    • Stability: pass → 0.97 functional
  • 14 Oct 26 0
    • “delete_automation” reworded the description of “id” cosmetic
    • “disable_automation” reworded the description of “id” cosmetic
    • “duplicate_automation” reworded the description of “id” cosmetic
    • “enable_automation” reworded the description of “id” cosmetic
    • “get_automation” reworded the description of “id” cosmetic
    • “get_contact” reworded the description of “id” cosmetic
    • “list_automation_runs” reworded the description of “id” cosmetic
    • “list_automation_versions” reworded the description of “id” cosmetic
    • “put_automation” reworded the description of “id” cosmetic
    • “read_conversation” reworded the description of “id” cosmetic
    • “send_to_past_comments” reworded the description of “id” cosmetic
    • “update_automation” reworded the description of “id” cosmetic

    12 cosmetic changes on this day. Switch on “Show cosmetic changes” to see them.

  • 13 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “bridge_status” rewrote its description, which is the text the model reads security
    • Tool “delete_post” rewrote its description, which is the text the model reads security
    • Tool “diagnose_naver_blog” rewrote its description, which is the text the model reads security
    • Tool “expand_naver_keywords” rewrote its description, which is the text the model reads security
    • Tool “follow” rewrote its description, which is the text the model reads security
    • Tool “get_insights” rewrote its description, which is the text the model reads security
    • Tool “get_naver_keyword_history” rewrote its description, which is the text the model reads security
    • Tool “get_post” rewrote its description, which is the text the model reads security
    • Tool “like” 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_naver_drafts” rewrote its description, which is the text the model reads security
    • Tool “list_naver_keyword_reports” rewrote its description, which is the text the model reads security
    • Tool “list_replies” rewrote its description, which is the text the model reads security
    • Tool “open_post” 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 “publish_naver_draft” rewrote its description, which is the text the model reads security
    • Tool “refresh_account” rewrote its description, which is the text the model reads security
    • Tool “reply” rewrote its description, which is the text the model reads security
    • Tool “research_naver_keywords” rewrote its description, which is the text the model reads security
    • Tool “search_youtube_videos” 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
    • New tool “check_naver_visibility” functional
    • New tool “get_naver_visibility” functional
    • New tool “scan_naver_blog_visibility” functional
    • Tool “bridge_status” changed its title: Check the Naver Blog extension and how to wake Chrome → Check the Naver Blog extension and how to wake its browser cosmetic
  • 12 Oct 26 0
    • Tool “publish” rewrote its description, which is the text the model reads security
    • Tool “refresh_account” rewrote its description, which is the text the model reads security
    • New tool “search_instagram_audio” functional
  • 10 Oct 26 0
    • Tool “like” 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 “search_youtube_videos” rewrote its description, which is the text the model reads security
  • 8 Oct 26 0
    • Tool “delete_post” rewrote its description, which is the text the model reads security
    • Tool “get_post” 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 “update_post” rewrote its description, which is the text the model reads security
  • 4 Oct 26 0
    • Tool “bridge_status” rewrote its description, which is the text the model reads security
    • Tool “create_comment_to_dm” rewrote its description, which is the text the model reads security
    • Tool “enable_automation” rewrote its description, which is the text the model reads security
    • Tool “list_automation_runs” rewrote its description, which is the text the model reads security
    • Tool “list_automation_templates” 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 “select_channels” rewrote its description, which is the text the model reads security
    • “create_comment_to_dm” added an optional parameter “likeComment” cosmetic
    • “create_comment_to_dm” added an optional parameter “publicReplyInstruction” cosmetic
    • “create_comment_to_dm” added an optional parameter “publicReplyMode” cosmetic
    • “create_comment_to_dm” reworded the description of “publicReply” cosmetic
    • “publish” reworded the description of “automation” cosmetic
    • “retry_post” reworded the description of “force” cosmetic
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://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 30 Oct 2026 28 Jan 2027 ECDSA 256 ECDSA-SHA256 bc5ef96273e95cc413845802341ef422
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 connection
HTTP status 401

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"
Header Value
www-authenticate 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 Auth required 401
http (plaintext) http://api.uplika.com/mcp HTTPS enforced 301 https://api.uplika.com/mcp
MCP tools · 65 exposed · ~21,497 tokens

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 →

Tool Tokens
approve_reply ~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.

NameTypeReqDescription
accountIdstringyes–
approveboolean–Default true.
replyIdstring–Omit to list the pending queue instead.
workspaceIdstring–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 ~323

Naver Blog only. Posts to Naver Blog are written by the uplika browser extension inside the user's own browser (Chrome, Edge or Whale), so nothing goes out while that browser is closed. Call this before publishing to Naver Blog. If online is false, the response carries wake commands per OS that open that browser (browser says which) on the user's computer in the profile that has the extension (found by extension id), for the person to run. Once the browser is open the extension reconnects within about a minute and queued posts go out; call this again or get_post to check. publish also returns the same bridge object when the extension is offline. state is one of online, offline, logged_out (the browser is on but not logged in to Naver), login_needed (the Naver login saved for that blog in that browser is signed out; its posts wait until the person logs in again from the dashboard). userMessage is a sentence in the person's language to relay as it is. queued is how many posts wait for the extension; delete_post cancels them and update_post rewrites them before they go out. extensionVersion and kinds say what that extension can do.

NameTypeReqDescription
accountIdstring–Limit to one Naver Blog account. Omit to cover every connected Naver Blog account.
workspaceIdstring–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.

check_naver_visibility ~431

Naver search only. Looks each keyword up on Naver's integrated search through the person's uplika browser extension (it reads the public result page in their own browser, about 3 seconds apart; no window opens) and returns, per keyword, whether an AI briefing answers it and in which form, the briefing's body sources (rank, site, title, how many answer paragraphs cite each) and image sources, where the blog posts sit in the integrated search results, and the related questions. Pass blog to mark that blog's posts (mine: true) and get its verdict per keyword (bodyRank, imageRank, citedParagraphs, organicRank, organicArea). Up to 10 keywords. A keyword read in the last 30 minutes comes from the saved result unless fresh is true; new reads spend the person's daily allowance of 200 Naver search pages. It waits up to 60 seconds. When it answers partial: true with pending[], the extension keeps reading the rest in the background; calling again with the same keywords later returns the saved results instead of reading them twice. The answer also carries citationRules: sentence rules Uplika measured on posts the AI briefing quoted, to check a draft against as their own layer, and weaker suggestions (grade B) to offer without checking, each with its evidence and caveat (they are not Naver's criteria). Which posts Naver cites is Naver's choice; this only reports what the page shows at that moment.

NameTypeReqDescription
blogstring–A Naver blog id or any link to the blog, to mark its posts and judge them.
freshboolean–Read again even if this keyword was read in the last 30 minutes (spends the daily allowance).
keywordsarrayyes1-10 keywords, as a reader would search them.
workspaceIdstring–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 ~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.

NameTypeReqDescription
accountIdstringyesConnected account id from list_accounts.
enabledboolean–Default false.
namestring––
paramsobjectyesThe template's params.
templateIdstringyesTemplate id from list_automation_templates.
workspaceIdstring–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 ~1,027

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. A file to deliver: if it already has a public https link that returns the file itself (jpeg, png, gif, webp, mp4, mov or PDF), pass it as deliver.fileUrl and it goes to the person as-is; the link is opened once on save and a web page (a Google Drive or Dropbox share page), a private address or a dead link is rejected. If the file has no public link, upload it to Uplika first (media_upload_link without a shell, media_presign then media_complete with one) and pass deliver.mediaId (photos, videos, PDF or HWP/HWPX documents; on Instagram a document other than PDF goes as a download link, because Instagram DMs attach PDF only). Not both. 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). Only one enabled automation per account can wait for "next" (409 next_post_taken). Order when everything is on: opening DM (message + button) -> askEmail -> requireFollow -> deliver (text, up to three link buttons, file; clicks are tracked) -> followUp if no link was clicked. openingDm:false sends deliver as the private reply itself; then requireFollow, askEmail, followUp and files are rejected because the window never opens. The optional public reply under the comment is fixed sentences (publicReply) or written by the AI for each comment (publicReplyMode: "ai" with publicReplyInstruction)…

NameTypeReqDescription
accountIdstringyesConnected Instagram or Facebook account id from list_accounts.
askEmailboolean–Ask for their email after the tap and store it in contact field `email`. Three tries, then continue without.
buttonTitlestring–Button under the opening DM, at most 20 characters.
deliverobjectyesWhat to send after the tap: text, up to three link buttons, and/or one file (fileUrl or mediaId).
emailMessagestring––
emailRetrystring––
enabledboolean–Default false. Prefer leaving it off and calling enable_automation after the person confirms.
followUpstring–Sent followUpAfterMinutes later if none of deliver.links was clicked. Needs openingDm and at least one link.
followUpAfterMinutesnumber–1 to 1380 (23 hours). Default 60.
keywordsarray–Trigger words in the comment. Empty means every comment.
likeCommentboolean–Like the comment first. Instagram accounts connected through Facebook only.
matchstring––
messagestring–The opening DM (private reply). One message. Required unless openingDm is false.
namestring––
notFollowingMessagestring––
openingDmboolean–Default true. false: deliver goes out as the private reply itself (no button, no window afterwards).
poststringyesOur post id, the platform post id, a link to the post, "any", or "next".
publicReplyarray–Optional public replies under the comment, one picked at random. Posted after the private reply goes out, and skipped when it could not be sent, so a reply saying a DM was sent stays true.
publicReplyInstructionstring–With publicReplyMode ai: what the public reply should say. DM contents (links, codes, prices) are never repeated in public.
publicReplyModestring–fixed (default) uses publicReply. ai: the AI writes the public reply for each comment in the channel's persona; needs publicReplyInstruction. Counts toward the daily AI limit.
recheckTitlestring––
requireFollowboolean–Instagram only. Deliver only to followers; others are asked to follow and check again.
workspaceIdstring–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_automation ~159

Delete an automation and its run history. Cannot be undone. A live automation is refused with automation_live: disable it first, or pass force: true after the person confirms, because deleting it stops what is going out to people.

NameTypeReqDescription
forceboolean–Delete even if it is live. Default false.
idstringyesAutomation id (af_…): id in list_automations, or data.id in the create_comment_to_dm, create_automation or duplicate_automation result.
workspaceIdstring–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 ~519

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. A Naver draft (target externalId starting with draft:) is only in Naver's draft box: this cancels our record and, with extension 0.7.2 or later, removes that draft too. 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. If the account that published the post was disconnected, this returns 409 account_disconnected and deletes nothing on any channel; reconnect the same account and the post id comes back. If the response carries `bridge`, `bridge.nextStep` says what is needed: `run_wake` means the browser with the extension is closed (`bridge.browser` says which: Chrome, Edge or Whale), so tell the person `bridge.userMessage` with the `bridge.wake` command for their OS and retry once after they say it is open; `ask_user_login` / `ask_user_update` mean tell the person `bridge.userMessage`. Do not retry more than twice.

NameTypeReqDescription
idstringyesA 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…
workspaceIdstring–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 ~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.

NameTypeReqDescription
postIdstringyesThe 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…
replyIdstringyesReply id from list_replies
workspaceIdstring–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.

describe_grammar ~249

How to write the body for a channel that has its own markup. Naver Blog has one; every other platform returns not_supported, which is not an error to work around. Call this before writing a Naver Blog body for the first time, or whenever you want something the basics do not cover: highlighting a phrase, a styled table, a collage, an event block, a map with several places. Without a topic you get an overview and the list of topics; with one you get that section in full, including the mistakes that fail silently. The values come from the same grammar the publisher validates against, so what this returns is what publish accepts.

NameTypeReqDescription
platformstringyesPlatform id, e.g. naver_blog. Only naver_blog has body markup today.
topicstring–Which section. overview (default) sketches the whole thing; directives, attributes, inline, blocks, highlight, media and limits go deep.
workspaceIdstring–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.

diagnose_naver_blog ~325

Naver Blog only. Reads a blog's public RSS feed (its latest posts, at most 50) and says whether the titles are written for search: the share of titles carrying a search intent word (price, how to, review), how many start with a date or episode label, posts per month, the categories, and the words the blog repeats in titles (seedCandidates: candidates to research, not proven keywords). summary.oldest and summary.newest say which dates it read, so a quiet blog's 50 posts are not everything; summary.capped is true at 50. flags and thresholds carry the judgement (lowIntent when the intent share is under thresholds.lowIntentPct). Works for any public blog, not only connected ones, and needs no Naver keys. Cached 24 hours; a cache miss spends one of 20 diagnoses per person per day (quota in the response). This reads titles only and finishes at once. Whether the posts are actually cited by the AI briefing or shown in search is scan_naver_blog_visibility, then get_naver_visibility with the blog.

NameTypeReqDescription
blogstringyesThe blog id or any link to the blog (blog.naver.com/<id>, m.blog.naver.com/<id>/<logNo>, PostView.naver?blogId=<id>).
workspaceIdstring–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 ~114

Stop an automation. Runs already waiting for a button stay waiting but nothing new starts.

NameTypeReqDescription
idstringyesAutomation id (af_…): id in list_automations, or data.id in the create_comment_to_dm, create_automation or duplicate_automation result.
workspaceIdstring–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.

duplicate_automation ~166

Copy an automation as a new draft with the same triggers and settings, optionally with a new name. Runs and versions are not copied; a copy bound to a specific post keeps that post, a copy of a next-post flow waits for the next post again when enabled.

NameTypeReqDescription
idstringyesAutomation id (af_…): id in list_automations, or data.id in the create_comment_to_dm, create_automation or duplicate_automation result.
namestring–Default: the original name with (copy).
workspaceIdstring–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 ~270

Turn an automation live. **This is the moment messages start going to real people.** Confirm with the person first. Only one automation per account can wait for the next post: enabling a second one is refused with next_post_taken until the first binds to a post. Only one message flow without keywords (a default reply or AI replies) can be live per account, or one message would get two answers: enabling a second is refused with automation_catch_all_taken, which names the live one. Refuses with reconsent_required if the account does not hold the DM permissions (the person reconnects it), with feature_in_review if the flow uses a feature whose permission is still in Meta app review (a mention trigger, liking a comment on Instagram) and the account does not already hold it, and warns if the account is not subscribed to webhooks.

NameTypeReqDescription
idstringyesAutomation id (af_…): id in list_automations, or data.id in the create_comment_to_dm, create_automation or duplicate_automation result.
workspaceIdstring–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.

expand_naver_keywords ~255

Naver Blog only. Expands seed keywords one level through Naver autocomplete and returns every word found with the seed it came from (found[].from is seed or L1:<seed>). These are candidates to measure with research_naver_keywords, not proven keywords. The person's uplika browser extension looks them up in the background when it is on (no window opens); otherwise our server does, and via says which path answered each seed. Up to 10 seeds. Cached seven days. There is no daily cap: the extension path has no wait, and when our server answers, each person gets one expansion every 60 seconds (naver_autocomplete_busy says how long to wait). When the answer is naver_autocomplete_unavailable, neither path could run: pass your own keyword list to research_naver_keywords instead. naver_autocomplete_paused and naver_autocomplete_busy carry retryAfterSeconds.

NameTypeReqDescription
seedsarrayyes1-10 seed keywords.
workspaceIdstring–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 ~327

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. If the response carries `bridge`, `bridge.nextStep` says what is needed: `run_wake` means the browser with the extension is closed (`bridge.browser` says which: Chrome, Edge or Whale), so tell the person `bridge.userMessage` with the `bridge.wake` command for their OS and retry once after they say it is open; `ask_user_login` / `ask_user_update` mean tell the person `bridge.userMessage`. Do not retry more than twice.

NameTypeReqDescription
accountIdstring–Which connected account to act as. Only needed when the workspace has more than one Naver Blog.
blogstringyesThe blog to follow: its id (the part after blog.naver.com/) or any link to it.
messagestring–Message sent with a mutual request. Naver shows it to the other blog. Ignored otherwise.
mutualboolean–true for a mutual-neighbor request. Default false.
workspaceIdstring–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 ~193

One automation as a document: triggers, nodes, start. Also returns version, which put_automation and update_automation need, and templateParams when the flow still has its template shape. pastComments is the latest send_to_past_comments job with its progress, or null. Pass version to read an older saved version's document instead (list_automation_versions).

NameTypeReqDescription
idstringyesAutomation id (af_…): id in list_automations, or data.id in the create_comment_to_dm, create_automation or duplicate_automation result.
versioninteger–A saved version number from list_automation_versions. Leave out for the current one.
workspaceIdstring–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 ~157

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.

NameTypeReqDescription
idstringyesContact id (ct_…): contact.id in list_conversations or read_conversation.
refreshboolean–Re-read the profile from the channel first.
workspaceIdstring–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_help ~294

Uplika's troubleshooting answers: why something did not work and what the person can do about it. Call it with the error code you got (code), or with a short question in any language (query), when a call fails, when an automation did not react or a DM did not arrive, or when the person asks why something happened. Without arguments it lists every question with its id; pass id for one answer in full. Each answer has the steps, links and a url to the same answer on uplika.com that you can give the person.

NameTypeReqDescription
codestring–An error code from an Uplika response, e.g. reconsent_required or window_closed.
idstring–One answer's id from the list, e.g. thread-control.
localestring–Language of the answer. en (default) or ko; use the person's language.
platformstring–Only answers about this platform id (plus general ones), e.g. instagram.
querystring–A short question or a few words in any language, e.g. "DM not sent after button" or "ManyChat".
workspaceIdstring–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 ~255

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. If the response carries `bridge`, `bridge.nextStep` says what is needed: `run_wake` means the browser with the extension is closed (`bridge.browser` says which: Chrome, Edge or Whale), so tell the person `bridge.userMessage` with the `bridge.wake` command for their OS and retry once after they say it is open; `ask_user_login` / `ask_user_update` mean tell the person `bridge.userMessage`. Do not retry more than twice.

NameTypeReqDescription
idstringyesA 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…
workspaceIdstring–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_naver_keyword_history ~144

The measurement history of one keyword: one point per day it was actually measured, newest first, with search volume, document count and posts per month. Shows whether a keyword is rising or cooling. An empty list means nobody has measured it here yet.

NameTypeReqDescription
keywordstringyesThe keyword, as you would send it to research_naver_keywords.
limitnumber–How many days, default 100.
workspaceIdstring–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_naver_visibility ~391

Reads what uplika has recorded about Naver search and AI briefings, without reading Naver again. With blog: the report card (cards: AI citation rate, search exposure rate, keywords with an AI briefing, cited posts; axes: five scores out of 10 on uplika's own scale with the raw value and threshold of each, not a Naver score; firstThing: the lowest axis; posts with their main keyword and latest verdict; events: when a post started or stopped being cited or shown). With post (a Naver post address, or the id of a post published through Uplika): that post's check history and events. With runId: the results of one check so far. With blog, cards count every post of that blog Uplika has checked so far (earlier report cards, keyword checks with this blog, and the 1, 7 and 30 day rechecks of posts published through Uplika), not only the last scan; lastScan.total is the size of the last scan. Of the five axes, search_title, consistency and topic_focus come from the post titles; ai_cited and search_exposed come from search checks.

NameTypeReqDescription
blogstring–A Naver blog id or any link to the blog, for its report card.
poststring–A Naver post address (blog.naver.com/<id>/<logNo>) of any blog, or the id of a post published through Uplika, for that post's record.
runIdstring–A runId from check_naver_visibility or scan_naver_blog_visibility.
workspaceIdstring–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 ~301

One publish: per-target status and the reason any target failed. For a post link you probably want open_post instead. A target whose account was disconnected keeps its status and link, with connectionId null and accountHandle set to that account's handle; editing, deleting or retrying the post then returns 409 account_disconnected until the same account is reconnected, and the same post id comes back with it. If the response carries `bridge`, `bridge.nextStep` says what is needed: `run_wake` means the browser with the extension is closed (`bridge.browser` says which: Chrome, Edge or Whale), so tell the person `bridge.userMessage` with the `bridge.wake` command for their OS and retry once after they say it is open; `ask_user_login` / `ask_user_update` mean tell the person `bridge.userMessage`. Do not retry more than twice.

NameTypeReqDescription
idstringyesA 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…
workspaceIdstring–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 ~195

TikTok only. Do not call it for any other channel: 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.

NameTypeReqDescription
accountIdstringyesThe connected account to ask about. Required: these values are per account.
workspaceIdstring–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 ~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.

NameTypeReqDescription
accountIdstring–Limit to one account. Omit to cover every connected channel.
workspaceIdstring–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 ~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.

NameTypeReqDescription
hideboolean–true hides it, false shows it again. Defaults to true.
postIdstringyesThe 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…
replyIdstringyesReply id from list_replies
workspaceIdstring–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 ~479

Like a post — or a comment: pass replyTo (a reply id from list_replies) to like that comment instead of the post. Idempotent: if it is already liked the call succeeds with already: true and nothing is toggled. There is no unlike. Works on Naver Blog and on Instagram accounts connected through Facebook that hold the like permission; any other Instagram account and every other channel answer not_supported. A Facebook-connected Instagram account without that permission answers feature_in_review while the permission is in Meta app review (list_platforms shows the state), and reconsent_required once it can be granted by reconnecting. 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. On Naver Blog a secret comment, a comment hidden by Cleanbot or by the blog's blocked keywords, and every comment on a blog that turned comment likes off have no like button; those answer naver_not_allowed too, and retrying does not help. If the response carries `bridge`, `bridge.nextStep` says what is needed: `run_wake` means the browser with the extension is closed (`bridge.browser` says which: Chrome, Edge or Whale), so tell the person `bridge.userMessage` with the `bridge.wake` command for their OS and retry once after they say it is open; `ask_user_login` / `ask_user_update` mean tell the person `bridge.userMessage`. Do not retry more than twice.

NameTypeReqDescription
idstringyesA 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…
replyTostring–Reply id from list_replies to like that reply instead of the post.
workspaceIdstring–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 ~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.

NameTypeReqDescription
workspaceIdstring–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 ~228

Runs of one automation with their status and a step log. Status says where a run is or why it stopped: running, waiting, done, superseded, blocked_window (24-hour window closed), blocked_opt_out, blocked_paused (a person is handling that conversation), blocked_burst, blocked_ai_quota (the workspace used its daily automation AI limit; it resets at 00:00 UTC), failed_channel, failed_ai (the AI step could not classify the comment or write the reply; the reason is in the log as classify_failed or ai_failed), expired.

NameTypeReqDescription
beforestring––
idstringyesAutomation id (af_…): id in list_automations, or data.id in the create_comment_to_dm, create_automation or duplicate_automation result.
limitinteger––
workspaceIdstring–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 ~166

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. AI-written comment replies are comment_public_reply with replyMode "ai" (and comment_to_dm's public reply with publicReplyMode "ai"); the old template id ai_comment_reply still works and the answer says renamedFrom.

NameTypeReqDescription
workspaceIdstring–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_versions ~124

Saved versions of one automation (every put_automation or update_automation adds one). Read one with get_automation and version.

NameTypeReqDescription
idstringyesAutomation id (af_…): id in list_automations, or data.id in the create_comment_to_dm, create_automation or duplicate_automation result.
workspaceIdstring–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 ~171

Automations on the connected accounts: name, channel, whether it is live or a draft, triggers, run count, and templateParams when the flow still has its template shape. Filter by accountId, status (draft or live) or templateId. Use get_automation to read one flow's document.

NameTypeReqDescription
accountIdstring–Only automations on this connected account.
statusstring–draft = not enabled, live = enabled.
templateIdstring–Only automations made from this template (list_automation_templates).
workspaceIdstring–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 ~309

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 videos set to Only me, videos still waiting in the creator's TikTok inbox, and videos posted before Uplika passed TikTok's audit (2026-10-09) do not appear. If the response carries `bridge`, `bridge.nextStep` says what is needed: `run_wake` means the browser with the extension is closed (`bridge.browser` says which: Chrome, Edge or Whale), so tell the person `bridge.userMessage` with the `bridge.wake` command for their OS and retry once after they say it is open; `ask_user_login` / `ask_user_update` mean tell the person `bridge.userMessage`. Do not retry more than twice.

NameTypeReqDescription
accountIdstring–Limit to one account. Omit to cover every connected channel.
limitnumber–1-100, defaults to 25
workspaceIdstring–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 ~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.

NameTypeReqDescription
accountIdstring––
kindstring––
limitinteger––
searchstring––
statestring––
unreadboolean––
workspaceIdstring–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 ~159

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. Mentions need a permission of their own: when no connected Threads account holds it the list is empty and the response carries notice (code feature_in_review while that permission is in Meta app review, reconsent_required once reconnecting grants it). list_platforms shows the state.

NameTypeReqDescription
accountIdstring––
unreadboolean––
workspaceIdstring–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_naver_drafts ~290

Naver Blog only. Lists the drafts (temp-saved posts) sitting in the blog's draft box: logNo, title and the last-saved time, newest first. A post you published with options.naver_blog.draftOnly is one of them, and so is anything the person saved by hand in the Naver editor. Pass a logNo from here to publish_naver_draft. Needs the extension 0.7.2 or later in the person's browser; otherwise you get extension_outdated. If the response carries `bridge`, `bridge.nextStep` says what is needed: `run_wake` means the browser with the extension is closed (`bridge.browser` says which: Chrome, Edge or Whale), so tell the person `bridge.userMessage` with the `bridge.wake` command for their OS and retry once after they say it is open; `ask_user_login` / `ask_user_update` mean tell the person `bridge.userMessage`. Do not retry more than twice.

NameTypeReqDescription
accountIdstring–Limit to one Naver Blog account. Omit to cover every connected Naver Blog account.
workspaceIdstring–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_naver_keyword_reports ~124

Lists the person's saved keyword research (from research_naver_keywords or the dashboard), newest first: when, what they typed, the first set's main and sub keywords, and every set with its prompt. Reports belong to the person, not a workspace.

NameTypeReqDescription
limitnumber–How many, default 50.
workspaceIdstring–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 ~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.

NameTypeReqDescription
workspaceIdstring–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 ~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.

NameTypeReqDescription
beforestring–A publish id from a previous page's nextBefore. Returns the ones older than it.
limitnumber–1-100, defaults to 20
sincestring–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.
sortstring–scheduled orders by the post's date ascending (soonest first) and drops paging. Omit for newest first.
statusstring–Narrow to one or more statuses, comma separated: scheduled, draft, publishing, published, partial, failed or cancelled. Omit for everything.
untilstring–YYYY-MM-DD or ISO 8601. Only posts dated at or before this (a date means the whole day).
workspaceIdstring–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 ~261

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. If the response carries `bridge`, `bridge.nextStep` says what is needed: `run_wake` means the browser with the extension is closed (`bridge.browser` says which: Chrome, Edge or Whale), so tell the person `bridge.userMessage` with the `bridge.wake` command for their OS and retry once after they say it is open; `ask_user_login` / `ask_user_update` mean tell the person `bridge.userMessage`. Do not retry more than twice.

NameTypeReqDescription
idstringyesA 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…
workspaceIdstring–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 ~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.

NameTypeReqDescription
idstringyesMedia id from media_presign
workspaceIdstring–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 ~293

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. Accepted formats (read from the bytes, not the headers): image/jpeg, image/png, image/gif, image/webp, video/mp4, video/quicktime. Each channel then checks what it takes when you publish. If you can see the image, write altText describing it.

NameTypeReqDescription
aiGeneratedboolean–true when the image or video was generated or substantially changed with AI. Naver Blog photos get its AI-use label; Instagram, YouTube and TikTok get their AI declaration turned on unless you set it…
altTextstring–What the image shows, for people using screen readers. Applied to carousel items.
urlstringyesPublic https URL of the image or video file itself.
workspaceIdstring–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 ~484

Use this only when you can HTTP PUT the file bytes yourself (a shell or code runtime). Web and mobile chat clients cannot, so do not call it there: for a file on the person's device use media_upload_link, for a public https address use media_from_url. 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. Documents for DM automations only (deliver.mediaId), not for posts: application/pdf, application/x-hwp, application/hwp+zip (.pdf, .hwp, .hwpx), up to 25MB. 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.

NameTypeReqDescription
aiGeneratedboolean–true when the image or video was generated or substantially changed with AI. Naver Blog photos get its AI-use label; Instagram, YouTube and TikTok get their AI declaration turned on unless you set it…
altTextstring–What the image shows, for people using screen readers. Write it whenever you can see the image. Applied to carousel items.
bytesnumberyesFile size in bytes
contentTypestringyesimage/jpeg or image/png or image/webp or image/gif or video/mp4 or video/quicktime or video/webm or application/pdf or application/x-hwp or application/hwp+zip
fileNamestringyes–
heightnumber–Pixel height, if you know it
widthnumber–Pixel width, if you know it
workspaceIdstring–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 ~201

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. The page also takes PDF and HWP/HWPX documents, for a DM automation's file (deliver.mediaId); a post cannot carry them.

NameTypeReqDescription
notestring–One line shown on the upload page, e.g. what you need them to upload.
workspaceIdstring–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 ~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.

NameTypeReqDescription
offsetinteger–Skip this many images before returning previews (default 0).
tokenstringyesThe token from media_upload_link.
workspaceIdstring–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 ~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.

NameTypeReqDescription
contentstringyesThe markdown body you plan to publish.
formstring–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.
mediaIdsarray–The media ids you will attach. Photos not referenced in the body get placed.
workspaceIdstring–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 ~267

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. If the response carries `bridge`, `bridge.nextStep` says what is needed: `run_wake` means the browser with the extension is closed (`bridge.browser` says which: Chrome, Edge or Whale), so tell the person `bridge.userMessage` with the `bridge.wake` command for their OS and retry once after they say it is open; `ask_user_login` / `ask_user_update` mean tell the person `bridge.userMessage`. Do not retry more than twice.

NameTypeReqDescription
idstringyesA 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…
workspaceIdstring–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 ~2,240

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. Naver Blog goes out through the user's browser extension. If the response carries a bridge object, read bridge.state: offline means the browser with the extension is closed and the post is queued (up to 7 days); logged_out means that browser is on but not logged in to Naver; login_needed means the Naver login saved for that blog in that browser is signed out, so its posts wait until the person logs in again from the dashboard. Either way relay bridge.userMessage to the person word for word, do not say it was published, and know that delete_post cancels a queued post and update_post rewrites it before it goes out. If the extension in that browser is too old for what you asked (update_post), this returns 422 extension_outdated with the installed and required versions. Uplika asks that browser to update at the same moment, so follow the message: usually call again in a minute or two. Text limits differ per channel: Threads 500 characters, Instagram 2200 characters, YouTube 5000 UTF-8 bytes, Facebook 63206 characters, Bluesky 300 gr…

NameTypeReqDescription
accountIdsarrayyesAccount ids from select_channels
automationobject–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…
batchIdstring–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.
contentstring–Post text
draftboolean–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.
mediaIdsarray–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…
optionsobject–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.
scheduledAtstring–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…
threadItemsarray–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…
topicTagstring–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…
waitboolean–Hold the response until the post is really out. Text waits up to 10 seconds, posts with media up to 75 seconds. If it is still going after that you get the usual publishing response and should poll g…
workspaceIdstring–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_naver_draft ~474

Naver Blog only. Publishes a draft from the blog's draft box exactly as it is in Naver: the extension loads that draft in the editor and presses publish, so edits the person made by hand in Naver are kept. Do not send content. Category, tags and openType are taken from the draft unless you pass them. Returns the same shape as publish (202 with a target that resolves to published, or the bridge object when the extension is offline; wait: true holds until it settles). If that draft was made through uplika (a target whose externalId starts with draft:), the same post record flips to published instead of a second one appearing. To publish uplika's own copy of the text rather than what is in Naver, use update_post on that post instead. If the response carries `bridge`, `bridge.nextStep` says what is needed: `run_wake` means the browser with the extension is closed (`bridge.browser` says which: Chrome, Edge or Whale), so tell the person `bridge.userMessage` with the `bridge.wake` command for their OS and retry once after they say it is open; `ask_user_login` / `ask_user_update` mean tell the person `bridge.userMessage`. Do not retry more than twice.

NameTypeReqDescription
accountIdstring–Which Naver Blog account. Required only when the workspace has more than one.
categorystring–Category by name instead of id.
categoryIdstring–Category id from list_accounts. Default: the draft's own.
logNostringyesThe draft's logNo from list_naver_drafts.
openTypestring–Visibility. Default: the draft's own setting.
tagsarray–Replace the draft's tags (no #).
titlestring–Replace the draft's title.
waitboolean–Hold until the extension finishes, up to 75 seconds. Past that it returns while still going out; read it with get_post.
workspaceIdstring–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 ~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.

NameTypeReqDescription
idstringyesA 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…
waitboolean–Hold the response until the post is really out, same as on publish.
workspaceIdstring–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 ~451

Edit an automation by replacing its whole document: for flows no template covers, or that were already edited on the canvas. If get_automation shows templateParams, change it with update_automation instead (only the params you pass change; an Instagram follow check is requireFollow, notFollowingMessage and recheckTitle). Replacing the document of a flow that still has its template form is refused with automation_is_template, because the person can no longer open it in the form afterwards; pass detachTemplate: true only when the change cannot be expressed as template params. Read it first with get_automation and pass the version you got; 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. A comment trigger's post.postId takes the post's link too; the server resolves it to the uplika post id. Validation problems come back with paths. Changing a live flow changes what goes out to people.

NameTypeReqDescription
detachTemplateboolean–Only for a flow that still has its template form: true turns it into a canvas-only flow the form can no longer open. Default false.
docobjectyesOne 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…
idstringyesAutomation id (af_…): id in list_automations, or data.id in the create_comment_to_dm, create_automation or duplicate_automation result.
namestring––
versionintegeryes–
workspaceIdstring–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.

Install

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

# add to Claude Code
claude mcp add --transport http com-uplika-uplika 'https://api.uplika.com/mcp'
Common questions

What is the uplika MCP server?

uplika is an MCP server listed in the public MCP registry as com.uplika/uplika. Your AI agent publishes to Threads, Instagram, YouTube and the other social channels you connect. This page covers its hosted endpoint (https://api.uplika.com/mcp).

Is the uplika MCP server safe to use?

uplika scores 36 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 65 tools: list_accounts, select_channels, list_platforms, get_help, list_posts, and 60 more. Their descriptions and schemas cost roughly 21,497 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 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.