Skip to main content
Glama

Server Details

Publish to social channels from your AI agent. Threads is live; nine more await review.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.5/5.0

Scored across 45 tools

Disambiguation3/5

Some tools are clearly distinct (publish vs. reply vs. send_dm), but several have overlapping or confusing boundaries, such as list_posts vs. list_channel_posts, get_post vs. open_post, and the multiple media upload tools (media_from_url, media_upload_link, media_presign) which each handle different file sources but could be mis-selected. The delete/hide/reply tools are also similar but have specific channel-dependent differences that are not immediately obvious.

Naming Consistency4/5

Most tools follow a clear verb_noun pattern (e.g., list_accounts, get_post, create_automation, send_dm), and the media_* prefix groups upload-related tools. However, there are minor inconsistencies: 'publish_now' uses an adverb style unlike 'publish', and 'select_channels' is a non-crud verb, but overall the pattern is consistent enough for an agent to predict naming.

Tool Count2/5

With 45 tools, this is far beyond the typical well-scoped range. While the domain is broad (multi-channel social media management), the count is excessive and likely includes many niche functions that could be consolidated (e.g., multiple media upload variants, multiple automation tools). This makes the tool surface unwieldy and hard to navigate for an agent.

Completeness3/5

The toolset covers core workflows for publishing, replying, deleting, and reading posts, as well as media handling and automations. However, there are notable gaps: no tool for editing a published post (except Naver Blog), no tool for searching or filtering posts, no tool for managing contacts beyond getting one, and no explicit tool for listing or managing multiple accounts' settings. The automation tools are extensive but lack a tool to pause/stop all automations at once.

Available Tools

45 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.2/5.0
Behavior4/5

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

Annotations already signal this is a mutating, destructive-hint operation. The description adds valuable behavioral context by stating that approving makes the reply public and that the tool can also ignore a held reply. 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?

The description is two sentences with no wasted words. It front-loads the platform and core action, then gives the key consequence and queue-reading hint.

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 mutating tool with four parameters and no output schema, the description covers the essential behavior, consequences, and how to locate the queue. It could be more explicit about the effect of ignore and the return value, but the main operational context 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 75%, so most parameters are already documented. The description adds a small amount of extra meaning by linking the approval/ignore action to the approve boolean and hinting at queue listing with 'pending: true', but it does not significantly clarify accountId or the exact mechanics of the pending filter.

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 ('approve') with a clear resource ('a reply held by reply approval on one of the account's posts') and scopes it to Threads. It clearly distinguishes the action from the many reply-related siblings like delete_reply or hide_reply by focusing on the approval workflow.

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: this is Threads-only, applies to held replies, and tells the agent how to read the pending queue ('pending: true'). It does not explicitly name alternative tools or state when not to use it, but the context is enough for basic routing.

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). If you have a shell on that computer, run the one for its OS, then call this again or get_post; the extension reconnects within about a minute and queued posts go out. publish also returns the same bridge object when the extension is offline. state is one of online, offline, logged_out (Chrome is on but not logged in to Naver). 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.6/5.0
Behavior5/5

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

Annotations only provide readOnlyHint=true. The description goes far beyond by explaining the extension's role, the offline behavior with wake commands, the state values, userMessage for relaying, queued count, extensionVersion/kinds, and the behavior that queued posts go out within a minute of Chrome opening. 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 description is a dense paragraph but every sentence carries useful information about scope, workflow, response fields, and relationships to sibling tools. It is not excessively verbose for the complexity it covers, though it could be better structured with bullets.

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?

The description fully explains the response fields (state, userMessage, queued, extensionVersion, kinds, wake commands) and the operational sequence. Even without an output schema, an agent would know exactly what to expect and how to use the 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 coverage is 100% and both parameters are already well-described in the schema. The description does not add parameter-specific semantics, but since the schema covers them, a 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 clearly states the tool checks the Naver Blog extension status and provides wake commands when offline. It explicitly scopes to Naver Blog and distinguishes itself from siblings like publish and get_post by explaining when it should be called.

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 instructs to call before publishing to Naver Blog, and provides a conditional workflow for when online=false, including running OS-specific wake commands and recalling the tool. It also notes that publish returns the same bridge object when offline, and mentions delete_post/update_post for queued posts, giving clear guidance vs alternatives.

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.4/5.0
Behavior4/5

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

Annotations already convey readOnlyHint=false and destructiveHint=false, so the description only needs to add meaningful behavior. It adds that the result is a draft rather than an active automation, which is material for an agent deciding what happens after the call. It does not mention side effects or return values, but the draft behavior is genuine added transparency.

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 sentences with no filler. The primary action is front-loaded, the draft outcome is stated immediately, and the fallback to put_automation is included in one compact sentence.

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 together with the schema covers where templateId and params come from, the draft behavior, and the alternative path when no template fits. Since there is no output schema, an explicit note about what the call returns would improve completeness, but this is a minor gap for a create 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 coverage is 83%, and the schema already explains templateId, params, accountId, enabled, and workspaceId. The description reinforces that params come from the chosen template, but adds no new parameter-specific meaning beyond what the schema already provides. 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 names a specific verb ('Create'), resource ('automation'), source ('any template in list_automation_templates'), and result ('Creates a draft'). It also signals the difference from put_automation, so an agent can distinguish the two tools without opening their 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 explicitly says to use this tool when a template covers the flow and to use put_automation instead when building the document by hand. This is a clear when-to-use condition with a named alternative.

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. Files go through media_presign first and are passed as deliver.mediaId. post can be our post id, the post's own id on the platform, a link to the post, "any" for every post, or "next" for the next post you publish (or pass automation on publish to do both in one call). 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.

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 a media id.
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.
publicReplyNoOptional public replies under the comment; one is picked at random.
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.
notFollowingMessageNo
followUpAfterMinutesNo1 to 1380 (23 hours). Default 60.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only carry readOnlyHint=false and destructiveHint=false, so the description bears the full transparency burden and delivers richly: Meta's private-reply/7-day/24-hour-window mechanics, the Instagram-vs-Facebook requireFollow asymmetry, the media_presign→mediaId pipeline, the post value forms, and the complete execution order (opening DM → askEmail → requireFollow → deliver → followUp). 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.

Conciseness5/5

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

Long but every sentence earns its place given the tool's complexity. The most decision-relevant fact (draft, nothing goes out) is front-loaded; platform differences, ordering, and edge cases follow in a logical flow. No filler or repetition of schema content.

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 20-parameter tool with nested objects, platform differences, and no output schema, the description covers the essential behavioral mechanics almost exhaustively. The one gap: it never states what the call returns (e.g., the draft automation id needed by enable_automation), which matters more because no output schema exists to fill that void.

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 70%, so the baseline is 3; the description pushes higher by adding meaning the schema lacks: what 'post' values mean in practice ('next' for the next post you publish), how files reach deliver.mediaId via media_presign, and the consequences of openingDm:false (window never opens, so requireFollow/askEmail/followUp/files are rejected). A few obscure params (emailRetry, recheckTitle, notFollowingMessage) remain undocumented in both, capping the score.

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 crisp definition: 'when someone comments on a post, DM them.' The verb (create), resource (comment-to-DM automation), and the draft status ('nothing goes out until enable_automation') are all explicit, and the description clearly differentiates from siblings like send_dm, reply, and create_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?

Gives explicit when-to-use and when-not-to-use guidance: 'Threads has no DMs at all; use create_automation with comment_public_reply' names the exact alternative. It also routes to enable_automation as the follow-up step and warns about the 409 next_post_taken conflict. The schema's 'enabled' field reinforces this with 'Prefer leaving it off and calling enable_automation after the person confirms.'

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

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 already indicate destructiveHint=true, so the agent knows it's destructive. The description goes far beyond that by detailing irreversibility, per-channel daily limits, time windows (Telegram 48h), platform restrictions (Instagram, Facebook, TikTok), and behavior on scheduled/draft posts. This is substantial behavioral disclosure that annotations alone do not 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?

The description is long but every sentence carries necessary platform-specific information. It is front-loaded with the core purpose and irreversibility, then systematically covers each platform's constraints. While verbose, the structure is logical and each detail is essential for correct usage, so it 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 comprehensively covers operational constraints across all supported platforms, including limits, restrictions, and edge cases like scheduled/draft posts. It does not describe the return value or error handling, but given the absence of an output schema and the focus on behavior, the omission is minor. The tool's complexity is well addressed.

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 fully documents both parameters. The description adds minimal additional semantics: it mentions that links work for posts written in the channel's app, but that is already stated in the schema's id description. Thus, the description adds no meaningful value beyond the schema, warranting the baseline 3.

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 deletes a post from the channel permanently, distinguishing it from update_post (edit), hide_reply (hide), and publish (create). The verb 'delete' and resource 'post' are specific, and the scope 'from the channel' sets expectations.

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 provides strong contextual guidance: it explains when deletion works (e.g., on scheduled/draft posts it cancels them) and when it doesn't (e.g., Instagram accounts not linked via Facebook). It also advises confirming with the person first, which is a usage guideline. It doesn't explicitly name alternative tools, but the platform-specific constraints effectively guide when not to use it.

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 declare destructiveHint=true, but the description goes further: it discloses irreversibility, channel-specific reach differences, and who it removes (anyone's comment vs only the connected account's reply. This is valuable context not present in 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?

Every sentence earns its place: the core action, the alternative, channel differences, and the recommendation. The key point is front-loaded and the length is proportionate to the complexity.

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 channel-dependent behavior, the description covers irreversibility, channel support routing, and the alternative. Combined with full schema coverage and annotations indicating destructiveness, nothing an agent needs to decide whether to call it 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%, with clear descriptions for postId, replyId, and workspaceId. The tool description adds no parameter-specific meaning beyond what the schema already provides, so the baseline of 3 is correct.

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 opens with a specific verb and resource ('Delete a comment for good') and immediately contrasts itself with the sibling hide_reply, so an agent can distinguish 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?

It explicitly states when not to use this tool ('This is not hide_reply: it cannot be undone') and names the alternative ('Prefer hide_reply when the person just wants it out of sight'). It also references list_platforms for determining channel support.

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 annotation, the description reveals important behavior: not_supported is expected for non-Naver platforms, results mirror the same grammar used by the publisher, and topic-specific sections include silent-failure mistakes. This gives the agent realistic expectations about outputs and errors.

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 moderately long but every sentence earns its place: purpose, exclusion, when to call, topic behavior, and source authority. It is front-loaded with the key purpose and scoping, and the later examples are illustrative, not 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?

For a read-only lookup tool with three parameters and no output schema, the description is complete. It covers supported platform, query behavior, default behavior, result provenance, and a non-error condition. An agent has enough to decide when to call it and what to expect.

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 meaning beyond the schema: it explains what happens without a topic vs. with one, and that returned values come from the grammar the publisher validates against. This complements rather than repeats the schema's 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 clearly states the tool's purpose: describe the body markup grammar for a channel, specifically Naver Blog. It distinguishes scope by noting every other platform returns not_supported, and ties the tool to the publish workflow rather than other sibling operations.

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?

Usage guidance is explicit: call this before writing a Naver Blog body for the first time, or when basic formatting doesn't cover a need. It also tells the agent not to treat not_supported as an error and clarifies that other platforms don't support this lookup.

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.5/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, so the safety profile is partially covered. The description adds a meaningful behavioral detail: existing waiting runs are preserved, only new starts are blocked. This goes beyond the annotations and clarifies the non-destructive nature, which is valuable for an agent deciding whether to call it.

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 zero filler. The core action is front-loaded, and the key behavioral distinction is stated immediately. Every sentence carries information that aids tool selection and correct invocation. This is an ideal size for a simple action tool.

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 tool with one required parameter and no output schema, the description covers the main effect but leaves ambiguities: it does not specify what happens to currently executing runs (only 'waiting' ones), whether the stop is reversible, or how to restart. These gaps are minor for a simple stop action but could affect an agent's decision in some scenarios.

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?

The input schema has 50% description coverage – workspaceId is explained, but id is not described. The tool description mentions neither parameter, providing no additional meaning for id, which is required. Given the low schema coverage, the description should compensate, but it fails to do so. The agent must infer id semantics from the context alone.

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 states a specific verb and resource: 'Stop an automation.' It clearly indicates the tool halts automation, and the added detail about runs waiting for a button distinguishes it from purely starting or creating automations. It doesn't explicitly name alternative tools, so it loses a point for no 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 behavioral note 'Runs already waiting for a button stay waiting but nothing new starts' implies the intended use case (stop new starts while letting pending manual steps continue). However, it does not explicitly state when to use this over alternatives like disable or delete, nor does it mention any prerequisites or exclusions. The guidance is implied rather than stated.

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. Refuses with reconsent_required if the account was connected before DM permissions, 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.3/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, and the description adds valuable detail: messages begin going to real people, confirmation is required, enabling is refused under certain conditions, and webhook subscription is warned about. This goes well 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.

Conciseness5/5

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

Every sentence earns its place. The most important warning is front-loaded, and the failure modes are packed into three tight sentences without 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?

The definition covers the key behavioral constraints, safety implications, and refusal modes an agent needs to act responsibly. It is slightly incomplete because it never specifies what the required 'id' parameter represents, but the overall picture is solid for a simple two-parameter mutation.

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%, with the required 'id' parameter completely undocumented in both the schema and the description. The description adds no parameter meaning; the agent must infer that 'id' refers to an automation 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?

The description states a specific action, 'Turn an automation live,' and clarifies its real-world effect: 'This is the moment messages start going to real people.' This clearly distinguishes it from siblings like create_automation and disable_automation.

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 contextual guidance: confirm with the person first, and explains the one-automation-per-account constraint and the error cases next_post_taken, reconsent_required, and webhook warnings. It does not explicitly name alternatives or say when not to use, but the context is strong.

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.

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.5/5.0
Behavior4/5

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

Annotations provide readOnlyHint=false and destructiveHint=true, correctly implying a mutating action. Description adds behavioral details critical for agent expectations: mutual requests become pending, 'already a neighbor' returns as 'already', and there is no unfollow. It also notes that the 'message' parameter is ignored unless mutual is true. Adding specific return semantics (already) is valuable beyond the generic annotations. Slight deduction for not explicitly stating that choosing follower status is permanent (given no unfollow), but that's implied.

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 moderately concise, opening with the core action and then immediately highlighting a platform-specific constraint ('Naver Blog only'). It then explains the two modes and a special return value, with a final note about 'no unfollow'. While it is a paragraph, each sentence contributes a distinct piece of actionable info. The ordering is sensible: action, key distinction, behavioral result, and boundary. A slight deduction for length but overall well-structured and 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?

Given the tool has 5 parameters, one required, and no output schema, the description covers the key use cases: how to follow normally, how to follow mutually, outcomes for both, and the absence of unfollow. It addresses the optional parameters indirectly by saying they are only needed in multi-account scenarios, which is sufficient context. It lacks explicit mention of error cases beyond 'already', but with no output schema, listing all possible return values isn't strictly necessary. The description is sufficient for a competent agent to pick the right options and understand the flow.

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 description doesn't need to repeat parameter descriptions. However, the description adds value by explaining the behavioral interplay: the 'message' is sent only with a mutual request, and that mutual requests require acceptance (resulting in pending status). It also clarifies that 'accountId' and 'workspaceId' are optional unless there are multiple, providing selection criteria. This adds context that the schema descriptions (which likely say 'which' but not when) do not fully capture.

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?

Description clearly states the action ('Follow an account'), the specific resource (Naver blog as a neighbor), and provides a crucial scoping constraint ('Naver Blog only today' removes ambiguity about platform). Distinguishes from siblings like 'like' or 'reply' by focusing on neighbor-following. It also differentiates the two behavioral modes (mutual vs plain) with explicit timing (immediate vs pending acceptance).

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?

Description includes explicit when-to-use guidance: 'mutual: true' is used when a mutual request is needed; 'without it' plain neighbor. It also states the consequence of the 'mutual' option (pending until accepted). It disambiguates from other actions by specifying 'no unfollow', clarifying that this is one-way. While it doesn't name alternatives, the description makes the use case and decision rules explicit.

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 needs, and templateParams when the flow still has its template shape.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAutomation id from 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.2/5.0
Behavior4/5

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

The readOnlyHint annotation already establishes safety, and the description adds useful behavioral context: the returned fields, that version is required for put_automation, and that templateParams only appear when the flow still has its template shape. This goes 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.

Conciseness5/5

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

Two sentences, no filler, and each sentence earns its place: the first defines the core output, the second adds the version and templateParams details that matter for downstream use. Information is front-loaded and easy to scan.

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 operation with a fully documented schema and readOnlyHint, the description adequately covers the return payload and even notes a conditional field. It could mention error cases or more about the 'document' structure, but nothing critical is missing for correct invocation.

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 does not add parameter-level detail, but the schema already explains id and workspaceId well, including when workspaceId is needed and how to handle ambiguous cases.

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 identifies the tool as a single-resource read: 'One automation as a document' with specific fields (triggers, nodes, start). It distinguishes itself from list-oriented siblings by emphasizing 'One automation' and connects to put_automation through the version field.

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 provides clear context: use this to get a single automation and its version, which is explicitly stated as needed by put_automation. It does not explicitly name alternatives or exclusion criteria, but the single-vs-list contrast and the version-for-update link give usable guidance.

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

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description doesn't need to restate safety. It adds valuable behavioral context: the Instagram-only limitation for follow relationships, the condition 'only for people who have messaged', and the absence of follower lists on any channel. It also implies the refresh parameter behavior by mentioning re-reading from the channel in the schema, but the description itself doesn't discuss rate limits or error behavior. Still, it 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?

The description is two sentences, front-loaded with the most important information (what a contact is and what fields are returned), followed by a crucial limitation. Every sentence earns its place; there is no fluff or repetition of schema details. The structure is ideal for an agent scanning quickly.

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 a simple schema (one required id, two optional params), the description covers the return fields and key limitations. It doesn't describe the output format (no output schema exists), but the field list effectively substitutes for that. It also doesn't mention pagination or error cases, but for a single-contact read that's less critical. The main gap is not explicitly stating when to use this vs. list_conversations or list_accounts, but the description's clarity about what it returns makes it complete enough for most agents.

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 67% (refresh and workspaceId have descriptions; id has none). The description doesn't explicitly explain the id parameter, but it's obvious from context that id identifies the contact. The description adds meaning by clarifying what data is returned for a given contact, which helps an agent understand what the id refers to. The refresh and workspaceId parameters are already well-described in the schema, so the description doesn't need to repeat them. This is slightly above baseline because the description clarifies the overall purpose of the 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 clearly states the tool reads 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 sibling tools by noting follower lists don't exist on any channel, making this the closest thing. The verb 'read' matches the title and readOnlyHint.

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 provides clear context on when to use this tool: when you need contact details, especially follow relationships and messaging window info. It explicitly notes the Instagram-only limitation and that follower lists don't exist, which helps an agent avoid expecting a list tool. However, it doesn't explicitly name alternative sibling tools like list_conversations or list_accounts for when a list is needed, 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.

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.

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
Behavior3/5

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

Annotations declare readOnlyHint=true, so the agent knows this is safe to call. The description adds a useful behavioral nuance: views and shares may be null when the platform has not reported them yet, and null is distinct from zero. It does not disclose pagination, rate limits, or data freshness/recency, but for a read-only metrics retrieval with a single publish id, the additional null guidance is meaningful. This sits at a solid 3, not higher because the main safety profile is already carried by annotations and no further behavioral traits are 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?

The description is a single, compact sentence that states the resource and the key metric fields, plus a crucial caveat about null values. It is front-loaded: the first clause says exactly what the tool returns, and the second clause handles the only real edge case an agent needs to know before calling. A few extra words could mention the response format, but for a read-only single-item tool, the size is appropriate.

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 one required parameter, a fully covered schema, and an annotations block declaring it safe, the description covers the core behavior and the most important data nuance (null vs zero). No output schema exists, so the metric list is essential context and is provided. It doesn't describe the exact JSON shape, but the listed metric names give an agent enough to interpret the result, and the read-only hint plus id resolution rules in the schema complete the picture.

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 adds value by noting that views and shares can be null, which relates to the returned data rather than the parameters themselves. The description does not add parameter-level semantics beyond the schema, but it also does not need to, since the id and workspaceId are fully described in the schema. The null comment is a behavior note rather than a parameter note, so the score stays at baseline.

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?

Clear verb+resource: it fetches metrics for one publish. The description explicitly lists which metric fields are included — views, likes, replies, reposts, quotes and shares — and notes null handling, which distinguishes it from a generic 'get metrics' definition and provides concrete expectations. The title 'Get post metrics' reinforces the same behavior without adding ambiguity.

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 implies this tool is for a single publish object and is separate from list_posts/list_channel_posts/list_replies, which are list-oriented siblings. It doesn't explicitly say 'use this instead of X when you need metrics for one publish', but the resource scope is clear enough for an agent to infer the correct context. It could improve with an explicit when-not-to-use or alternative mention, but the semantics are sufficiently unambiguous.

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.

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
Behavior4/5

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

With readOnlyHint already declaring the operation safe, the description adds useful behavioral context: it returns per-target status and explains that failed targets include a reason. This helps an agent know what to expect without opening the output. It does not detail error handling or edge cases, but the annotation covers the main safety aspect.

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 only two sentences and contains zero filler. The key point (what the tool returns) is front-loaded, and the alternative guidance is given in a concise second sentence. Every word contributes to the agent's decision-making.

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 there is no output schema, the description's summary of return content (per-target status and failure reasons) is essential and present. It also addresses the common ambiguity of post links by pointing to open_post. It could mention how errors are surfaced, but overall it is sufficient for a tool with only 2 parameters and a read-only annotation.

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 parameters thoroughly, including the accepted id forms and when workspaceId is needed. Because schema coverage is 100%, the description does not need to add much. It only implies the id refers to a publish, matching the schema's 'publish id (post_…)' description, so it adds no substantial parameter meaning.

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 states the tool returns per-target status and failure reasons for one publish, giving a specific resource and what it yields. It clearly distinguishes itself from open_post by noting that for a post link, open_post is more appropriate. However, it is phrased as a fragment ('One publish: …') and could more explicitly say 'Retrieves the status of one publish.'

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 explicitly names an alternative (open_post) and the condition that selects it ('For a post link you probably want open_post instead'). This provides a clear when-not-to-use signal. It does not contrast with list tools like list_posts or list_channel_posts, but the singular scope is implied by 'One publish.'

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

get_publish_optionsCheck what a channel needs before publishingA
Read-only
Inspect

What a channel needs to know before you publish to it. Only TikTok has this today; every other channel returns not_supported, which is not an error to work around. For TikTok it returns the creator nickname the post will go out as, the privacy levels this account may use right now, whether it can post at all, and its video length limit. Call it before every TikTok publish: the values are per account and change when the person edits their TikTok settings. options.tiktok.privacyLevel is required and has no default, so this is where you get the value to pass.

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.6/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true, and the description adds substantial non-obvious behavior: per-account values that change when settings change, the not_supported return for non-TikTok channels, and the specific fields returned. It also warns that options.tiktok.privacyLevel has no default, which is exactly the operational detail an agent needs.

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 clause and the guidance is sequenced sensibly (scope, then return values, then the call-before-publish rule). The final sentence about privacyLevel is slightly long but carries required-value information that 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?

With no output schema, the description compensates by enumerating the returned fields (nickname, privacy levels, posting ability, video length limit) and the not_supported fallback. An agent has everything needed to call and interpret the response.

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, and the description only echoes the per-account rationale for accountId and the optional nature of workspaceId. It adds no format or syntax detail beyond the schema, 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 (check) and resource (channel publish requirements) and immediately distinguishes itself from the sibling 'publish' by framing it as a pre-flight check. The TikTok-specific scope is spelled out, so an agent knows exactly what it is asking for.

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 'Call it before every TikTok publish' and pre-empts the main misuse by noting that other channels return not_supported 'which is not an error to work around'. Both the when and the when-not are given.

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.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, but the description adds valuable behavioral context: it reports live usage from the platform, and reveals an internal rate cap that can cause publish to fail independently of platform allowance. This goes beyond the basic read-only hint.

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 serving a clear purpose: function, usage timing, differentiation from static limits, and a caveat about rate limiting. No fluff or repetition, and 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?

With no output schema, the description could have specified the return format, but it clearly conveys the core measurement (used vs. allowance) and provides context for interpreting when rate limits might still occur. The absence of an output schema is partially compensated by the description's conceptual clarity, though a bit more detail on what is returned would make it fully 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 coverage is 100% for both parameters, with clear descriptions in the schema itself. The description does not add parameter-specific semantics, so the baseline of 3 is appropriate; it does not need 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?

The description clearly states the tool reports how much of the 24-hour publishing allowance is used for posts, replies, and deletes. It explicitly distinguishes itself from list_platforms by noting 'not the static limits in list_platforms', making the purpose specific and unambiguous relative to sibling tools.

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 explicit usage timing with 'Check this before a burst of publishing' and contrasts itself with list_platforms as the alternative for static limits. Also warns that publish can return rate_limited even when allowance remains, giving practical guidance for when to check quota.

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

hide_replyHide a replyA
Destructive
Inspect

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/5.0
Behavior4/5

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

Annotations already mark this as non-read-only and destructiveHint=true. The description adds valuable nuance by clarifying the action is reversible ('show it again with hide: false'), which softens the destructive hint. It does not detail permissions or broader visibility side effects, but annotations lower the burden.

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 concise sentences. The action and toggle behavior are front-loaded, and every clause adds useful guidance about the hide parameter or id provenance. No wasted words.

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 tool with no output schema, the description plus rich schema cover the core requirements: replyId and postId derivation, the hide toggle, workspaceId handling, and post link formats. The only notable gap is not explicitly distinguishing hide from the sibling delete_post, but the reversible-toggle language mitigates this.

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's mention that 'postId is the publish it belongs to' is largely redundant with the schema's own postId description. It adds little semantic meaning beyond what the schema already 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 action and resource: 'Hide a reply on the channel, or show it again with hide: false.' It clearly distinguishes this from sibling tools like delete_post, reply, or list_replies by focusing on the hide/show toggle.

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 when to use the tool (hiding or unhiding a reply) and points to list_replies as the source for replyId. However, it does not explicitly contrast with delete_post or explain when not to use this tool, leaving some selection ambiguity.

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 replyA
Destructive
Inspect

Like a post, or a reply under it when you pass replyTo. Idempotent: if it is already liked the call succeeds with already: true and nothing is toggled. There is no unlike. Naver Blog only today; other channels answer not_supported. On Naver Blog the post can belong to another blog: pass its link and we act as the connected account. Naver ignores liking your own post, and that comes back as naver_not_allowed rather than a fake success.

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.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint false, destructiveHint true), the description reveals idempotency with 'already: true', no unlike operation, channel limitations, cross-blog linking behavior, and the naver_not_allowed error for self-likes. This is rich behavioral disclosure with no contradiction to 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?

The description is dense yet efficient: core behavior, idempotency, no-unlike caveat, channel support, edge cases, and error behavior are all included without redundant wording. Every sentence 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?

Given the operation's complexity, the description covers channel restrictions, error responses, idempotency, authentication-driven cross-blog behavior, and parameter semantics. With no output schema, it sufficiently explains what an agent needs to know to invoke 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 the baseline is 3. The description reinforces that replyTo selects a reply and that links can be used for posts on another blog, but most parameter meaning is already present in the schema. It adds limited extra semantic detail.

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 and resource: 'Like a post, or a reply under it when you pass replyTo.' It also clarifies scope by saying 'There is no unlike,' which distinguishes this tool from other engagement tools like reply or follow.

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 channel guidance ('Naver Blog only today; other channels answer not_supported') and explains idempotent behavior. It does not explicitly name sibling tools as alternatives, but the context is clear enough for an agent to know when this tool applies.

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

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.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. The description adds non-obvious behavioral context: the meaning of status 'active', that only active accounts are used for publishing, and that an empty list indicates no connected channel. This goes beyond the annotation without contradicting it.

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?

Every sentence adds value, starting with the core purpose, then usage context, output fields, and edge-case guidance. It is front-loaded and contains no redundancy or 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?

Despite lacking an output schema, the description explains the item fields and key statuses, integrates with the publish workflow, and covers the empty-list case with a suggested action. This is complete for a read-only 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?

The description itself does not discuss the workspaceId parameter, but the schema provides a thorough parameter description including when it is needed and explicit guidance not to re-ask. With 100% schema coverage, the description adds little parameter-level meaning, earning the baseline 3.

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 this tool lists connected social accounts, enumerating fields (id, platform, handle, status). It distinguishes itself from sibling tools by explicitly positioning it as the precursor to publishing, and it is uniquely named 'list_accounts' with no similar sibling.

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 instructs 'Call this before publishing anything' and explains how the output maps to publish (accountIds, only active accounts, targeting all active accounts when no channel is named). Also provides an actionable fallback when the list is empty, sending the person to the dashboard.

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 runsC
Read-only
Inspect

Runs of one automation with their status and a step log. Status names why a run stopped: blocked_window (24-hour window closed), blocked_opt_out, blocked_paused (a person is handling that conversation), blocked_burst, failed_channel, expired, superseded, waiting, done.

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

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful context by explaining the meaning of status values (blocked_window, blocked_opt_out, etc.), but it does not disclose pagination behavior, ordering, or other operational details like rate limits.

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 purpose, followed by a valuable enumeration of statuses. Each line earns its place, though the long status list could arguably be trimmed if a separate enum were available; here it is necessary.

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

Completeness2/5

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

The tool has 4 parameters, no output schema, and very low schema coverage, so the description must carry substantial weight. It covers the output's nature and status meanings but leaves pagination parameters and return details unspecified, making it incomplete for an agent to call correctly in all cases.

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 25%, so the description must compensate, but it only implicitly clarifies that 'id' refers to the automation. The 'limit' and 'before' pagination parameters are left entirely unexplained, and workspaceId's purpose is defined only in the schema, not the description.

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 (runs of one automation) and the output (status and step log), and the title supplies the verb 'List'. It differentiates from siblings like list_automations and get_automation by specifying 'one automation', though the description itself is a noun phrase rather than a full verb-led statement.

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?

No explicit guidance is given about when to use this tool versus alternatives such as list_automations or get_automation. The status meanings imply use for inspecting run history, but there is no stated context, prerequisites, or exclusions.

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. Use get_automation to read one flow's document.

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
Behavior3/5

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

readOnlyHint already signals a safe read, and the description adds useful context about the summary fields and connected-account scope. It does not disclose potential pagination, ordering, or error behavior, so it adds modest but not rich behavioral detail 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?

Two tight sentences: the first front-loads what is returned and the second names the relevant alternative. Every word 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?

For a simple read-only list tool with one optional, fully documented parameter, the description covers purpose, scope, returned fields, and the main sibling alternative. No output schema is needed because the field list is in the description.

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 sole parameter workspaceId is documented with a detailed schema description, achieving 100% schema coverage. The tool description itself adds no parameter information, 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 clearly defines the tool as returning automations on connected accounts and enumerates the returned fields (name, channel, live/draft, triggers, run count). It also distinguishes itself from get_automation, which reads one flow's document, so an agent can tell them apart.

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 explicitly tells the agent to use get_automation when the need is to read one flow's document, implying list_automations is for the summary list across connected accounts. This provides a clear decision rule between siblings.

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.

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/5.0
Behavior4/5

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

The readOnlyHint annotation already signals a safe read operation, and the description adds useful behavioral context: each template lists its parameters and supported channels, and the comment_to_dm example illustrates the interaction flow. This gives the agent a concrete sense of what the returned templates describe without contradicting the annotation.

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, leading with the core purpose then adding usage guidance and a clarifying example. Every sentence contributes value, and the comment_to_dm example is relevant without being excessive.

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 one optional parameter and no output schema, the description covers the key things an agent needs: what the tool returns, when to call it, and a representative template example. It could theoretically mention that no output schema is provided, but this is not necessary given the straightforward nature of the 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 parameter is already well explained in the schema, including when to omit it. The description adds no parameter-specific guidance, but the baseline of 3 applies because the schema carries the full burden and does so adequately.

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 the tool lists ready-made automation templates with their parameters and channels, which is specific and actionable. It does not explicitly contrast itself with list_automations, but the term 'templates' versus 'automations' and the reference to create_automation make the purpose distinguishable.

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 explicitly instructs agents to read this before create_automation, giving a clear when-to-use signal. It does not mention alternatives like list_automations or when to skip this tool, but the primary usage context is well established.

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 channelA
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 it stays empty while the app is awaiting TikTok's Content Posting audit and every post goes out private.

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.

TDQS

A4.1/5.0
Behavior5/5

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

Annotations only declare readOnlyHint, so the description carries the burden of behavioral nuance and does it well: it warns that an empty result does not mean the account has no posts, and explains the TikTok-specific reason (public-videos-only reads while the Content Posting audit is pending, with posts going out private). That is exactly the kind of non-obvious behavior that prevents a wrong diagnosis.

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 sentences, each doing distinct work: identifying the resource, giving the use condition plus downstream chaining, then the empty-result caveat. The caveat sentence is long but front-loads the actionable fact (empty does not mean no posts) before the TikTok rationale, so it earns its length.

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 compensates by telling the agent what each returned item carries (a permalink usable by other tools) and by scoping the result set to live channel content. Pagination behaviour beyond the documented limit parameter is the only real gap, and that is minor for a read-only listing 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 limit, accountId and workspaceId are already fully documented in the schema, including the defaults and the multi-workspace disambiguation hint. The description adds nothing about parameters, which is acceptable at this coverage level but earns no extra credit.

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 states a specific resource and scope — what is currently live on the channel, including posts composed in the channel's own app — which an agent can distinguish from a link-based fetch like get_post. It stops short of explicitly contrasting itself with the sibling list_posts, so the differentiation is inferred from the 'right now / actually on the channel' framing rather than stated.

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 selection condition ('use this to find a post when you do not have its link') and names the downstream tools that consume the returned permalink (open_post, reply, delete_post). What is missing is the converse case — when to prefer list_posts or get_post instead — so the guidance is clear but not exhaustive.

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

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
Behavior4/5

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

The readOnlyHint annotation already establishes safety, so the description adds value by disclosing that each item reports whether the 24-hour window is open and how much time remains. This is useful behavioral/return information beyond what annotations or schema provide.

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 sentences with no filler; the opening 'The inbox' orients the agent immediately, and the filter hints and item-level behavior are stated efficiently. Every sentence contributes.

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 and 7 parameters, the description covers the core concept and one important return detail but omits guidance on filtering via search/unread, pagination via limit, and account selection. It is minimally sufficient but leaves meaningful gaps for a 7-parameter tool.

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 14%, so the description must compensate for undocumented parameters. It does clarify state's default ('open') and maps kind to the conversation types mentioned earlier, but limit, search, unread, accountId, and workspaceId receive no explanatory value 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 ('list') and resource ('inbox conversations'), and clearly defines the scope: DMs on Instagram/Facebook plus mention threads on Threads. This distinguishes it from sibling tools like read_conversation or list_mentions, which focus on individual messages or mentions only.

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 as an inbox overview and mentions state/kind filters, which gives some context on how to use it. However, it does not explicitly say when to prefer this tool over alternatives like list_mentions or read_conversation, nor does it state exclusions.

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.

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

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds that mentions are delivered by webhook and that the result shape matches list_conversations, which is useful context. It does not go further into auth requirements, rate limits, or pagination, but for a read-only list tool this is acceptable.

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, no wasted words, and the core purpose is front-loaded. The mention of same-shape and the send_dm follow-up both earn their place by giving the agent actionable orientation.

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 required parameters and readOnlyHint=true, the tool is simple enough that the description covers the main context: what is listed, how it relates to list_conversations, and what to do with the results. There is no output schema, so the 'same shape' reference is important and mostly sufficient, though unread semantics remain unexplained.

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 33%, with workspaceId described in the schema but accountId and unread left undocumented. The description does not compensate for this gap: it never mentions unread, accountId, or how they affect the results. The 'same shape as list_conversations' line is too indirect to clarify parameter behavior.

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 what the tool does: it returns Threads posts that mention the connected account. It also distinguishes itself from list_conversations by noting it is the same shape but filtered with kind mention. This is enough for an agent to understand its specific role among many list tools.

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 reference to list_conversations implies when this tool is appropriate, and 'Reply with send_dm' gives a useful follow-up action. However, it does not explicitly state when not to use this tool or compare it against other list alternatives like list_posts or list_channel_posts. The usage context 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.

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.1/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint annotation by spelling out the meaning of status values (live, beta, bridge, soon), how charCount should be interpreted, and that options is the JSON Schema for publish options. This is substantial behavioral disclosure that the annotations do not 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?

The description is organized around the key fields and is mostly front-loaded, but it repeats 'Read it instead of guessing' twice, which is slightly redundant. Still, each substantive sentence adds meaning to the tool's output.

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 lack of an output schema, the description explains the important field semantics (status, charCount, options) but does not detail the media-related fields (media required, image/video limits) mentioned in the first sentence. This is a minor gap, but the core decision-making data is covered.

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 workspaceId with a full explanation about when to include it and when to omit it, so schema coverage is 100%. The tool description adds nothing about the parameter, so the baseline score of 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?

The description states the tool lists every channel and its rules (character limit, media requirements, state) and explicitly frames it as the way to avoid guessing platform limits. It is specific about the resource and what it returns, but does not name sibling tools to differentiate it, so it stops short of full distinction.

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 says to read this instead of guessing a platform's limits, and connects charCount to checking length before calling publish, giving a clear context of when to use it (before publishing). However, it does not mention when not to use it or alternatives like get_publish_options.

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.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint: true. The description adds substantial behavioral context beyond that: default limit (20), max 100, pagination via hasMore/nextBefore, the fact that sort=scheduled drops paging, and the workspaceId fallback behavior. It also clarifies that scheduled posts are dated by scheduledAt and sent posts by creation time. No contradictions.

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, single paragraph with no filler. It leads with the core purpose, then covers inclusions, ordering, defaults, pagination, and the sibling distinction in a logical order. Every sentence contributes operational knowledge.

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 list tool with 7 parameters, no output schema, and no required params, the description covers everything needed: what's returned, ordering, paging, filtering, and the workspaceId edge case. It also disambiguates from the sibling. An agent can call this tool correctly without further clarification.

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 all parameters are individually documented. The description adds value by explaining the default limit, the interaction between sort and paging, and the semantics of 'before' as nextBefore from a previous page. It also clarifies the workspaceId condition. This goes beyond simple restatement, though not every nuance is covered, so a 4 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 ('list') and resource ('posts published through us'), and precisely scopes what is included (recent publishes, scheduled and draft posts) and what is excluded (posts that existed on the channel). It explicitly names the sibling list_channel_posts as the alternative, distinguishing the two clearly.

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 explicit when-to-use guidance with a concrete example ('To answer "what is scheduled this week", pass status scheduled with since and until and sort scheduled') and explicitly points to list_channel_posts for channel-existing posts. No ambiguity about when to choose this tool.

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.

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.2/5.0
Behavior4/5

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

The readOnlyHint annotation already signals safety, and the description adds valuable behavioral detail: the result includes nested replies, may be truncated, and the returned count can differ from the get_insights metric. This gives the agent useful expectations 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.

Conciseness5/5

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

The description is three short sentences, each adding meaningful information: what is returned, how truncation is signaled, and how the count relates to another tool. There is no redundancy or 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?

For a read-only list operation with only two parameters and no output schema, the description covers the key behavioral semantics: full nested thread, truncation, and count discrepancies. It does not explain how to continue after truncation, but that is not critical for the agent to invoke 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?

The schema already documents both parameters fully, including how `id` can be a publish id, channel id, or link, and when `workspaceId` is needed. The description adds no parameter-level details, so the baseline of 3 is appropriate given the high schema coverage.

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 identifies the tool as returning the full reply thread under a post, including nested replies. The title and description align, and the relationship to get_insights is clarified enough to distinguish the tool's purpose.

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 for when to use this tool: when you need the whole reply thread, not just a metric. It explicitly notes that the reply count here may differ from the get_insights metric, which helps prevent misuse, though it does not explicitly name alternatives or state when not to use it.

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, the description adds meaningful behavioral context: it verifies that the file actually landed before marking it ready, and only a ready id can be sent to publish. This tells the agent the tool is not a blind completion step and that readiness is gated. It does not contradict the readOnlyHint/destructiveHint 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 short sentences, each earning its place: what step it is, when to call it, and what behavioral guarantee it provides. Important sequencing 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 simple two-parameter tool with annotations and full schema coverage, the description covers the workflow context, the prerequisite, and the downstream consequence well. It does not describe what the response looks like or how failure is reported if the file did not land, which is a minor gap given there is no output schema.

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 id and workspaceId parameters are already well documented in the schema, including the conditional need for workspaceId. The description itself adds no additional parameter-level meaning.

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 identifies the tool as the completion step in a media upload workflow, using a specific action ('Call it after the upload finishes') and resource ('image or video'). It distinguishes itself from sibling media tools by framing this as the step that marks an upload as ready, and it names the downstream dependency on publish.

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 timing guidance: call it after upload finishes and before passing a ready media id to publish. It does not explicitly name alternatives like media_upload_status or media_presign, so it stops short of full when-not-to-use guidance.

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. 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.
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 indicate this is not read-only, and the description adds meaningful behavioral context: the tool downloads the file, copies it into storage, and returns a media id. It also discloses the https-only constraint and the share-link failure mode, going beyond the 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.

Conciseness5/5

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

The description is compact and front-loaded: the main action appears first, followed by necessary constraints. Every sentence contributes either to usage guidance or parameter clarification, with no redundancy.

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 correctly states the outcome (media id for publish). It covers URL requirements, failure cases, and altText guidance. Minor omissions like size limits or processing time are not critical for a simple tool.

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 extra value by specifying that the URL must be a direct file URL ending in the file itself, and by advising to write altText when an image is visible. This goes beyond the schema 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 states a specific verb and resource: 'Attach an image or video that is already on the public web.' It explains the process (download, copy to storage, return a media id) and how it differs from publishing, 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 Guidelines4/5

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

Provides clear context: use this when media is already on the public web ('One step, no upload needed') and explicitly warns which URL types won't work (Google Drive/Dropbox share links). However, it does not name the upload alternatives among the siblings, leaving the when-not-to-use case partly 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.

media_presignStart a direct media uploadAInspect

Step 1 of attaching an image or video. Returns a media id and a one-time uploadUrl. PUT the file bytes to uploadUrl with the same contentType, then call media_complete. Images: image/jpeg, image/png, image/webp, image/gif, up to 20MB. Video: video/mp4, video/quicktime, video/webm, up to 8GB, 43200 seconds, 4096px wide. Aspect ratio up to 20:1. Any image pixel width is fine. If you can see the image, write altText describing it. The response has mediaExpiresAt: this media id disappears after that time if it was never published, and publish will then fail with media_expired.

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
contentTypeYesimage/jpeg or image/png or image/webp or image/gif or video/mp4 or video/quicktime or video/webm
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 it is a non-read-only, non-destructive write; the description carries the real behavioral load: the uploadUrl is one-time, the correct contentType must be reused on the PUT, and the media id expires at mediaExpiresAt so a later publish fails with media_expired. That expiry/failure semantics is exactly the kind of context annotations cannot express.

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 step number, the return values, and the next action, then constraints — a good ordering for an agent. Slight redundancy: the contentType list and part of the altText guidance duplicate the schema descriptions rather than adding to them.

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 itself names the returned media id, uploadUrl and mediaExpiresAt, and explains the failure mode on expiry. For a 7-parameter tool with 3 required fields, the workflow, constraints and error behavior are all covered.

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 86% (baseline 3), and the description adds genuine constraints the schema lacks: per-type byte ceilings (20MB image / 8GB video), 43200-second and 4096px video limits, and a 20:1 aspect-ratio cap. It also reinforces altText usage ('write altText describing it'), though the contentType list largely repeats the schema enum 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 action ('Step 1 of attaching an image or video') plus concrete outputs ('Returns a media id and a one-time uploadUrl'), which cleanly separates it from the sibling media_complete that finishes the flow. An agent can route between media_presign, media_complete, media_from_url and media_upload_link from this text alone.

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 an explicit follow-up procedure ('PUT the file bytes to uploadUrl ... then call media_complete') and the per-media-type eligibility rules, so the agent knows the sequencing and constraints. It never explicitly says when to prefer this over media_from_url or media_upload_link, so it falls short of a full when/when-not statement.

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.5/5.0
Behavior5/5

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

Annotations only say readOnlyHint=true; the description adds rich behavior: possible statuses, media ID lists, image blocks via previewIds, 20-item pagination, offset usage, and the duplicateOf deduplication hint. This goes far beyond the structured annotation.

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 every sentence earns its place: status values, output usage, visual previews, pagination, and the duplicateOf edge case. It is front-loaded with the core question and status list before diving into mechanics.

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 fully explains return semantics: statuses, mediaIds, previewIds mapping, pagination, and duplicate handling. Nothing an agent needs to invoke the tool correctly or interpret results 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 the schema already documents all three parameters. The description adds helpful context for token ('from media_upload_link') and offset ('to see the rest'), but does not substantially enrich workspaceId beyond its schema 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 opens with a direct question ('Has the person uploaded yet?') and clearly states the resource: upload status for a token from media_upload_link. It returns explicit statuses (waiting, ready, expired) and media IDs, distinguishing it from sibling tools like media_upload_link or publish.

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 implies the workflow: call this after media_upload_link, then pass returned IDs to publish as mediaIds. It explains when and how to use the output, but it does not explicitly exclude alternatives or name when not to use this tool.

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.

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.2/5.0
Behavior4/5

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

The readOnlyHint annotation is present and the description is consistent with it. The description adds useful behavioral context beyond the annotation by warning that replies or metrics can come back null if the platform refused just that part, which helps set expectations about partial responses.

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 three short, purposeful sentences. It front-loads the core purpose, then gives the primary use case, then a caveat about partial nulls. There is no filler or redundant repetition of the schema.

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 single-post tool with no output schema, the description provides the essential return shape (text, thread, metrics), the main invocation trigger (a post link), and partial-failure behavior. It could be slightly more complete by describing what metrics are included, but beyond that an agent has enough context to select and 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%, and the schema already thoroughly documents both id and workspaceId, including accepted formats and optionality. The description adds little parameter-level meaning beyond reinforcing the post-link use case, so the baseline 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 clearly states what the tool does: it returns the text, entire reply thread, and metrics for a single post in one call. This distinguishes it from sibling tools like get_post, list_replies, and get_insights by combining their functionality into one unified 'open post' operation.

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 a concrete, actionable trigger: 'This is the right tool when someone hands you a post link.' It does not explicitly mention when not to use it or name alternatives, but the stated use case is clear enough for an agent to make a basic routing decision.

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

publishPublish a postA
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. 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; ask the person to update the extension. 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. 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. 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. 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 90 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. Targets on channels without comments or DMs (YouTube, Telegram, Naver Blog, Bluesky, TikTok) are skipped and named in the response.
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.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false and destructiveHint=true, which is minimal. The description carries the burden and does so thoroughly: it discloses that Naver rate limits return 429 with retryAfterSeconds and that the draft is already in Naver; that offline/logged_out bridge states mean the post is queued and must be relayed to the user as not-published; that over-limit text publishes nothing to any channel; that the call returns before publishing completes with permalink null; and that YouTube privacyStatus may not be what was requested. All of this adds genuine behavioral context far 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 long, but nearly every sentence earns its place for a 12-parameter multi-channel tool with no output schema. Facts are grouped by channel and concern (limits, grouping, Naver specifics) rather than dumped as one undifferentiated paragraph. A couple of redundancies appear – Naver form and media: references are explained both in the main description and in the schema's naver_blog block – but the main-body repetition is justified because it is the operative instruction for the agent.

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?

Given 12 parameters, nested per-channel options, no output schema, and 44 sibling tools, the description is remarkably complete. It covers text limits, media grouping, error codes and how to recover, the bridge/offline path, scheduling, draft mode, per-channel content overrides, threadItems as an alternative to reply, and when to consult get_post, get_publish_options, list_accounts, describe_grammar, naver_layout, and update_post. Nothing an agent needs to safely invoke this multi-channel publish is missing.

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?

Schema coverage is 100%, so the baseline is 3, but the description compensates with information that is not in the schema: where media ids come from, how Naver form selection works, the exact retry/error codes, per-channel text limits and item grouping, the fact that channel content overrides shared content, and the scheduledAt/draft semantics. It also tells the agent to pass the Naver Markdown body in options.naver_blog.content when other channels are present, which the schema's description mentions but the tool description makes operative.

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 opens with 'Post to social channels' – a specific verb and resource – then immediately lists the exact channels open today. It distinguishes itself from siblings like update_post, delete_post, publish_now, and reply by covering immediate multi-channel publishing, and from select_channels by telling the agent where accountIds must come from.

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 is explicit about when to use publish versus alternatives: 'Get accountIds from select_channels — do not guess which channel the person meant', 'For a long post use threadItems instead of publish-then-reply', and it names update_post, publish_now, delete_post, retry_post, and get_post in the contexts where they apply. It also states when not to call again (Naver 429) and when to show forms instead of picking.

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.7/5.0
Behavior5/5

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

The annotations only say readOnlyHint=false and destructiveHint=true; the description adds the meaningful behavioral details: it returns while publishing, wait controls synchronous behavior, drafts need a target account, and already-sent posts return post_not_editable. This is exactly the kind of operational context an agent needs beyond the raw 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 with no filler. The main action is front-loaded, then the async behavior, then the preconditions and failure mode. Every sentence contributes information an agent cannot infer from the schema alone.

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 simple 3-parameter action with no output schema, the description covers the key operational concerns: async versus blocking behavior, draft requirements, error semantics, and id/workspace disambiguation. Referencing 'like publish' is acceptable because publish is a known sibling that documents the shared return semantics.

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 value: it explains the accepted id forms (publish id, channel id, or post link), clarifies that wait behaves 'same as on publish,' and tells the agent to omit workspaceId unless multi-workspace and not to re-ask the person. That meaningfully extends 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?

The description opens with a specific verb and resource: 'Send a scheduled or draft post right now instead of waiting.' It clearly distinguishes this from the broader publish/update/retry sibling family by focusing on immediate publication of scheduled or draft content.

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 usage context: use this when you want a scheduled or draft post sent immediately, and pass wait: true if you need to block for the result. It also flags draft prerequisites and the already-published error case. It references 'like publish' but does not explicitly state when to prefer publish_now over publish, so it stops 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.

put_automationReplace an automation's flowA
Destructive
Inspect

Replace an automation's whole document. Pass the version you got from get_automation; a stale version is refused with version_conflict so a concurrent edit is not overwritten. Node types: send (mode window | private_reply | public_reply), condition, action, delay, random, goto, ai. Waiting is a send node with buttons and next: null; the tapped button's next continues. A loop must pass through such a wait. Validation problems come back with paths. Changing a live flow changes what goes out to people.

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.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations declare destructiveHint=true and readOnlyHint=false. The description adds context about version conflict behavior, validation paths, and that changing a live flow affects people. It does not contradict the annotations and provides meaningful behavioral detail beyond the flags.

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 and logically ordered: purpose, version requirement, node types, waiting semantics, validation, and impact. Every sentence adds value, though it is somewhat long. It is well structured and front-loaded with the core purpose.

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 complex tool with a large schema, the description covers the essential usage nuances: versioning, node types, waiting/loop rules, and validation behavior. It does not describe return values, but there is no output schema, so that is acceptable. It is sufficient for an agent to call 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 40%, so the description must compensate. It clarifies the version parameter and explains the doc structure (node types, waiting, loops). However, it does not elaborate on id, name, or workspaceId, leaving gaps that the schema only partially fills.

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 states a clear action: 'Replace an automation's whole document.' This is a specific verb and resource. It distinguishes from partial updates and creation implicitly, but does not explicitly name alternative tools like create_automation, so it misses the top score.

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 a concrete usage rule: 'Pass the version you got from get_automation; a stale version is refused with version_conflict.' This guides when to use it and how to avoid conflicts. It does not explicitly state when not to use it (e.g., for creation), but the instruction is actionable.

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, so the safety profile is covered. The description adds useful behavioral details: it returns recent messages only, includes contact fields like tags/opt-out, notes Instagram-specific follow status, and explains that AI drafts appear as 'draft' status.

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 tight sentences with no filler. The core purpose ('one conversation with its recent messages and the contact') is front-loaded, and the draft-status note is a valuable addition without bloating the text.

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 tool is read-only and has no output schema, the description does a good job outlining return contents and special cases. It could be more explicit about what 'recent messages' includes or any pagination, but the provided detail is sufficient for an agent 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 coverage is 50%: the workspaceId parameter is already well explained in the schema, and id is self-evident as the conversation identifier. The description does not add parameter-level meaning, but the schema handles the only ambiguous parameter, leaving no meaningful gap.

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 the tool reads a single conversation and returns its recent messages plus contact details. It is specific about the resource and scope, though it does not explicitly name sibling tools like list_conversations or get_contact 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 Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives. It implies use when you need one conversation's recent messages and contact info, but it does not mention list_conversations for browsing multiple conversations or get_contact for contact-only details.

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 metadataAInspect

Re-read one connected channel's metadata. On Naver Blog this re-reads the blog's categories through the user's browser extension and waits up to a minute for it; list_accounts then shows the new list under naverBlog.categories. Call this when a category the person mentions is not in list_accounts yet. If the extension is offline you get 202 and the refresh runs when that browser comes back. Other channels return refresh_unsupported because their metadata is live on every call.

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.

TDQS

A4.7/5.0
Behavior5/5

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

With annotations only marking readOnlyHint=false/destructiveHint=false, the description carries the real behavioral load: waits up to a minute via the browser extension, returns 202 when the extension is offline and defers the refresh, and returns refresh_unsupported for other channels. This is exactly the async/latency/error context an agent needs.

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-loads purpose, then channel-specific behavior, then the trigger condition and error cases, in four tight sentences with no filler. Every sentence 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, but the description explains the meaningful return states (202 deferral, refresh_unsupported, and where refreshed data appears). 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 coverage is 100% — both accountId and workspaceId are already documented, including the nuanced workspaceId guidance — so the description adds little parameter 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?

States a specific verb ('re-read') and resource ('one connected channel's metadata'), and grounds it in the sibling flow (list_accounts shows the refreshed list). An agent can distinguish this from list_accounts or publish 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 trigger: 'Call this when a category the person mentions is not in list_accounts yet.' It also states the negative case — other channels return refresh_unsupported because their metadata is live on every call — so when-not-to-use is covered.

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

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. Call get_post with the returned id to see the final status and link.

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.
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.1/5.0
Behavior4/5

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

The description discloses the asynchronous behavior ('returns before the reply is live') and directs the caller to get_post with the returned id. This adds value beyond the annotations, which only mark the operation as non-read-only and hinting at mutation. No contradiction with the annotations is present.

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-loads the core purpose. Every clause contributes; the mention of 'Like publish' is brief but meaningful. A small formatting gap after the period slightly disrupts readability but does not harm comprehension.

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 mutating reply operation with no output schema, the description explains the main flow, the return id usage, and how to check final status. It could additionally state the expected response shape or call out channel-specific constraints, but the provided guidance is sufficient for most calls.

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 roughly 80%, so the schema carries most parameter meaning. The description adds useful semantics for replyTo (empty vs. reply id from list_replies) and subtly confirms id can be a publish id. Content, secret, and workspaceId are left to the schema, which is acceptable at this coverage level.

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: 'Reply to a post or to a reply.' It clearly distinguishes this from sibling tools like publish, list_replies, and hide_reply by narrowing the operation to replies and nesting behavior.

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 concrete usage guidance: leave replyTo empty for a top-level reply, or pass a reply id from list_replies to nest. It also explains how to verify completion via get_post after the async return. It does not explicitly contrast with publish or other alternatives, but the context is clear enough for an agent to decide.

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 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.
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 mark it destructive and not read-only. The description goes well beyond that by disclosing replay behavior, the 429 naver_rate_limited response with retryAfterSeconds, the 400 naver_form_required response, the nothing_to_retry case, and the risk that a failed Naver Blog target may still have left a post or draft. 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 description is dense and long, yet nearly every sentence carries an operational constraint or edge case that matters for correct invocation. It is front-loaded with the core purpose. It could be restructured into shorter sentences for readability, but it is not padded.

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 retry operation with no output schema, the description covers prerequisites, failure modes, when not to call, what can go wrong on Naver Blog, and how to resolve form-required errors. An agent has enough context to invoke it correctly and safely.

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 fully describes id and workspaceId, so the baseline of 3 applies. The description adds workflow-level semantics about options.naver_blog.form and layout, but these are not present in the provided input schema, which is a slight mismatch; it does not add extra meaning to the two actual 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?

States a specific verb and resource: 'Retry the targets that failed on a publish.' It is clearly differentiated from siblings like publish or publish_now by scoping to failed targets and noting that already-successful targets are left alone.

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 explicit when-to-use and when-not-to-use guidance: check get_post for retryable, call publish again instead when retryable is false, do not call before retryAfterSeconds, and only applies to posts published through this system. It names the alternative tool and the condition for choosing it.

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

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), 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?

The description discloses detailed behavioral traits beyond the readOnlyHint annotation: duplicates are folded, expired/not-yet-live channels are dropped into `skipped` with reasons and reconnect links, `limits` reflects the tightest rule, and accountIds are to be passed to publish unchanged. It also explains the Naver Blog bridge state and queued info, and instructs to relay userMessage. This exceeds the annotation's basic read-only hint and provides actionable context.

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 fairly long but dense with necessary information. It is front-loaded with the core purpose and critical instruction, then expands on scope and edge cases. Every sentence contributes meaning, though it could be tightened slightly. It is well-structured and not 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?

With no output schema, the description fully explains return values (accountIds, candidates, skipped, limits, and Naver Blog's bridge, state, userMessage, queued) and how to use them. It also covers the empty-result case and reconnection flow, making it complete for an agent to execute correctly. The complexity is high and the description addresses all relevant aspects.

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 (scope and workspaceId) with clear descriptions. The description adds behavioral context about scope (duplicates folded, skipped channels) but does not add new parameter format details beyond what the schema states. Baseline 3 is appropriate given the schema does the heavy lifting; the description does not meaningfully augment parameter semantics.

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: 'Pick which connected channels to post to.' It also clarifies its role as a prerequisite to publish ('Call this before publish'), which distinguishes it from the sibling publish tool. It also explains the two modes (candidate listing vs selection), making its purpose 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?

The description gives explicit when-to-use guidance ('Call this before publish and show the result to the person'), how to use the scope parameter (omit for candidates, 'all' for all active, or a mixed array), and when to direct the user to connect channels ('If both accountIds and candidates come back empty... Send the person to...'). It also specifies handling of Naver Blog bridge states, covering exclusions and alternatives.

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.1/5.0
Behavior5/5

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

The description significantly exceeds the annotations by disclosing side effects (automations paused for 30 minutes), special behavior on mention threads (public reply), refusal behavior (window_closed), and the draft-approval flow. This gives an agent a clear picture of what actually happens when the tool is called.

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, front-loads the primary action and the most critical constraint (24-hour window), then covers secondary behaviors in separate sentences. There is no filler, and every sentence contributes actionable 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?

Given the absence of an output schema and the tool's mutating nature, the description covers the key behavioral context: when it succeeds, when it fails, side effects, and draft usage. It does not describe the success response shape, but the critical error case is named, making it sufficiently complete for an agent to call 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 coverage is 80%, so the schema itself documents most parameters. The description adds useful context for draftId ('AI draft that was waiting for approval') but does not explain text, mediaId, or workspaceId beyond the schema. It meets the baseline but does not substantially compensate for the 20% gap.

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 the action ('send a message in a conversation as the account') and specifies important scope details like the 24-hour window and mention-thread behavior. It does not explicitly distinguish this from sibling tools like reply or create_comment_to_dm, so it misses the last bit of differentiation.

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 usage conditions: only inside the 24-hour window, otherwise the call is refused with window_closed, and draftId is for sending AI drafts awaiting approval. It does not name alternative tools or say when to choose those over this one, but the window constraint strongly shapes when this is appropriate.

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 or draft postAInspect

Change a scheduled or draft post before it goes out: content, mediaIds, accountIds, Naver Blog caps how many posts one ID publishes; when it does, this returns 429 naver_rate_limited with retryAfterSeconds. Do not call again before that, the draft is already in Naver. Naver Blog asks which form to publish with, every post: if options.naver_blog.form is missing this returns 400 naver_form_required with forms (id, name, when). The form is the house style to use when the person has no style of their own, so read the conversation first. If they dictated the structure or you laid it out yourself, pass options.naver_blog.layout: "as-is" and the markdown goes out unchanged. Otherwise show them the forms (naver_layout with forms: "all" lays every one out side by side) and call again with the one they pick. Do not pick for them. If the Naver editor shows a "missing image" error when you open an already-published post for editing, calling update_post on that post rewrites it in place and fixes it; the URL stays the same. options, scheduledAt or draft. Fields you leave out keep their current value; options you pass replace the whole options object. scheduledAt moves the send time (same rules as publish), null turns it into a draft, and draft: true does the same. A thread only takes schedule changes. Posts that already went out return post_not_editable, except Naver Blog: a published Naver post is rewritten in place (same URL, same logNo) when you pass content, mediaIds or options — list the media ids again to keep the photos.

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.
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.
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.
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 only declare readOnlyHint=false and destructiveHint=false, leaving safety profile minimal. The description goes far beyond this: it discloses the 429 naver_rate_limited retry behavior, the 400 naver_form_required condition, the in-place rewrite of published Naver posts (same URL/logNo), and the field-level semantics (left-out fields keep value, options replaces whole object). It also explains the 'missing image' fix. No contradictions 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.

Conciseness3/5

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

The description is very long and not front-loaded; the first sentence leaps from general purpose to Naver rate limiting before explaining core behavior. Multiple topics (rate limits, form handling, layout, published posts, parameter semantics) are interleaved, making it harder to parse. While nearly every sentence carries unique information, the lack of organization and excessive length pull the score down.

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 with 8 params, nested objects, and no output schema, the description covers a large range of edge cases: rate limiting, form requirements, layout options, thread limitations, and non-editable post errors. It omits only an explicit statement of the success return value, which is a minor gap given the focus on invocation. Overall it is sufficient for correct usage.

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?

Although schema coverage is 100%, the description adds critical semantics not present in the schema: concrete behavior when fields are omitted (keep current), options replacement semantics, scheduledAt null/draft behavior, thread-only schedule changes, and the need to relist mediaIds to keep photos on Naver published posts. It also explains the layout option ('as-is') and form selection flow, which massively benefits the agent.

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 opens with 'Change a scheduled or draft post before it goes out' and specifies the mutable fields (content, mediaIds, accountIds), clearly distinguishing this from sibling tools like publish (create) and delete_post (remove). It also clarifies the scope by noting that already-published posts are generally not editable except for Naver Blog's in-place rewrite, which further defines the tool's purpose.

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?

While it doesn't name alternative tools explicitly, it provides strong when-not guidance: 'Posts that already went out return post_not_editable' and 'A thread only takes schedule changes.' It also gives conditional instructions like not calling again before retryAfterSeconds, and how to handle the Naver form selection. Missing explicit pointer to siblings like 'use publish for new posts' keeps it just below a 5.

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. 1 tool update
    • Changedput_automation3 fields changed
      • addedInput schema / properties / doc / properties / nodes / additionalProperties / properties / items / items / properties / message
        Added value: +{
        +  "description": "follow: message on the mutual request.",
        +  "type": "string"
        +}
      • addedInput schema / properties / doc / properties / nodes / additionalProperties / properties / items / items / properties / mutual
        Added value: +{
        +  "description": "follow: ask for a mutual neighbor relation (Naver). Default false.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / doc / properties / nodes / additionalProperties / properties / items / items / properties / type / enum
        Previous value: -[
        -  "add_tag",
        -  "remove_tag",
        -  "set_field",
        -  "clear_field",
        -  "opt_in",
        -  "opt_out",
        -  "open_conversation",
        -  "close_conversation",
        -  "assign",
        -  "hide_reply",
        -  "approve_reply"
        -]New value: +[
        +  "add_tag",
        +  "remove_tag",
        +  "set_field",
        +  "clear_field",
        +  "opt_in",
        +  "opt_out",
        +  "open_conversation",
        +  "close_conversation",
        +  "assign",
        +  "hide_reply",
        +  "approve_reply",
        +  "follow"
        +]
  2. 2 tool updates
    • Changedcreate_comment_to_dm12 fields changed
      • addedInput schema / properties / askEmail
        Added value: +{
        +  "description": "Ask for their email after the tap and store it in contact field `email`. Three tries, then continue without.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / buttonTitle / description
        Previous value: -"Button under the private reply, at most 20 characters."New value: +"Button under the opening DM, at most 20 characters."
      • changedInput schema / properties / deliver / description
        Previous value: -"What to send after the tap: text, link, and/or a media id."New value: +"What to send after the tap: text, up to three link buttons, and/or a media id."
      • addedInput schema / properties / deliver / properties / link / description
        Added value: +"Legacy: one url appended to the text. Prefer links."
      • addedInput schema / properties / deliver / properties / links
        Added value: +{
        +  "items": {
        +    "properties": {
        +      "title": {
        +        "description": "At most 20 characters.",
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "title",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 3,
        +  "type": "array"
        +}
      • addedInput schema / properties / emailMessage
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / emailRetry
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / followUp
        Added value: +{
        +  "description": "Sent followUpAfterMinutes later if none of deliver.links was clicked. Needs openingDm and at least one link.",
        +  "type": "string"
        +}
      • addedInput schema / properties / followUpAfterMinutes
        Added value: +{
        +  "description": "1 to 1380 (23 hours). Default 60.",
        +  "type": "number"
        +}
      • changedInput schema / properties / message / description
        Previous value: -"The private reply. One message."New value: +"The opening DM (private reply). One message. Required unless openingDm is false."
      • addedInput schema / properties / openingDm
        Added value: +{
        +  "description": "Default true. false: deliver goes out as the private reply itself (no button, no window afterwards).",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "accountId",
        -  "post",
        -  "message",
        -  "deliver"
        -]New value: +[
        +  "accountId",
        +  "post",
        +  "deliver"
        +]
    • Changedput_automation6 fields changed
      • changedInput schema / properties / doc / properties / nodes / additionalProperties / properties / all / items / properties / field / enum
        Previous value: -[
        -  "tag",
        -  "follows_us",
        -  "we_follow",
        -  "follower_count",
        -  "verified",
        -  "window_open",
        -  "opted_in",
        -  "last_interaction_hours",
        -  "field",
        -  "intent",
        -  "sentiment",
        -  "text"
        -]New value: +[
        +  "tag",
        +  "follows_us",
        +  "we_follow",
        +  "follower_count",
        +  "verified",
        +  "window_open",
        +  "opted_in",
        +  "last_interaction_hours",
        +  "field",
        +  "intent",
        +  "sentiment",
        +  "text",
        +  "clicked"
        +]
      • addedInput schema / properties / doc / properties / nodes / additionalProperties / properties / field
        Added value: +{
        +  "description": "ask: contact field the answer is stored in (e.g. email).",
        +  "type": "string"
        +}
      • addedInput schema / properties / doc / properties / nodes / additionalProperties / properties / maxTries
        Added value: +{
        +  "description": "ask: default 3. After that the flow continues without a value.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / doc / properties / nodes / additionalProperties / properties / retry
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / doc / properties / nodes / additionalProperties / properties / type / enum
        Previous value: -[
        -  "send",
        -  "condition",
        -  "action",
        -  "delay",
        -  "random",
        -  "goto",
        -  "ai"
        -]New value: +[
        +  "send",
        +  "condition",
        +  "action",
        +  "delay",
        +  "random",
        +  "goto",
        +  "ai",
        +  "ask"
        +]
      • addedInput schema / properties / doc / properties / nodes / additionalProperties / properties / validate
        Added value: +{
        +  "description": "ask: how to check the answer. Wrong answers get `retry`, up to maxTries.",
        +  "enum": [
        +    "email",
        +    "none"
        +  ],
        +  "type": "string"
        +}
  3. 2 tool updates
    • Addeddescribe_grammar
    • Changedpublish1 field changed
      • changedInput schema / properties / options / properties / naver_blog / description
        Previous value: -"Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. Write the body as Markdown: `## ` becomes a section title, `> ` a quotation, `---` a divider. Plain paragraphs become body text. Three directives place things in the body, each alone on its line: `![alt](media:<id>)` an uploaded image, `@video(media:<id>)` an uploaded video, `@card(https://…)` a link card. Put them mid-paragraph and they publish as literal text. Ids you reference this way do not have to repeat in mediaIds, and media you pass but never reference goes at the end. When other channels are in the same post, put the Markdown in options.naver_blog.content so the shared content stays plain text."New value: +"Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. The body is Markdown, plus Naver-only markup for things Markdown has no word for (highlighting, styled tables, collages, maps, events): call describe_grammar with platform naver_blog for the syntax and its traps. Reference uploaded media inline with `![alt](media:<id>)`; ids you reference this way do not have to repeat in mediaIds, and media you pass but never reference goes at the end. When other channels are in the same post, put the Markdown in options.naver_blog.content so the shared content stays plain text."
  4. 16 tool updates
    • Addedapprove_reply
    • Addedcreate_automation
    • Addedcreate_comment_to_dm
    • Addeddisable_automation
    • Addedenable_automation
    • Addedget_automation
    • Addedget_contact
    • Addedlist_automation_runs
    • Addedlist_automation_templates
    • Addedlist_automations
    • Addedlist_conversations
    • Addedlist_mentions
    • Changedpublish1 field changed
      • addedInput schema / properties / automation
        Added value: +{
        +  "description": "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.",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "params": {
        +      "type": "object"
        +    },
        +    "template": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Addedput_automation
    • Addedread_conversation
    • Addedsend_dm
  5. 16 tool updates
    • Removedapprove_reply
    • Removedcreate_automation
    • Removedcreate_comment_to_dm
    • Removeddisable_automation
    • Removedenable_automation
    • Removedget_automation
    • Removedget_contact
    • Removedlist_automation_runs
    • Removedlist_automation_templates
    • Removedlist_automations
    • Removedlist_conversations
    • Removedlist_mentions
    • Changedpublish1 field changed
      • removedInput schema / properties / automation
        Removed value: -{
        -  "description": "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.",
        -  "properties": {
        -    "enabled": {
        -      "type": "boolean"
        -    },
        -    "name": {
        -      "type": "string"
        -    },
        -    "params": {
        -      "type": "object"
        -    },
        -    "template": {
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
    • Removedput_automation
    • Removedread_conversation
    • Removedsend_dm
  6. 16 tool updates
    • Addedapprove_reply
    • Addedcreate_automation
    • Addedcreate_comment_to_dm
    • Addeddisable_automation
    • Addedenable_automation
    • Addedget_automation
    • Addedget_contact
    • Addedlist_automation_runs
    • Addedlist_automation_templates
    • Addedlist_automations
    • Addedlist_conversations
    • Addedlist_mentions
    • Changedpublish1 field changed
      • addedInput schema / properties / automation
        Added value: +{
        +  "description": "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.",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "params": {
        +      "type": "object"
        +    },
        +    "template": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Addedput_automation
    • Addedread_conversation
    • Addedsend_dm
  7. 1 tool update
    • Addeddelete_reply
  8. 6 tool updates
    • Addedfollow
    • Addedlike
    • Changedmedia_upload_status1 field changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Skip this many images before returning previews (default 0).",
        +  "type": "integer"
        +}
    • Addednaver_layout
    • Changedpublish2 fields changed
      • addedInput schema / properties / options / properties / naver_blog / properties / form
        Added value: +{
        +  "description": "Form preset for the template layout (default photo-story). GET /v1/naver/forms lists the presets; naver_layout with forms: \"all\" shows them side by side.",
        +  "enum": [
        +    "bubble-info",
        +    "divider-tutorial",
        +    "photo-review",
        +    "place-list",
        +    "news-event",
        +    "table-explain",
        +    "mood-review",
        +    "photo-story"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / options / properties / naver_blog / properties / layout
        Added value: +{
        +  "description": "template (default) reshapes the body into the blog's house form before it goes out: #/## titles become underlined quote headings, a thin rule sits between sections, and photos you did not place with media: references go one per section (leftovers pair up at the end). Text is never changed. Call naver_layout first to see the result. Use as-is when the person dictated the structure or you placed everything yourself.",
        +  "enum": [
        +    "template",
        +    "as-is"
        +  ],
        +  "type": "string"
        +}
    • Changedreply1 field changed
      • addedInput schema / properties / secret
        Added value: +{
        +  "description": "Naver Blog only: post it as a secret comment that only the blog owner can read. Other channels refuse it.",
        +  "type": "boolean"
        +}
  9. 1 tool update
    • Changedpublish1 field changed
      • addedInput schema / properties / options / properties / naver_blog / properties / seoKeywords
        Added value: +{
        +  "description": "The search keywords this post targets, from keyword research (POST /v1/naver/keywords/judge): main is the one keyword the title leads with, subs (2-5) become the section titles one each. Not used when publishing; stored with the post and read by the SEO check.",
        +  "properties": {
        +    "main": {
        +      "description": "The main keyword, verbatim in the title and the first line.",
        +      "maxLength": 100,
        +      "type": "string"
        +    },
        +    "measuredAt": {
        +      "description": "ISO 8601 date the numbers were measured.",
        +      "type": "string"
        +    },
        +    "subs": {
        +      "description": "Sub keywords, one per section title.",
        +      "items": {
        +        "description": "One sub keyword.",
        +        "maxLength": 100,
        +        "type": "string"
        +      },
        +      "maxItems": 5,
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
  10. 1 tool update
    • Changedpublish1 field changed
      • changedInput schema / properties / options / properties / youtube / properties / privacyStatus / description
        Previous value: -"Defaults to private. We pass this through as you set it. Google can still restrict uploads from an API project that is under review, so if the video ends up somewhere else you get a warning on the result saying what YouTube actually applied."New value: +"Defaults to private. We pass this through as you set it. If YouTube applies something else, the result carries a warning saying what it actually applied."
  11. 1 tool update
    • Changedpublish4 fields changed
      • changedInput schema / properties / options / properties / naver_blog / properties / fontFamily / description
        Previous value: -"Body font as Naver's editor font code, e.g. \"nanumbarungothic\", \"nanumgothic\", \"nanummyeongjo\", \"maruburi\". Omit for the editor default."New value: +"Body font, one of nanumgothic, nanummyeongjo, nanumbarungothic, nanumsquare, maruburi. Omit for the editor default."
      • addedInput schema / properties / options / properties / naver_blog / properties / fontFamily / enum
        Added value: +[
        +  "nanumgothic",
        +  "nanummyeongjo",
        +  "nanumbarungothic",
        +  "nanumsquare",
        +  "maruburi"
        +]
      • changedInput schema / properties / options / properties / naver_blog / properties / fontSize / description
        Previous value: -"Body font size in px, 10-34. Omit for the editor default."New value: +"Body font size in px, one of the editor's sizes (11-38). Omit for the editor default."
      • addedInput schema / properties / options / properties / naver_blog / properties / fontSize / enum
        Added value: +[
        +  "11",
        +  "13",
        +  "15",
        +  "16",
        +  "19",
        +  "24",
        +  "28",
        +  "30",
        +  "34",
        +  "38"
        +]
  12. 4 tool updates
    • Changedlist_posts4 fields changed
      • addedInput schema / properties / since
        Added value: +{
        +  "description": "YYYY-MM-DD or ISO 8601. Only posts dated at or after this. A scheduled post is dated by its scheduledAt, a sent post by when it was created.",
        +  "type": "string"
        +}
      • addedInput schema / properties / sort
        Added value: +{
        +  "description": "scheduled orders by the post's date ascending (soonest first) and drops paging. Omit for newest first.",
        +  "enum": [
        +    "scheduled"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / status / description
        Previous value: -"Narrow to one status: publishing, published, partial, failed or cancelled. Omit for everything."New value: +"Narrow to one or more statuses, comma separated: scheduled, draft, publishing, published, partial, failed or cancelled. Omit for everything."
      • addedInput schema / properties / until
        Added value: +{
        +  "description": "YYYY-MM-DD or ISO 8601. Only posts dated at or before this (a date means the whole day).",
        +  "type": "string"
        +}
    • Changedpublish42 fields changed
      • addedInput schema / properties / batchId
        Added value: +{
        +  "description": "Optional tag (letters, digits, - or _) to group posts made together, for example the same text sent to two workspaces. Pass the same value on each call.",
        +  "type": "string"
        +}
      • addedInput schema / properties / draft
        Added value: +{
        +  "description": "true saves the post as a draft on uplika without sending anything. Use it when the person wants to review before it goes out. They finish it in the dashboard, or you call update_post and publish_now.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / options / description
        Previous value: -"Per-channel settings. Only the channels you are posting to need an entry."New value: +"Per-channel settings, keyed by channel id. Only the channels you are posting to need an entry. Every channel takes content to override the shared text for that channel alone."
      • addedInput schema / properties / options / properties / bluesky / properties / content
        Added value: +{
        +  "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
        +  "type": "string"
        +}
      • addedInput schema / properties / options / properties / bluesky / properties / langs / items / description
        Added value: +"One BCP-47 code."
      • addedInput schema / properties / options / properties / bluesky / properties / langs / items / pattern
        Added value: +"^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$"
      • addedInput schema / properties / options / properties / bluesky / properties / langs / maxItems
        Added value: +3
      • changedInput schema / properties / options / properties / facebook / description
        Previous value: -"Facebook Page settings. Optional — plain text publishes without it."New value: +"Facebook Page settings. Optional: plain text publishes without it."
      • addedInput schema / properties / options / properties / facebook / properties / content
        Added value: +{
        +  "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
        +  "type": "string"
        +}
      • changedInput schema / properties / options / properties / facebook / properties / contentType / description
        Previous value: -"What kind of post. Defaults to reel for a single video and feed otherwise. A Facebook story is rejected if you send any text — publish the story with no content, and put the words in a feed post instead. A story also takes exactly one image or video and no first comment."New value: +"What kind of post. Defaults to reel for a single video and feed otherwise. A Facebook story is rejected if you send any text: publish the story with no content, and put the words in a feed post instead. A story also takes exactly one image or video and no first comment."
      • changedInput schema / properties / options / properties / facebook / properties / scheduledPublishTime / description
        Previous value: -"ISO 8601 time to publish a feed post later, 10 minutes to 28 days from now. Feed posts only — not reels or stories. Cannot be combined with firstComment (a scheduled post is not live yet, so nothing to comment on)."New value: +"ISO 8601 time to publish a feed post later, 10 minutes to 28 days from now. Feed posts only, not reels or stories. Cannot be combined with firstComment (a scheduled post is not live yet, so nothing to comment on). This is Facebook's own scheduling; for scheduling across channels use scheduledAt on the post."
      • changedInput schema / properties / options / properties / instagram / description
        Previous value: -"Instagram settings. Optional — a plain post with media works without it."New value: +"Instagram settings. Optional: a plain post with media works without it."
      • addedInput schema / properties / options / properties / instagram / properties / collaborators / items / description
        Added value: +"A public professional account's username, without @."
      • addedInput schema / properties / options / properties / instagram / properties / collaborators / maxItems
        Added value: +3
      • addedInput schema / properties / options / properties / instagram / properties / content
        Added value: +{
        +  "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
        +  "type": "string"
        +}
      • addedInput schema / properties / options / properties / instagram / properties / thumbOffsetMs / minimum
        Added value: +0
      • addedInput schema / properties / options / properties / instagram / properties / userTags / items / description
        Added value: +"One tagged account."
      • addedInput schema / properties / options / properties / instagram / properties / userTags / items / properties / mediaIndex / description
        Added value: +"Which carousel slide, from 0."
      • addedInput schema / properties / options / properties / instagram / properties / userTags / items / properties / username / description
        Added value: +"Username without @."
      • addedInput schema / properties / options / properties / instagram / properties / userTags / items / properties / x / description
        Added value: +"0 to 1 from the left. Photos only."
      • addedInput schema / properties / options / properties / instagram / properties / userTags / items / properties / y / description
        Added value: +"0 to 1 from the top. Photos only."
      • changedInput schema / properties / options / properties / naver_blog / description
        Previous value: -"Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. Write `content` as Markdown: `## ` becomes a section title, `> ` a quotation, `---` a divider. Plain paragraphs become body text. Three directives place things in the body, each alone on its line: `![alt](media:<id>)` an uploaded image, `@video(media:<id>)` an uploaded video, `@card(https://…)` a link card. Put them mid-paragraph and they publish as literal text. Ids you reference this way do not have to repeat in mediaIds, and media you pass but never reference goes at the end."New value: +"Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. Write the body as Markdown: `## ` becomes a section title, `> ` a quotation, `---` a divider. Plain paragraphs become body text. Three directives place things in the body, each alone on its line: `![alt](media:<id>)` an uploaded image, `@video(media:<id>)` an uploaded video, `@card(https://…)` a link card. Put them mid-paragraph and they publish as literal text. Ids you reference this way do not have to repeat in mediaIds, and media you pass but never reference goes at the end. When other channels are in the same post, put the Markdown in options.naver_blog.content so the shared content stays plain text."
      • addedInput schema / properties / options / properties / naver_blog / properties / content
        Added value: +{
        +  "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content. On Naver Blog this is where the Markdown body goes when the other channels get plain text.",
        +  "type": "string"
        +}
      • changedInput schema / properties / options / properties / naver_blog / properties / draftOnly / description
        Previous value: -"Save as a draft in Naver instead of publishing. The user finishes it by hand."New value: +"Save as a draft in Naver instead of publishing. The user finishes it by hand. Different from draft on the post, which keeps the whole post on uplika."
      • addedInput schema / properties / options / properties / naver_blog / properties / fontSize / maximum
        Added value: +34
      • addedInput schema / properties / options / properties / naver_blog / properties / fontSize / minimum
        Added value: +10
      • changedInput schema / properties / options / properties / naver_blog / properties / scheduledAt / description
        Previous value: -"Schedule the post (ISO 8601, at least 10 minutes from now). The extension sets it in Naver's publish dialog."New value: +"Schedule the post inside Naver (ISO 8601, at least 10 minutes from now). The extension sets it in Naver's publish dialog. For scheduling across channels use scheduledAt on the post instead."
      • addedInput schema / properties / options / properties / naver_blog / properties / tags / items / description
        Added value: +"One tag without # and without spaces."
      • addedInput schema / properties / options / properties / naver_blog / properties / tags / maxItems
        Added value: +30
      • addedInput schema / properties / options / properties / naver_blog / properties / title / maxLength
        Added value: +100
      • addedInput schema / properties / options / properties / telegram
        Added value: +{
        +  "description": "Telegram has no channel-specific settings. Note the caption limit: with media attached the text is capped at 1,024 characters instead of 4,096.",
        +  "properties": {
        +    "content": {
        +      "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / options / properties / threads
        Added value: +{
        +  "description": "Threads settings. Optional.",
        +  "properties": {
        +    "content": {
        +      "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
        +      "type": "string"
        +    },
        +    "topicTag": {
        +      "description": "One topic to tag the post with, like a category. Threads takes exactly one and rejects periods and ampersands in it. On a thread it goes on the first piece only. Leave it out unless the person asked for a topic.",
        +      "maxLength": 64,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / options / properties / tiktok / properties / content
        Added value: +{
        +  "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
        +  "type": "string"
        +}
      • changedInput schema / properties / options / properties / tiktok / properties / title / description
        Previous value: -"Required for a photo post, up to 90 characters. A video post has no title field at all and passing one is rejected; a video's text comes from `content`."New value: +"Required for a photo post, up to 90 characters. A video post has no title field at all and passing one is rejected; a video's text comes from content."
      • addedInput schema / properties / options / properties / tiktok / properties / title / maxLength
        Added value: +90
      • addedInput schema / properties / options / properties / tiktok / properties / videoCoverTimestampMs / minimum
        Added value: +0
      • addedInput schema / properties / options / properties / youtube / properties / content
        Added value: +{
        +  "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
        +  "type": "string"
        +}
      • changedInput schema / properties / options / properties / youtube / properties / publishAt / description
        Previous value: -"ISO 8601 time to make the video public. Only works with privacyStatus private, and only on a video that was never public."New value: +"ISO 8601 time to make the video public. Only works with privacyStatus private, and only on a video that was never public. This is YouTube's own scheduling; for scheduling across channels use scheduledAt on the post."
      • addedInput schema / properties / options / properties / youtube / properties / tags / items / description
        Added value: +"One search tag."
      • addedInput schema / properties / options / properties / youtube / properties / title / maxLength
        Added value: +100
      • addedInput schema / properties / scheduledAt
        Added value: +{
        +  "description": "ISO 8601 time with a timezone offset (2026-09-20T09:00:00+09:00) to send the post at, on every channel. 10 minutes to 365 days from now. We keep the post as scheduled until then; the person can still change or cancel it.",
        +  "type": "string"
        +}
      • changedInput schema / properties / wait / description
        Previous value: -"Hold the response until the post is really out. Text waits up to 10 seconds, posts with media up to 90 seconds. If it is still going after that you get the usual publishing response and should poll get_post. Defaults to false."New value: +"Hold the response until the post is really out. Text waits up to 10 seconds, posts with media up to 90 seconds. If it is still going after that you get the usual publishing response and should poll get_post. Defaults to false. Ignored with scheduledAt or draft."
    • Addedpublish_now
    • Addedupdate_post
  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 every post goes out private, which means no link and no metrics come back."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. 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."
      • 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 so they finish and post it in the app; then we set no visibility and no link or metrics exist until they publish it."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 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."
  14. 3 tool updates
    • Addedget_publish_options
    • 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"New value: +"image/jpeg or image/png or image/webp or image/gif or video/mp4 or video/quicktime or video/webm"
    • Changedpublish1 field changed
      • addedInput schema / properties / options / properties / tiktok
        Added value: +{
        +  "description": "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 every post goes out private, which means no link and no metrics come back.",
        +  "properties": {
        +    "brandContentToggle": {
        +      "description": "Declare paid partnership content (\"Branded Content\"). TikTok does not allow branded content to be private, so this cannot be combined with privacyLevel SELF_ONLY.",
        +      "type": "boolean"
        +    },
        +    "brandOrganicToggle": {
        +      "description": "Declare that the post promotes the creator's own brand (\"Your Brand\"). Leave it out rather than sending false: not declaring and declaring 'no' are different statements.",
        +      "type": "boolean"
        +    },
        +    "disableComment": {
        +      "description": "Turn comments off for this post. Cannot be set to false if the creator disabled comments account-wide.",
        +      "type": "boolean"
        +    },
        +    "disableDuet": {
        +      "description": "Turn duets off for this post. Video posts only.",
        +      "type": "boolean"
        +    },
        +    "disableStitch": {
        +      "description": "Turn stitches off for this post. Video posts only.",
        +      "type": "boolean"
        +    },
        +    "isAigc": {
        +      "description": "Declare that the content was generated by AI. Worth setting when you made the video or images.",
        +      "type": "boolean"
        +    },
        +    "postMode": {
        +      "description": "direct (default) posts to the profile. draft sends it to the creator's TikTok inbox so they finish and post it in the app; then we set no visibility and no link or metrics exist until they publish it.",
        +      "enum": [
        +        "direct",
        +        "draft"
        +      ],
        +      "type": "string"
        +    },
        +    "privacyLevel": {
        +      "description": "Required unless postMode is draft. One of the values that get_publish_options returns for this account, e.g. PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR or SELF_ONLY. The list differs per account, so do not hard-code it.",
        +      "type": "string"
        +    },
        +    "title": {
        +      "description": "Required for a photo post, up to 90 characters. A video post has no title field at all and passing one is rejected; a video's text comes from `content`.",
        +      "type": "string"
        +    },
        +    "videoCoverTimestampMs": {
        +      "description": "Which frame to use as the cover, in milliseconds into the video. TikTok does not accept a cover image file, only a timestamp.",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
  15. 1 tool update
    • Changedpublish3 fields changed
      • changedInput schema / properties / mediaIds / description
        Previous value: -"Media ids from media_presign, each already confirmed with media_complete"New value: +"Media ids from media_presign (confirmed with media_complete), media_from_url or media_upload_link. On Naver Blog you can leave out ids the body already points at with media:<id>; we pick those up from the text."
      • changedInput schema / properties / options / properties / naver_blog / description
        Previous value: -"Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. Write `content` as Markdown: `## ` becomes a section title, `> ` a quotation, `---` a divider, and `![alt](media:<id>)` places an uploaded image at that spot. Plain paragraphs become body text."New value: +"Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. Write `content` as Markdown: `## ` becomes a section title, `> ` a quotation, `---` a divider. Plain paragraphs become body text. Three directives place things in the body, each alone on its line: `![alt](media:<id>)` an uploaded image, `@video(media:<id>)` an uploaded video, `@card(https://…)` a link card. Put them mid-paragraph and they publish as literal text. Ids you reference this way do not have to repeat in mediaIds, and media you pass but never reference goes at the end."
      • changedInput schema / properties / options / properties / naver_blog / required
        Previous value: -[
        -  "title",
        -  "categoryId"
        -]New value: +[
        +  "title"
        +]
  16. 1 tool update
    • Addedbridge_status
  17. 2 tool updates
    • Changedpublish2 fields changed
      • addedInput schema / properties / options / properties / naver_blog / properties / category
        Added value: +{
        +  "description": "The category name instead of its id, exactly as it appears in naverBlog.categories from list_accounts. If the blog does not have it you get naver_category_unknown with the list to pick from; if the person just created it, call refresh_account first.",
        +  "type": "string"
        +}
      • changedInput schema / properties / options / properties / naver_blog / properties / categoryId / description
        Previous value: -"Required. The id of a category on the connected blog. list_accounts returns them under naverBlog.categories. There is no default; without it Naver files the post under the wrong board."New value: +"The id of a category on the connected blog. list_accounts returns them under naverBlog.categories. Give this or category (the name); there is no default, and without one Naver files the post under the wrong board."
    • Addedrefresh_account

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    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.
    142 npm
    87
    MIT
  • 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
    67 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Gives AI agents the ability to schedule and publish social media posts to Instagram, TikTok, YouTube, X, LinkedIn, Facebook, Pinterest, Threads, and Bluesky. Create, schedule, and bulk-plan posts with per-platform captions, then check per-platform results and retry failures.
    12
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to manage social media publishing across platforms like LinkedIn, Twitter, Facebook, Instagram, Threads, and Bluesky.
    7
    54 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources