uplika
REMOTE · API.UPLIKA.COM
Your AI agent publishes to Threads, Instagram, YouTube and the other social channels you connect.
Available components
Last scanned (5 hours ago)
Scores higher than 19% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Marketing and SEO
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security89
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability0
- Transport blocked by authentication: the endpoint requires auth we don't have to verify streamable-http. See how to fix → View diagnostics → Unverified
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.
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
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 |
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 →
read_conversation Read a 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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Conversation id (cv_…) from list_conversations. |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
refresh_account Re-read a channel's metadata ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | yes | The account id from list_accounts. |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
reply Reply to a post ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | – |
| id | string | yes | A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the acco… |
| replyTo | string | – | Reply id from list_replies. Omit to reply to the post itself. |
| secret | boolean | – | Naver Blog only: post it as a secret comment that only the blog owner can read. Other channels refuse it. |
| wait | boolean | – | 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. |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
research_naver_keywords Measure and judge Naver keywords into sets ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| keywords | array | yes | 1-60 keywords, as the person would search them. |
| seedText | string | – | What the person asked for, kept as the report's label. Defaults to the first five keywords. |
| topic | string | – | 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. |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
retry_post Retry a failed post ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | – | 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… |
| id | string | yes | A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the acco… |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
scan_naver_blog_visibility Start a Naver blog's search report card ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| blog | string | yes | The blog id or any link to the blog. |
| limit | number | – | How many recent posts, 1-50. |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
search_instagram_audio Instagram only: find music or sounds for a reel ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | yes | The connected Instagram account. Required: trending audio differs per account. |
| cursor | string | – | nextCursor from the previous call, to get the next page. |
| limit | number | – | How many to return, 1-50. Defaults to 25. |
| query | string | – | Optional keywords, up to 100 characters. Leave it out for this account's trending audio. With type music it only searches royalty-free music. |
| type | string | – | music (default) or original_sound. |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
search_youtube_videos Search YouTube for benchmark 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).
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | Default all. |
| max | number | – | 1-50, default 25. |
| order | string | – | Default viewCount. |
| period | string | – | How far back. Omit for no limit. |
| q | string | yes | The search words, as a viewer would type them. |
| topic | string | – | The video the person wants to make, one line. Goes into prompt. |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
select_channels Select channels to post to ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| scope | – | – | Omit to list candidates, "all" for every active channel, or an array of platform names, handles or account ids. |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
send_dm Send a message in a conversation ~195
Send a message in a conversation as the account. **Only inside the 24-hour window** after the person's last message; outside it the call is refused with window_closed and nothing can be done until they write again. On a mention thread (Threads) this posts a public reply. Pass draftId to send an AI draft that was waiting for approval. Sending pauses automations on that conversation for 30 minutes.
| Name | Type | Req | Description |
|---|---|---|---|
| draftId | string | – | Message id of an AI draft to send instead of new text. |
| id | string | yes | Conversation id from list_conversations. |
| mediaId | string | – | Optional media id from media_presign. |
| text | string | – | – |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
send_to_past_comments Send an automation 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).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Automation id (af_…): id in list_automations, or data.id in the create_comment_to_dm, create_automation or duplicate_automation result. |
| includeAnswered | boolean | – | Also send to comments that already have a reply from the account. Default false. |
| mode | string | yes | preview counts without sending, start queues the sends, stop halts a running job. |
| publicReply | boolean | – | 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. |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
update_automation Edit an automation's template settings ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| enabled | boolean | – | – |
| id | string | yes | Automation id (af_…): id in list_automations, or data.id in the create_comment_to_dm, create_automation or duplicate_automation result. |
| name | string | – | – |
| params | object | – | Template params to change. Only what you pass changes. |
| version | integer | yes | The version from get_automation or list_automations. |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
update_media Mark media as AI-made ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| aiGenerated | boolean | yes | true to mark as AI-made, false to clear. |
| id | string | yes | Media id from media_presign, media_from_url or media_upload_status. |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
update_post Edit a scheduled, draft or live 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…
| Name | Type | Req | Description |
|---|---|---|---|
| accountIds | array | – | New target accounts, from select_channels. Replaces the current set. |
| content | string | – | New post text. |
| draft | boolean | – | true turns a scheduled post back into a draft. |
| id | string | yes | A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the acco… |
| mediaIds | array | – | New media, in order. Replaces the current set. 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. |
| options | object | – | Per-channel settings, same shape as on publish. Replaces the whole object. |
| scheduledAt | string|null | – | New send time (ISO 8601 with offset, 10 minutes to 365 days out), or null to keep the post as a draft instead. |
| sourceVersion | string | – | 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… |
| threadItems | array | – | 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… |
| wait | boolean | – | 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_… |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
validate_automation Check an automation document ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | yes | The connected account the flow would run on. |
| doc | object | yes | One automation flow. triggers start it, nodes are the steps, start names the first node. Waiting is not a node: a send node with buttons and next: null waits for the person to tap one, and that butto… |
| workspaceId | string | – | Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again. |
No output schema declared.
No examples provided.
How do I install the uplika MCP server?
uplika is a hosted endpoint at https://api.uplika.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · api.uplika.com
claude mcp add --transport http com-uplika-uplika 'https://api.uplika.com/mcp'
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.