Skip to main content
Glama

Server Details

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

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.8% over 55 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.9/5.0

Scored across 61 tools

Disambiguation4/5

Most tools have distinct resource+action targets and the descriptions cross-reference each other aggressively (get_post vs open_post vs list_posts vs list_channel_posts, publish vs publish_now vs retry_post). A few genuine overlaps remain — create_comment_to_dm vs create_automation, update_post vs update_media — but the documentation makes the boundaries clear enough to choose correctly.

Naming Consistency4/5

Names are overwhelmingly consistent snake_case verb_noun (list_automations, create_automation, delete_reply, publish_now). Minor deviations exist with noun-first/descriptive names (bridge_status, naver_layout, describe_grammar, diagnose_naver_blog), but the pattern stays readable throughout.

Tool Count2/5

61 tools is far past the heavy threshold and creates real selection burden, with multiple near-duplicate list_/create_ helpers (create_comment_to_dm, list_automation_versions, list_automation_templates, list_naver_keyword_reports) that could be consolidated. The domain is broad, but the surface is still over-large for reliable agent use.

Completeness4/5

Coverage is genuinely deep: full post lifecycle (publish, schedule, draft, edit, retry, delete), media pipeline, automation CRUD plus runs/versions/templates, DM/conversation handling, and rich Naver research. Only small gaps (no unfollow, no unlike) remain, which are platform limitations rather than missing operations.

Available Tools

62 tools
approve_replyApprove a held reply (Threads)A
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
approveNoDefault true.
replyIdNoOmit to list the pending queue instead.
accountIdYes
workspaceIdNoWhich 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.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false; the description adds a concrete consequence ('Making it public') and the prerequisite state ('held by reply approval'). It doesn't explain 'ignore' behavior or the return format, but it extends beyond annotations meaningfully.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with no filler. Each clause carries signal: platform, action, scope, effect, and workflow hint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema fills in parameter details and queue-listing behavior, but with no output schema the description doesn't state return values, 'ignore' semantics are under-specified, and the 'pending: true' hint is ambiguous without naming a tool. A small but real gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, with approve, replyId, and workspaceId already documented. The description adds no new parameter detail; the 'pending: true' remark isn't a parameter on this tool and doesn't clarify any input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('approve') and resource ('a reply held by reply approval'), scopes the tool to Threads, and clarifies the outcome ('makes it public'). This clearly distinguishes it from siblings like delete_reply, hide_reply, and reply.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear usage context: Threads-only, for replies held by reply approval, and instructs the agent to read the queue with 'pending: true' before acting. It doesn't name alternatives or state exclusions explicitly, but the context is sufficient to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bridge_statusCheck the Naver Blog extension and how to wake ChromeA
Read-only
Inspect

Naver Blog only. Posts to Naver Blog are written by the uplika browser extension inside the user's own Chrome, so nothing goes out while that Chrome is closed. Call this before publishing to Naver Blog. If online is false, the response carries wake commands per OS that open Chrome on the user's computer in the profile that has the extension (found by extension id), for the person to run. Once Chrome 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 (Chrome is on but not logged in to Naver), login_needed (the Naver login saved for that blog in that Chrome 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdNoLimit to one Naver Blog account. Omit to cover every connected Naver Blog account.
workspaceIdNoWhich 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.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare a safe read; the description goes far beyond them, enumerating the state values (online, offline, logged_out, login_needed) and what each means, the per-OS wake commands, the ~1 minute reconnection window, queued post behavior, and the fields userMessage/extensionVersion/kinds. This is rich behavioral context an agent needs to interpret and act on the result.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the hard constraint ('Naver Blog only') and the primary instruction ('Call this before publishing'), then streams return-field semantics efficiently. It is dense and runs long with several clauses per sentence, but nearly every clause carries actionable information, so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must carry the return contract, and it does: state enum meanings, userMessage, queued, extensionVersion, kinds, and the wake commands. Combined with the pre-publish usage rule, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters are documented in the schema itself, so the baseline is 3. The description adds no additional semantics for accountId or workspaceId (no format, defaulting, or edge-case guidance), so it neither compensates nor detracts.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: checking the Naver Blog publishing bridge (browser extension) status and returning wake commands. The scope is pinned with 'Naver Blog only' and it explains the mechanism (posts written by the uplika extension in the user's own Chrome). It does not differentiate itself from the related sibling diagnose_naver_blog, which keeps it short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to call it ('Call this before publishing to Naver Blog'), what to do with the result (relay userMessage, run wake commands), and how to follow up ('call this again or get_post to check'). It also notes that publish returns the same bridge object, and names siblings that interact with queued posts (delete_post, update_post).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_automationCreate an automation from a template (draft)AInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
paramsYesThe template's params.
enabledNoDefault false.
accountIdYesConnected account id from list_accounts.
templateIdYesTemplate id from list_automation_templates.
workspaceIdNoWhich 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.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds value beyond the annotations by explaining that the operation only creates a draft and does not immediately complete the automation. It also conveys the follow-up workflow involving put_automation. The annotations already signal a non-read-only, non-destructive mutation, so the description does not need to restate those.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. The core behavior is front-loaded, and the alternative workflow is stated in one clear sentence. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides enough context to select and invoke the tool correctly, including the template source and what to do when no template fits. The absence of an output schema means return details are not specified, but for a draft-creation step this is a minor gap given the clear workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers most parameters, and the description meaningfully connects templateId and params to list_automation_templates, telling the agent where the values come from. This adds semantic guidance beyond the bare property descriptions, especially for the nested params object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Create'), a specific resource ('an automation'), and the source ('any template in list_automation_templates'). It also clarifies the immediate outcome ('Creates a draft'), making it easy to distinguish from related tools like put_automation or enable_automation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool: when creating from a template. It also names the alternative for uncovered cases: 'build the document yourself and call put_automation on the draft.' This gives a clear either/or routing decision with no reliance on inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_comment_to_dmCreate a comment-to-DM automation (draft)AInspect

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); either way it is posted only after the private reply went out, and the AI is told a DM was sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
postYesOur post id, the platform post id, a link to the post, "any", or "next".
matchNo
deliverYesWhat to send after the tap: text, up to three link buttons, and/or one file (fileUrl or mediaId).
enabledNoDefault false. Prefer leaving it off and calling enable_automation after the person confirms.
messageNoThe opening DM (private reply). One message. Required unless openingDm is false.
askEmailNoAsk for their email after the tap and store it in contact field `email`. Three tries, then continue without.
followUpNoSent followUpAfterMinutes later if none of deliver.links was clicked. Needs openingDm and at least one link.
keywordsNoTrigger words in the comment. Empty means every comment.
accountIdYesConnected Instagram or Facebook account id from list_accounts.
openingDmNoDefault true. false: deliver goes out as the private reply itself (no button, no window afterwards).
emailRetryNo
buttonTitleNoButton under the opening DM, at most 20 characters.
likeCommentNoLike the comment first. Instagram accounts connected through Facebook only.
publicReplyNoOptional 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.
workspaceIdNoWhich 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.
emailMessageNo
recheckTitleNo
requireFollowNoInstagram only. Deliver only to followers; others are asked to follow and check again.
publicReplyModeNofixed (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.
notFollowingMessageNo
followUpAfterMinutesNo1 to 1380 (23 hours). Default 60.
publicReplyInstructionNoWith publicReplyMode ai: what the public reply should say. DM contents (links, codes, prices) are never repeated in public.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare it is a non-read-only, non-destructive, closed-world write. The description goes far beyond that: draft-only until enable_automation, the Meta private-reply mechanics (one per comment, 7-day limit, 24-hour window), one-time fileUrl validation on save, delivery ordering, and platform-specific rejection rules. This is exactly the behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The critical constraint ('Creates a draft; nothing goes out until enable_automation') is bolded and front-loaded, which is good. But the body is a single dense run-on paragraph mixing file handling, platform rules, ordering, and error codes; it is informative yet hard to scan and could be structured into sections.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 23-parameter, nested-object tool with no output schema, the description covers the essential behaviors an agent needs: lifecycle (draft + enable), platform constraints, delivery ordering, file-delivery paths, and public-reply rules including the AI mode's dependency on publicReplyInstruction. Little an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 74% and the description adds real meaning on top: post accepts 'any'/'next'/id/link, fileUrl vs mediaId 'not both', openingDm:false semantics, and followUp's dependency on openingDm plus a link. However several params (match, emailRetry, recheckTitle, emailMessage, notFollowingMessage) remain undocumented in both schema and description, so it doesn't fully compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a concrete verb+resource framing ('when someone comments on a post, DM them') and immediately clarifies the draft semantics. It names the sibling that must run afterward (enable_automation) and the alternative for Threads (create_automation with comment_public_reply), so an agent can distinguish it from siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when/when-not coverage: use create_automation for Threads, requireFollow is rejected on Facebook, openingDm:false rejects requireFollow/askEmail/followUp/files, and fileUrl vs mediaId are mutually exclusive. The 409 next_post_taken and 7-day window constraints tell the agent exactly when this call succeeds or fails.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_automationDelete an automationA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
forceNoDelete even if it is live. Default false.
workspaceIdNoWhich 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.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, but the description adds the non-obvious consequences: run history is destroyed with the automation, the action is irreversible, and live automations are hard-refused unless force is used. It also explains WHY the confirmation matters ('deleting it stops what is going out to people'), which is behavioral context no annotation provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with what is deleted, then irreversibility, then the refusal/force mechanics. No filler and no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the error-contract burden and does so (automation_live error, force override, workspaceId omission rule echoed in the schema). For a destructive 3-parameter tool, an agent has everything needed to call it safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the schema itself documents force and workspaceId. The description still adds real meaning for force (it only matters for live automations, and requires person confirmation first), which the schema's 'Delete even if it is live' does not convey. The id parameter remains undocumented in both places, but its meaning is self-evident.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete an automation') and immediately extends scope to 'and its run history', which distinguishes it from sibling disable_automation (a non-destructive state change) and from delete_post/delete_reply. An agent can tell exactly what is removed without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative path ('disable it first'), the blocked case (live automation refused with automation_live), and the escape hatch ('pass force: true after the person confirms'). This is a complete when/when-not/alternative statement, with the required human-confirmation gate spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_postDelete a postA
Destructive
Inspect

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 Chrome with the extension is closed, so tell the person bridge.userMessage with the bridge.wake command for their OS and retry once after they say Chrome is open; ask_user_login / ask_user_update mean tell the person bridge.userMessage. Do not retry more than twice.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesA publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here.
workspaceIdNoWhich 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.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds critical context: irreversibility, channel-specific quotas, draft/scheduled behavior, 409 account_disconnected handling, bridge.nextStep protocols, and a retry cap. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and irreversibility warning are front-loaded, and the dense channel/error details are valuable. However, the long unbroken paragraph could be structured with lists for faster scanning, and a few clauses feel redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-complexity destructive tool with no output schema, the description is remarkably complete: it covers channel limits, error responses, bridge workflows, and draft semantics. An agent has everything needed to invoke and handle outcomes correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are fully documented in the schema. The description repeats the accepted id forms but adds no new syntax or format details beyond what the schema already states. Baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete a post from the channel') and immediately clarifies the irreversible nature. The resource 'post' inherently distinguishes it from siblings like delete_reply or delete_automation, so an agent can select it without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides extensive when/when-not guidance: channel-specific daily limits, accounts where deletion is impossible (TikTok no API, Instagram login cannot delete), Facebook Page-only restriction, and the alternative (tell the person to delete in the app). This goes well beyond naming an alternative and covers preconditions and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_replyDelete a replyA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
postIdYesThe post the reply sits under. A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here.
replyIdYesReply id from list_replies
workspaceIdNoWhich 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.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint=true, but the description adds substantial context: deletion is irreversible, it removes anyone's comment on Instagram/Facebook but only the connected account's replies on Threads/Bluesky. This goes well beyond the hint flag and accurately describes what gets destroyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences cover purpose, irreversibility, platform differences, and an alternative recommendation with no filler. The most critical fact ('cannot be undone') is front-loaded, and the description is efficiently ordered.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with no output schema and a simple flat parameter set, the description is complete: it covers irreversibility, platform-scoped behavior, support lookup via list_platforms, and the hide_reply fallback. The agent has everything needed to decide when and how to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with postId, replyId, and workspaceId all documented inline. The tool description adds no new parameter-level meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Delete a comment for good') and distinguishes itself from hide_reply, which is the key sibling it could be confused with. It also explains channel-specific behavior (Instagram/Facebook vs Threads/Bluesky), making its purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'This is not hide_reply' and advises 'Prefer hide_reply when the person just wants it out of sight,' giving a clear when-not-to-use and alternative. It also directs the agent to list_platforms to determine channel support, providing actionable selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_grammarLook up a channel's body syntaxA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNoWhich section. overview (default) sketches the whole thing; directives, attributes, inline, blocks, highlight, media and limits go deep.
platformYesPlatform id, e.g. naver_blog. Only naver_blog has body markup today.
workspaceIdNoWhich 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.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and destructiveHint annotations, the description discloses topic-dependent output behavior: without a topic it returns an overview and topic list, with a topic it returns that section in full including 'mistakes that fail silently.' It also reveals data provenance—the values come from the same grammar the publisher validates against—adding meaningful trust context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured: it front-loads the purpose, then platform scope, then usage timing, then behavior, then reliability. Examples like 'highlighting a phrase, a styled table, a collage' make the advanced-use case concrete without wasting space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description tells the agent exactly what to expect for both call shapes (with and without topic), the non-Naver edge case, and the guarantee that returned syntax matches what publish accepts. Combined with the annotations, there is no obvious missing information for invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers all three parameters at 100% coverage, so the baseline is met. The description adds extra meaning for the topic parameter by describing what happens with and without a topic, and clarifies platform behavior by noting that non-Naver platforms return not_supported rather than an error.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: it provides the body-writing syntax for a channel that has its own markup, specifically Naver Blog. It distinguishes the tool from siblings by explicitly calling out that every other platform returns not_supported, making it unmistakably a lookup/reference tool rather than a publishing or mutation tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit call timing: 'Call this before writing a Naver Blog body for the first time, or whenever you want something the basics do not cover.' It also tells agents what to expect for unsupported platforms—not_supported is not an error to work around—which functions as clear when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagnose_naver_blogDiagnose a Naver blog's titles for searchA
Read-only
Inspect

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). Returns 403 research_tool_disabled with enableUrl if the person has not turned this tool on for connectors. Tell them once and do not call it again until they say it is on.

ParametersJSON Schema
NameRequiredDescriptionDefault
blogYesThe blog id or any link to the blog (blog.naver.com/<id>, m.blog.naver.com/<id>/<logNo>, PostView.naver?blogId=<id>).
workspaceIdNoWhich 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.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/openWorld/non-destructive, but the description goes well beyond them: 24-hour caching, a 20-per-day per-person quota surfaced in the response, the 50-post cap and what summary.capped means, and a caveat that seedCandidates are candidates rather than proven keywords. That is substantive behavioral context an agent cannot get from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and tightly packed with useful facts, but several sentences are long and clause-heavy, so a reader has to parse a lot to extract the quota and cap details. Little is wasted, though it could be broken into cleaner units.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description correctly carries the return-value burden, naming the fields it produces (seedCandidates, summary.oldest/newest/capped, flags, thresholds.lowIntentPct). Combined with cached/quota/403 details, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both 'blog' and 'workspaceId' in detail (including the do-not-ask-again guidance). The description adds no additional parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Reads a blog's public RSS feed... says whether the titles are written for search') and scopes it to Naver Blog only. It enumerates the concrete outputs (intent share, date/episode prefixes, posts per month, categories, repeated words), which distinguishes it from keyword-research siblings like research_naver_keywords and expand_naver_keywords.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-it-works context: any public blog, not only connected ones, no Naver keys required. It also gives operational conditions — cached 24 hours, a cache miss costs one of 20 daily diagnoses — and the exact failure path (403 research_tool_disabled with enableUrl, plus the instruction to tell the person once and not retry).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

disable_automationStop an automationAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
workspaceIdNoWhich 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.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses a specific behavioral nuance beyond annotations: 'Runs already waiting for a button stay waiting but nothing new starts.' This informs the agent that the operation does not cancel pending runs, only prevents new ones. Annotations only indicate non-read-only and non-destructive, so this added detail is valuable and non-contradictory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences, front-loaded with the main purpose and immediately followed by a key behavioral detail. There is no redundancy or fluff, and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple mutation tool with one required parameter and no output schema, the description covers the essential behavior (stopping an automation and its effect on pending runs). The optional parameter is well-documented in the schema. Nothing critical is missing for an agent to correctly invoke the tool, though it could have mentioned the result or success indication, but that is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50% (id has no description, workspaceId has a detailed one). The tool description adds no parameter information. With low schema coverage, the description should compensate, but it does not. The id parameter is left undocumented in both schema and description, so the agent gets no additional meaning about the parameters from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Stop an automation') with a specific verb and resource. It also adds a distinguishing behavioral detail ('nothing new starts') that separates it from enable_automation and other sibling tools. The purpose is unambiguous and easily distinguishable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by stating the action, but it does not explicitly mention alternatives or when-not-to-use conditions. The sibling list includes enable_automation, and the opposite semantics are clear, but there is no direct guidance like 'Use this to stop an automation; to start one, use enable_automation.' Thus, usage is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

duplicate_automationCopy an automation as a draftAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNoDefault: the original name with (copy).
workspaceIdNoWhich 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.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare it is a non-read-only, non-destructive, non-open-world write. The description goes beyond that with real behavioral detail: runs and versions are not copied, post-bound copies retain their post, and next-post flows re-wait. It does not, however, state where the resulting draft surfaces or what identifier comes back.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action, then a dense clause covering the three non-obvious copy behaviors. No filler and no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description should ideally say what the copy returns (e.g., the new draft's id) for a follow-up enable/publish call. Everything else an agent needs — what is copied, what is not, post binding behavior — is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the description adds only the optionality of the name ('optionally with a new name'), which the schema already covers with its default hint. The workspaceId guidance lives entirely in the schema, so the description neither compensates nor detracts; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Copy an automation as a new draft') and immediately scopes what makes it distinct from create_automation/update_automation by specifying what is carried over (triggers and settings). An agent can distinguish it from its siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys the semantics of a copy but never states when to prefer this over create_automation or list_automation_templates. Usage is implied by the copy semantics ('same triggers and settings, optionally with a new name') rather than explicitly routed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

enable_automationTurn an automation liveA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
workspaceIdNoWhich 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.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations mark destructiveHint=true and readOnlyHint=false, but the description adds substantial behavioral context: it explains the real-world effect ('messages start going to real people'), specific error codes and their causes, and uniqueness constraints. Far exceeds what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with key effect in bold, then detailed constraints. Somewhat verbose but well-structured; every sentence provides actionable information. Slightly dense but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive for a mutation tool: covers safety, real-world impact, error conditions, and constraints. No output schema needed as errors are explained. Missing nothing critical for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: the id parameter is undocumented in the schema, but the description implies it identifies the automation. workspaceId is described in the schema. Description adds no extra parameter detail, but given the schema coverage, baseline 3 is exceeded by context. Not quite 5 due to lack of parameter-specific hints beyond implicit id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Turn an automation live' with precise semantics, distinguishing it from disable_automation and from create_automation/update_automation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly warns to confirm with the person first, and enumerates the exact conditions under which enabling a second automation is refused (next_post_taken, automation_catch_all_taken, reconsent_required, feature_in_review). Provides clear context for when to use and when it will fail.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

expand_naver_keywordsExpand seed keywords through Naver autocompleteA
Read-only
Inspect

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:). These are candidates to measure with research_naver_keywords, not proven keywords. The person's uplika Chrome 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. Returns 403 research_tool_disabled with enableUrl if the person has not turned this tool on for connectors. Tell them once and do not call it again until they say it is on.

ParametersJSON Schema
NameRequiredDescriptionDefault
seedsYes1-10 seed keywords.
workspaceIdNoWhich 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.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld annotations: discloses a seven-day cache, a per-person 60-second server-path throttle with no daily cap, the two execution paths (extension vs server) and how the 'via' field reports which answered, and named error codes with retryAfterSeconds. This is exactly the behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and scope in the first sentence, then error/rate-limit handling. It is long and dense, but nearly every sentence targets a distinct failure mode or routing decision, so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by describing the return shape (found[].from is seed or L1:<seed>), the 'via' field, and every notable error path including retryAfterSeconds and the enableUrl. Nothing an agent needs to call or recover from this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented. The description restates the 'up to 10 seeds' limit and reinforces the workspaceId omission rule, but adds little syntactic meaning beyond the schema. Baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (expands), resource (seed keywords), mechanism (Naver autocomplete), and scope constraint (Naver Blog only), then disambiguates from the sibling by noting these are 'candidates to measure with research_naver_keywords, not proven keywords.' An agent can tell it apart from research_naver_keywords without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative tool and the condition that selects it, and gives explicit fallback routing: when naver_autocomplete_unavailable, 'pass your own keyword list to research_naver_keywords instead.' It also states the enablement precondition for the 403 case, covering when-not-to-call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

followFollow a blogA
Destructive
Inspect

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 Chrome with the extension is closed, so tell the person bridge.userMessage with the bridge.wake command for their OS and retry once after they say Chrome is open; ask_user_login / ask_user_update mean tell the person bridge.userMessage. Do not retry more than twice.

ParametersJSON Schema
NameRequiredDescriptionDefault
blogYesThe blog to follow: its id (the part after blog.naver.com/) or any link to it.
mutualNotrue for a mutual-neighbor request. Default false.
messageNoMessage sent with a mutual request. Naver shows it to the other blog. Ignored otherwise.
accountIdNoWhich connected account to act as. Only needed when the workspace has more than one Naver Blog.
workspaceIdNoWhich 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.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the tool is a destructive, non-read-only open-world operation; the description adds substantial context beyond that: the pending-until-accepted semantics, the 'already' return, the absence of an unfollow, and the full bridge.nextStep protocol including the retry limit of two.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the primary action and the mutual distinction come first, followed by error-handling detail. Every sentence carries operational value, though the bridge passage is long and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by explaining the observable return states ('already') and the bridge error protocol, including exact next-step handling and retry guidance. An agent has everything needed to invoke and recover correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning about `mutual` (it sends a request the other blog must accept, otherwise immediate plain-neighbor) that goes beyond the schema's one-line description. It does not add anything for message/accountId/workspaceId.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Follow) and resource (an account/blog on the channel), scoped to Naver Blog. It is immediately distinguishable from ambiguous siblings like like, reply, or send_dm.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly explains the two modes (mutual:true vs plain neighbor), the already-a-neighbor outcome, and that there is no unfollow. It does not, however, name any alternative sibling tools or broader when-not-to-use conditions, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_automationRead one automationA
Read-only
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAutomation id from list_automations.
versionNoA saved version number from list_automation_versions. Leave out for the current one.
workspaceIdNoWhich 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.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), yet the description adds real behavioral detail absent from structured fields: pastComments is the latest send_to_past_comments job with its progress or null, and templateParams appears only while the flow retains its template shape. With no output schema, these return-shape semantics carry genuine weight.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core payload (document contents) before secondary concerns like version consumption and pastComments. It is dense but every clause adds a distinct fact; no filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must describe the return shape, and it does: document fields, version, templateParams conditionality, and pastComments nullability. Missing are any hints about failure modes or size/limits, but for a single-resource read tool this is close to complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes beyond it by explaining what the version parameter selects (an older saved version's document) and pointing to its source list_automation_versions, adding intent the schema's 'saved version number' phrasing does not fully convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('One automation as a document') and immediately enumerates what the document contains: triggers, nodes, start. It also names the siblings it relates to (put_automation, update_automation, list_automation_versions), so an agent can distinguish it from list_automations without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the version-selection path ('Pass version to read an older saved version's document instead (list_automation_versions)') and why the returned version matters to put_automation/update_automation. It stops short of an explicit when-to-use-this-vs-list_automations statement, but the routing context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contactRead a contactA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
refreshNoRe-read the profile from the channel first.
workspaceIdNoWhich 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.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description does not need to repeat that it's a safe read. It adds valuable behavioral context: the follow relationship data is Instagram-only and only available for contacts who have messaged, plus the note that follower lists are not available on any channel. This goes beyond the structured hints and helps the agent set expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences and avoids padding. The first sentence front-loads the core purpose ('One contact:') and immediately lists the output fields, making it easy to scan. The second sentence clarifies a key limitation. It is concise and efficient, though a more explicit action verb like 'Retrieves a single contact by ID' would strengthen it further.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must convey return semantics, and it does by itemizing the fields. It also highlights the Instagram-only caveat and the lack of follower lists, which is important context. Given the tool's simplicity (read-only, one required parameter) and the annotations covering safety, the description is largely complete. It could mention what happens if the contact does not exist or the meaning of 'refresh', but those are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers refresh and workspaceId with descriptions, so across 3 parameters, coverage is 67% (above 50%), giving a baseline of 3. The description adds no parameter-specific meaning; it does not explain what 'refresh' does or when workspaceId is needed beyond what the schema already says. Thus the description neither compensates for gaps nor adds value, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool retrieves a single contact and enumerates the exact fields returned (name, username, follow relationships, follower count, tags, opt-out, messaging window close). It also distinguishes itself from listing tools by explicitly noting that follower lists do not exist on any channel, making it clear this is the only way to get such data. This is a specific verb+resource with clear scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like list_conversations or list_mentions. The only hint is 'Follower lists do not exist on any channel; this is the closest thing,' which implies it's the way to get follow status but does not explicitly say 'use this when you need a single contact's profile' or 'don't use this for bulk contact listing.' No exclusions or alternatives are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_helpLook up why something did not workA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoOne answer's id from the list, e.g. thread-control.
codeNoAn error code from an Uplika response, e.g. reconsent_required or window_closed.
queryNoA short question or a few words in any language, e.g. "DM not sent after button" or "ManyChat".
localeNoLanguage of the answer. en (default) or ko; use the person's language.
platformNoOnly answers about this platform id (plus general ones), e.g. instagram.
workspaceIdNoWhich 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.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavior beyond that: argument-count-dependent modes (list-all vs single full answer) and the shape of each answer (steps, links, and a public URL). It does not address rate limits, error responses, or auth, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose before the invocation mechanics, and every clause carries information. It runs long as a single dense multi-clause sentence, which slightly reduces scannability, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description correctly carries the return-value burden by explaining that each answer contains steps, links, and a shareable URL. Combined with the mode selection and empty-argument behavior, an agent has everything needed to call and use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description goes further by tying parameters to intent: the error code supplied by an Uplika response, or a short question in any language, and it explicitly tells the agent to omit workspaceId when already decided rather than re-ask the person. That usage-level meaning exceeds the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (look up) and resource (Uplika troubleshooting answers) and opens with the exact problem it solves: why something did not work and what can be done about it. This is clearly distinguishable from siblings like diagnose_naver_blog or get_insights, and an agent can route to it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the triggering situations (a failed call, an automation that did not react, a DM that did not arrive, the person asking why something happened) and maps each argument mode to a scenario: code for an error code, query for a natural-language question, id for one full answer, no args to list everything. The when-to-use is concrete and there is little left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_insightsGet post metricsA
Read-only
Inspect

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 Chrome with the extension is closed, so tell the person bridge.userMessage with the bridge.wake command for their OS and retry once after they say Chrome is open; ask_user_login / ask_user_update mean tell the person bridge.userMessage. Do not retry more than twice.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesA publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here.
workspaceIdNoWhich 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.

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare it as a safe read operation, but the description adds substantial context: null values mean unreported metrics, not zero; bridge responses require specific next steps; and retries are capped at two. This is rich behavioral detail beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then gives necessary null and bridge handling details. It is somewhat long, but the additional sentences carry operational value and no obvious filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries most of the return-value burden. It lists the returned metrics, explains null semantics, and details bridge failure modes and retry behavior. It could still specify the general response shape more fully, but it is largely complete for this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents the id and workspaceId parameters. The description adds only 'one publish' as context and does not extend parameter meaning beyond what the schema provides, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns engagement metrics for one publish, naming the specific metrics: views, likes, replies, reposts, quotes and shares. It does not explicitly distinguish itself from siblings like get_post or list_posts, so it is clear but lacks sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for one publish' implies the usage context, but there is no explicit guidance on when to choose this tool over alternatives such as get_post or list_posts. The bridge instructions address error handling rather than tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_naver_keyword_historyGet a keyword's measurement historyA
Read-only
Inspect

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. Returns 403 research_tool_disabled with enableUrl if the person has not turned this tool on for connectors. Tell them once and do not call it again until they say it is on.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many days, default 100.
keywordYesThe keyword, as you would send it to research_naver_keywords.
workspaceIdNoWhich 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.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, non-destructive, non-open-world behavior, and the description adds substantial context beyond them: newest-first ordering, the meaning of an empty list, and a concrete failure mode (403 with enableUrl) plus retry policy. It surfaces an operational constraint the agent could not derive from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four front-loaded sentences with no filler: payload, interpretation, empty case, then error handling. Each sentence carries distinct, actionable information and nothing is repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-shape burden and does so fully (per-day points, ordering, three metrics), plus edge cases and error handling. An agent has everything needed to call it correctly and react to failures.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all three parameters including defaults and the workspaceId conditional. The description adds no parameter-level syntax or format detail beyond what the schema states, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('the measurement history of one keyword') and specifies the grain, ordering, and payload ('one point per day it was actually measured, newest first, with search volume, document count and posts per month'). This cleanly separates it from research_naver_keywords, expand_naver_keywords and list_naver_keyword_reports.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit runtime guidance for the disabled-tool case (403 research_tool_disabled with enableUrl, tell them once, do not call again until re-enabled) and explains the empty-list meaning. What it lacks is a direct statement of when to prefer this over the sibling research_naver_keywords call, though the 'history' framing implies it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_postGet one postA
Read-only
Inspect

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 Chrome with the extension is closed, so tell the person bridge.userMessage with the bridge.wake command for their OS and retry once after they say Chrome is open; ask_user_login / ask_user_update mean tell the person bridge.userMessage. Do not retry more than twice.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesA publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here.
workspaceIdNoWhich 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.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/destructive/openWorld; the description goes well beyond them by disclosing the disconnected-account state (connectionId null, accountHandle set), the exact 409 account_disconnected failure on edit/delete/retry, id stability, and the full bridge nextStep protocol (run_wake / ask_user_login / ask_user_update) with a retry cap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the return semantics and the sibling comparison before the dense edge-case material. The bridge paragraph is lengthy with several nested conditions, but each clause governs a distinct agent action (which field to read, what to say, whether to retry).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-shape burden and does so for the salient cases (per-target status, failure reason, bridge object). It leaves other response fields, such as media or account metadata, unspecified, but covers everything needed to call and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented, including that id accepts a publish id, channel id, or link. The description adds no format or edge-case detail beyond what the schema states, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (retrieve one publish/post) and immediately clarifies the scope: per-target status plus the reason any target failed. It explicitly distinguishes itself from the sibling open_post, so an agent can route correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative (open_post) and the condition that selects it ('For a post link'). It also gives retry guidance (do not retry more than twice) and the bridge.nextStep branch conditions, which is genuine when-to-act guidance. It does not, however, contrast with list_posts for multi-post retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_publish_optionsTikTok only: creator settings to check before publishingA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe connected account to ask about. Required: these values are per account.
workspaceIdNoWhich 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.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/non-destructive, and the description adds real behavioral context beyond them: the not_supported behavior for other channels, that values are per-account and drift when the person edits TikTok settings, and that privacyLevel has no default so this call is the source of that value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences that are front-loaded with the scope restriction, then the return contents, then the pre-publish requirement and the privacyLevel dependency. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing return fields (nickname, privacy levels, postability, video length limit) and does so, plus it explains the one cross-field dependency (privacyLevel required, no default). Nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds rationale the schema only implies – that these values are per-account (justifying required accountId) and that workspaceId should be omitted rather than re-asked when already decided. It stops short of adding format/syntax detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (TikTok creator publish settings) and a clear verb (get), and explicitly scopes itself as TikTok-only, which distinguishes it from the broad publish/publish_now siblings. An agent can tell what it returns without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('call it before every TikTok publish'), explicit when-not ('do not call it for any other channel'), and even pre-empts a wrong reaction to the not_supported response ('which is not an error to work around'). This is exactly the routing guidance an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_quotaGet remaining publishing quotaA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdNoLimit to one account. Omit to cover every connected channel.
workspaceIdNoWhich 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.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this read-only, and the description adds meaningful behavioral context: it reports live platform usage rather than static limits, and it describes an additional account-level rate cap relevant to interpreting publish failures. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with no filler. The core purpose comes first, followed by usage timing and a key differentiation from related tools.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with optional parameters, the description covers purpose, timing, and a subtle behavioral caveat about rate limiting. The lack of an output schema is partly mitigated by the description's clear framing of what the quota represents.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents both optional parameters fully, with 100% schema description coverage. The description adds no parameter-level meaning, but it also doesn't need to since the schema carries that burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource (24 hour publishing allowance) and what it reports (usage for posts, replies, deletes). It distinguishes itself from list_platforms and publish, making the tool's role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent to check this before a burst of publishing, and warns that publish can return rate_limited even when the platform allowance has room. It also names list_platforms as the source of static limits, not this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hide_replyHide a replyAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hideNotrue hides it, false shows it again. Defaults to true.
postIdYesThe post the reply sits under. A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here.
replyIdYesReply id from list_replies
workspaceIdNoWhich 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.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, and the description adds value by explaining the operation is reversible ('show it again with hide: false'). This clarifies the non-destructive nature without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One efficient sentence covers the action, the toggle behavior, and the parameter provenance. Every clause earns its place, and the core verb is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-required-parameter tool with full schema coverage and no output schema, the description provides enough context to call it correctly. The only notable omission is guidance on when to choose this over the similar delete_reply tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description mostly repeats what the schema already says: replyId comes from list_replies and postId is the publish it belongs to. It adds minimal new meaning beyond the structured parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Hide a reply on the channel, or show it again'. It clearly distinguishes this from deletion by emphasizing reversibility, and the 'hide: false' clause makes the toggle behavior explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for when to use the tool: to hide or unhide a reply, and it tells the agent where the replyId comes from ('list_replies') and that postId is the parent publish. However, it does not explicitly name sibling alternatives like delete_reply or state when hiding is preferable to deletion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

likeLike a post or a reply
Destructive
Inspect

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 Chrome with the extension is closed, so tell the person bridge.userMessage with the bridge.wake command for their OS and retry once after they say Chrome is open; ask_user_login / ask_user_update mean tell the person bridge.userMessage. Do not retry more than twice.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesA publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here. On Naver Blog a link to someone else's post works too.
replyToNoReply id from list_replies to like that reply instead of the post.
workspaceIdNoWhich workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.
list_accountsList connected accountsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceIdNoWhich 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.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: only 'active' accounts can be published to, an empty list means no connected channel, and the user should be sent to the connection dashboard. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Six short sentences, each earning its place: output fields, publish routing, active-status rule, unnamed-channel behavior, empty-list handling, and a fallback URL. The key instruction is front-loaded and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description explains the item fields and the practical consequences of the result: which accounts publish, what to do when no channel is named, and what an empty list means. The only omitted detail, workspaceId semantics, is already fully covered by the input schema, so nothing essential is missing for a low-complexity list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the workspaceId parameter is fully documented in the input schema itself. The tool description adds no extra parameter-level meaning, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource ('connected social accounts') and the kind of data returned (id, platform, handle, status). It also ties the tool to the publish workflow ('accountIds you pass to publish are these ids'), but it does not explicitly name sibling tools like list_platforms or select_channels to differentiate them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit trigger: 'Call this before publishing anything,' and explains how to use the result: pass accountIds to publish, target every active account when no channel is named, and redirect to the dashboard when the list is empty. It lacks explicit when-not-to-use guidance or named alternatives, so it stops just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_automation_runsList an automation's runsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
limitNo
beforeNo
workspaceIdNoWhich 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.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=false, destructiveHint=false, so safety is covered. The description adds substantial domain context beyond that: the meaning of each terminal and blocked status, that blocked_ai_quota resets at 00:00 UTC, and that AI failure reasons appear in the log as classify_failed or ai_failed. It does not disclose pagination behavior for the limit/before parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a single clear sentence stating what is returned, followed by the status enumeration. The long parenthetical list is dense but earns its place because no output schema exists to document these values elsewhere; minor sprawl keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully covers return semantics (statuses and step log), and annotations cover the safety profile. However, the undocumented limit/before pagination parameters and the required id parameter leave an agent without guidance on result size or how to page through runs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 25% (only workspaceId is documented). The description explains status values, which are output semantics rather than parameters, and says nothing about id, limit, or before (pagination). With four parameters and a large coverage gap, the description fails to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope ('Runs of one automation') and names the two things returned ('status and a step log'). It is clearly distinguishable from list_automations, get_automation, and list_automation_versions without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: you need one automation's id to retrieve its run history, and the status list hints at debugging why a run stopped. But there is no explicit when-to-use statement, no comparison to get_automation or list_automation_versions, and no prerequisites (e.g., required permissions).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_automationsList automationsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNodraft = not enabled, live = enabled.
accountIdNoOnly automations on this connected account.
templateIdNoOnly automations made from this template (list_automation_templates).
workspaceIdNoWhich 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.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a safe read (readOnlyHint, non-destructive). The description adds field-level return context and a conditional note that templateParams appears only when the flow still has its template shape. It doesn't cover pagination or volume limits, but the added behavioral detail is meaningful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences: return content, filters, then alternative tool. No wasted words and the key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description tells the agent what is returned and how to filter, plus the sibling for detail. Missing only pagination/ordering behavior, which is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents each parameter with descriptions and an enum. The description maps the filters to intent and hints at availability of templateParams, adding marginal value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verb (list) plus resource (automations) and enumerates the returned fields: name, channel, live/draft, triggers, run count, templateParams. This clearly distinguishes it from get_automation, which reads a single flow's document.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative (get_automation) and its purpose, and specifies the three filter dimensions (accountId, status, templateId). The routing rule is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_automation_templatesList automation templatesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceIdNoWhich 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.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description goes further by disclosing response content (each template's channels, the renamedFrom field, the ai_comment_reply alias). That is meaningful behavioral context beyond the structured fields, though return shape/pagination is still unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and usage cue are front-loaded in the first two sentences, but the remainder sprawls into detailed reference material about specific templates and aliases without structure. This detail is useful but not tightly organized, and some sentences would be better placed in per-template documentation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does explain what the answer contains (channels per template, params, renamedFrom) and how to act on it. It is close to complete for a low-complexity, one-optional-param list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single optional workspaceId is fully documented in the schema, including its conditional requirement. The description never mentions the parameter, so it adds no semantics beyond the schema — the baseline 3 for high coverage applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line states a specific resource (ready-made automation templates) and what it returns (the params each one takes), so the verb+object is clear. It does not explicitly distinguish itself from the sibling list_automations (which lists configured automations rather than templates), leaving a small ambiguity an agent must resolve from context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Read this before create_automation" is an explicit, actionable when-to-use cue tied to a named sibling. It lacks any when-not-to-use note or a direct contrast with list_automations, so it falls short of full alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_automation_versionsList an automation's saved versionsA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
workspaceIdNoWhich 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.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false). The description adds genuine context that versions are produced by put/update operations, but says nothing about ordering, pagination, or return shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with what is listed and followed by the routing hint. No filler and every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only listing tool with no output schema and only two parameters, the description covers what it returns, how versions arise, and how to fetch one. Return format details are the only meaningful omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%; workspaceId is well described in the schema, while id is undocumented in both places. The description adds no parameter meaning of its own (the 'version' it mentions belongs to get_automation), so it neither compensates for the gap nor obscures it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('saved versions of one automation') and adds the salient mechanism that each put_automation/update_automation creates a version. It references get_automation to distinguish reading a single version, but does not explicitly differentiate itself from list_automation_runs, the closest sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Routes the agent to get_automation plus a version argument when a single version is wanted, which is clear alternative guidance. It lacks an explicit when-not-to-use statement relative to list_automations/list_automation_runs, but the context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_channel_postsList posts on the channel
Read-only
Inspect

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 Chrome with the extension is closed, so tell the person bridge.userMessage with the bridge.wake command for their OS and retry once after they say Chrome is open; ask_user_login / ask_user_update mean tell the person bridge.userMessage. Do not retry more than twice.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo1-100, defaults to 25
accountIdNoLimit to one account. Omit to cover every connected channel.
workspaceIdNoWhich workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.
list_conversationsList inbox conversationsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNo
limitNo
stateNo
searchNo
unreadNo
accountIdNo
workspaceIdNoWhich 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.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: each item indicates whether the 24-hour window is open and how much time remains, which is beyond the schema. However, it does not disclose pagination, ordering, or whether the search parameter filters by contact name or message content.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core concept ('The inbox'), then explains the window indicator and the two key filters. Every sentence earns its place, though the parameter explanations could be slightly more structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description covers the main purpose and the two most important filters. However, with 7 parameters and no output schema, an agent would benefit from knowing what fields each conversation item contains, how pagination works, and what the search parameter matches. The description is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 14%, so the description must compensate. It explains the meaning of 'state' and 'kind' enums, which is helpful, but the other five parameters (limit, search, unread, accountId, workspaceId) are left undocumented in both the schema and description. The workspaceId parameter has a schema description, but the rest rely on naming conventions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists inbox conversations across Instagram DMs, Facebook DMs, and Threads mentions, and distinguishes it from the sibling list_mentions by covering both DM and mention kinds. The verb 'list' plus the resource 'inbox conversations' is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the default state ('open') and the kind filter ('dm or mention'), giving an agent enough context to know when to use this tool. It does not explicitly name alternatives or exclusions, but the sibling list_mentions is implicitly differentiated by the mention coverage. No explicit when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_mentionsList Threads mentionsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
unreadNo
accountIdNo
workspaceIdNoWhich 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.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safe read profile (readOnlyHint, destructiveHint=false), so the bar is lower. The description still adds real behavioral value: webhook delivery, the dependency on a dedicated permission, empty-list semantics, and the notice codes (feature_in_review, reconsent_required) an agent must interpret.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences that lead with what the tool returns before detailing permissions and alternatives. Parentheticals are compact, though the error-code aside adds some reading load.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description supplies the permission gating, the empty-result condition, and the correct next-step sibling. The only real gap is that the three input parameters are left entirely to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33% — unread and accountId carry no description in either place — and the description says nothing about any of the three parameters. With low coverage the description is expected to compensate, and it does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Threads posts that mention the connected account') and immediately positions it against a sibling by noting it is the same shape as list_conversations with kind mention. An agent can tell exactly what this returns without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the follow-up tool (send_dm) and the diagnostic sibling (list_platforms) explicitly, and explains the permission condition that makes the list empty. It stops short of a full when-to-use/when-not statement, but the routing context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_naver_draftsList the drafts saved in Naver BlogA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdNoLimit to one Naver Blog account. Omit to cover every connected Naver Blog account.
workspaceIdNoWhich 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.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds substantial behavior beyond them: the extension version gate, the extension_outdated error, and the full bridge.nextStep protocol (run_wake / ask_user_login / ask_user_update) with what to tell the person in each case. That is rich operational context the agent cannot infer from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the scope and returned fields, then the handoff, then error handling. Every sentence carries information, though the bridge/error-branching section is dense and slightly long for a single description block.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming the returned fields and ordering, and it covers prerequisites, error codes, and recovery steps. An agent has everything needed to call it and handle the common failure paths.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented in the schema. The description adds little parameter-level meaning beyond what the schema states, so the baseline 3 for fully-covered schemas applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Lists the drafts (temp-saved posts) sitting in the blog's draft box') and immediately scopes it to 'Naver Blog only', which cleanly separates it from siblings like list_posts and list_channel_posts. It even enumerates the returned fields and sort order.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing guidance: 'Pass a logNo from here to publish_naver_draft' names the downstream alternative and the handoff condition. It also states prerequisites (extension 0.7.2+), the failure mode (extension_outdated), and an explicit retry policy ('Do not retry more than twice').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_naver_keyword_reportsList saved keyword researchA
Read-only
Inspect

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. Returns 403 research_tool_disabled with enableUrl if the person has not turned this tool on for connectors. Tell them once and do not call it again until they say it is on.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many, default 50.
workspaceIdNoWhich 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.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only/non-destructive profile, and the description goes well beyond them: newest-first ordering, the exact shape of returned data, and a specific failure mode (403 research_tool_disabled with enableUrl) plus how to behave on it. This is genuine behavioral context an agent cannot get from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five dense clauses, front-loaded with the core action and return contents, then the ownership caveat and the error-handling rule. No filler; each sentence carries operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by describing the return contents, and it closes the loop on the one meaningful failure path. Nothing an agent needs to call this correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds interpretive value by clarifying that reports belong to the person rather than a workspace, which informs how the optional workspaceId should be treated. It does not, however, explain the limit parameter beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Lists the person's saved keyword research') and immediately enumerates the returned fields (when, typed text, first set's main/sub keywords, every set with its prompt). This clearly separates it from siblings like get_naver_keyword_history and research_naver_keywords.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context (it surfaces saved research originating from research_naver_keywords or the dashboard, ordered newest first) and explicit handling for the disabled-tool case with a concrete retry instruction. It does not, however, explicitly compare against the nearest alternative, get_naver_keyword_history.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_platformsList platform limitsA
Read-only
Inspect

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. takes on publish: which fields exist, which are required, and the allowed values. Read it instead of guessing a channel's settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceIdNoWhich 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.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true and destructiveHint=false. The description adds substantial behavioral context: explains the meaning of each status value (live, beta, bridge, soon), how charCount should be used, and that options is a JSON Schema for publish parameters. This goes far beyond the annotations and helps the agent interpret the output correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a bit long, but it is well-organized: it opens with the purpose, then details status, charCount, and options sequentially. Each sentence contributes meaning; it is not bloated. Front-loaded with the core purpose, so a 4.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with no output schema, the description covers what the tool returns (channels and their rules), how to interpret status, charCount, and options. It lacks explicit notes on pagination or error handling, but these are minor given the tool's simplicity. Overall it is sufficiently complete for an agent to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter workspaceId is fully documented in the schema (coverage 100%), with clear guidance on when it is needed and when to omit it. The description does not add parameter-specific information, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists every channel and its rules (character limit, media requirements, state). It specifically says 'Every channel and its rules' and lists the fields. It distinguishes itself from siblings by focusing on platform limit details, which is unique among list_accounts, get_quota, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Read this instead of guessing a platform's limits' and advises checking charCount before calling publish to avoid failures. It does not mention alternatives directly but clearly indicates the appropriate context. Slight gap in naming specific alternatives, so 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_postsList posts published hereA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoscheduled orders by the post's date ascending (soonest first) and drops paging. Omit for newest first.
limitNo1-100, defaults to 20
sinceNoYYYY-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.
untilNoYYYY-MM-DD or ISO 8601. Only posts dated at or before this (a date means the whole day).
beforeNoA publish id from a previous page's nextBefore. Returns the ones older than it.
statusNoNarrow to one or more statuses, comma separated: scheduled, draft, publishing, published, partial, failed or cancelled. Omit for everything.
workspaceIdNoWhich 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.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: inclusion of scheduled/draft posts, paging semantics (hasMore, nextBefore, limit cap of 100), ordering ('newest first'), and the exclusion of pre-existing channel posts. This is rich, non-obvious behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a dense but well-ordered paragraph: scope, default behavior, paging, usage example, exclusions, and sibling alternative. Every sentence carries new information and is front-loaded with the core purpose. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description covers what is returned, ordering, pagination, filtering, defaults, and the boundary vs. list_channel_posts. With rich parameter schemas and annotations, nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description reinforces the paging parameter interaction ('pass the returned nextBefore as before') and gives a filter example, but it largely restates what the schema already documents (limit default, sort behavior, since/until semantics). It adds marginal value over the schema, so 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('list posts published through us'), enumerates what the list includes (recent publishes, scheduled, drafts), and explicitly contrasts with list_channel_posts. An agent can immediately distinguish this from the sibling tool without reading schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives direct when-to-use guidance: 'Posts that already existed on the channel are not here. Use list_channel_posts for those.' It also provides a concrete use-case pattern ('To answer "what is scheduled this week", pass status scheduled with since and until and sort scheduled.'), which fully routes the agent to the right tool and parameter combination.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_repliesList replies to a postA
Read-only
Inspect

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 Chrome with the extension is closed, so tell the person bridge.userMessage with the bridge.wake command for their OS and retry once after they say Chrome is open; ask_user_login / ask_user_update mean tell the person bridge.userMessage. Do not retry more than twice.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesA publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here.
workspaceIdNoWhich 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.

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Well beyond the readOnly/openWorld/non-destructive annotations, it discloses that results may be truncated via a `truncated` flag, that the count can legitimately differ from get_insights, and it decodes the `bridge` error payload into concrete nextStep actions (run_wake, ask_user_login, ask_user_update) with a two-retry cap. This is unusually rich failure-mode disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, followed by caveats and then the bridge handling in ascending order of operational rarity. The bridge paragraph is dense, but every clause maps to a distinct action an agent must take.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description steps in and explains the two non-obvious response aspects an agent will encounter: `truncated` and the `bridge` object. Combined with complete schema coverage and safety annotations, nothing needed to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both `id` (publish id, channel id, or post link) and `workspaceId` (only needed for multi-account, error reports ids) are already fully documented in the schema. The description adds no parameter meaning, which is fine but earns only the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names the resource and its scope precisely: the whole reply thread under a post, nested replies included. It distinguishes itself from the replies metric in get_insights, though it does not route to a true selection alternative among siblings like list_mentions or read_conversation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the resource (fetch replies to a given post) and the description gives operational guidance for failures, but it never states when to prefer this tool over siblings or any precondition beyond the id. The guidance offered is retry behavior rather than tool-selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

media_completeFinish a media uploadAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMedia id from media_presign
workspaceIdNoWhich 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.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description reveals an internal verification step: 'We check the file really landed before marking it ready.' This adds meaningful behavior context about validation and state transition that the annotations alone do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, purposeful sentences with no filler. The most important information (when to call) is front-loaded, followed by the verification behavior and the downstream requirement. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a workflow-step tool with no output schema, the description covers the essential context: position in the flow, trigger condition, internal check, and downstream constraint. It does not explicitly describe the return value or failure behavior, but enough context is present for an agent to invoke it correctly in the media-attachment workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The tool description itself does not add additional meaning to the parameters beyond what the schema already states, such as id coming from media_presign and workspaceId's conditional use. No special compensation is needed or provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('finish a media upload'), identifies it as 'Step 2 of attaching an image or video', and clarifies it must be called after the upload finishes. This clearly differentiates it from sibling tools like media_presign, media_upload_link, and media_upload_status by workflow position.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit timing context: 'Call it after the upload finishes.' It also gives a downstream rule ('Only a ready media id can be passed to publish') and the schema adds workspaceId guidance. It does not explicitly name alternatives or when not to use it, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

media_from_urlAdd media from a public URLAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPublic https URL of the image or video file itself.
altTextNoWhat the image shows, for people using screen readers. Applied to carousel items.
aiGeneratedNotrue 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 to false. Leave it out when unsure.
workspaceIdNoWhich 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.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations covering the safety profile (readOnly=false, destructive=false, openWorld=true), the description still adds substantial behavior: the server downloads and re-hosts the file, format is validated from bytes not headers, the returned media id is meant to be passed to publish, and each channel applies its own format check at publish time.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and the payoff ('attach... we give you a media id you can pass to publish'), then constraints, then formats, then the altText cue. No filler sentences; every clause carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description explains what comes back (a media id for publish) and how formats/channels interact. For a 4-param, one-required tool with a single remote input, nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds real value beyond it: url must be a direct file URL ending in the file itself, accepted MIME list, and the cue that altText should be written whenever the image is visible. It does not elaborate on aiGenerated or workspaceId beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource: attach already-hosted media by URL, with the mechanism spelled out (we download it, copy it into storage, return a media id). It clearly positions itself against the upload-style siblings (media_presign/media_upload_link) by saying 'no upload needed'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives strong usage conditions and exclusions: https only, Google Drive/Dropbox share links return HTML and won't work, use a direct file URL. It does not name a specific sibling tool to use instead when the URL is a local/private asset, so it stops short of explicit alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

media_presignStart a direct media uploadAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bytesYesFile size in bytes
widthNoPixel width, if you know it
heightNoPixel height, if you know it
altTextNoWhat the image shows, for people using screen readers. Write it whenever you can see the image. Applied to carousel items.
fileNameYes
aiGeneratedNotrue 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 to false. Leave it out when unsure.
contentTypeYesimage/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
workspaceIdNoWhich 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.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are minimal (readOnlyHint=false, destructiveHint=false, openWorldHint=false), and the description carries the rest: the uploadUrl is one-time, a follow-up call to media_complete is required, and the returned mediaExpiresAt means an unpublished id vanishes and later publish calls fail with media_expired. Per-type MIME lists, byte caps (20MB/8GB/25MB), duration, resolution and aspect-ratio limits are all disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the gating condition and alternative routing before any format detail, which is the right order for the agent's decision. It is long, but nearly every sentence carries a constraint or a downstream step; only the 'Any image pixel width is fine' remark is close to filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description takes on the burden of describing the return payload (media id, uploadUrl, mediaExpiresAt) and the full multi-step lifecycle through media_complete. Given the tool's complexity and the file-type-dependent constraints, an agent has everything it needs to call it correctly in one pass.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 88%, so the baseline is 3. The description goes further by tying parameter values to constraints the schema only names: which content types are valid images vs video vs documents, that documents are for DM automations (deliver.mediaId) and not posts, and that contentType must be reused when PUTting bytes. It does not, however, add anything for fileName or the width/height fields beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (start/direct media upload) and immediately distinguishes itself from the three sibling tools in the same family (media_upload_link, media_from_url, media_complete). It also spells out the artifact produced (a media id and a one-time uploadUrl), so the agent knows exactly what it gets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use and when-NOT-to-use: 'Use this only when you can HTTP PUT the file bytes yourself... Web and mobile chat clients cannot, so do not call it there.' It names both alternatives and the condition that routes to each (on-device file -> media_upload_link, public https URL -> media_from_url). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

media_upload_statusCheck upload statusA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYesThe token from media_upload_link.
offsetNoSkip this many images before returning previews (default 0).
workspaceIdNoWhich 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.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already marking it read-only and non-destructive, the description adds significant behavior: status values, pagination limit of 20 with offset, previewId mapping for image blocks, and duplicateOf semantics. This goes well beyond the annotations and fully discloses the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact yet information-dense, front-loaded with the core purpose and then efficiently explaining return values, pagination, and duplicate handling. No sentence is wasted; every clause adds operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description fully specifies what the tool returns and how to use it (statuses, media IDs, previewIds, offset, duplicateOf). It also explains the workspaceId nuance and how to proceed with publish. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers all parameters at 100%, so the baseline is 3. However, the description adds extra semantics: it clarifies token origin, explains the 20-image limit and offset usage, and reinforces workspaceId guidance. This adds value beyond the schema, meriting a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool checks upload status and returns waiting, ready, or expired plus all media IDs. It also explains how to use those IDs with publish, making the purpose unambiguous. It distinguishes itself from sibling upload/publish tools by focusing on status retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies usage context (after media_upload_link, before publish) and explains how to chain with publish. It does not explicitly name alternatives or state when NOT to use it, but the context is clear enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_postOpen a post with replies and metricsA
Read-only
Inspect

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 Chrome with the extension is closed, so tell the person bridge.userMessage with the bridge.wake command for their OS and retry once after they say Chrome is open; ask_user_login / ask_user_update mean tell the person bridge.userMessage. Do not retry more than twice.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesA publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here.
workspaceIdNoWhich 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.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, non-destructive, open world), yet the description adds real behavioral context: replies or metrics may come back null when the platform refuses that part, and the `bridge` object signals a Chrome/extension or auth problem with a defined remediation path. This is exactly the runtime nuance an agent cannot get from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the scope sentence before the failure handling, and there is no filler. The bridge/retry passage is long and reads more like error-recovery procedure than tool description, but every clause is actionable and the retry cap is stated tightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-shape burden and does so: it enumerates the three payload sections, flags nullable fields, and explains the `bridge` object's meaning. Nothing needed to call or interpret the response is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so `id` and `workspaceId` are already fully documented in the schema, including accepted id formats and the 'do not ask again' guidance. The description adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and the exact payload it returns ('the text, the whole reply thread, and its metrics') plus a concrete trigger ('when someone hands you a post link'). This implicitly contrasts with narrower siblings like get_post and list_replies, but neither is named, so the differentiation is inferential rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit selection condition ('the right tool when someone hands you a post link') and then prescribes behavior for edge cases: interpret `bridge.nextStep`, branch on `run_wake` vs `ask_user_login`/`ask_user_update`, surface `bridge.userMessage`, and never retry more than twice. That is far beyond what most definitions offer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publishPublish a post
Destructive
Inspect

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 that Chrome is closed and the post is queued (up to 7 days); logged_out means Chrome is on but not logged in to Naver; login_needed means the Naver login saved for that blog in that Chrome 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 Chrome is too old for what you asked (update_post), this returns 422 extension_outdated with the installed and required versions. Uplika asks that Chrome 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 graphemes and 3000 UTF-8 bytes, Telegram 4096 characters (1024 with media attached), Naver Blog 30000 characters, TikTok 2200 characters. Over the limit nothing goes out to any channel, so shorten it before calling. Images and video both work on the channels that take them. How several items sit in one post differs per channel: Threads groups up to 20 items in one post, Instagram groups up to 10 items in one post, YouTube takes 1 video and no images, Facebook groups up to 10 items in one post, Bluesky has no carousel and places up to 4 images in the post itself, Telegram groups up to 10 items in one post, Naver Blog has no carousel and places up to 40 images in the post itself, TikTok groups up to 35 items in one post. More than a channel takes is not refused: the first items up to its limit go out and that target's warning says what was left out. A channel that cannot mix images and video keeps the video. YouTube is different: it takes exactly one video, no images, and it needs options.youtube.title. Its description is measured in UTF-8 bytes, so Korean and Japanese cost three per character. Instagram cannot publish text alone: every post needs at least one image or video. A single video becomes a reel there. Set options.instagram.contentType to story for a story; stories show no caption. Non-JPEG images are converted for Instagram automatically. Instagram feed images (single or carousel) must be between 4:5 and 1.91:1: one outside that range is not refused, it is center-cropped to the nearest of the two on a copy, and that target's warning says so. A 3:4 phone photo loses about 6% of its height; a 9:16 image loses 30%, so crop it yourself or send it as a story if the edges matter. A reel takes music, or another reel's sound, through options.instagram.audio with an id from search_instagram_audio (Instagram accounts connected via Facebook only); for a voice-over set volume around 20 and keep videoVolume at 100. Facebook publishes to a Page, never a personal profile. options.facebook.link makes a link post (no media alongside), and a single video becomes a reel (3-90 seconds). Bluesky counts graphemes, not characters, and also caps UTF-8 bytes, so a post of 300 emoji can fail on the byte limit. Set options.bluesky.langs to the language of the text (1-3 BCP-47 codes like ["ko"]): without it the post never appears in language-scoped feeds, and Bluesky has no post editing to fix it later. Links, @mentions and #hashtags in the text are made clickable for you, and a link gets a preview card, so write the URL plainly. There are three ways to get a media id, pick by where the file is: media_from_url when it already has a public https address, media_upload_link when it is on the person's own device, media_presign plus media_complete when you can PUT the bytes yourself. Then pass the media ids here. On Naver Blog the body can also place media itself with alt and @video(media:), each on a line of its own. Ids you reference that way are picked up even if you leave them out of mediaIds, and media you pass but never reference goes at the end of the post. Those references only work when every target is Naver Blog: other channels would publish the markup as literal text, so we refuse instead. A photo line takes {.link=https://…} to make the photo a link (describe_grammar topic=media). This publishes immediately unless you pass scheduledAt (we hold the post and send it at that time, on every channel) or draft: true (nothing goes out; the person or update_post finishes it later). scheduledAt needs a timezone offset, 10 minutes to a year out; ask the person which timezone they mean instead of guessing. options.naver_blog.scheduledAt means the same as scheduledAt on the post (we hold the post and send it then; Naver's own reservation is not used), so pass the post-level one. A scheduled or draft post comes back with status scheduled or draft, can be changed with update_post, sent early with publish_now, and dropped with delete_post. Every channel also takes options..content to send that channel a different text than the shared content, which is how Naver Blog Markdown and a 500-character Threads post fit in one call. On YouTube we pass privacyStatus through as you set it and report back what YouTube actually applied, so read the warning on the result instead of promising the person a visibility we did not confirm. Returns while the post is still publishing. The permalink is null at that moment. Call get_post with the returned id to see the final status and link. Pass wait: true to hold the response until it is really out — then you can tell the person it is posted instead of guessing. For a long post use threadItems instead of publish-then-reply: we keep the order and wait for each piece to land before sending the next one.

ParametersJSON Schema
NameRequiredDescriptionDefault
waitNoHold 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 get_post. Defaults to false. Ignored with scheduledAt or draft.
draftNotrue 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.
batchIdNoOptional 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.
contentNoPost text
optionsNoPer-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.
mediaIdsNoMedia 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 from the text.
topicTagNoOne 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 refused, so publish to it separately. On a thread it goes on the first piece only. Leave it out unless the person asked for a topic.
accountIdsYesAccount ids from select_channels
automationNoAttach 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 draft unless enabled: true. Each target goes through the same checks as create_automation. A target whose channel the template does not cover (comment_to_dm on Threads or Naver Blog, any template on YouTube, Telegram, Bluesky or TikTok) is skipped and named in the response with the reason.
scheduledAtNoISO 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 change or cancel it.
threadItemsNoSplit 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 obeys the character limit on its own. Pass either content or threadItems, not both. If a later item fails, the ones already up stay up and the response tells you where to resume.
workspaceIdNoWhich workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.
publish_naver_draftPublish a Naver Blog draft as it isA
Destructive
Inspect

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 Chrome with the extension is closed, so tell the person bridge.userMessage with the bridge.wake command for their OS and retry once after they say Chrome is open; ask_user_login / ask_user_update mean tell the person bridge.userMessage. Do not retry more than twice.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoReplace the draft's tags (no #).
waitNoHold until the extension finishes, up to 75 seconds. Past that it returns while still going out; read it with get_post.
logNoYesThe draft's logNo from list_naver_drafts.
titleNoReplace the draft's title.
categoryNoCategory by name instead of id.
openTypeNoVisibility. Default: the draft's own setting.
accountIdNoWhich Naver Blog account. Required only when the workspace has more than one.
categoryIdNoCategory id from list_accounts. Default: the draft's own.
workspaceIdNoWhich 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.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag it as a non-readonly, destructive, open-world write; the description adds the mechanism (extension loads the draft and presses publish, so manual Naver edits survive), the dedupe rule (a draft: externalId draft flips the same post record to published rather than creating a duplicate), the offline bridge object, and the wait:true timeout behavior. This is rich context well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core behavior and the key exclusion ('Do not send content') before the recovery detail. It is dense and long, but nearly every sentence carries actionable information; the bridge section is verbose where a compact mapping would do.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, network-dependent write with no output schema, the description covers the success shape (202 with a target resolving to published), the deferred/offline shape, the dedupe outcome, and the user-facing recovery path. An agent has everything needed to call it and handle failure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds the framing rule that category, tags and openType fall back to the draft unless explicitly passed, binding the override parameters into one behavioral contract. It largely echoes schema defaults, hence not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope: publishes a Naver Blog draft exactly as it sits in the draft box, and explicitly says content is not sent. It also distinguishes itself from siblings by naming update_post and publish, so an agent can route without opening other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-not guidance ('Do not send content') and names the alternative path: to publish uplika's own copy of the text, use update_post on that post instead. It also enumerates the bridge failure modes and the exact recovery action for each (run_wake, ask_user_login, ask_user_update) with a retry cap of two.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_nowSend a scheduled or draft post nowA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesA publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here.
waitNoHold the response until the post is really out, same as on publish.
workspaceIdNoWhich 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.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description discloses important asynchronous behavior: it returns while publishing unless wait: true is passed. It also surfaces a precondition for drafts and an error case for already-published posts, which are genuinely useful behavioral details not visible in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the main action, the async behavior with wait option, and the draft/already-sent edge cases. The most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, async tool with no output schema, the description covers the core action, waiting behavior, a prerequisite, and an error condition. It is nearly complete, though it relies on the reader knowing publish's semantics and does not describe the response shape beyond holding for the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains id, wait, and workspaceId well. The description reinforces the wait behavior and draft requirement but does not add substantial new meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: send a scheduled or draft post now, rather than waiting. It also distinguishes the tool from siblings by emphasizing the immediacy and the scheduled/draft scope, and references publish as a behavioral comparison.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use this when you want to send a scheduled or draft post immediately. It also provides a prerequisite (a draft needs at least one target account) and an exclusion (posts that already went out return post_not_editable), though it does not explicitly name alternative sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

put_automationEdit an automation (replace its flow)A
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
docYesOne 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 button's next continues. A loop must pass through such a wait.
nameNo
versionYes
workspaceIdNoWhich 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.
detachTemplateNoOnly 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.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructiveHint=true; the description goes well beyond that by naming the specific refusal errors (automation_is_template, version_conflict), explaining the concurrency guarantee (a stale version will not overwrite a concurrent edit), noting that validation failures return paths, and warning that editing a live flow changes what goes out to people.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose and the update_automation alternative before diving into node/loop semantics, so the important routing decision survives skimming. It is dense and long, with a parenthetical node-type list and the wait/loop rule repeated from the doc field's schema description, which costs some efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool whose doc parameter is a deeply nested object schema with no output schema, the description covers the failure modes an agent must anticipate, the versioning contract, and the structural rules the schema cannot express (loops must pass through a wait, button next: null semantics). What remains thin is the trigger/document construction detail, though the schema largely handles that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 50% schema coverage across six parameters, the description carries real weight: it explains version semantics (stale versions rejected), the meaning and risk of detachTemplate, and how doc semantics work (node types, wait-as-send-node, comment postId accepting a link). Some of the node-type and wait content duplicates enums already present in the schema, so it is not purely additive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with its exact semantics: 'Edit an automation by replacing its whole document.' It further scopes which flows this applies to (flows no template covers or already edited on canvas), which cleanly separates it from create_automation and update_automation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: if get_automation shows templateParams, use update_automation instead; use detachTemplate only when the change cannot be expressed as template params. It also mandates the read-then-write workflow by requiring the version from get_automation, so the agent knows exactly when and how to invoke this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_conversationRead a conversationA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
workspaceIdNoWhich 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.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral detail: it returns recent messages, contact fields, Instagram-only follow state, opt-out, and draft status, which goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core outcome, then lists key returned fields and the draft-status nuance. Every sentence adds information, with no filler or repetition of the annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple read-only nature and no output schema, the description adequately outlines what the tool returns, including the Instagram-only condition and draft handling. It does not specify message ordering, pagination, or error behavior, but these are not critical for a basic single-conversation read.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: workspaceId is thoroughly described in the schema, while id has only a type and no description. The description does not explain the parameters, but id's role as the conversation identifier is clear from the tool name and required field, so the gap is minor.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool returns a single conversation with recent messages and contact details, which matches the name and title. It does not explicitly differentiate from list_conversations or get_contact, but the singular focus on one conversation and its contents is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus siblings like list_conversations, get_contact, or list_mentions. The workspaceId parameter note gives invocation advice, but it does not help an agent choose this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

refresh_accountRe-read a channel's metadataInspect

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 Chrome with the extension is closed, so tell the person bridge.userMessage with the bridge.wake command for their OS and retry once after they say Chrome is open; ask_user_login / ask_user_update mean tell the person bridge.userMessage. Do not retry more than twice.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe account id from list_accounts.
workspaceIdNoWhich 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.
replyReply to a postA
Destructive
Inspect

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 Chrome with the extension is closed, so tell the person bridge.userMessage with the bridge.wake command for their OS and retry once after they say Chrome is open; ask_user_login / ask_user_update mean tell the person bridge.userMessage. Do not retry more than twice.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesA publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here.
waitNoHold 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.
secretNoNaver Blog only: post it as a secret comment that only the blog owner can read. Other channels refuse it.
contentYes
replyToNoReply id from list_replies. Omit to reply to the post itself.
workspaceIdNoWhich 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.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag it as a non-read-only, destructive, open-world write; the description goes well beyond that by disclosing asynchronous completion ('returns before the reply is live'), the 10-second wait ceiling, and a full bridge-error playbook (run_wake, ask_user_login, ask_user_update) with what to tell the person. Nothing here contradicts the destructiveHint annotation, since it publishes content.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded: the core reply semantics and replyTo behavior come first, then async behavior, then the bridge error ladder. It is long, but each clause carries operational weight; only the bridge detail could be trimmed without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so: it explains the returned id, the bridge/bridge.nextStep field, and how to check final status via get_post. For a 6-parameter publishing tool with error-recovery needs, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 83%, so the schema already documents id, wait, replyTo, secret and workspaceId; the description's parameter content (empty replyTo, wait:true) largely restates the schema rather than adding syntax or format detail. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb+resource ('Reply to a post or to a reply') and immediately distinguishes the two modes via the replyTo parameter. It names and routes to siblings (list_replies, get_post, publish), so an agent can tell it apart from publish or send_dm without opening anything else.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use for every branch: omit replyTo to reply to the post, pass a list_replies id to nest, pass wait:true to block, otherwise poll get_post with the returned id. It also gives a bounded retry policy ('Do not retry more than twice'), which is rare and genuinely actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

research_naver_keywordsMeasure and judge Naver keywords into setsA
Read-only
Inspect

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. Returns 403 research_tool_disabled with enableUrl if the person has not turned this tool on for connectors. Tell them once and do not call it again until they say it is on.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNoWhat 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.
keywordsYes1-60 keywords, as the person would search them.
seedTextNoWhat the person asked for, kept as the report's label. Defaults to the first five keywords.
workspaceIdNoWhich 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.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Rich disclosure well beyond the annotations: seven-day cross-user caching, a time budget that yields partial:true with unmeasured[], a ten-minute dedupe window that returns an existing reportId, the 403 research_tool_disabled error with enableUrl, and the fact that each call persists a report. The description discloses side effects (report saving, cache writes) that readOnlyHint=true does not surface, but it does not assert the opposite of the annotation, so this is understatement rather than contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with scope, function, and card outputs before the mechanics, and nearly every sentence carries operative detail (caching, budget, dedupe, 403 handling). It is a dense single block, however, and the prompt/draftPrompt/prompt-distinction sentences run together, making it harder to scan than it needs to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even with no output schema, the description explains what comes back (verdicts with reasons, sets with same-intent subs, prompt, draftPrompt), how partial results are signaled, and how failures and dedupe resolve. For a four-parameter tool with a time-budgeted, cached, error-prone backend, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents topic, seedText, workspaceId, and keywords in detail. The description reinforces a few things the schema says (topic flows into draftPrompt, workspaceId should not be re-asked) and adds the 1-60 keyword bound, but adds no formats or constraints beyond that. Baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verbs and resources: it measures Naver Blog keywords across three metrics, judges each into named verdicts (best, possible, hard, wall, hot, saturated, phantom), and groups them into post sets with main + sub keywords. The scope 'Naver Blog only' is clear. It never names or contrasts with the nearby expand_naver_keywords, get_naver_keyword_history, or list_naver_keyword_reports siblings, so differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage context: Naver Blog only, up to 60 keywords, and explicit instructions for the 403 research_tool_disabled path (tell the person once, do not retry until enabled). The partial:true / unmeasured[] re-call guidance tells the agent exactly when to call again. It stops short of comparing against alternative keyword tools (expand_naver_keywords), so 'when not to use this' is only partially covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

retry_postRetry a failed postA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesA publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here.
forceNoRetry 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 such reply), or even though another post with the same content is on the same account (duplicate_post).
workspaceIdNoWhich 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.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (destructive=true, openWorld=true) only flag risk; the description goes far beyond by enumerating concrete error codes and their meaning (429 naver_rate_limited, 400 naver_form_required, 409 naver_draft_unknown, 409 naver_reply_unknown, 409 duplicate_post, nothing_to_retry), noting that it replays the same payload, and warning that a failed Naver target may have left a post or draft in the editor. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and every subsequent sentence carries actionable branching logic rather than filler. It is dense and long, but the length is justified by the number of distinct error states; a bulleted error-code list would have made it easier to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description fully compensates by spelling out every return code, the retryAfterSeconds field, the prerequisite reads (get_post errorCode/retryable, list_naver_drafts, the blog comment), and the force escalation path. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents id, force, and workspaceId well, so the baseline is 3. The description nonetheless adds meaning by tying force to the specific error states and their required pre-checks, and by clarifying that workspaceId should not be re-asked — reinforcing how the parameters interact with the failure flow.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope: 'Retry the targets that failed on a publish. Targets that already went out are left alone.' It distinguishes itself from publish, publish_now, and publish_naver_draft by framing itself as a replay of a prior publish's failures, and it explicitly routes to publish when retryable is false.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when/when-not and alternatives throughout: don't call again before retryAfterSeconds, call publish instead when retryable is false, check list_naver_drafts before force:true, check the blog comment before force:true on naver_reply_unknown, and read the conversation / show forms via naver_layout before choosing a Naver form.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_instagram_audioInstagram only: find music or sounds for a reel
Read-only
Inspect

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, and you cannot choose where the audio starts. For a voice-over keep videoVolume at 100 and set volume around 15 to 30. Pass nextCursor back as cursor for the next page.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNomusic (default) or original_sound.
limitNoHow many to return, 1-50. Defaults to 25.
queryNoOptional keywords, up to 100 characters. Leave it out for this account's trending audio. With type music it only searches royalty-free music.
cursorNonextCursor from the previous call, to get the next page.
accountIdYesThe connected Instagram account. Required: trending audio differs per account.
workspaceIdNoWhich 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.
search_youtube_videosSearch YouTube for benchmark videos
Read-only
Inspect

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). Returns 403 research_tool_disabled with enableUrl if the person has not turned this tool on for connectors. Tell them once and do not call it again until they say it is on.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesThe search words, as a viewer would type them.
maxNo1-50, default 25.
orderNoDefault viewCount.
topicNoThe video the person wants to make, one line. Goes into prompt.
formatNoDefault all.
periodNoHow far back. Omit for no limit.
workspaceIdNoWhich workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.
select_channelsSelect channels to post toA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoOmit to list candidates, "all" for every active channel, or an array of platform names, handles or account ids.
workspaceIdNoWhich 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.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnlyHint=true, destructiveHint=false, openWorldHint=false), and the description adds substantial behavioral context: duplicate folding, skipped channels with reasons and reconnect links, limits calculation, accountIds passing to publish, empty-candidate meaning, and Naver Blog bridge states with user messages.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loads the core purpose and key instruction ('Call this before publish'). Every sentence carries useful guidance, though the long multi-clause sentences could be broken into clearer parts.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must explain return behavior. It covers candidates, accountIds, skipped, limits, and the Naver Blog bridge object, giving the agent enough to interpret most outcomes and handle edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters. The description adds concrete examples for the array items and notes duplicate folding, but it largely repeats the schema's scope description and says nothing about workspaceId.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Pick which connected channels to post to.' Clearly distinguishes from sibling publish by positioning itself as the selection step before publishing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to call it before publish and show the result to the person, explains how to use empty scope vs 'all' vs an array, and gives fallback instructions for empty results and Naver Blog accounts. It names the next tool (publish) and the conditions for each path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_dmSend a message in a conversationA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesConversation id from list_conversations.
textNo
draftIdNoMessage id of an AI draft to send instead of new text.
mediaIdNoOptional media id from media_presign.
workspaceIdNoWhich 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.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the description doesn't need to restate that. It adds valuable behavioral context: the 24-hour window, the public reply behavior on mention threads, and the 30-minute automation pause. It doesn't mention whether the message is irreversible or any rate limits, but the annotations cover the destructive nature. The description adds meaningful context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each carrying essential information: the core action, the critical time constraint, the mention-thread behavior, and the automation pause. No filler or repetition. The most important constraint (24-hour window) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the key behavioral constraints (24-hour window, public reply on threads, automation pause) and parameter nuances (draftId, workspaceId). It doesn't describe the success/failure response format, but the error case for window_closed is mentioned. Given the tool's complexity and the annotations covering safety, this is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the schema already documents most parameters. The description adds meaning for draftId ('AI draft that was waiting for approval') and workspaceId ('Only needed when the account has more than one — the error tells you the ids when it matters'). It doesn't add detail for text or mediaId, but the schema covers those adequately. The description compensates for the less obvious parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Send a message in a conversation as the account.' It also distinguishes itself from siblings by clarifying that on a mention thread it posts a public reply, and by mentioning draftId for AI drafts. This clearly differentiates it from related tools like reply, approve_reply, and create_comment_to_dm.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the critical 24-hour window constraint and what happens outside it (refused with window_closed). It also gives guidance on when to use draftId and when to include workspaceId, including the instruction not to ask the person again. This is strong usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_to_past_commentsSend an automation to past commentsA
Destructive
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe automation.
modeYespreview counts without sending, start queues the sends, stop halts a running job.
publicReplyNoAlso 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.
workspaceIdNoWhich 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.
includeAnsweredNoAlso send to comments that already have a reply from the account. Default false.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true; the description goes well beyond by explaining irreversibility ('a sent message cannot be recalled'), the Meta 7-day / one-private-reply constraint, the 750 replies/hour shared rate limit, the alreadyReplied refusal path, and the error codes (automation_not_live, past_comments_running, past_comments_no_post). This is exactly the added context the annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the critical 'preview first' warning are front-loaded, and nearly every sentence carries operational content (limits, error codes, mode effects). It is dense and long with heavy parenthetical asides, which costs a little readability, but little of it is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming where results surface: preview counts, get_automation (pastComments) for progress, and list_automation_runs for each answered comment. Combined with the mutation warnings and preconditions, an agent has everything needed to invoke this safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: mode preview is described as reading the newest comments and reporting eligible vs skipped by reason, start as queuing a throttled job, and includeAnswered/publicReply are tied to their effect on skipped/answered comments. It stops short of documenting workspaceId behavior, which only the schema covers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — running a live comment automation against comments already on the post — and immediately scopes it against the default behavior ('An automation normally reacts only to new comments'). An agent can distinguish this from create_automation, enable_automation, or a normal live run without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly prescribes the workflow: 'Always preview first, show the person the numbers, and start only after they confirm.' Names when each mode applies (preview/start/stop), when not to proceed (7-day limit, alreadyReplied), and what happens if you skip preview. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_automationEdit an automation's template settingsA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNo
paramsNoTemplate params to change. Only what you pass changes.
enabledNo
versionYesThe version from get_automation or list_automations.
workspaceIdNoWhich 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.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true but say nothing about merge semantics and versioning. The description adds substantial behavioral context: top-level fields replaced, objects merged one level deep with a concrete example (deliver.text keeps deliver.links), null removes a field, arrays replaced whole, stale version answers version_conflict, and live-flow edits take effect immediately. This is rich disclosure beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with the core update semantics, then the versioning rule, then the failure-mode routing. It is one long paragraph; a break between the merge rules and the routing/steering sentences would improve scanability, but every sentence carries needed information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with no output schema, the description covers the essential unknowns: merge/replace semantics, null behavior, version precondition and conflict error, rename and enable behavior, the Instagram follow-check fields, the not_a_template routing to put_automation, and the immediate effect on live flows. Nothing an agent needs to call it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%, so the description must compensate. It explains the id/version pairing (read first with get_automation and pass its version), the params merge semantics, and that name/enabled are also editable with the same checks as enable_automation. It does not restate the workspaceId rule, but that is already documented in the schema, so the description covers the documented gap well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (edit) and resource (an automation with its template shape), and explicitly names the fields it can change (name, enabled, template params). It distinguishes itself from put_automation by stating the template-shape precondition, so an agent can tell which sibling to pick without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use (an automation still having its template shape) and when-not (a canvas-edited flow has no template shape, use put_automation). It also tells the agent to read it first with get_automation and pass the version, and explains the version_conflict failure mode. Sibling routing is fully specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_mediaMark media as AI-madeAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMedia id from media_presign, media_from_url or media_upload_status.
aiGeneratedYestrue to mark as AI-made, false to clear.
workspaceIdNoWhich 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.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds key behavioral context beyond the annotations: the timing effect ('Applies to posts published or edited after this call'), the lack of retroactive changes, and the propagation behavior ('Every copy of the same file in your workspaces follows'). These traits are not captured in the annotations (readOnlyHint: false, destructiveHint: false) and would otherwise be unknown to the agent, so this is valuable disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no redundant words. It front-loads the core action, then packs in scope, timing, an alternative tool, and a workspace behavior. Every clause carries information that an agent needs, earning its place without any fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple mutation tool with no output schema, the description covers purpose, behavior, and parameter usage comprehensively. The only missing element is an explicit note about what the tool returns (e.g., success or updated media) or error cases beyond the workspace-id hint. Since there is no output schema, a brief mention of the return value would fully round it out, but the current description is already strong enough for correct invocation in most scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds significant meaning to the parameters. It tells the agent where the id comes from (media_presign, media_from_url, or media_upload_status) and gives nuanced guidance on workspaceId: when it's needed, that the error reveals the ids, and to leave it out if already decided without asking again. This goes beyond the schema's basic type descriptions and aids correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the verb ('Mark or unmark'), the resource ('uploaded image or video'), and the attribute ('aiGenerated'). It also distinguishes itself from the sibling update_post by noting that posts already out do not change and referencing update_post for that case, making it easy for an agent to select the right tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear when-to-use ('Mark or unmark...') and when-not-to-use ('posts already out do not change') guidance, and explicitly names the alternative (update_post) for already-published posts. It also provides practical instruction for the optional workspaceId parameter, including when to omit it and not to re-ask the user, which is directly actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_postEdit a scheduled, draft or live postA
Destructive
Inspect

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; leave it to keep the spacing. Send the edited source as content together with sourceVersion. Without it, or when the post changed on Naver since, this returns 409 naver_source_required with the current source and its sourceVersion (get_post also shows sourceVersion, but its content is only the source after uplika has read it once). Keep a @keep line to keep that block where it is, delete it to remove the block; text you write directly next to a @keep text block joins that block, and comes back inside its @keep line on the next read. An unknown id returns 422 naver_keep_unknown. This needs extension 0.7.8 or later (422 extension_outdated otherwise). A published Naver post is rewritten in place (same URL, same logNo) when you pass content, mediaIds or options. On a post that goes only to Naver Blog, the media: references in the new body are the post's media list: when you leave mediaIds out, media the new body does not place is removed from the post and the response note says how many. Pass mediaIds only for media to add at the end of the post without placing it in the body. If the body places more photos or videos than Naver takes (list_platforms), this returns 422 naver_media_over_limit with droppedIds and nothing changes. Naver Blog caps how many posts one ID publishes; when it does, this returns 429 naver_rate_limited with retryAfterSeconds. Do not call again before that, the draft is already in Naver. Naver Blog asks which form to publish with, every post: if options.naver_blog.form is missing this returns 400 naver_form_required with forms (id, name, when). The form is the house style to use when the person has no style of their own, so read the conversation first. If they dictated the structure or you laid it out yourself, pass options.naver_blog.layout: "as-is" and the markdown goes out unchanged. Otherwise show them the forms (naver_layout with forms: "all" lays every one out side by side) and call again with the one they pick. Do not pick for them. If the Naver editor shows a "missing image" error when you open an already-published post for editing, calling update_post on that post rewrites it in place and fixes it; the URL stays the same. A Naver draft (a target whose externalId starts with draft:, from options.naver_blog.draftOnly) is not on the blog: update_post publishes uplika's copy as a new post and, with extension 0.7.2 or later, removes the old draft from Naver's draft box. To publish the draft exactly as it is in Naver, call publish_naver_draft. Editing a post that is already live is asynchronous: pass wait: true to hold the response for the result (up to 75 seconds), or read it with get_post. If the account that published the post was disconnected, this returns 409 account_disconnected; reconnect the same account and the post id comes back.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesA publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here.
waitNoOnly 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_post.
draftNotrue turns a scheduled post back into a draft.
contentNoNew post text.
optionsNoPer-channel settings, same shape as on publish. Replaces the whole object.
mediaIdsNoNew 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.
accountIdsNoNew target accounts, from select_channels. Replaces the current set.
scheduledAtNoNew send time (ISO 8601 with offset, 10 minutes to 365 days out), or null to keep the post as a draft instead.
threadItemsNoReplace 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 (content then edits just the first one). Exclusive with content.
workspaceIdNoWhich 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.
sourceVersionNoOnly 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 current source.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far beyond the annotations (readOnlyHint=false, destructiveHint=true, openWorldHint=true), it discloses that editing live posts is asynchronous (wait up to 75s), that omitted Naver media is removed from the post, that rate limits surface as 429 naver_rate_limited with retryAfterSeconds, and numerous platform-specific error codes. The destructiveHint annotation is consistent with the disclosed media-removal behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded, but the body is a single monolithic paragraph of extreme length with no headers or breaks, making crucial operational rules (async wait, form requirement, @keep rules) hard to scan. Individually much of the content is useful, but the size and lack of structure are a clear defect.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 11 parameters, nested objects, no output schema and multiple platform-specific branches, the description covers error codes, prerequisites (extension version), async behavior and edge cases comprehensively. Nothing an agent needs in order to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, and much of the description reinforces it (options replaces the whole object, threadItems replaces the whole chain, scheduledAt null makes a draft). It goes further with semantics not in the schema, e.g. options.naver_blog.form/layout, sourceVersion and @keep line handling, which meaningfully aid correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb (Change/Edit) on a specific resource (scheduled/draft/live post) and immediately bounds scope by channel capability ('on a channel that supports editing'). It is readily distinguishable from siblings like publish, publish_naver_draft and get_post, which are named within the text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Alternatives are named with the conditions that select them: use publish_naver_draft 'to publish the draft exactly as it is in Naver', check list_platforms features, and read get_post to poll async results. It also gives explicit exclusions ('posts that already went out return post_not_editable') and process guidance ('Do not pick for them').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_automationCheck an automation documentA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
docYesOne 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 button's next continues. A loop must pass through such a wait.
accountIdYesThe connected account the flow would run on.
workspaceIdNoWhich 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.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and closed-world, so safety is covered. The description adds real value beyond that: it confirms no persistence, lists the rule families enforced, and defines the return contract (problems with paths, empty list = acceptable). It does not state whether validation is deterministic or how large documents are handled, but the added context is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no waste: the first front-loads what is checked and the non-saving constraint, the second delivers the return semantics and the routing to put_automation. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by defining the result shape (problems with paths) and the success signal (empty list). Combined with a richly documented nested input schema and annotations that cover the safety profile, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and all three parameters carry their own descriptions in the schema, so the schema does the heavy lifting. The description only hints at the account scope ('against the rules for one account') and adds no format or constraint detail beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Check a flow document') and enumerates exactly what is validated (node shapes, references, 24-hour window, Meta-review features). This clearly separates it from put_automation/create_automation/update_automation siblings, which persist rather than check.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames itself as a non-saving dry run and names put_automation as the operation it gates ('an empty list means put_automation would accept it'), so the agent knows when to reach for it. It stops short of stating when NOT to use it (e.g., post-save validation) or naming create_automation/update_automation as the actual apply paths.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updates
    • Changedpublish1 field changed
      • addedInput schema / properties / options / properties / instagram / properties / audio
        Added value: +{
        +  "description": "Music or a sound from search_instagram_audio to put on a reel. Reels only, and only on Instagram accounts connected via Facebook. Instagram defaults both volumes to 100, which can drown a voice-over; for narration try volume 20 and videoVolume 100. Instagram cannot preview the mix before it is published, and you cannot choose where the audio starts.",
        +  "properties": {
        +    "id": {
        +      "description": "The audio id from search_instagram_audio. Digits only. Use an id from this account's own results.",
        +      "type": "string"
        +    },
        +    "videoVolume": {
        +      "description": "Loudness of the video's own sound, a whole number from 0 to 100. Default 100.",
        +      "type": "number"
        +    },
        +    "volume": {
        +      "description": "Loudness of the added audio, a whole number from 0 to 100. Default 100.",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Addedsearch_instagram_audio
  2. 1 tool update
    • Changedpublish2 fields changed
      • changedInput schema / properties / options / properties / tiktok / description
        Previous value: -"TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. Until Uplika completes TikTok's review a direct post is visible only to the creator (SELF_ONLY) and comes back with no link and no metrics. postMode draft sends the video to the creator's TikTok inbox, where they choose who can see it."New value: +"TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. A direct post goes out with the privacyLevel you pass; only a public post that TikTok has reviewed comes back with a link and metrics. postMode draft sends the video to the creator's TikTok inbox, where they choose who can see it."
      • changedInput schema / properties / options / properties / tiktok / properties / postMode / description
        Previous value: -"direct (default) posts to the profile. draft sends it to the creator's TikTok inbox; they open the notification and finish it in the app, choosing who can see it themselves, so we send no visibility on this path. Until Uplika completes TikTok's review, a direct post is visible only to the creator (SELF_ONLY). A draft is not on the profile until the person finishes it, so there is no link and no metrics in the meantime."New value: +"direct (default) posts to the profile. draft sends it to the creator's TikTok inbox; they open the notification and finish it in the app, choosing who can see it themselves, so we send no visibility on this path. A draft is not on the profile until the person finishes it, so there is no link and no metrics in the meantime."
  3. 1 tool update
    • Changedpublish3 fields changed
      • addedInput schema / properties / options / properties / facebook / properties / feedTargeting
        Added value: +{
        +  "description": "Preferred audience for a Facebook text or link post. A hint, not a limit: Facebook may show the post more to these people, others can still see it, and the effect is not guaranteed. Facebook does not keep it on photo posts or reels (we checked), so those are refused. It cannot be changed after the post is published.",
        +  "properties": {
        +    "countries": {
        +      "description": "Countries to aim the post at, for example [\"US\", \"GB\"].",
        +      "items": {
        +        "description": "ISO 3166-1 two-letter country code in capitals, like US.",
        +        "pattern": "^[A-Z]{2}$",
        +        "type": "string"
        +      },
        +      "maxItems": 25,
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / options / properties / youtube / properties / defaultLanguage
        Added value: +{
        +  "description": "The language the title and description are written in, as one BCP-47 code (for example en-US or ko). Leave it out and none is sent. The spoken language (YouTube Studio's Video language) cannot be set through the API.",
        +  "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$",
        +  "type": "string"
        +}
      • changedInput schema / properties / options / properties / youtube / properties / madeForKids / description
        Previous value: -"Whether this video is directed at children. This is a legal declaration about someone else's channel. Leave it out unless the person tells you, and the channel's own default applies."New value: +"Whether this video is directed at children. This is a legal declaration about someone else's channel. Leave it out unless the person tells you, and the channel's own default applies. If the channel has not set its audience either, YouTube Studio will not save other edits to this video until someone picks one, so ask the person."
  4. 2 tool updates
    • Changedput_automation1 field changed
      • changedInput schema / properties / doc / properties / triggers / items / properties / post / description
        Previous value: -"comment triggers: { postId } | \"any\" | \"next\". \"next\" binds to the next post you publish."New value: +"comment triggers: { postId } | \"any\" | \"next\". postId may also be the post's link (the server resolves it to the uplika post id when saving). \"next\" binds to the next post you publish."
    • Changedvalidate_automation1 field changed
      • changedInput schema / properties / doc / properties / triggers / items / properties / post / description
        Previous value: -"comment triggers: { postId } | \"any\" | \"next\". \"next\" binds to the next post you publish."New value: +"comment triggers: { postId } | \"any\" | \"next\". postId may also be the post's link (the server resolves it to the uplika post id when saving). \"next\" binds to the next post you publish."
  5. 1 tool update
    • Addedsend_to_past_comments
  6. 4 tool updates
    • Changedcreate_comment_to_dm3 fields changed
      • addedInput schema / properties / likeComment
        Added value: +{
        +  "description": "Like the comment first. Instagram accounts connected through Facebook only.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / publicReplyInstruction
        Added value: +{
        +  "description": "With publicReplyMode ai: what the public reply should say. DM contents (links, codes, prices) are never repeated in public.",
        +  "type": "string"
        +}
      • addedInput schema / properties / publicReplyMode
        Added value: +{
        +  "description": "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.",
        +  "enum": [
        +    "fixed",
        +    "ai"
        +  ],
        +  "type": "string"
        +}
    • Changedpublish1 field changed
      • changedInput schema / properties / automation / description
        Previous value: -"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 draft unless enabled: true. Targets on channels without comments or DMs (YouTube, Telegram, Naver Blog, Bluesky, TikTok) are skipped and named in the response."New value: +"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 draft unless enabled: true. Each target goes through the same checks as create_automation. A target whose channel the template does not cover (comment_to_dm on Threads or Naver Blog, any template on YouTube, Telegram, Bluesky or TikTok) is skipped and named in the response with the reason."
    • Changedput_automation1 field changed
      • addedInput schema / properties / doc / properties / triggers / items / properties / publicReplyAi
        Added value: +{
        +  "description": "Instead of publicReply: the AI writes the public reply for each comment, after the flow ran. Told a DM was sent only when the private reply went out.",
        +  "properties": {
        +    "instruction": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "instruction"
        +  ],
        +  "type": "object"
        +}
    • Changedvalidate_automation1 field changed
      • addedInput schema / properties / doc / properties / triggers / items / properties / publicReplyAi
        Added value: +{
        +  "description": "Instead of publicReply: the AI writes the public reply for each comment, after the flow ran. Told a DM was sent only when the private reply went out.",
        +  "properties": {
        +    "instruction": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "instruction"
        +  ],
        +  "type": "object"
        +}
  7. 1 tool update
    • Changedretry_post1 field changed
      • changedInput schema / properties / force / description
        Previous value: -"Retry even though a Naver target is naver_draft_unknown (pass it only after list_naver_drafts shows the draft is not there), or even though another post with the same content is on the same account (duplicate_post)."New value: +"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 such reply), or even though another post with the same content is on the same account (duplicate_post)."
  8. 2 tool updates
    • Changedcreate_comment_to_dm1 field changed
      • changedInput schema / properties / publicReply / description
        Previous value: -"Optional public replies under the comment; one is picked at random."New value: +"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."
    • Changedput_automation1 field changed
      • addedInput schema / properties / detachTemplate
        Added value: +{
        +  "description": "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.",
        +  "type": "boolean"
        +}
  9. 8 tool updates
    • Addeddelete_automation
    • Addedduplicate_automation
    • Changedget_automation1 field changed
      • addedInput schema / properties / version
        Added value: +{
        +  "description": "A saved version number from list_automation_versions. Leave out for the current one.",
        +  "type": "integer"
        +}
    • Addedlist_automation_versions
    • Changedlist_automations3 fields changed
      • addedInput schema / properties / accountId
        Added value: +{
        +  "description": "Only automations on this connected account.",
        +  "type": "string"
        +}
      • addedInput schema / properties / status
        Added value: +{
        +  "description": "draft = not enabled, live = enabled.",
        +  "enum": [
        +    "draft",
        +    "live"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / templateId
        Added value: +{
        +  "description": "Only automations made from this template (list_automation_templates).",
        +  "type": "string"
        +}
    • Changedmedia_presign1 field changed
      • changedInput schema / properties / contentType / description
        Previous value: -"image/jpeg or image/png or image/webp or image/gif or video/mp4 or video/quicktime or video/webm"New value: +"image/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"
    • Addedupdate_automation
    • Addedvalidate_automation
  10. 1 tool update
    • Changedcreate_comment_to_dm4 fields changed
      • changedInput schema / properties / deliver / description
        Previous value: -"What to send after the tap: text, up to three link buttons, and/or a media id."New value: +"What to send after the tap: text, up to three link buttons, and/or one file (fileUrl or mediaId)."
      • addedInput schema / properties / deliver / properties / fileUrl
        Added value: +{
        +  "description": "Public https link to the file itself, sent as-is. Checked once on save.",
        +  "type": "string"
        +}
      • addedInput schema / properties / deliver / properties / mediaId / description
        Added value: +"A file uploaded to Uplika media, for a file with no public link."
      • addedInput schema / properties / deliver / properties / mediaKind / description
        Added value: +"Filled in from the file when you pass fileUrl."
  11. 1 tool update
    • Addedget_help
  12. 1 tool update
    • Changedput_automation4 fields changed
      • changedInput schema / properties / doc / properties / nodes / additionalProperties / properties / mode / description
        Previous value: -"send: window = inside the 24-hour window, private_reply = one DM to a commenter, public_reply = comment under the post."New value: +"send: window = inside the 24-hour window, private_reply = one DM to a commenter, public_reply = comment under the post. ai: window | public_reply | post_comment (post_comment = read the neighbor's post that triggered the flow and leave one comment; neighbor_post trigger only)."
      • changedInput schema / properties / doc / properties / nodes / additionalProperties / properties / mode / enum
        Previous value: -[
        -  "window",
        -  "private_reply",
        -  "public_reply"
        -]New value: +[
        +  "window",
        +  "private_reply",
        +  "public_reply",
        +  "post_comment"
        +]
      • changedInput schema / properties / doc / properties / triggers / items / properties / kind / enum
        Previous value: -[
        -  "comment",
        -  "live_comment",
        -  "message",
        -  "story_reply",
        -  "story_mention",
        -  "referral",
        -  "mention",
        -  "contact_created",
        -  "tag_added",
        -  "tag_removed",
        -  "field_changed",
        -  "schedule"
        -]New value: +[
        +  "comment",
        +  "live_comment",
        +  "message",
        +  "story_reply",
        +  "story_mention",
        +  "referral",
        +  "mention",
        +  "neighbor_post",
        +  "contact_created",
        +  "tag_added",
        +  "tag_removed",
        +  "field_changed",
        +  "schedule"
        +]
      • addedInput schema / properties / doc / properties / triggers / items / properties / neighbors
        Added value: +{
        +  "description": "neighbor_post trigger (Naver Blog): mutual = only mutual neighbors (default), all = every neighbor in the feed.",
        +  "enum": [
        +    "mutual",
        +    "all"
        +  ],
        +  "type": "string"
        +}
  13. 1 tool update
    • Changedpublish2 fields changed
      • changedInput schema / properties / options / properties / tiktok / description
        Previous value: -"TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. While this app is awaiting TikTok's Content Posting audit a direct post can only be SELF_ONLY and comes back with no link and no metrics; if the person wants it public in the meantime, use postMode draft instead."New value: +"TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. Until Uplika completes TikTok's review a direct post is visible only to the creator (SELF_ONLY) and comes back with no link and no metrics. postMode draft sends the video to the creator's TikTok inbox, where they choose who can see it."
      • changedInput schema / properties / options / properties / tiktok / properties / postMode / description
        Previous value: -"direct (default) posts to the profile. draft sends it to the creator's TikTok inbox; they open the notification and finish it in the app, choosing the visibility themselves. While this app awaits the Content Posting audit this is the only way to get something out publicly: a direct post can only be SELF_ONLY, but on this path we send no visibility at all. The trade is that it is not on the profile until the person finishes it, so there is no link and no metrics in the meantime."New value: +"direct (default) posts to the profile. draft sends it to the creator's TikTok inbox; they open the notification and finish it in the app, choosing who can see it themselves, so we send no visibility on this path. Until Uplika completes TikTok's review, a direct post is visible only to the creator (SELF_ONLY). A draft is not on the profile until the person finishes it, so there is no link and no metrics in the meantime."

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Lets any AI agent post to TikTok, Instagram, YouTube, X, LinkedIn, Bluesky, Telegram, Mastodon and Discord through a single post_to_social tool. Connect an account once, then publish everywhere.
    2
    74 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Social media scheduling and publishing for AI agents. 17 validation-first tools to post to X, LinkedIn, Instagram, TikTok, YouTube, Reddit, Discord, Telegram, and more through one connected workspace.
    87 npm
    95
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to schedule and publish social media posts to platforms like Instagram, TikTok, YouTube, LinkedIn, Facebook, X, Threads, and Pinterest using natural language.
    33
    774 npm
    4
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    AI-powered social media posting across 14 platforms. Post to Twitter, Instagram, TikTok, Facebook, LinkedIn, YouTube and more with one command. AI adapts content per platform, schedules posts, and generates 30-day content calendars.
    6
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources