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 (5 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
read_conversation ~111

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.

NameTypeReqDescription
idstringyesConversation id (cv_…) from list_conversations.
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.

refresh_account ~314

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. On Threads, Instagram and Facebook this re-reads the display name and the profile picture. It does not renew a sign-in: a connection whose sign-in the channel has ended answers account_expired, and that account is reconnected on the Connections page. Channels with nothing to re-read return refresh_unsupported. 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
accountIdstringyesThe account id from list_accounts.
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.

reply ~411

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 unless you pass wait: true, which holds the response until it is out (up to 10 seconds). Otherwise call get_post with the returned id to see the final status and link. 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
contentstringyes–
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. Omit to reply to the post itself.
secretboolean–Naver Blog only: post it as a secret comment that only the blog owner can read. Other channels refuse it.
waitboolean–Hold the response until the reply is really out, up to 10 seconds, so you can say it is live. If it is still going you get the usual publishing response; poll get_post. Defaults to 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.

research_naver_keywords ~360

Naver Blog only. Measures keywords (monthly searches from Search Ad, blog document count and posts per month from API HUB), judges each one (best, possible, hard, wall, hot, saturated, phantom and so on, with why), and groups them into sets for one post: a main keyword plus two to five subs with the same search intent. Every set carries prompt, a ready-to-paste Korean brief for writing the skeleton of that post. Up to 60 keywords. Measurements are cached seven days across users; new ones run against a time budget, so partial: true with unmeasured[] means the budget ran out and calling again with the same keywords finishes the rest from cache. Each call is saved as a report (reportId) unless the same keyword set was saved in the last ten minutes, which returns that report's id instead. Every set also carries draftPrompt, a brief for writing the whole post (title, subheadings, body, and bracketed photo placeholders for the person to fill); pass topic to put the post's subject in it.

NameTypeReqDescription
keywordsarrayyes1-60 keywords, as the person would search them.
seedTextstring–What the person asked for, kept as the report's label. Defaults to the first five keywords.
topicstring–What the post is about, one line. Goes into draftPrompt; without it the prompt tells the writer to pick a subject that fits the main keyword.
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.

retry_post ~619

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 a Naver target stopped right after Save as draft (errorCode naver_draft_unknown), this returns 409 naver_draft_unknown and retries nothing; check list_naver_drafts and call again with force: true only if the draft is not there. If a Naver reply did not confirm in time (errorCode naver_reply_unknown), this returns 409 naver_reply_unknown and retries nothing; look at the comment on the blog first and call again with force: true only if the reply is not there. If another post with the same content and files is queued, going out, published or scheduled on the same account, this returns 409 duplicate_post with that post's postId and retries nothing; force: true sends it anyway. 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.

NameTypeReqDescription
forceboolean–Retry even though a Naver target is naver_draft_unknown (pass it only after list_naver_drafts shows the draft is not there) or naver_reply_unknown (pass it only after the comment on the blog shows no…
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.

scan_naver_blog_visibility ~271

Naver search only. Starts a report card for a Naver blog: reads its latest posts from the public RSS feed, picks each post's main keyword (from its title, or the keyword chosen when it was written in Uplika, or one the person set), and checks every keyword through the person's uplika browser extension in the background. Returns runId and etaSeconds right away and does not wait; read the result with get_naver_visibility (blog) when etaSeconds have passed. limit is how many posts, up to 50 (default 50). A report card for the same blog from the last 6 hours is returned instead of starting another (reused: true). Unlike diagnose_naver_blog, which reads titles only, this searches each post's keyword through the extension. It also refreshes the title summary diagnose_naver_blog returns, without spending a diagnosis.

NameTypeReqDescription
blogstringyesThe blog id or any link to the blog.
limitnumber–How many recent posts, 1-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.

search_instagram_audio ~425

Instagram only. Lists audio you can put on an Instagram reel: music, or original sounds from other reels. Put the id you pick in options.instagram.audio.id when you call publish. Reels only. Works only for Instagram accounts connected via Facebook; an account connected with Instagram login answers not_supported, and the person has to reconnect it with Facebook. type is music (default) or original_sound. Without query you get what is trending for this account. With query, music comes only from Meta's royalty-free Sound Collection, so an artist or song name will not find that song; look through the trending list for popular songs instead. Trending music differs per account, and some accounts only get royalty-free music. Use ids from this account's own results. previewUrl is a temporary audio file (about 1.5 days) and listenUrl opens the sound on Instagram; neither is the finished reel. Instagram cannot preview a reel with audio before it is published. The audio plays once from its beginning (you cannot choose the start) and is not repeated, so pick one at least as long as the reel (durationMs). For a voice-over keep videoVolume at 100 and set volume around 15 to 30. Pass nextCursor back as cursor for the next page.

NameTypeReqDescription
accountIdstringyesThe connected Instagram account. Required: trending audio differs per account.
cursorstring–nextCursor from the previous call, to get the next page.
limitnumber–How many to return, 1-50. Defaults to 25.
querystring–Optional keywords, up to 100 characters. Leave it out for this account's trending audio. With type music it only searches royalty-free music.
typestring–music (default) or original_sound.
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.

search_youtube_videos ~375

Searches YouTube for a keyword and returns the top videos with views, subscribers, duration and publish date as YouTube gives them, plus two values uplika calculates from them that are not YouTube metrics (dataNotes says so): the views-to-subscribers ratio (above 1 means the title and topic pulled more people than the channel has) and Shorts or long-form (60 seconds or less counts as a Short). order is viewCount, date or relevance; period 7d, 1m, 3m, 6m or 1y; format all, shorts or long; max 1-50 (default 25). The same search is cached 24 hours and does not count; a new one spends one of the person's daily searches (quota in the response) and shared YouTube Data API units (youtube_quota_exhausted when today's are gone). Carries prompt, a brief in the person's Uplika language (Korean or English) that turns the table into title and hook ideas; pass topic to fill it in. Saved to the person's search history (reportId).

NameTypeReqDescription
formatstring–Default all.
maxnumber–1-50, default 25.
orderstring–Default viewCount.
periodstring–How far back. Omit for no limit.
qstringyesThe search words, as a viewer would type them.
topicstring–The video the person wants to make, one line. Goes into prompt.
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.

select_channels ~305

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. When a Naver Blog account is selected the response carries bridge with state (online, offline, logged_out, login_needed), userMessage to relay to the person, and queued; if state is not online, tell the person before publishing.

NameTypeReqDescription
scope––Omit to list candidates, "all" for every active channel, or an array of platform names, handles or account ids.
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.

send_dm ~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.

NameTypeReqDescription
draftIdstring–Message id of an AI draft to send instead of new text.
idstringyesConversation id from list_conversations.
mediaIdstring–Optional media id from media_presign.
textstring––
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.

send_to_past_comments ~538

Run a live comment automation on comments that are **already on the post**: the ones it missed because they came before it was enabled, during an outage, or while another tool handled the account. An automation normally reacts only to new comments. How Meta works: a comment can get one private reply, and only within 7 days. Older comments cannot be reached, and a comment another app already answered by DM is refused by Meta (counted as alreadyReplied, not as a failure). Instagram and Facebook only; top-level comments only. mode preview sends nothing: it reads the newest comments and answers eligible (how many would get the automation now) and skipped by reason (mine, tooOld, keyword, alreadyRan, answered, sameAuthor). One person gets it once: when someone commented several times, only their newest comment is answered (sameAuthor counts the rest). **Always preview first, show the person the numbers, and start only after they confirm**, because a sent message cannot be recalled. mode start queues the job: comments are answered a few at a time (Meta allows 750 private replies per hour per account, shared with the live automation), so a large post takes hours. Read progress in get_automation (pastComments), and see each answered comment in list_automation_runs. mode stop halts a running job; disabling the automation stops it too. By default a comment that already has a reply from the account is skipped (answered) and the trigger's public reply is not posted; includeAnswered and publicReply change that. The automation must be live (automation_not_live); one job per automation at a time (past_comments_running); a next-post automation that has not bound to a post yet has nothing to read (past_comments_no_post).

NameTypeReqDescription
idstringyesAutomation id (af_…): id in list_automations, or data.id in the create_comment_to_dm, create_automation or duplicate_automation result.
includeAnsweredboolean–Also send to comments that already have a reply from the account. Default false.
modestringyespreview counts without sending, start queues the sends, stop halts a running job.
publicReplyboolean–Also post the trigger's public reply under each comment. Default false, so an old post does not get the same reply many times at once.
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.

update_automation ~315

Edit an automation that still has its template shape, without rebuilding the whole document: pass only the template params you want to change (the same params as create_automation / create_comment_to_dm). Top-level fields are replaced, object fields such as deliver merge one level deep (deliver.text alone keeps deliver.links), null removes a field, arrays are replaced whole. Read it first with get_automation and pass its version; a stale version answers version_conflict. Also renames (name) and turns it on or off (enabled, with the same checks as enable_automation). Instagram follow check: requireFollow, notFollowingMessage, recheckTitle. A flow that was edited on the canvas has no template shape and answers automation_not_template: use put_automation for it. Changing a live flow changes what goes out to people right away.

NameTypeReqDescription
enabledboolean––
idstringyesAutomation id (af_…): id in list_automations, or data.id in the create_comment_to_dm, create_automation or duplicate_automation result.
namestring––
paramsobject–Template params to change. Only what you pass changes.
versionintegeryesThe version from get_automation or list_automations.
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.

update_media ~152

Mark or unmark an uploaded image or video as AI-made (aiGenerated). Applies to posts published or edited after this call; posts already out do not change (use update_post to rewrite a Naver Blog post). Every copy of the same file in your workspaces follows.

NameTypeReqDescription
aiGeneratedbooleanyestrue to mark as AI-made, false to clear.
idstringyesMedia id from media_presign, media_from_url or media_upload_status.
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.

update_post ~1,569

Change a scheduled or draft post before it goes out, or edit a post that is already live on a channel that supports editing (list_platforms features: today Naver Blog, YouTube and some Facebook posts). Fields: content, mediaIds, accountIds, options, scheduledAt or draft. Fields you leave out keep their current value (on a Naver Blog post, see media below); options you pass replace the whole options object (on a post written directly on the channel they are merged per channel key instead). scheduledAt moves the send time (same rules as publish), null turns it into a draft, and draft: true does the same. A thread (chain) can be changed too while it is scheduled or a draft: content replaces the first item and keeps the later items; threadItems replaces the whole chain (one item collapses it to a single post); passing threadItems to a single post turns it into a chain. Pass id of the first item — later items return 409 thread_piece with rootId. Posts that already went out return post_not_editable on channels that cannot edit a live post. A post written directly on the channel (one a link or id resolved to, origin imported) can be edited on YouTube, on the text of Facebook text, link and photo posts, and on Naver Blog: uplika reads the post from the channel first, so fields you leave out keep the channel's current values. Elsewhere it returns post_not_editable with the reason (list_platforms feature update_imported). A Naver post written in Naver's editor is rewritten from its current source, which uplika reads from Naver's edit screen: text, bold, italic, underline, strikethrough and links are markdown; headings and quotes are markdown only when their text has no style at all; every other block (photos, videos, cards, tables, headings or quotes with a font, and whole text blocks that have colors, sizes or alignment anywhere, several paragraphs each) is one @keep(...) line. A line holding only an invisible U+200B character is blank space at the edge of a text block; lea…

NameTypeReqDescription
accountIdsarray–New target accounts, from select_channels. Replaces the current set.
contentstring–New post text.
draftboolean–true turns a scheduled post back into a draft.
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…
mediaIdsarray–New media, in order. Replaces the current set. On a Naver Blog post the body's media: references already are the list, so leave this out unless you add media to the end of the post without placing it.
optionsobject–Per-channel settings, same shape as on publish. Replaces the whole object.
scheduledAtstring|null–New send time (ISO 8601 with offset, 10 minutes to 365 days out), or null to keep the post as a draft instead.
sourceVersionstring–Only for a Naver post written in Naver's editor: the sourceVersion that came with the source you edited (from naver_source_required or get_post). It tells uplika the content was made from the post's…
threadItemsarray–Replace the whole chain: [{ content, mediaIds? }], first item is the root. Only while the post is scheduled or a draft, and only for Threads and Bluesky. Leave it out to keep the current items (conte…
waitboolean–Only when editing a post that is already live: hold the response until the edit has gone through or not, up to 75 seconds. Past that it returns while still working, with next telling you to read get_…
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.

validate_automation ~186

Check a flow document against the rules for one account without saving it: node shapes, references, the 24-hour window, and features still in Meta review. Answers problems with paths; an empty list means put_automation would accept it.

NameTypeReqDescription
accountIdstringyesThe connected account the flow would run on.
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…
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.