Skip to main content
Glama

Server Details

Let AI agents draft, schedule and publish posts to 17 social platforms, read analytics and reply.

Ownership verified
Status
Healthy
Uptime
90.0% over 24 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL
Repository
himpu-k/shortsync-mcp
GitHub Stars
0
Server Listing
ShortSync MCP server
ChatGPT
–
Claude
ShortSync

TDQS

A4/5.0

Scored across 93 tools

Disambiguation4/5

Most tools target clearly distinct resources or actions, and the descriptions explicitly distinguish batched vs single-post variants and the layered analytics tools. The main ambiguity comes from deprecated OpusClip tools overlapping with the generic import tools, plus the sheer size of the surface increasing misselection risk.

Naming Consistency5/5

Tool names consistently use snake_case with a verb_noun structure, and the batch_ prefix is applied predictably across related operations. There is no mixing of camelCase or chaotic verb styles.

Tool Count1/5

With 93 tools, the surface is far beyond a practical MCP tool set, even for a broad social-media management platform. Many batch variants, deprecated OpusClip tools, and niche admin operations could be consolidated or hidden behind fewer higher-level tools.

Completeness4/5

Coverage is very broad: publishing, scheduling, uploads, carousels, text posts, analytics, inbox, repurposing, folders, imports, connections, and team management are all represented. Minor lifecycle gaps remain, such as creating/updating saved replies, deleting concepts, platform comment moderation, and workspace creation/deletion.

Available Tools

93 tools
batch_publish_nowPublish posts nowA
Destructive
Inspect

Publishes multiple draft or scheduled posts immediately in a single call. Equivalent to calling publish_now for each post but batched. Use this when publishing more than one post. Pass either video_post_ids, or video_upload_id to publish every draft/scheduled post of that upload (optionally only the given platforms). Each post is checked like publish_now (subscription, quota, connection health, caption limits); one failure doesn't stop the rest. Returns per-post results.

NameRequiredDescriptionDefault
platformsNoWith video_upload_id only: limit to these platforms, e.g. ["twitter", "threads"]. Omit for all of the upload's draft/scheduled posts.
video_post_idsNovideo_posts.id values to publish now (max 50). Typically from create_post_drafts.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
video_upload_idNoInstead of video_post_ids: publish every draft or scheduled post of this upload.
notify_on_successNoEmail the user when each post successfully publishes. Defaults to false.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag this as a destructive, non-read-only, open-world operation, and the description adds important behavior beyond that: each post is validated for subscription, quota, connection health, and caption limits. It also discloses partial-failure semantics, notable for a batch mutation: one failure does not stop the rest. That is exactly the kind of operational context an agent needs before invoking a destructive batch tool.

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 front-loaded with the core action and its batch nature, then moves through input modes, validation behavior, failure isolation, and return shape. Every sentence contributes operational information; there is no filler.

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

Completeness5/5

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

For a destructive batch mutation with no output schema, the description covers the essential gaps: input mode selection, per-post validation, partial failure behavior, and the shape of results (per-post). Combined with annotations and schema descriptions, an agent has enough to call this correctly and interpret outcomes.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents each parameter well. The description adds relational meaning by clarifying the either/or usage between video_post_ids and video_upload_id, and by noting that platforms applies only with video_upload_id. That goes beyond individual field 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: publishing multiple draft or scheduled posts immediately in one batch call. It explicitly distinguishes itself from the singular sibling publish_now by calling itself the batched equivalent. An agent can tell exactly what this does 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 Guidelines4/5

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

It clearly says to use this when publishing more than one post and names publish_now as the per-post equivalent, which gives the agent a usable alternative. It does not explicitly state the inverse rule, such as 'use publish_now for a single post', so it stops just short of fully explicit when/when-not guidance.

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

batch_schedule_postsSchedule postsAInspect

Schedules multiple draft video posts in a single call. Equivalent to calling schedule_post for each post but batched — use this when scheduling more than one post. Pass scheduled_for (every post gets that time) or use_next_slot: true (each upload takes the next free saved posting time, in the order given, and all of an upload's platforms share it, like the app's bulk scheduling). Pass recurrence to repeat each upload on a cadence ("Repeat this post", same shape as the public API). Returns per-post results so you can see which succeeded and which failed.

NameRequiredDescriptionDefault
recurrenceNo"Repeat this post": publish the same post again on a cadence, like the app's Repeat option. scheduled_for is occurrence 1. Max 12 occurrences in total; each occurrence counts as one upload credit.
scheduled_forNoISO 8601 timestamp for when all posts should publish. Max 1 year out. Times in the past are nudged to now + 30 seconds. Required unless use_next_slot is true.
use_next_slotNoGive each upload the next free saved posting time (see get_posting_slots) instead of one shared scheduled_for.
video_post_idsYesArray of video_posts.id values to schedule (max 50). Typically obtained from create_post_draft or create_post_drafts.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
notify_on_successNoEmail the user when each post successfully publishes. Defaults to false.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare a non-read-only, non-destructive, open-world write. The description adds genuine behavioral context beyond them: partial success is possible ('per-post results so you can see which succeeded and which failed'), uploads consume next slots in the given order, and all of an upload's platforms share one time. It omits retry/idempotency behavior and any auth or rate-limit notes, which keeps it short of a 5.

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

Conciseness4/5

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

Purpose and the single-vs-batch routing are front-loaded, followed by the two scheduling modes and the return shape. It is dense and mostly earns its sentences, though the parenthetical asides ('same shape as the public API', 'like the app's bulk scheduling') could be trimmed.

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?

No output schema exists, so the description carries the return-value burden, which it handles by stating per-post results are returned. For a batched write tool with a fully documented schema and safety annotations, the remaining gaps (auth prerequisites, failure/retry semantics) are minor.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description still adds meaning the schema does not: next-slot assignment is ordered by input order, platforms within an upload share the slot, and recurrence mirrors the app's 'Repeat this post' semantics. That is useful clarification on top of a fully documented 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 states a specific verb and resource ('Schedules multiple draft video posts in a single call') and explicitly frames it as the batched equivalent of schedule_post. An agent can distinguish it from schedule_post and from the broader sibling list 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 names the alternative (schedule_post) and the exact condition that selects this tool ('use this when scheduling more than one post'). It also routes the agent between the two scheduling modes (scheduled_for vs use_next_slot) with the conditions for each.

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

batch_update_postsUpdate postsA
Destructive
Inspect

Updates caption, title, description, first comment, and platform-specific settings on multiple posts in a single call. Equivalent to calling update_post for each post but batched — use this when editing more than one post. To give every post the same text, set caption/title/description/first_comment once at the top level and list the posts in video_post_ids (or in updates, where an entry's own value wins over the top-level one). Posts on the same upload share one video_settings row, so shared fields (caption, title, description) are written once per upload. Does NOT support thumbnail operations — use update_post for those. Captions over a platform's limit are rejected for the whole upload group. Posts that failed for an over-limit caption are re-queued once the caption is fixed; their result includes the new status.

NameRequiredDescriptionDefault
titleNoShared title for every post in the call (an entry's own title wins).
captionNoShared caption for every post in the call (an entry's own caption wins).
updatesNoPer-post edits (max 50 posts in total with video_post_ids). Each entry targets one video_post_id and may set any combination of text/settings fields.
descriptionNoShared description for every post in the call (an entry's own description wins).
first_commentNoShared first comment for every post in the call (an entry's own first_comment wins).
video_post_idsNoPosts that get the top-level caption/title/description/first_comment and nothing else. Use with or instead of updates.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
follow_up_commentsNoUp to 4 more comments after the first comment (5 per post in total), posted on the same platforms as the first comment. Shared by every post of the upload; passing it replaces the current list, [] clears it. Not posted on X, which only gets the first comment. On Threads, Bluesky, Mastodon and Pixelfed each one replies to the previous comment, so they read as a thread.
first_comment_delay_minutesNoMinutes after the post goes live to post the first comment. 0 = right away (default). Up to 10080 (7 days). Shared by every post of the upload.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and openWorldHint=true, and the description goes well beyond them: it discloses that posts on the same upload share one video_settings row, that an over-limit caption rejects the whole upload group, and that failed posts are re-queued with a new `status` once fixed. These are non-obvious side effects and failure modes that materially change how an agent should batch edits. It stops short of describing permission requirements or partial-failure semantics for non-caption errors.

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?

It is front-loaded with purpose, then usage, then constraints, then failure behavior — a sensible order with no filler sentences. It is on the long side and repeats the precedence rule that the schema also states per field, which keeps it from a 5.

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 9-parameter batch mutation with no output schema, the description covers the grouping model, the override precedence, the caption-limit failure path, and the re-queue outcome, which is most of what an agent needs. It does not describe the shape of the returned per-post results beyond the `status` field, leaving some ambiguity about how partial failures are reported.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning on precedence ('an entry's own value wins over the top-level one') and on the division of labor between video_post_ids and updates. That precedence rule is the single most error-prone aspect of this tool and is stated in prose rather than left to per-field schema text.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Updates caption, title, description, first comment, and platform-specific settings on multiple posts') and immediately distinguishes itself from the single-post sibling by calling itself the batched equivalent of update_post. It also carves out an explicit non-capability (thumbnails), so an agent can route correctly 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 states the selection condition directly ('use this when editing more than one post') and names the alternative for the excluded case ('Does NOT support thumbnail operations — use update_post for those'). It also explains the two input modes (top-level shared values vs. per-entry overrides in updates), which is the main usage decision an agent faces here.

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

cancel_repurposing_workflow_postCancel repostA
Destructive
Inspect

Cancels an upcoming repost from a Repurposing workflow: its scheduled posts are removed from the library and the workflow won't pick that source post again. post_id is the entry id from list_repurposing_workflow_posts (not a platform post id). Fails if the repost has already gone out.

NameRequiredDescriptionDefault
post_idYesThe entry's id from list_repurposing_workflow_posts.
workflow_idYesThe workflow. Get it from list_repurposing_workflows.

TDQS

A4.7/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 exactly the consequences an agent needs beyond that: scheduled posts are removed from the library and the workflow will not pick that source post again. It also discloses the failure mode for already-published reposts, which no annotation conveys.

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

Conciseness5/5

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

Three sentences, each with a distinct job: what happens, parameter provenance, and failure condition. Effects are front-loaded before the parameter note, with no filler.

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

Completeness5/5

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

For a 2-parameter destructive tool with no output schema, the description covers effect, side effects, parameter sourcing, and failure conditions. Nothing an agent needs in order to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns extra by disambiguating post_id as the workflow entry id rather than a platform post id, and by naming the source tool for each parameter. It adds meaning beyond the field descriptions, though not format details.

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?

Specific verb (cancels) + resource (an upcoming repost from a Repurposing workflow) with the scope qualifier 'from a Repurposing workflow' that separates it from the sibling cancel_scheduled_post. An agent can identify the action and its domain 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 Guidelines4/5

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

Explains the preconditions ('fails if the repost has already gone out') and points to both prerequisite lookup tools (list_repurposing_workflow_posts for post_id, list_repurposing_workflows for workflow_id). It does not explicitly contrast with cancel_scheduled_post or delete_repurposing_workflow, so it falls short of naming alternatives.

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

cancel_scheduled_postCancel scheduled postA
Destructive
Inspect

Cancels a scheduled or failed post: removes the QStash job (including a pending auto-retry) and returns the post to Draft, clearing a failed post's error. Use when the user wants to stop a scheduled publish before it fires, or park a failed post for editing. To publish a failed post again, use retry_post instead. Refuses posts that have already published.

NameRequiredDescriptionDefault
video_post_idYesThe video_posts.id to unschedule. Get scheduled ids from list_scheduled_posts.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.7/5.0
Behavior5/5

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

The description adds substantial behavioral detail beyond the destructiveHint annotation: it removes the QStash job, cancels a pending auto-retry, returns the post to Draft, clears a failed post's error, and refuses posts that have already published. These are precise effects and preconditions for a destructive mutation.

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 four tight sentences, front-loaded with the effect followed by usage guidance, alternative routing, and a refusal condition. Every sentence contributes useful information.

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

Completeness5/5

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

For a destructive mutation with no output schema, the description covers outcomes, side effects, preconditions, and alternatives. The schema already documents both parameters, so no critical invocation detail is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both video_post_id and idempotency_key are already fully documented in the schema. The description does not add syntax or format details about the parameters, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource: cancels scheduled or failed posts. It also distinguishes the action from retry_post and from posts that have already published, so an agent can identify its role even with many sibling tools present.

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 when to use it: stop a scheduled publish before it fires or park a failed post for editing. It also names the alternative for republishing (retry_post) and states the refusal condition for already-published posts.

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

compare_instagram_accountsCompare Instagram accountsA
Read-only
Inspect

Compares the workspace's Instagram account with up to 5 other public Instagram Business or Creator accounts, read live from Instagram. For each account: followers, total posts, and over its last 12 posts the average likes, comments and Reel views, engagement rate (average likes + comments divided by followers, in percent) and posts per week. The workspace's own account is always returned as own. Personal or age-gated accounts can't be read and come back with ok: false and a reason. Needs Facebook Login for Instagram on the workspace; if it's missing the tool says so, and get_connect_link can create a link to connect it. Use it for questions like "how do I compare to @competitor" or "which of these creators gets more engagement".

NameRequiredDescriptionDefault
usernamesYesInstagram usernames to compare against (with or without @, or profile links), up to 5. Pass an empty array to get only the workspace's own numbers.
workspace_idYesWorkspace whose Instagram account is compared. Get one from list_workspaces.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/openWorldHint/non-destructive, and the description adds real value on top: live external reads from Instagram, per-account ok:false + reason on unreadable accounts, and the auth dependency with a recovery path. The one gap is that it doesn't say anything about latency, rate limits, or whether partial failures still return the remaining accounts' data.

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

Conciseness5/5

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

Front-loaded with the verb and scope, then returns, then caveats, then prerequisites, then example intents. The long metrics clause is dense but each item is information the agent needs to describe results to a user; no filler sentences.

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

Completeness5/5

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

There is no output schema, so the description carries the return contract itself and does so fully: per-account followers, posts, 12-post averages, engagement-rate formula, posts-per-week, and the `own` label. Combined with the auth prerequisite and error shape, an agent has everything needed to call it and interpret the response.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds meaning the schema doesn't: the workspace account is always included and labeled `own`, which tells the agent how to interpret the result relative to `usernames`. It doesn't add anything beyond the schema for `workspace_id`, and the @/profile-link/empty-array nuances are already in the schema text.

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

Purpose5/5

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

States a specific verb and resource ('Compares the workspace's Instagram account with up to 5 other public Instagram Business or Creator accounts, read live from Instagram') and enumerates exactly which metrics come back. The scope (max 5 others, own account always included as `own`, public Business/Creator only) makes it unmistakable against siblings like get_workspace_analytics or get_post_analytics.

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 concrete trigger questions ('how do I compare to @competitor', 'which of these creators gets more engagement') plus the prerequisite (Facebook Login for Instagram) and an explicit alternative when the prerequisite is missing (get_connect_link). It also states the failure condition for personal/age-gated accounts, so the agent knows when this tool simply won't work.

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

connect_discord_webhookConnect Discord channelAInspect

Adds a Discord channel to a workspace from a channel webhook URL, without the user leaving the chat. The user gets the URL in Discord: Server Settings → Integrations → Webhooks → pick or create a webhook for the channel → Copy Webhook URL. Works for every channel type, including forum channels. A workspace has one Discord connection that can hold several channels; each new webhook adds a channel, and sending one that's already connected refreshes it. The first channel is a default channel. Returns the connection and the added channel (use its id in platform_settings.channelIds). The webhook URL is a secret: it's stored encrypted and never returned.

NameRequiredDescriptionDefault
labelNoOptional display name for the channel. Defaults to the webhook's name.
webhook_urlYesThe channel's webhook URL, https://discord.com/api/webhooks/<id>/<token>.
workspace_idYesWorkspace to add the channel to. Get one from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (which declare a non-destructive, open-world write), the description adds substantial behavioral detail: a workspace has one Discord connection holding several channels, each webhook adds a channel, re-sending an existing webhook refreshes it, the first channel is a default channel, and the webhook URL is stored encrypted and never returned. It also describes the return value (connection and added channel with id for platform_settings.channelIds).

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

Conciseness4/5

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

The description is front-loaded with the core action, then provides necessary user-facing instructions and behavioral context. Every sentence contributes, though the step-by-step Discord navigation is slightly detailed for a tool description and could be trimmed without losing critical information.

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

Completeness5/5

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

Given the lack of an output schema and minimal annotations, the description is complete: it covers the return shape, idempotency/side effects, secret handling, and the distinction between adding and refreshing a channel. An agent has everything needed to call the tool correctly and interpret the result.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are already documented in the schema. The description reinforces a few points (label defaults to webhook name, workspace_id source, idempotency behavior) but adds little meaning beyond what the structured fields already provide, 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?

The description opens with a specific verb and resource: 'Adds a Discord channel to a workspace from a channel webhook URL.' This clearly distinguishes it from sibling tools like list_discord_channels (which lists) and other connection-related tools.

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 explains how the user obtains the webhook URL in Discord, notes it works for every channel type including forum channels, and describes what happens when sending an already-connected webhook (refreshes it). It does not explicitly name alternative tools or state when not to use this, but the context is clear enough for an agent to act.

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

create_comment_dm_ruleCreate comment DM ruleA
Destructive
Inspect

Creates an Instagram comment DM rule: anyone who comments a keyword gets the message as one private DM, once per person per rule. It starts sending to real people as soon as it's on, so confirm the keywords and text with the user first, or set enabled=false. The DM lands in the person's Message requests. Needs the Team plan or the Creator add-on.

NameRequiredDescriptionDefault
enabledNoDefaults to true.
messageYesThe DM text, up to 1,000 bytes. Include a line saying it's automated, such as 'This is an automated message.' Some places, like California and Germany, require that. The result's disclosure_missing is true when there's no such line.
post_idNoInstagram post id from list_comment_dm_posts to watch one post. Null or left out on create watches every post.
keywordsYesUp to 20 words or phrases people comment to get the DM. Whole words, any case: 'link' matches 'Link please' but not 'linked'. Emoji work too.
workspace_idYesWorkspace with the Instagram connection. Required. Get one from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and openWorldHint=true, and the description earns credit beyond them by explaining why: it starts messaging real people immediately, is limited to once per person per rule, and messages land in Message requests where they may go unseen. The safety confirmation requirement and plan gating are exactly the kind of context annotations cannot carry.

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

Conciseness5/5

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

Three sentences, front-loaded with the action and mechanism, then the risk warning and mitigation, then the plan requirement. Nothing is repeated from the schema and every sentence changes how the agent would behave.

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?

Covers purpose, risk, preconditions, plan gating, and delivery channel for a mutation tool with no output schema. The only minor gap is that it never says what is returned on success (a rule record, including the disclosure_missing field referenced in the schema), which matters slightly 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 coverage is 100% and the parameter descriptions are already thorough (keyword whole-word matching, 1,000-byte DM limit, idempotency window, post_id null meaning all posts). The description only indirectly touches parameters via 'confirm the keywords and text' and 'enabled=false', so it does not add meaningful semantics beyond the schema. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb (Creates) and resource (an Instagram comment DM rule) and then explains the mechanism: anyone commenting a keyword receives the message as one private DM, once per person per rule. That mechanism-level detail makes it unmistakable against siblings like update_comment_dm_rule or reply_to_comment without touching either schema.

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

Usage Guidelines4/5

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

Gives clear preconditions: confirm keywords and text with the user first, or set enabled=false, and the plan requirement (Team plan or Creator add-on). It stops short of naming the sibling that modifies an existing rule (update_comment_dm_rule) or the listing tool, but the when-to-use context is strong.

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

create_conceptCreate conceptAInspect

Creates a content concept (idea/brief) in a workspace's ideation bank (Library → Concepts). Requires Concepts to be turned on for the account (Settings → Advanced). New concepts land in the 'idea' column by default. Pass due_date to plan it onto a day in the content calendar. Use list_workspaces to resolve workspace_id.

NameRequiredDescriptionDefault
tagsNoOptional tag list for filtering.
titleYesShort title (required, max 200 chars).
statusNoOptional starting column: idea (default), draft, scheduled, published, archived.
captionNoOptional default caption. Copies straight into the video draft when the concept is converted.
due_dateNoOptional planned date (YYYY-MM-DD). The concept shows as an idea placeholder on that day in the content calendar.
platformsNoOptional list of platform slugs the concept targets (e.g. ['instagram','tiktok']).
descriptionNoFreeform notes / brief / voice-transcribed idea. Optional. Surfaced in the UI as 'Notes'.
content_typeNoOptional format: video, image, carousel, text, or other. Leave unset for a fresh idea that hasn't committed to a format.
workspace_idYesWorkspace to add the concept to. Get from list_workspaces. Caller must be a member.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the write/safety profile is structured. The description adds real value beyond that – a feature-flag precondition that will fail the call if Concepts is off, the default landing column ('idea'), and the calendar side effect of due_date. It stops short of describing the return payload or what errors look like, so it is good but not rich.

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

Conciseness4/5

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

Front-loads the core action and resource, then adds the prerequisite and the two usage patterns. Slightly redundant with the schema on due_date and workspace_id, but no sentence is wasted.

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 10-parameter mutation with no output schema, the definition covers the prerequisite, the default state, and the calendar behavior. A hint about what is returned (e.g. a concept id for later update_concept calls) would close the remaining gap.

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 every parameter carries its own description, so the baseline is 3. The description largely restates schema content (due_date planning, workspace_id lookup) rather than adding new meaning, though it does reinforce the default 'idea' status.

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?

Specific verb ('Creates') plus concrete resource ('content concept / idea / brief') and its location (ideation bank → Library → Concepts). Clearly distinct from list_concepts (read), update_concept (modify), and create_post_drafts_from_concept (conversion), so an agent can route correctly.

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 the prerequisite (Concepts must be enabled in Settings → Advanced) and a routing hint (use list_workspaces to resolve workspace_id), plus the planning pattern via due_date. It does not, however, say when to prefer create_post_draft or create_post_drafts_from_concept over this tool, so the sibling discrimination is only partial.

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

create_folderCreate folderAInspect

Creates a new folder inside a workspace, optionally nested under a parent folder. Folder names must be unique among siblings (case-sensitive, max 80 chars) and nesting is capped at 5 levels. Returns the created folder row. Use list_folders first to look up the parent_id when creating a subfolder.

NameRequiredDescriptionDefault
nameYesFolder name (max 80 chars). Must be unique among siblings under the same parent.
parent_idNoOptional parent folder id. Omit or pass null to create a top-level folder. Must belong to the same workspace.
workspace_idYesWorkspace to create the folder in. Get it from list_workspaces. The user must be a member.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses crucial operational behaviors beyond the annotations, specifically: folder name uniqueness (case-sensitive among siblings) and the maximum nesting depth of 5. This is critical execution context.

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

Conciseness5/5

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

The description is highly dense and efficient. Every clause adds essential constraints or workflow logic, making it appropriately sized and highly effective.

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 thorough input schema and the detailed explanation of constraints (nestability, uniqueness, limits), the definition provides all necessary context for the agent to execute the tool correctly.

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

Parameters4/5

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

While schema coverage is 100%, the description adds high-value semantic context by detailing the strict naming constraints (case-sensitive, max 80 chars) and the required prerequisite for nested folders.

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 purpose is perfectly clear: 'Creates a new folder inside a workspace.' It explicitly handles the nuance of optional nesting.

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 provides explicit instructions on workflow, stating 'Use list_folders first to look up the parent_id when creating a subfolder.' It also defines hard operational constraints (80 char limit, 5 level cap).

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

create_post_draftCreate post draftAInspect

Creates a draft video post for a single platform on top of an existing video upload. If a draft, failed, or ready post already exists for that (upload, platform) it is reset back to draft rather than duplicated. Call once per platform; use list_video_uploads first to get a video_upload_id. Refuses platforms that can't take the upload's content type. Accepted content types per platform: instagram: video/image/carousel; tiktok: video/image/carousel; youtube: video; facebook: video/image/text/carousel; snapchat: video/image; linkedin: video/image/text/carousel; threads: video/image/text/carousel; twitter: video/image/text/carousel; bluesky: video/image/text/carousel; pinterest: video/image/carousel; telegram: video/image/text/carousel; mastodon: video/image/text/carousel; discord: video/image/text/carousel; reddit: video/image/text; tumblr: video/image/text/carousel; pixelfed: video/image/carousel; google_business: image/text. Snapchat Spotlight is video-only (images go to Story).

NameRequiredDescriptionDefault
platformYesTarget platform: instagram, youtube, tiktok, facebook, snapchat, linkedin, threads, twitter, bluesky, pinterest, telegram, mastodon, discord, reddit, tumblr, pixelfed, or google_business. Discord: a workspace can connect several channels; one Discord post goes to the workspace's default channels unless you set platform_settings.channelIds afterwards with update_post (get ids from list_discord_channels). Other Discord settings: silent, mention ("none" | "here" | "everyone"), threadName (forum channels, max 100 chars), username (max 80 chars, no "discord"), textOnly. Caption up to 2000 characters, up to 10 attachments and 10 MB per post (unboosted servers), no custom thumbnail. First comment (max 2000 characters): in text channels a separate message right after the post, in forum channels the first reply in the post's thread; it never notifies on its own, and a failed comment never fails the post. Tumblr: one login can own several blogs; posts go to the primary blog unless you set platform_settings.blogName (the blog's short name) with update_post. Other Tumblr settings: tags (array, no "#", no commas, max 30), title (optional heading above the post text; overrides the post's shared title), textOnly. Tumblr's post text is the post's description (up to 5,000 characters, split into paragraphs), falling back to the caption when no description is set; video (one per post, up to 500 MB and 10 minutes), carousels (up to 10 items, images plus at most one video) or text posts; no custom thumbnail and no first comment. Tumblr limits accounts to 250 posts and 20 videos (60 minutes of video) per day. Reddit: each post goes to one subreddit, which is required; set platform_settings.subreddit with update_post (a bare name like "AskReddit", "r/AskReddit" also works, or "u_username" for the user's own profile; a bare name is always a subreddit, so "jane" posts to r/jane, never to u/jane). A saved default subreddit is applied when there is one. Other Reddit settings: title (the Reddit post title, max 300 characters; set it as platform_settings.title on the Reddit post, which only affects Reddit; when empty the publisher falls back to the upload's shared title, which YouTube, Facebook, Pinterest and Tumblr also use), nsfw (boolean, default false), flairId (id from the subreddit's flair list; some subreddits require a flair). The post body is the post's description. Video, single image or text (self) posts; no carousels, no first comment, no custom thumbnail, no analytics, and Reddit posts can't be deleted from ShortSync. Up to 10 Reddit posts per workspace per day. Some subreddits hold posts from new or low-karma accounts for moderator approval. Pixelfed: a federated, Mastodon-compatible photo network; each connection is one account on one server (instance). Every post needs media: video, image, or a carousel (mixed photos and videos allowed); no text-only posts. Settings via update_post: visibility ("public" | "unlisted" | "private", default "public"), sensitive (boolean, blurs media behind a warning), spoilerText (content warning, max 140 chars, only used when sensitive is true). Caption up to 500 characters (some servers allow more), up to 20 items per carousel (the server's own album cap, often 4, is checked at publish), one file-size cap for photos and videos (default about 15 MB per server; oversized videos are compressed, oversized images fail). Video is off by default on Pixelfed servers, so posting video to a photo-only server fails with a clear error. First comment (max 500 characters) is posted as a reply under the post; no custom thumbnail. Google Business Profile (google_business, beta): one Google login can manage several business locations; a post goes to the default locations unless you set platform_settings.locationIds with update_post (get ids from the `locations` of the google_business connection in list_platform_connections), and it fans out to every selected location. Other settings: ctaType ("BOOK" | "ORDER" | "SHOP" | "LEARN_MORE" | "SIGN_UP" | "CALL", optional button), ctaUrl (http(s) link, required for every ctaType except CALL, which dials the profile's phone number), textOnly (post a video upload's caption without the video). Caption up to 1500 characters and required; one photo (JPG or PNG, 10 KB to 5 MB) or text only; no video, no carousel, no custom thumbnail, no first comment, no mentions.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
video_upload_idYesid of the source upload. Get from list_video_uploads. The user must be a member of the upload's workspace.

TDQS

A4.5/5.0
Behavior5/5

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

Adds substantial traits beyond the annotations: an existing draft/failed/ready post is reset to draft rather than duplicated, unsupported content types are refused, per-platform posting limits (Tumblr 250 posts/20 videos per day, Reddit 10 per workspace per day) and per-platform constraints (no carousels, no custom thumbnail) are spelled out. Annotations only say it is a non-read-only, non-destructive write; the reset behavior is exactly the kind of mutation context the description must supply.

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

Conciseness4/5

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

Front-loads the core action and upsert semantics in the first two sentences, then gives constraints. The 16-platform content-type chain is a single dense sentence that would be easier to scan as a table, but it is information-dense rather than padded.

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 covers inputs, refusal conditions, per-platform quirks, and defaults thoroughly. It does not say what the tool returns (presumably a draft post id needed for subsequent update_post calls), which is the main remaining gap for a create-and-configure workflow.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds the accepted-content-type matrix per platform and the Snapchat Spotlight caveat, which is not fully captured in the platform parameter description. The idempotency_key and video_upload_id semantics live entirely in the schema and are not echoed, which is acceptable.

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 plus scope: 'Creates a draft video post for a single platform on top of an existing video upload.' The 'single platform' and 'on an existing video upload' qualifiers distinguish it from the plural create_post_drafts and from the upload-creation tools.

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

Usage Guidelines4/5

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

Gives concrete call guidance: 'Call once per platform' and 'use list_video_uploads first to get a video_upload_id', plus platform refusal rules. It stops short of explicitly routing between itself, create_post_drafts, and schedule_post/publish_now, so the agent must infer when a single draft is preferable to a batch or a direct publish.

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

create_post_draftsCreate post draftsAInspect

Creates draft video posts for multiple platforms in a single call. Equivalent to calling create_post_draft once per platform but batched — use this instead when drafting to more than one platform. Returns per-platform results with each post's id; platforms that can't take the upload's content type come back with ok: false. Accepted content types per platform: instagram: video/image/carousel; tiktok: video/image/carousel; youtube: video; facebook: video/image/text/carousel; snapchat: video/image; linkedin: video/image/text/carousel; threads: video/image/text/carousel; twitter: video/image/text/carousel; bluesky: video/image/text/carousel; pinterest: video/image/carousel; telegram: video/image/text/carousel; mastodon: video/image/text/carousel; discord: video/image/text/carousel; reddit: video/image/text; tumblr: video/image/text/carousel; pixelfed: video/image/carousel; google_business: image/text. Snapchat Spotlight is video-only (images go to Story).

NameRequiredDescriptionDefault
platformsYesTarget platforms, e.g. ["instagram", "tiktok", "youtube"]. Duplicates are ignored. See create_post_draft for the full list.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
video_upload_idYesid of the source upload. Get from list_video_uploads.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only declare it is a non-read, non-destructive, closed-world write. The description goes well beyond that by disclosing partial-failure semantics ('platforms that can't take the upload's content type come back with ok: false') and a full per-platform content-type matrix, which is the main failure mode for a batched write. It stops short of stating permissions/account requirements or whether successful drafts are later publishable, keeping it at 4 rather than 5.

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

Conciseness4/5

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

Front-loaded with purpose and the sibling comparison in the first two sentences; the content-type matrix follows as reference material. The enumerated platform list is dense prose that would read better as a table, but every clause carries actionable constraint information.

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

Completeness5/5

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

No output schema exists, and the description compensates by explaining the return shape (per-platform results with each post's id and ok flags). For a 3-parameter batch write with full schema coverage, nothing an agent needs in order to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for the 'platforms' parameter: the accepted content types per platform and the Snapchat Spotlight video-only caveat constrain which values will succeed. Idempotency and video_upload_id semantics are left entirely to the schema.

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

Purpose5/5

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

States a specific verb and resource ('Creates draft video posts') plus the distinguishing scope ('for multiple platforms in a single call'). It explicitly separates itself from the singular sibling create_post_draft, so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit selection rule: 'Equivalent to calling create_post_draft once per platform but batched — use this instead when drafting to more than one platform.' The alternative and the condition that selects it are both named, leaving nothing to inference.

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

create_post_drafts_from_conceptCreate drafts from conceptAInspect

Turns a concept into draft posts, like 'Create draft' on the Concepts board. Creates a draft per platform (default: the concept's platforms) and copies the concept's caption, per-platform captions, first comments and YouTube title onto them (the YouTube caption override also becomes the description). The concept's notes are not copied. Media: pass video_upload_id (from create_video_upload / list_video_uploads); otherwise the concept's existing linked upload is reused, or its attached image/video is turned into an upload (pass attachment_id if it has several). Links the concept to the upload and moves it to the Draft column; scheduling the drafts later moves it to Scheduled and publishing to Published. Then use batch_update_posts for platform settings and batch_schedule_posts to schedule.

NameRequiredDescriptionDefault
platformsNoOptional target platforms. Defaults to the concept's platforms.
concept_idYesThe concept to turn into posts. Get from list_concepts.
attachment_idNoOptional: which concept attachment to use as the media when the concept has more than one.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
video_upload_idNoOptional media for the posts. Must be in the concept's workspace. Overrides the concept's attachment and linked upload.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare a non-destructive write, but the description adds substantial beyond-schema behavior: which fields are copied (caption, per-platform captions, first comments, YouTube title/description override), that notes are NOT copied, the media resolution precedence, and the resulting board state transitions (Draft → Scheduled → Published). That is exactly the kind of side-effect disclosure an agent needs before a write.

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

Conciseness4/5

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

Front-loaded with the core action and no filler sentences; every clause carries operational detail. It is a dense single paragraph, though, and the media-selection chain plus the lifecycle sentence could be split for faster scanning.

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?

Covers source resolution, copy semantics, media fallback, linking, and lifecycle consequences, with no output schema needed to infer results. For a 5-parameter write tool with no output schema, nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description still adds value by explaining precedence ("Overrides the concept's attachment and linked upload") and the conditional reason to pass attachment_id ("if it has several"). idempotency_key semantics are left entirely to the schema, keeping it just shy of a 5.

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

Purpose5/5

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

Opens with a specific verb+resource ("Turns a concept into draft posts") anchored to a concrete UI affordance ("like 'Create draft' on the Concepts board"). This clearly separates it from plain create_post_draft / create_post_drafts, which presumably don't take a concept as the source.

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 explicit downstream routing ("Then use batch_update_posts for platform settings and batch_schedule_posts to schedule") and a media-selection decision tree (video_upload_id > linked upload > attachment). It never explicitly contrasts with the sibling single-draft tools, so it stops short of full when-not guidance.

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

create_post_thumbnail_uploadCreate thumbnail uploadAInspect

Reserves a presigned S3 PUT URL scoped to a specific video post's custom-thumbnail slot. Use this when the user has a LOCAL image file they want as the cover for an existing video post. Returns { upload_token, presigned_url, method: 'PUT', expires_at }. PUT the image bytes to presigned_url with Content-Type set to image/jpeg, image/png, image/webp, or image/gif. Then call finalize_post_thumbnail with the same video_post_id and upload_token to wire it in as the cover. The cover is used on YouTube, Instagram Reels, Facebook Reels and Pinterest. Does NOT create a video_uploads library entry, so nothing to clean up afterward. For a public image URL, use update_post with custom_thumbnail_url directly. For an image already in the library, use update_post with custom_thumbnail_upload_id.

NameRequiredDescriptionDefault
video_post_idYesThe video_posts.id whose cover you want to set. All sibling posts on the same upload share the cover (they read from the same video_settings row).
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare the generic write/non-destructive profile; the description goes far beyond by disclosing the return shape ({ upload_token, presigned_url, method, expires_at }), that the URL expires, allowed Content-Types, the mandatory finalize_post_thumbnail follow-up, and the absence of cleanup side effects. It also reveals the cross-post sharing behavior that a caller would otherwise not anticipate.

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

Conciseness4/5

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

Front-loaded with the core action and return contract, then alternatives last — a sensible ordering with little filler. The platform list ('YouTube, Instagram Reels, Facebook Reels and Pinterest') is the one sentence that borders on trivia for a caller deciding how to invoke the tool.

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 write tool with no output schema, the description supplies the return shape, the required follow-up call, the upload protocol, and the side-effect profile. Nothing an agent needs in order to invoke it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the video_post_id description already explains the shared-cover semantics, so the schema does the heavy lifting. The description reinforces that the same video_post_id must be passed to finalize_post_thumbnail but adds no new syntax or constraints for idempotency_key. Baseline 3 applies.

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

Purpose5/5

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

States a precise verb and resource ('Reserves a presigned S3 PUT URL scoped to a specific video post's custom-thumbnail slot') and explicitly separates itself from create_video_upload ('Does NOT create a video_uploads library entry'). An agent can distinguish it from every sibling 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?

Gives the exact triggering condition ('when the user has a LOCAL image file ... for an existing video post') and names two alternative paths with the condition selecting each: public image URL -> update_post with custom_thumbnail_url; already-in-library image -> update_post with custom_thumbnail_upload_id. Both when-to-use and when-not-to-use are covered.

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

create_repurposing_workflowCreate repurposing workflowAInspect

Creates a Repurposing workflow that reposts a source's posts to other connected accounts. The source is exactly one of source_connection_id (an Instagram or Facebook Page account) or source_integration 'twitch' (the user's connected Twitch channel, see Settings > Integrations: clips go out in the vertical version when Twitch has one, with the clip title as the caption; either kind, and kind 'existing' can use publish_order 'most_viewed') or source_integration 'rss' with feed_url (an Apple Podcasts link or any RSS/Atom feed, such as a podcast or blog; YouTube channels are not supported: each item is posted as its video when the feed has one, else its cover art, with the title as the caption and the item's link under it on X, Bluesky, Threads, Mastodon, LinkedIn, Facebook, Telegram, Discord, Tumblr and Reddit, as the pin link on Pinterest and as a Learn more button on Google Business Profile; Instagram, TikTok and Snapchat get the title only). kind 'new_posts' (default) reposts each new post: publish_mode 'immediate' publishes it right away, 'draft' (the API default) saves it to the library. kind 'existing' reposts older posts on a weekly timetable and needs schedule_slots and timezone; it schedules posts into the library up to 30 days ahead, where they can be edited or cancelled. Each repost counts as one upload on the plan. The original caption is used (first line as the title where a platform has one), Instagram and Facebook video covers are carried over, and ShortSync's own posts to the source are never reposted. Returns the created workflow.

NameRequiredDescriptionDefault
kindNo'new_posts' (default) for each new post as it's published; 'existing' to repost older posts on a timetable. Can't be changed later.
nameNoOptional name for the workflow (max 80 characters), e.g. 'Reels to TikTok'. null or empty shows the default label for its kind.
enabledNofalse pauses the workflow, true turns it back on.
feed_urlNoWith source_integration 'rss': an Apple Podcasts show link or an RSS/Atom feed URL. YouTube channel links are refused. Feeds are checked about every 15 minutes.
timezoneNoScheduled workflows: IANA time zone the slots are in, e.g. 'Europe/Helsinki'.
include_fromNoScheduled workflows: only repost source posts published on or after this date (ISO 8601).
publish_modeNoNew-posts workflows only: 'immediate' publishes each repost right away, 'draft' saves it to the library for review. Scheduled ('existing') workflows always schedule.
workspace_idYesWorkspace to create it in. Get one from list_workspaces.
content_typesNoWhich post types to repost. Default: all three.
include_untilNoScheduled workflows: only repost source posts published on or before this date (ISO 8601).
publish_orderNoScheduled workflows: work through the source's posts newest or oldest first, or (Twitch only) most viewed first. Default newest.
caption_suffixNoOptional text added to every repost's caption (max 500 characters). null clears it.
schedule_slotsNoScheduled ('existing') workflows: publishing times per weekday, keys '0' (Sunday) to '6' (Saturday), values 'HH:mm' lists, up to 5 a day. Example: { "1": ["10:00"], "3": ["10:00", "16:00"] }.
target_optionsNoPer-target options: { pinterest?: { board_id, board_name? }, reddit?: { subreddit }, discord?: { channel_ids: [] }, google_business?: { location_ids: [] }, caption_mode?: 'title_and_description' | 'split' | 'title', settings?: { <platform>: { ... } } }. Board ids come from list_pinterest_boards, channel ids from list_discord_channels. caption_mode: on YouTube, Pinterest, Reddit and Tumblr the title is the caption's first line; the description is the whole caption (title_and_description), the caption without its first line (split) or empty (title). settings: per-platform settings in the same camelCase shape as update_post's platform_settings (e.g. { youtube: { privacyStatus: 'unlisted', categoryId: '20' }, tiktok: { privacyLevel: 'SELF_ONLY' } }); anything unset uses the member's saved upload settings (YouTube defaults to public). Per-post fields (titles, alt text, subtitles, polls) are ignored.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
source_integrationNo'twitch': repost clips from the user's connected Twitch channel (needs Twitch connected in Settings > Integrations). 'rss': post items from the feed in feed_url. Either way every new item (kind 'new_posts') or older items on a timetable (kind 'existing'). Can't be changed later.
source_connection_idNoThe Instagram or Facebook Page connection to repost from (list_platform_connections). Omit when source_integration is set. Can't be changed later.
target_connection_idsYesConnections to repost to (ids from list_platform_connections), not the source. Pinterest needs target_options.pinterest.board_id and Reddit needs target_options.reddit.subreddit.

TDQS

A4.9/5.0
Behavior5/5

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

It reveals critical operational constraints not found in the schema or annotations, such as the limit of 'one upload per plan' and the policy that ShortSync's own posts to the source are never reposted.

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 very long, which is necessitated by the tool's complexity, but the information is highly dense and well-ordered, grouping logic by source and workflow type efficiently.

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 complexity of a multi-platform, multi-mode, scheduled, and constrained workflow creator, the description is exceptionally complete and addresses almost all edge cases and limitations an agent might encounter.

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 the schema is 100% covered, the description provides crucial context for the function of specific parameters like caption generation rules (X vs Instagram) and the constraints of 'target_options' (e.g., 'list_platform_connections').

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 purpose is clearly stated: to create a Repurposing workflow that repost source content to connected accounts. It immediately defines the core function and operational scope.

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 acts as a decision tree, clearly outlining the constraints and necessary inputs based on source type (IG/FB, Twitch, RSS) and workflow kind (new_posts, existing). This prevents common configuration errors.

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

create_text_postCreate text postAInspect

Creates a text-only post (no media) in a workspace and returns its upload_id. The caption is the post body. Then call create_post_drafts with the upload_id for the platforms that take text posts (X, Threads, Bluesky, LinkedIn, Facebook, Mastodon, Telegram, Discord, Reddit, Tumblr, Google Business Profile), batch_update_posts for per-platform captions and settings (e.g. a shorter X or Bluesky caption with the rest as a first comment), and batch_schedule_posts or batch_publish_now. Text posts can't be scheduled or published without a caption.

NameRequiredDescriptionDefault
captionNoOptional post text, shared by every platform. Can also be set later with batch_update_posts. Platform length limits are checked when the caption is saved on drafts.
workspace_idYesWorkspace to create the post in. Get from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover the safety profile (non-destructive write), while the description adds the meaningful behavioral details: the call returns an upload_id, caption acts as the post body, length limits are validated at draft-save time, and scheduling fails without a caption.

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

Conciseness4/5

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

Front-loads what the tool does and then the follow-up chain in three dense sentences with no filler. The long parenthetical enumeration of eleven platforms is slightly verbose but earns its place by telling the agent which platforms accept text posts.

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?

Everything an agent needs is present: what it creates, the return value (upload_id, standing in for the absent output schema), the required follow-up calls, and the caption constraint. Nothing essential is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description goes further by clarifying that the caption is shared across every platform and can be supplied later via batch_update_posts, which is semantics the schema only hints at.

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 ('Creates a text-only post (no media)') plus the return value, and distinguishes itself from media-creating siblings like create_carousel and create_video_upload by the explicit 'no media' qualifier.

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

Usage Guidelines5/5

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

Gives an explicit downstream workflow: call create_post_drafts with the upload_id, batch_update_posts for per-platform captions, then batch_schedule_posts or batch_publish_now. It also names the precondition (a text post can't be scheduled/published without a caption) and lists which platforms accept text posts.

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

create_video_uploadCreate uploadAInspect

Reserves a NEW video/image library slot and returns a presigned S3 PUT URL for the caller to upload bytes directly. Use this when you have the file locally and don't want to host it publicly first (create_video_upload_from_url is the URL-based alternative). Response: { upload_id, presigned_url, method: 'PUT', expires_at, required_headers? }. PUT the raw bytes to presigned_url with Content-Type set to the file's MIME (video/mp4, video/quicktime, video/webm, image/jpeg, image/png, image/webp, image/gif). S3 records whatever type you send and finalize validates it against the allow-list. If required_headers is present, echo those verbatim on the PUT or S3 will 403 with SignatureDoesNotMatch. After the PUT completes, call finalize_video_upload with upload_id to get the video_upload_id back. Video max 950 MB, image max 20 MB.

DO NOT use this tool to set a cover / thumbnail on an existing video post. This creates a separate library entry, not a cover image. To set a cover on an existing post, call update_post with custom_thumbnail_url (public https URL to an image) or with custom_thumbnail_upload_id (a video_upload_id of an image already in the workspace).

NameRequiredDescriptionDefault
filenameNoOptional original filename (max 255 chars, no path separators). Preserved on the video_uploads row after finalize so the dashboard and platform validators can read the extension. When provided the response includes a required_headers map that the client MUST echo on the PUT.
workspace_idYesWorkspace to attach the upload to. Get one from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.7/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the annotations: it describes the response object, the required PUT method, Content-Type constraints, the 403 risk when required_headers are not echoed, size limits, and the need to call finalize_video_upload afterward. These details go well beyond the safety hints in the annotations and do not contradict 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 appropriately long for a multi-step upload workflow and is front-loaded with the core action, the alternative sibling, the response shape, PUT instructions, limits, and the finalize step. Each section serves a clear operational purpose.

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?

Although there is no output schema, the description explicitly documents the response fields including upload_id, presigned_url, method, expires_at, and required_headers. It also gives enough workflow guidance to complete the upload and finalize it correctly, including constraints and the follow-up 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 workspace_id, filename, and idempotency_key are already well documented in the schema. The description reinforces the filename/header workflow and upload constraints, but it does not add significant parameter-level meaning beyond what the schema provides.

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

Purpose5/5

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

The description states a specific verb and resource: it reserves a NEW video/image library slot and returns a presigned S3 PUT URL. It clearly distinguishes itself from the sibling create_video_upload_from_url and from thumbnail-setting behavior on existing posts.

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: use this when the file is local and you do not want to host it publicly first, with create_video_upload_from_url named as the URL-based alternative. It also gives an explicit DO NOT case for cover/thumbnail creation and routes that use case to update_post with the appropriate parameters.

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

create_video_upload_from_urlCreate upload from URLAInspect

Downloads a video or image from a public https:// URL into ShortSync and registers a NEW video_uploads row you can then reference from create_post_draft. Good for 'here's my Dropbox/Drive/S3 link, post it' flows. When the remote sends a generic Content-Type (Google Drive serves application/octet-stream), pass an explicit filename with the right extension (.mp4/.mov/.webm/.jpg/.png/.webp/.gif/etc.) so the type can be inferred. Server-side SSRF guards apply: https only, no private IPs, Content-Length required, 950 MB max for video / 20 MB for images. Returns the new video_upload_id.

DO NOT use this tool to set a cover / thumbnail on an existing video post. This creates a separate library entry, not a cover image. To set a cover on an existing post, call update_post with custom_thumbnail_url (public https URL to an image) or with custom_thumbnail_upload_id (a video_upload_id of an image already in the workspace).

NameRequiredDescriptionDefault
filenameNoOptional filename to store (max 255 chars, no path separators). Derived from the URL path when omitted. **Required** when the URL doesn't end in a recognizable extension (e.g. Google Drive `uc?export=download&id=…` links) because that's how we infer the media type when the remote sends application/octet-stream.
source_urlYesPublic https:// URL to download from. Direct-download links (Dropbox '?dl=1', S3, presigned URLs, Drive uc?export=download) work; pages that require login or JavaScript to reveal the file don't.
workspace_idYesWorkspace to attach the upload to. Get it from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description explains that a new video_uploads row is created, the tool returns the new video_upload_id, and server-side SSRF guards apply: https only, no private IPs, Content-Length required, and size limits of 950 MB for video and 20 MB for images. It also highlights the important behavioral distinction that this creates a separate library entry, not a cover image.

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 front-loaded with the primary purpose and return value, then moves through practical usage, filename guidance, safety limits, and the critical misuse warning. Despite its length, every section provides actionable information for correctly invoking the tool.

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 tool's complexity and the absence of an output schema, the description covers creation behavior, return value, URL requirements, filename inference needs, size limits, SSRF restrictions, and the key non-use case. An agent has enough information to call it correctly and avoid confusing it with cover-image or draft-creation tools.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all four parameters thoroughly. The description reinforces the filename guidance for generic Content-Type responses and mentions public https URL behavior, but most of that detail is already present in the schema, so it adds limited additional parameter semantics beyond structured data.

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 precise verb and resource: downloading a video or image from a public URL into ShortSync and registering a NEW video_uploads row. It also distinguishes this tool from create_post_draft and from update_post by explaining that this creates a separate library entry rather than a cover image.

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 a concrete when-to-use scenario ('here's my Dropbox/Drive/S3 link, post it') and an explicit when-not-to-use case: it must not be used to set a cover/thumbnail on an existing video post. It also names the correct alternative, update_post with custom_thumbnail_url or custom_thumbnail_upload_id.

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

delete_comment_dm_ruleDelete comment DM ruleA
Destructive
Inspect

Deletes an Instagram comment DM rule and its send history, so a new rule could DM the same people again. To stop one for now, use update_comment_dm_rule with enabled=false instead.

NameRequiredDescriptionDefault
rule_idYesRule id from list_comment_dm_rules.
workspace_idYesWorkspace with the Instagram connection. Required. Get one from list_workspaces.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description doesn't need to re-establish that this is a write. It does add genuinely new behavioral context by disclosing that send history is deleted too and why that matters (a new rule could DM the same people again). It stops short of stating irreversibility or permission requirements outright.

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, zero waste, with the destructive scope front-loaded and the safer alternative placed second where it reads as a guardrail.

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 two fully documented required parameters, no output schema, and annotations covering the safety profile, the definition is nearly complete. The only remaining gap is an explicit statement that the deletion is permanent and cannot be undone.

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 documented in-schema with sourcing hints (list_comment_dm_rules, list_workspaces). The description adds no parameter meaning beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Deletes an Instagram comment DM rule') and adds the consequential scope ('and its send history'), which lets an agent distinguish it from update_comment_dm_rule without opening either schema.

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

Usage Guidelines5/5

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

Explicitly routes the agent away from this tool when the intent is only to pause: 'To stop one for now, use update_comment_dm_rule with enabled=false instead.' Both the alternative and the selecting condition are named.

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

delete_folderDelete folderA
Destructive
Inspect

Deletes a folder. Any subfolders inside it are deleted with it (cascade). Videos filed under any deleted folder are NOT deleted — they become unfoldered (folder_id set to null). Returns { success: true } on completion.

NameRequiredDescriptionDefault
folder_idYesThe folder to delete. Get it from list_folders.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true, so the description earns credit for disclosing what annotations cannot: subfolders are cascade-deleted, videos are preserved but unfoldered (folder_id null), and the response shape is { success: true }. It stops short of stating whether the deletion is recoverable or what permissions/role are required, which are the remaining behavioral unknowns for a destructive write.

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

Conciseness5/5

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

Three tight sentences with zero filler: the operation first, the dangerous side effect second, the non-obvious preservation behavior third, and the return value last. Front-loaded and every sentence carries distinct information.

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

Completeness5/5

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

No output schema exists, yet the description supplies the return value, the cascade side effect, and the nulling behavior for videos — covering the questions an agent must answer before firing a destructive call. Combined with the destructive annotation and fully documented two-parameter schema, nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100% — folder_id documents its source (list_folders) and idempotency_key documents its 10-minute retry semantics in full. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ("Deletes a folder") and immediately scopes the blast radius with cascade semantics, which is exactly what separates it from update_folder or move_video_to_folder in the sibling list. An agent can identify the operation and its scope 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 Guidelines3/5

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

Usage is only implied by the verb — delete a folder when you want it gone. There is no guidance on when not to use it (e.g., to remove a video from a folder, use move_video_to_folder), no confirmation/permission prerequisite, and no mention that deletion may be irreversible. The schema's pointer to list_folders for the ID is the only navigational aid.

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

delete_published_postDelete published postA
Destructive
Inspect

DESTRUCTIVE AND IRREVERSIBLE: deletes an already published post from the social platform it went out on (the live post, its views, likes and comments are gone for good), like the dashboard's "Delete from platform". Always confirm with the user first, naming the platform and the post, and never call it on your own initiative or to clean up. Only works on posts with status "published". The ShortSync post stays as an audit record with status "removed" and the upload is kept. Not every platform allows it: TikTok, Snapchat and Reddit can't be deleted through their APIs, and Instagram and Threads only once enabled for the account; those return an error telling the user to delete the post in the app. To drop a draft, scheduled or failed post that never went live, use cancel_scheduled_post instead.

NameRequiredDescriptionDefault
video_post_idYesThe video_posts.id of the published post to delete (from list_scheduled_posts with status 'published' or get_post_details). Not the platform's own post ID.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and openWorldHint=true, so the description is not carrying the safety burden alone — yet it still adds substantial context: exactly what is destroyed (live post, views, likes, comments), what survives (ShortSync post kept as an audit record with status "removed", upload retained), and per-platform capability limits (TikTok/Snapchat/Reddit unsupported; Instagram/Threads conditional) with the resulting error behavior.

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 highest-severity signal ("DESTRUCTIVE AND IRREVERSIBLE") before any procedural guidance, and each subsequent sentence carries distinct information. It runs long for a two-parameter tool and a couple of clauses (the dashboard analogy, the parenthetical about views/likes/comments) are reinforcement rather than new facts, keeping it just below top marks.

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

Completeness5/5

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

No output schema exists, yet the description supplies the post-condition (post marked "removed", upload kept) and the failure mode (platform-specific errors instructing the user to delete in-app). Combined with the confirmation requirement and the sibling routing rule, an agent has everything needed to decide and to act 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?

Schema description coverage is 100% — both video_post_id and idempotency_key are fully documented in the schema, including the warning that it is not the platform's own post ID. The description adds no parameter-level detail of its own; its mention of status "published" only indirectly scopes which ID is valid. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb and resource ("deletes an already published post from the social platform it went out on") and immediately bounds it with "Only works on posts with status 'published'". It also names the sibling it is not (cancel_scheduled_post) and the class of posts that sibling handles, so an agent can distinguish it without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use (published post, matches the dashboard's "Delete from platform"), explicit process constraint ("Always confirm with the user first, naming the platform and the post"), explicit prohibition ("never call it on your own initiative or to clean up"), and an explicit alternative for drafts/scheduled/failed posts. Nothing is left to inference.

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

delete_repurposing_workflowDelete repurposing workflowA
Destructive
Inspect

Deletes a Repurposing workflow. Reposts that already went out stay in the library and on the platforms. For a scheduled ('existing') workflow, stop_action says what happens to the posts it scheduled that haven't gone out yet ('drafts' by default). To stop it for now instead, use update_repurposing_workflow with enabled: false.

NameRequiredDescriptionDefault
stop_actionNoScheduled workflows: what happens to posts it scheduled that haven't gone out yet. 'drafts' (default) keeps them in the library as drafts, 'remove' deletes them. Published posts always stay.
workflow_idYesThe workflow. Get it from list_repurposing_workflows.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, so the bar is lower, but the description still adds real value: published reposts persist, unshipped posts default to drafts, and only 'remove' deletes them. The one gap is that it never states the workflow deletion itself is permanent/irreversible or whether confirmation or special permissions are needed.

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 tight sentences, front-loaded with the action, then consequences, then the parameter caveat, then the alternative. Every sentence carries distinct information and nothing is padded.

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 two-parameter destructive tool with no output schema, this covers survival semantics, default branch behavior, and the non-destructive alternative. It stops short of stating permanence of the workflow deletion itself, the main remaining unknown an agent would want before calling it.

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 the stop_action parameter already documents both enum values and the 'drafts' default, so the description's rephrasing of stop_action is largely redundant. It contextualizes it slightly ("for a scheduled ('existing') workflow") but adds no syntax or scope detail beyond the schema, which is the baseline-3 case.

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?

Specific verb-plus-resource ("Deletes a Repurposing workflow") in the first sentence, immediately followed by what survives the deletion. It also distinguishes itself from update_repurposing_workflow, so an agent can tell the two apart without opening either schema.

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

Usage Guidelines5/5

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

Explicitly names the alternative path and its condition: "To stop it for now instead, use update_repurposing_workflow with enabled: false." That is a rare, unambiguous when-not-to-use statement with the substitute call spelled out.

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

delete_uploadDelete uploadA
Destructive
Inspect

Deletes an upload (video, image, carousel or text post) from the workspace library, same as deleting it in the ShortSync dashboard. The media and thumbnails are removed and every scheduled, queued or draft post made from it is cancelled. Posts already published stay live on their platforms. This can't be undone, so confirm with the user first. Workspace clients can't delete.

NameRequiredDescriptionDefault
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
video_upload_idYesThe upload to delete. Get it from list_video_uploads.

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond destructiveHint=true by disclosing the exact cascade: media and thumbnails removed, all scheduled/queued/draft posts from the upload cancelled, already-published posts left live. It also states irreversibility and a permission restriction (workspace clients), which the 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.

Conciseness5/5

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

Five short sentences, front-loaded with what is deleted, then consequences, then the safety instruction. Every sentence carries distinct information — cascade, published-post exception, irreversibility, permission — with no filler.

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

Completeness5/5

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

For a destructive mutation with no output schema, this covers the full decision surface: scope, side effects, exception for published content, irreversibility, and authorization limits. Nothing an agent needs before invoking 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% and both parameters are documented in-schema, including the idempotency key's retry window. The description adds no additional parameter meaning, 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?

States a specific verb (deletes) and resource (an upload) and enumerates the covered media types (video, image, carousel, text post), so the agent knows exactly what object class is affected. The analogy to the ShortSync dashboard anchors the semantics without ambiguity.

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

Usage Guidelines4/5

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

Gives clear operating conditions: confirm with the user first, and workspace clients can't delete — that rules out a whole caller class. It does not, however, route to the sibling alternative delete_published_post, which is the obvious choice when the target is an already-published post rather than a library upload.

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

explain_post_analytics_stateExplain post analyticsAInspect

Diagnostic — returns one of eight concrete states explaining why a post's analytics look the way they do. Use this instead of inferring from raw zeros / nulls in get_post_analytics; it collapses the (platform supports analytics?) × (connection healthy?) × (sync ran?) × (metrics zero?) matrix into a single state plus a human-readable explanation.

Possible states:

  • platform_not_supported: no analytics exist for this platform (Telegram, Discord). The zero row is a permanent placeholder.

  • account_not_supported: the platform reports nothing for this post and explanation carries the reason: a personal account where only business accounts or pages have analytics (LinkedIn personal profile, personal Pinterest account), an X post when the workspace hasn't added its own X API key, or a Google Business Profile post (Google only has profile-level stats; get_workspace_analytics returns them).

  • connection_needs_reconnect — the token that published this post is expired / revoked; the sync cannot refresh it until the user reconnects.

  • sync_never_ran — no post_analytics row, OR the row is still the publish-time placeholder. No sync has run since the post was published; check the sync field for whether this call started one.

  • sync_failed — the fetch ran and errored out; fetch_error carries the upstream message.

  • synced_zero — real fetch, real zeros. The platform genuinely reports no engagement yet.

  • synced_populated — real fetch, at least one non-zero metric.

  • post_not_published — the post is still a draft or scheduled; no analytics can accrue yet.

Returns actionable: true when there's a user-facing next step (usually reconnect or wait), plus a next_step string spelling it out.

Freshness: if the workspace's analytics were last synced over an hour ago (or never), this call also starts a background sync and reports it in the response's sync field (status started or in_progress, plus last_synced_at). The numbers in that response are from the previous sync; call again in a few minutes for fresh ones. sync.status of free_plan_limit or daily_limit means no sync could run, so the numbers may not be current.

NameRequiredDescriptionDefault
video_post_idYesThe video_posts.id to diagnose. Get it from list_video_uploads or the return value of other analytics tools.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations alone (readOnlyHint=false, openWorldHint=true) would leave the agent confused about why a read-looking diagnostic isn't read-only; the description resolves this by disclosing that the call may kick off a background sync when data is stale, and reports that in a `sync` field. It also surfaces failure modes ('sync_never_ran', 'sync_failed' with fetch_error, token expiry) and plan limits beyond what annotations cover.

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 one-line purpose, then a scannable state list — the length is largely justified because there is no output schema and these enum values must be documented somewhere. A few sentences (e.g., restating actionable/next_step after already explaining each state) are mildly 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 carries the full burden and does so: it enumerates all eight `state` values, names the accompanying fields (explanation, fetch_error, actionable, next_step, sync, last_synced_at), and explains the side effect and staleness caveat. Nothing an agent needs to interpret the response is missing.

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

Parameters3/5

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

Only one parameter and the schema already documents it at 100% coverage, including where to obtain video_post_id. The description adds no additional meaning about the parameter's format or constraints, so the baseline 3 for high schema coverage applies.

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

Purpose5/5

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

States a specific verb and resource ('Diagnostic — returns one of eight concrete states explaining why a post's analytics look the way they do') and immediately distinguishes itself from the sibling that produces the raw numbers, get_post_analytics. An agent can tell exactly what this returns without opening the schema.

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

Usage Guidelines5/5

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

Explicit routing rule: 'Use this instead of inferring from raw zeros / nulls in get_post_analytics.' It also gives follow-up guidance ('call again in a few minutes for fresh ones') and explains what a sync.status of free_plan_limit or daily_limit implies about the data's currency.

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

finalize_post_thumbnailFinish thumbnail uploadA
Destructive
Inspect

Finalizes a thumbnail upload started with create_post_thumbnail_upload. Call this after PUTting the image bytes to the presigned URL. Verifies the bytes landed in S3 with an image content-type (jpeg/png/webp/gif) and writes custom_thumbnail_url + custom_thumbnail_s3_key on the post's video_settings row. All sibling posts on the same upload use the new cover at publish time (YouTube, Instagram Reels, Facebook Reels and Pinterest). Errors: 'reserved' when the PUT hasn't landed yet (retry in a few seconds), or 'unsupported content type' when the object's Content-Type isn't an image MIME.

NameRequiredDescriptionDefault
upload_tokenYesThe upload_token returned by create_post_thumbnail_upload. Identifies the specific pending upload in S3.
video_post_idYesThe video_posts.id you passed to create_post_thumbnail_upload.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing what is mutated (the post's video_settings row), a cross-post side effect (sibling posts on the same upload use the cover at publish time, across four named platforms), and concrete error strings with remediation. This is exactly the kind of write-scope and failure-mode detail annotations cannot convey.

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

Conciseness5/5

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

Front-loads the action and the prerequisite, then layers in side effects and errors. Every sentence carries information an agent needs; there is no filler or restatement of the title.

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

Completeness5/5

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

For an annotated mutation with no output schema, the description covers prerequisite state, mutation target, cross-post consequences, and error handling. An agent has everything needed to call it correctly and to recover from the common failure mode.

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 value by tying upload_token to the 'reserved' error condition and explaining that its absence of a landed PUT is what triggers the retry. The idempotency_key is left to the schema, which documents it well.

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

Purpose5/5

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

States a specific verb and resource ('finalizes a thumbnail upload') and explicitly ties it to the sibling create_post_thumbnail_upload, so an agent can place it in the upload flow without opening either schema. It also names the exact fields written (custom_thumbnail_url, custom_thumbnail_s3_key).

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

Usage Guidelines5/5

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

Gives an explicit ordering precondition: call only after PUTting image bytes to the presigned URL obtained from create_post_thumbnail_upload. The retry guidance for the 'reserved' error also tells the agent what to do when the prerequisite isn't yet satisfied.

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

finalize_video_uploadFinish uploadAInspect

Finalizes an upload started with create_video_upload. Call this after PUTting bytes to the presigned URL. Returns { status: 'ready', video_upload_id, filename, content_type, size_bytes } once the bytes are in S3, or { status: 'reserved' } if the PUT hasn't landed yet (retry in a few seconds). Errors: unsupported file type (only mp4/mov/webm/mkv/avi videos and jpeg/png/webp/gif/heic images are allowed) or file too large (video 950 MB, image 20 MB). The upload also finalizes on its own via a background timer within a few minutes of the PUT, so calling this is optional but faster.

NameRequiredDescriptionDefault
upload_idYesThe upload_id returned by create_video_upload (a video_settings row id).
workspace_idNoOptional. Workspace the upload belongs to; found from upload_id when left out. If given, it must match the workspace_id passed to create_video_upload.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond annotations by documenting both return states, the retry guidance for the 'reserved' case, allowed MIME types, size caps, and the background-timer auto-finalization. Annotations only cover readOnly=false and destructive=false; the description supplies the substantive behavior (mutation semantics, delay window, optionality).

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 the purpose and sequencing, then stacks return values, error conditions, and the optionality note in compact sentences. Every sentence carries distinct information with no repetition of the title or annotations.

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

Completeness5/5

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

No output schema exists, yet the description inlines both response shapes ({status:'ready',...} and {status:'reserved'}) plus error cases and retry timing, leaving nothing an agent needs in order to invoke and interpret this tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so upload_id, workspace_id, and idempotency_key are already fully documented. The description adds no parameter-level detail (e.g., it never mentions idempotency or workspace matching), so it sits at the baseline where schema does the work.

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

Purpose5/5

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

States a specific verb+resource and ties it directly to its predecessor ('Finalizes an upload started with create_video_upload'), which disambiguates it from siblings like create_video_upload and cancel_scheduled_post. An agent can identify this as the terminal step of the upload lifecycle without opening the schema.

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

Usage Guidelines5/5

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

Explicitly says when to call ('after PUTting bytes to the presigned URL') and offers the alternative path ('the upload also finalizes on its own via a background timer... calling this is optional but faster'). This is a clear when/when-not with a named alternative mechanism.

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

get_account_growthGet account growthA
Read-only
Inspect

Follower, subscriber, following and post counts per connected account, plus how much each grew in a window. Answers "how are my followers trending". Each entry has current and previous counts (previous is the last snapshot at or before from), growth deltas (null when there's no baseline), needs_reconnect, and growth_window_days (30 when Instagram clamped the window to its 30-day limit). YouTube, Facebook and Instagram deltas come live from the platform when the window has a start; the rest come from daily snapshots. Google Business Profile entries add google_business profile stats instead of followers. Same data as GET /api/v1/analytics/account-growth.

NameRequiredDescriptionDefault
toNoWindow end, ISO 8601. Defaults to now.
fromNoWindow start, ISO 8601 (e.g. 2026-10-01T00:00:00Z). Omit for lifetime counts without deltas.
platformNoOptional comma-separated platform filter, e.g. "instagram,tiktok". Omit for every connected platform.
workspace_idYesWorkspace to report on. Get one from list_workspaces.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, non-destructive, closed-world), yet the description still adds substantial behavior: `growth` is null without a baseline, `needs_reconnect` flags broken connections, Instagram clamps windows to 30 days and surfaces this via `growth_window_days`, and YouTube/Facebook/Instagram deltas are fetched live while others come from daily snapshots. That is exactly the kind of data-quality caveat an agent cannot get from the schema.

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

Conciseness4/5

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

Front-loaded with the resource and the question it answers, then layered with caveats in decreasing priority. It is dense rather than padded, though the snapshot-vs-live sentence is compacted enough to require a second read.

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

Completeness5/5

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

There is no output schema, so the description carries the burden of return values and does so fully: it names each entry field, its nullability, and the one platform-specific shape deviation. An agent can consume and interpret the response without further documentation.

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 genuinely adds meaning: `previous` is defined as the last snapshot at or before `from`, and the platform-window interaction (Instagram 30-day clamp) affects how `from`/`to` behave. That goes beyond the schema's terse ISO-8601 notes.

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

Purpose4/5

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

States a specific verb+resource and enumerates exactly what is returned: follower/subscriber/following/post counts per connected account plus in-window growth. It even notes the Google Business Profile variant, so the agent knows the shape changes by platform. It stops short of naming siblings like get_workspace_analytics or compare_instagram_accounts, so there is no explicit 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?

The framing question "how are my followers trending" gives an unambiguous use case, and the Google Business carve-out clarifies a case where the tool still applies. There is no when-not guidance and no named alternative for overlapping analytics tools, which keeps it out of the 5 range.

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

get_conversation_messagesGet conversation messagesA
Read-only
Inspect

Returns the messages in an inbox conversation, oldest-first. Use before reply_to_comment when you need thread context. Returns cached data from ShortSync's inbox sync — it doesn't hit the platform API on read.

NameRequiredDescriptionDefault
limitNoMax messages to return (default 50, max 200). Ordered oldest-first, so the tail is the newest.
workspace_idNoOptional. Auto-resolved from the conversation when omitted.
conversation_idYesThe id returned by list_inbox_conversations.

TDQS

A4.2/5.0
Behavior4/5

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

Adds non-obvious behavior beyond the readOnlyHint annotations: data comes from ShortSync's cached inbox sync and no platform API call occurs on read, which lets an agent reason about staleness and latency. It doesn't state how stale the cache may be or whether a sync_inbox call is needed to refresh, so not a 5.

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

Conciseness5/5

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

Three short sentences: purpose and ordering first, then the usage pointer, then the caching caveat. Every sentence carries distinct information with zero repetition.

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

Completeness4/5

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

With no output schema, the description should hint at what a message looks like and whether there's pagination; it does say results are ordered oldest-first so the tail is newest, but doesn't say if there's a has_more cursor beyond limit. Adequate for a small read tool but slightly incomplete.

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/default/max and workspace_id auto-resolution are already documented. The description only repeats the oldest-first ordering and adds no new parameter guidance, which is 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?

States a specific verb ('Returns') and resource ('messages in an inbox conversation') with a scope qualifier (oldest-first). This clearly separates it from list_inbox_conversations, which returns conversations rather than their messages, and the schema's conversation_id description reinforces the chain.

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

Usage Guidelines4/5

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

Explicitly says to call it 'before reply_to_comment when you need thread context', naming both the sibling and the condition. It lacks an explicit when-not (e.g., don't use for a single message, or when live data is required), so it falls just short of 5.

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

get_folder_analyticsGet folder analyticsAInspect

Returns aggregated analytics for a folder across every video inside it. By default the numbers cumulate through subfolders (matching the analytics dashboard's folder view); pass include_subfolders=false to limit the rollup to uploads filed directly in this folder. Response includes per-platform breakdown, per-video breakdown (one row per upload with its own summed metrics), and folder-level totals. Use list_folders to look up a folder_id.

Numbers come from the locally-cached analytics (post_analytics), not a live platform fetch.

Dashboard parity note: same caveat as get_workspace_analytics. Instagram, Facebook, and YouTube slices sum cached per-post metrics and may under-report vs. the ShortSync dashboard, which fetches account-level insights live for those three platforms. TikTok match the dashboard exactly. That's why folder totals can differ from the dashboard's own folder view for Instagram, Facebook, and YouTube.

by_platform only contains platforms the analytics pipeline actually fetches; other platforms have no metrics, not zero engagement.

hidden_platforms_no_analytics lists the unsupported platforms that do have posts in the folder (Telegram, Discord) with the post count, which are excluded from the breakdown. X and Google Business Profile rows show 0 when X has no API key added or for Google Business posts (Google has no per-post stats).

Analytics coverage: per-post analytics exist for YouTube, TikTok, Instagram, Facebook, LinkedIn (Company Pages), Threads, Bluesky, Pinterest (business accounts), Snapchat, Mastodon, Pixelfed, Reddit and Tumblr (Pixelfed, Reddit, Tumblr, Bluesky and Mastodon report no view counts). X has analytics only when the workspace has added its own X API key in Settings > Integrations (X bills each post read to the user's X developer account); without one, X posts come back unavailable with that reason. Google Business Profile has profile-level stats only (no per-post numbers). Telegram and Discord have no analytics at all.

by_video still includes every published post regardless of platform. Low numbers on a fetched platform can come from a connection that needs reconnecting; list_platform_connections shows that state.

Freshness: if the workspace's analytics were last synced over an hour ago (or never), this call also starts a background sync and reports it in the response's sync field (status started or in_progress, plus last_synced_at). The numbers in that response are from the previous sync; call again in a few minutes for fresh ones. sync.status of free_plan_limit or daily_limit means no sync could run, so the numbers may not be current.

NameRequiredDescriptionDefault
daysNoOptional lookback window in days, counting from now. Omit for lifetime. Max 365. The window is based on the post's published_at.
folder_idYesThe folders.id to summarize. Get it from list_folders. The user must be a member of the folder's workspace.
include_subfoldersNoWhen true (default), sum metrics through every descendant folder. When false, only include uploads filed directly in this folder.

TDQS

A4.6/5.0
Behavior5/5

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

The description goes well beyond the annotations by disclosing that data comes from locally cached analytics rather than a live platform fetch, explaining dashboard parity caveats, unsupported platforms, X API key requirements, and background sync behavior. This is exactly the kind of behavioral context an agent needs before calling a tool whose annotations alone would not reveal these operational traits.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and main subfolder behavior, and it uses clear paragraphs for caveats, platform coverage, and freshness. It is fairly long and some platform coverage details are verbose, but most sentences carry useful behavioral context rather than 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?

Given the tool's complexity, the 100% schema coverage, and the absence of an output schema, the description is highly complete. It explains the response shape, per-platform and per-video breakdowns, platform-specific limitations, and sync freshness behavior, leaving little ambiguity for an agent invoking it.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all three parameters in detail, establishing a baseline of 3. The description adds useful contextual meaning for include_subfolders and the folder_id lookup path, though it does not add much about the days parameter beyond what the schema already says.

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: it returns aggregated analytics for a folder across every video inside it. It also distinguishes the folder-level rollup from workspace-level and post-level analytics through explicit scope and examples, so an agent can identify the tool 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 Guidelines4/5

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

The description gives clear usage context, including the default subfolder rollup behavior, the include_subfolders=false alternative, and the prerequisite to use list_folders for a folder_id. It does not explicitly route the agent to sibling tools such as get_video_analytics or get_post_analytics when finer-grained analytics are needed, so it stops short of full when-to-use/when-not guidance.

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

get_post_analyticsGet post analyticsAInspect

Returns the latest analytics snapshot for a single platform post (layer 1 of 3 — one post = one platform). Includes views, likes, comments, shares, plus platform-specific metrics like reach, saves, watch time. Instagram Reels may add platform_metrics.reels_skip_rate (percent of views that skipped in the first 3 seconds), and Instagram rows with Facebook Login may add platform_metrics.reposts. When the workspace has Facebook Login for the same account, Instagram likes, comments and views are all-surfaces totals including boosted media, and platform_metrics has total_likes, total_comments and total_views.

The provenance field says where a row of zeros comes from:

  • sync → the analytics pipeline actually fetched from the platform. Zeros here are real.

  • seed → placeholder row written at publish time (fetched_at ≈ published_at). No fetch has run yet; every metric is a stub 0.

  • unsupported_platform → the platform has no analytics (Telegram, Discord). The seed row stays at 0 forever and does not mean the platform reported zero engagement.

A row with fetch_status unavailable means the platform will never report on this post, and fetch_error says why (personal LinkedIn/Pinterest account, X without the workspace's own API key, Google Business Profile posts); its zeros are placeholders, not measured values.

Also returns platform_supports_analytics: boolean. Numeric fields may be null when the platform doesn't expose that metric (e.g. shares on YouTube) OR when no sync has run yet. For the same video summed across platforms use get_video_analytics; for a whole folder rolled up use get_folder_analytics.

Freshness: if the workspace's analytics were last synced over an hour ago (or never), this call also starts a background sync and reports it in the response's sync field (status started or in_progress, plus last_synced_at). The numbers in that response are from the previous sync; call again in a few minutes for fresh ones. sync.status of free_plan_limit or daily_limit means no sync could run, so the numbers may not be current.

NameRequiredDescriptionDefault
video_post_idYesThe video_posts.id to fetch analytics for. Only meaningful once the post is published.

TDQS

A4.4/5.0
Behavior5/5

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

With readOnlyHint=false, the description supplies the missing reason: the call can kick off a background sync and returns sync.status of 'started'/'in_progress', with 'free_plan_limit'/'daily_limit' meaning no sync ran and numbers may be stale. It further discloses what zeros actually mean per provenance value and per fetch_status 'unavailable', which an agent cannot infer from any structured field.

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

Conciseness4/5

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

Front-loaded with the core purpose, then organized into clearly separated topics (metrics, provenance, fetch_status, freshness). It is long for a single-parameter tool and the provenance block partly overlaps the sibling explain_post_analytics_state, but nearly every sentence carries decision-relevant detail.

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

Completeness5/5

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

There is no output schema, so the description must carry the return semantics, and it does: which metrics appear, platform-specific fields, nullability causes (unsupported metric vs. no sync yet), and stale-data behavior. An agent has enough to call this correctly and to interpret a zeros result.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter video_post_id is fully documented in the schema ('Only meaningful once the post is published'). The description adds no further syntax or format detail about the parameter, so this sits at the high-coverage 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?

Opens with a specific verb and resource: 'Returns the latest analytics snapshot for a single platform post', and immediately scopes it as 'layer 1 of 3 — one post = one platform'. That framing lets an agent distinguish it from get_video_analytics and get_folder_analytics without opening any schema.

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

Usage Guidelines4/5

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

Explicitly routes adjacent cases: 'For the same video summed across platforms use get_video_analytics; for a whole folder rolled up use get_folder_analytics.' It also implies the pre-publish restriction via the schema note. It does not tell the agent when to use the sibling explain_post_analytics_state instead of reading the provenance prose here.

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

get_post_detailsGet post detailsA
Read-only
Inspect

Returns full detail on a single video post — status, platform, scheduled/published timestamps, and its resolved caption/title/description pulled from the parent video_settings (with per-platform overrides applied). Use before update_post when you need to know the current text.

NameRequiredDescriptionDefault
video_post_idYesThe video_posts.id to fetch. Get from list_video_uploads, list_scheduled_posts, or create_post_draft.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that by disclosing resolution semantics: the text is derived from the parent video_settings with per-platform overrides applied, which an agent could not infer from annotations or schema.

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

Conciseness5/5

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

Two sentences, front-loaded with the return payload and followed by the usage condition. No filler or redundant restatement of the title.

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

Completeness4/5

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

There is no output schema, but the description compensates by enumerating what is returned, and the sole parameter is fully documented. The only gap is behavior on an invalid or deleted video_post_id (error vs. empty result), which is minor for a single-item read.

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

Parameters3/5

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

With 100% schema description coverage, the single parameter is fully documented in the schema, including where to obtain the value (list_video_uploads, list_scheduled_posts, create_post_draft). The description adds no parameter-level meaning beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ("Returns full detail on a single video post") and enumerates the returned fields — status, platform, timestamps, resolved caption/title/description. This clearly distinguishes it from sibling list tools like list_video_uploads and list_scheduled_posts.

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?

"Use before update_post when you need to know the current text" gives an explicit trigger and names a sibling tool as the downstream consumer. It does not cover when-not-to-use (e.g., batch scenarios where batch_update_posts or list tools suffice), but the routing guidance is clear.

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

get_posting_slotsGet posting slotsA
Read-only
Inspect

Returns the user's saved daily posting times for a workspace (the queue set in Settings and the scheduling step) and next_slots: the next free slots as UTC timestamps, picked the way the app's scheduling step picks them (a slot is free when no scheduled post in the workspace sits at that minute). Times are in timezone (effective_timezone is UTC when none is saved). Use this before scheduling instead of guessing a time, or pass use_next_slot: true to schedule_post / batch_schedule_posts. move_posts_past_limits is the workspace setting that moves a scheduled post to its next free slot when it hits a platform's daily limit, instead of failing it (on by default). Same data as GET /api/v1/posting-slots.

NameRequiredDescriptionDefault
countNoHow many next free slots to return. Default 5, max 50.
workspace_idYesWorkspace to read. Get one from list_workspaces.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/non-destructive, and the description adds substantial context beyond them: how a slot is deemed free, timezone fallback behavior (`effective_timezone` is UTC when none is saved), the `move_posts_past_limits` default-on setting, and the equivalent REST endpoint.

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

Conciseness4/5

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

Front-loads the return value and the primary usage directive, with no filler sentences; the parenthetical asides about timezone and the settings flag are dense but each carries real information, though the long compound sentences could be split for readability.

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

Completeness5/5

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

With no output schema, the description carries the burden of explaining return values and does so (saved daily times plus `next_slots` as UTC timestamps), and it covers timezone semantics and the limit-handling setting, leaving nothing an agent needs before calling it.

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 `count` and `workspace_id` are already documented in the schema; the description adds contextual meaning about what the workspace's queue represents but no extra syntax or format detail for the parameters themselves. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb and resource ('Returns the user's saved daily posting times for a workspace') plus the derived `next_slots` output, and implicitly distinguishes itself from the write-side sibling update_posting_slots by describing a read of the queue.

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

Usage Guidelines5/5

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

Explicitly says when to use it ('Use this before scheduling instead of guessing a time') and names the concrete alternative path ('pass use_next_slot: true to schedule_post / batch_schedule_posts'), so the agent knows both the trigger and the downstream consumer.

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

get_user_profileGet user profileA
Read-only
Inspect

Returns the authenticated user's ShortSync profile: user_id, email, current_organization_id, and account creation date. Use this to introduce yourself, confirm which ShortSync account is connected, or resolve the user's default organization before other tools.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds that the response is scoped to the authenticated caller, but says nothing about auth failure behavior or whether fields can be null.

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

Conciseness5/5

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

Two sentences, front-loaded with the return contract, then the usage guidance. No filler, and each clause carries distinct information an agent needs.

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's explicit field enumeration does the heavy lifting for an agent that needs to know what comes back. Only gap is edge cases (unauthenticated call, missing organization), which is minor for a trivial no-arg read.

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?

Zero parameters, so the baseline is 4. The description's field list is about return values rather than inputs, but it usefully signals that the call implicitly targets the current user, complementing the empty schema.

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

Purpose5/5

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

States a specific verb and resource ('Returns the authenticated user's ShortSync profile') and enumerates the returned fields (user_id, email, current_organization_id, creation date), which distinguishes it clearly from siblings like list_organizations or list_workspace_people.

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 three concrete use cases: introducing yourself, confirming which account is connected, and resolving the default organization before calling other tools. This is actionable routing guidance, though it names no explicit alternative or exclusion condition.

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

get_video_analyticsGet upload analyticsAInspect

Returns aggregated analytics for a single video upload across every platform it was posted to. Includes per-platform sibling rows (one per platform post) plus summed totals: views, likes, comments, shares, saves, watch time, followers gained, and a recomputed engagement rate. Use list_video_uploads to look up a video_upload_id. Numbers come from the locally-cached analytics (post_analytics), not a live platform fetch.

Dashboard parity note: same caveat as get_workspace_analytics. Instagram, Facebook, and YouTube slices sum cached per-post metrics and may under-report vs. the ShortSync dashboard, which fetches account-level insights live for those three platforms (Instagram views include Reels reach and impressions; Facebook aggregates page-level comments; YouTube counts include Shorts feed views). TikTok, Snapchat, Threads, Mastodon, X, LinkedIn, Pinterest, Bluesky, Reddit, Tumblr and Pixelfed match the dashboard exactly.

Analytics coverage: per-post analytics exist for YouTube, TikTok, Instagram, Facebook, LinkedIn (Company Pages), Threads, Bluesky, Pinterest (business accounts), Snapchat, Mastodon, Pixelfed, Reddit and Tumblr (Pixelfed, Reddit, Tumblr, Bluesky and Mastodon report no view counts). X has analytics only when the workspace has added its own X API key in Settings > Integrations (X bills each post read to the user's X developer account); without one, X posts come back unavailable with that reason. Google Business Profile has profile-level stats only (no per-post numbers). Telegram and Discord have no analytics at all.

Freshness: if the workspace's analytics were last synced over an hour ago (or never), this call also starts a background sync and reports it in the response's sync field (status started or in_progress, plus last_synced_at). The numbers in that response are from the previous sync; call again in a few minutes for fresh ones. sync.status of free_plan_limit or daily_limit means no sync could run, so the numbers may not be current.

NameRequiredDescriptionDefault
video_upload_idYesThe video_uploads.id to summarize. Get it from list_video_uploads. Only meaningful once at least one platform sibling has been published.

TDQS

A4.4/5.0
Behavior5/5

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

Discloses significant behavior beyond the annotations: numbers come from a local cache, not a live fetch; a stale workspace triggers a background sync reported in the `sync` field with the returned numbers still being from the previous sync; and sync.status values free_plan_limit/daily_limit mean no sync ran. The readOnlyHint=false is consistent with this write side effect, and per-platform data availability limits (X API key requirement, Google Business Profile, Telegram/Discord) are spelled out.

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

Conciseness4/5

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

Purpose and return shape are front-loaded in the first sentence, and the labeled sections (Dashboard parity note, Analytics coverage, Freshness) make it scannable. It is nonetheless long, with a 13-platform enumeration that could be trimmed, costing it the top score.

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

Completeness5/5

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

No output schema exists, so the description carries the burden of return-value disclosure and does so by naming every returned metric plus the per-platform sibling rows and the `sync` field. For a tool with real data-reliability caveats, it covers source of truth, coverage gaps, and freshness handling.

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% for the single parameter, and the schema already documents both the list_video_uploads lookup and the 'published sibling' precondition. The description repeats that guidance without adding syntax, format, or edge-case detail beyond what the schema provides, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Returns aggregated analytics for a single video upload') plus the exact scope: per-platform sibling rows plus summed totals, with the metric list enumerated. An agent can distinguish this from get_post_analytics or get_workspace_analytics purely from the phrasing without opening a schema.

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

Usage Guidelines4/5

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

Explicitly routes the agent to list_video_uploads for the required id and names the precondition that a platform sibling must already be published. It does not explicitly contrast against siblings like get_post_analytics or explain_post_analytics_state, so the when-not 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.

get_workspace_analyticsGet workspace analyticsAInspect

Summarizes published-post analytics for a workspace over a rolling window: total posts, views, likes, comments, and shares, plus the same breakdown per platform. Numbers come from the cached per-post post_analytics table, NOT from live platform API calls. Filter to one platform by passing platform.

Freshness: if the workspace's analytics were last synced over an hour ago (or never), this call also starts a background sync and reports it in the response's sync field (status started or in_progress, plus last_synced_at). The numbers in that response are from the previous sync; call again in a few minutes for fresh ones. sync.status of free_plan_limit or daily_limit means no sync could run, so the numbers may not be current.

Analytics coverage: per-post analytics exist for YouTube, TikTok, Instagram, Facebook, LinkedIn (Company Pages), Threads, Bluesky, Pinterest (business accounts), Snapchat, Mastodon, Pixelfed, Reddit and Tumblr (Pixelfed, Reddit, Tumblr, Bluesky and Mastodon report no view counts). X has analytics only when the workspace has added its own X API key in Settings > Integrations (X bills each post read to the user's X developer account); without one, X posts come back unavailable with that reason. Google Business Profile has profile-level stats only (no per-post numbers). Telegram and Discord have no analytics at all.

Google Business Profile: posts always show 0 (Google has no per-post stats). When the workspace has a Google Business Profile connection, the response adds google_business_profile with profile views (Search + Maps impressions), website_clicks, call_clicks and direction_requests: window for the requested days (Google keeps ~30 days of daily data; window_fully_covered is false when the window starts earlier), last_30_days, and daily points. These profile stats are the Google Business numbers; the post totals stay at 0.

Dashboard parity note: numbers here match the ShortSync Overview dashboard exactly for TikTok, Snapchat, Threads, Mastodon, X, LinkedIn, Pinterest, Bluesky, Reddit, Tumblr and Pixelfed. For Instagram, Facebook, and YouTube the dashboard shows different (usually higher) numbers because it fetches account-level insights live from those three platforms, which count differently (Instagram video views include Reels impressions and reach; Facebook aggregates comments across the whole page; YouTube counts include Shorts feed views). This tool sums per-post cached metrics while the dashboard fetches account-level totals for those three platforms; get_post_analytics returns the numbers for a single post.

NameRequiredDescriptionDefault
daysNoLookback window in days, counting from now. Default 30, max 365. The window is based on the post's published_at.
platformNoRestrict to one platform (instagram, youtube, tiktok, etc.). Omit to summarize across all.
workspace_idYesWorkspace to summarize. Required — get one from list_workspaces.

TDQS

A4.4/5.0
Behavior5/5

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

Despite annotations covering safety, the description adds substantial behavioral context: data comes from cached post_analytics rather than live APIs, stale data may trigger a background sync, and freshness statuses like free_plan_limit and daily_limit affect whether numbers are current. It also documents platform-specific coverage gaps, X API key requirements, and Google Business Profile limitations.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and well structured into freshness, coverage, Google Business Profile, and dashboard parity sections. It is lengthy and has minor repetition, such as restating that Google Business Profile posts show 0, but the detail is largely justified by the tool's 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?

There is no output schema and annotations are minimal, so the description carries the full burden. It adequately explains the returned metrics, sync field behavior, platform-specific availability, Google Business Profile profile stats, and dashboard parity caveats.

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 days, platform, and workspace_id are already well documented in the schema. The description reinforces the platform filter and rolling-window concept but adds little parameter-specific meaning 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 clear verb and resource: summarizes published-post analytics for a workspace over a rolling window. It names the exact metrics and per-platform breakdown, and explicitly distinguishes itself from get_post_analytics for single-post numbers.

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

Usage Guidelines4/5

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

Gives clear context for filtering to one platform and points to get_post_analytics as the single-post alternative. It does not address other analytics siblings such as get_video_analytics or get_folder_analytics, so the when-to-use mapping is incomplete but still strong.

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

get_workspace_statusGet workspace statusA
Read-only
Inspect

Returns what needs attention in a workspace, in one call: connections that need the user to reconnect (with a reconnect_url to share) or are rate limited, posts that failed in the last 14 days with the reason, posts scheduled for the next 7 days grouped by upload, and the user's monthly upload quota. Good first call when the user asks how things are going, why something didn't post, or what's coming up. Without workspace_id it covers every workspace the user belongs to.

NameRequiredDescriptionDefault
workspace_idNoWorkspace to check. Leave out to check all of the user's workspaces.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already establish read-only and non-destructive, but the description adds the substantive behavioral detail they cannot: the 14-day failure lookback, the 7-day scheduling horizon, grouping of upcoming posts by upload, quota inclusion, and that reconnect entries carry a shareable reconnect_url. That is exactly the extra context an agent needs to interpret the response without an output schema.

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

Conciseness5/5

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

The highest-value content — what the call returns — leads, followed by usage triggers, then the scope caveat. Every clause maps to a distinct return element; nothing is filler or repeated from the schema.

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

Completeness5/5

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

With no output schema, the description carries the burden of describing return values, and it does so item by item, including the failure reason and reconnect_url. An agent knows what it will get, when to call it, and how scope widens when workspace_id is omitted.

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 parameter is fully documented, so the baseline is 3. The description's closing line about omitting workspace_id restates the schema's own note rather than adding new semantics such as ordering or pagination across multiple workspaces.

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 (returns workspace status) and then enumerates exactly what comes back: broken/rate-limited connections, failures from the last 14 days, the next 7 days of scheduled posts, and the monthly upload quota. This clearly differentiates it from narrow siblings like list_scheduled_posts or list_platform_connections by framing it as a single aggregated health view.

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 explicit trigger conditions — 'how things are going', 'why something didn't post', 'what's coming up' — and calls itself a 'good first call', which is a real routing signal. It does not name which sibling to use instead when the user wants, say, full post lists or analytics, so it stops short of full when-not guidance.

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

import_itemsImport contentAInspect

Imports items found with list_import_items into a workspace library (the per-call cap is max_per_import from the source list, usually 20; Canva and Descript cap at 10). Sources that render first (opusclip, klap, descript, canva mp4) can take up to 2.5 minutes. Pass container_id for sources with projects, and import options in options (e.g. { format: "landscape" } for twitch, { version: "captioned" } for heygen, { format: "mp4" } for canva). Returns per item: video_upload_id (pass to create_post_drafts or create_carousel), caption and title (use the title as the YouTube title; shorten the caption for X and Bluesky), or ok: false with an error. Items that fail don't stop the others.

NameRequiredDescriptionDefault
sourceYes
optionsNoImport options for the source.
item_idsYesItem ids from list_import_items, all from one container when the source has them.
container_idNoThe project id, for sources with projects.
workspace_idYesWorkspace to import into. Get it from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnly=false, destructive=false, openWorld=true) by disclosing the per-call cap (20, or 10 for Canva/Descript), that render-first sources can take up to 2.5 minutes, and that failures are partial ('Items that fail don't stop the others'). It also describes the per-item return shape (video_upload_id, caption, title, or ok:false with an error), which is exactly the behavior an agent needs before a slow mutation.

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

Conciseness4/5

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

Front-loaded with the core action, then caps, then options, then returns — a sensible order with no filler sentences. The nested parenthetical '(the per-call cap is max_per_import from the source list, usually 20; Canva and Descript cap at 10)' is information-dense but awkwardly embedded mid-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?

For a 6-parameter, nested-object, open-world mutation with no output schema, the definition covers caps, latency, partial-failure semantics, and return fields, which is close to sufficient. It omits any permission or connection prerequisite (e.g. whether the source account must be linked to the workspace) and whether the call blocks for the full 2.5 minutes.

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

Parameters4/5

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

With 83% schema coverage the schema already documents most fields, but the description adds real meaning the schema lacks: container_id's purpose for project-based sources and concrete `options` payloads per source ({ format: "landscape" } for twitch, { version: "captioned" } for heygen, { format: "mp4" } for canva) for an otherwise free-form additionalProperties object. It says nothing extra about workspace_id or idempotency_key, so 4 rather than 5.

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

Purpose5/5

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

States a specific verb and resource ('Imports items ... into a workspace library') and ties the input to a named producer ('items found with list_import_items'), which immediately separates it from upload tools like create_video_upload. An agent knows what entity it moves and where it lands 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 Guidelines4/5

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

Gives explicit routing context: call list_import_items first, pass container_id for sources with projects, and send create_post_drafts/create_carousel the returned video_upload_id, so downstream usage is clear. It never states a when-not condition and does not disambiguate against the overlapping sibling import_opusclip_clips, which keeps it from a 5.

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

import_opusclip_clipsImport OpusClip clipsAInspect

Deprecated: use import_items with source opusclip. Imports clips of one OpusClip project into a workspace library (up to 20 per call). OpusClip renders each clip first, so this takes 15-90 seconds. Returns per clip: video_upload_id (pass to create_post_drafts), caption (OpusClip's description and hashtags; pass it as the caption, shortening it for X and Bluesky) and title (OpusClip's short headline; use it as the YouTube title), or ok: false with an error. Clips that fail don't stop the others.

NameRequiredDescriptionDefault
org_idYesThe project's org_id from list_opusclip_projects.
clip_idsYesClip ids from list_opusclip_clips, all from this project.
project_idYesFrom list_opusclip_projects.
workspace_idYesWorkspace to import into. Get it from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only cover the safety profile (readOnly=false, destructive=false, openWorld=true); the description adds the traits that actually matter here: a 15-90 second latency window because OpusClip renders first, a 20-clip cap, and partial-failure semantics (failed clips don't abort the others). It doesn't discuss auth/permission requirements or whether partially imported batches can be retried safely without the idempotency key.

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 deprecation notice and the replacement tool are front-loaded in the first clause, followed by limits, latency, and return shape in descending order of decision value. Dense but no sentence is filler.

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

Completeness4/5

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

With no output schema, the description carries the return-shape burden and does so: per-clip video_upload_id, caption, title, or ok:false with an error, plus what to do with each downstream. It's nearly complete for a write tool; only permission/auth expectations are unstated.

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 every parameter is already documented in structured form, including idempotency_key's retry semantics. The description's added meaning is mostly about the return fields (video_upload_id, caption, title) rather than the inputs, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource with scope: imports clips of one OpusClip project into a workspace library, capped at 20 per call. It names the sibling superseding it (import_items with source opusclip), so an agent can distinguish the two without opening either schema.

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

Usage Guidelines5/5

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

Explicitly flags deprecation and names the replacement (import_items with source opusclip), which is the strongest possible routing guidance. It also gives the precondition (clip ids come from list_opusclip_clips, all from the same project) and the batch-size limit.

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

invite_workspace_memberInvite workspace memberAInspect

Invites someone by email to join a workspace as a team member, like the dashboard's "Invite member". ShortSync emails them a link (valid 7 days) and the tool returns invite_url too. This sends a real email, so confirm the address and role with the user first. Inviting needs a Team plan. Owners and admins can invite; only owners can invite admins or owners. Inviting an email that already has a pending invitation sends a fresh link. These are login members of the workspace, not the tagged people from list_workspace_people.

NameRequiredDescriptionDefault
roleNoRole they get on accepting. Default member. client is a restricted role for agency clients.
emailYesEmail address to invite.
workspace_idYesWorkspace to manage. Get from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

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, open-world, non-destructive write. The description adds substantial context beyond that: a real email is sent, the link is valid 7 days, invite_url is returned, plan gating applies, and re-inviting a pending address issues a fresh link.

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

Conciseness4/5

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

Front-loaded with the core action and the side-effect warning, then permissions and edge cases. Dense but nearly every sentence carries distinct information; the dashboard analogy is slightly redundant with the title but aids recognition.

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 write tool with no output schema, the description covers side effects, return value (invite_url), permission model, plan requirement, and idempotent retry behavior. An agent has everything needed to call 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?

Schema description coverage is 100%, so role enum, defaults, email, workspace_id sourcing, and idempotency_key semantics are already documented in the schema. The description only reinforces that role should be confirmed with the user, adding little beyond the structured fields.

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 ("Invites someone by email to join a workspace as a team member") and anchors it to a known UI action ("like the dashboard's 'Invite member'"). It also explicitly distinguishes itself from the similarly named sibling list_workspace_people by clarifying these are login members, not tagged people.

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 preconditions and exclusions: confirm address and role with the user first, requires a Team plan, owners/admins can invite but only owners can invite admins or owners. It also names the alternative concept (list_workspace_people) and the re-invite case, leaving little to inference.

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

like_conversationLike a commentAInspect

Sets the 'liked by us' state on a top-level comment thread (Instagram or Facebook). liked=true calls the platform's like endpoint and persists the state; liked=false unlikes. Only comment threads (thread_kind post_comments or video_comments) can be liked — DMs return an error. YouTube is not supported (the Data API v3 has no comment-like endpoint). The workspace's connection must hold the like scope (has_like_scope on list_inbox_connections). When it's missing the error includes a link for the user to open; don't retry until they have.

NameRequiredDescriptionDefault
likedYestrue to like, false to unlike.
workspace_idNoOptional. Auto-resolved from the conversation when omitted.
conversation_idYesThe dm_conversations.id to like/unlike. Get it from list_inbox_conversations.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare non-read-only, non-destructive, open-world; the description adds real behavior — liked=true hits the platform like endpoint and persists, liked=false unlikes, errors on DM threads, no YouTube support, and an auth-scope requirement surfaced via has_like_scope on list_inbox_connections. The retry warning after a missing-scope error is exactly the kind of operational context the annotations cannot carry.

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

Conciseness5/5

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

Four dense sentences, front-loaded with what the tool does, then platform/thread constraints, then the auth prerequisite. No filler and no repetition of the schema's optional-parameter text.

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 two-required-parameter mutation with no output schema, the definition covers what is mutated, which resource kinds are valid, which platforms are excluded, the auth prerequisite, and the retry policy. An agent can call it correctly and handle the main failure mode without extra lookups.

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 every parameter including the idempotency key and workspace auto-resolution is already documented in structured form. The description restates liked=true/false semantics rather than adding syntax or format detail beyond the schema, so the baseline 3 applies; the thread_kind constraint is useful but is not a parameter.

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

Purpose5/5

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

The first sentence names a specific verb and resource: setting the 'liked by us' state on a top-level comment thread, with the platforms scoped (Instagram or Facebook). It also carves out DMs and YouTube, which effectively separates it from the sibling like_message without ambiguity.

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

Usage Guidelines5/5

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

Explicit when/when-not guidance: only thread_kind post_comments or video_comments can be liked, DMs return an error, and YouTube is unsupported because Data API v3 lacks a like endpoint. It also states a prerequisite (like scope) and a behavioral rule (don't retry until the user opens the error link).

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

like_messageLike a comment replyAInspect

Sets the 'liked by us' state on a nested comment reply (a dm_messages row inside a comment thread on Instagram or Facebook). Same semantics as like_conversation but scoped to a reply row: liked=true likes on the platform + persists, liked=false unlikes. DMs and YouTube reply rows can't be liked (returns an error).

NameRequiredDescriptionDefault
likedYestrue to like, false to unlike.
message_idYesThe dm_messages.id to like/unlike. Get it from get_conversation_messages.
workspace_idNoOptional. Auto-resolved from the message when omitted.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, but the description adds real value beyond them: the write happens on the platform and persists, unlike is the inverse of like, and unsupported row types fail with an error rather than silently no-op. It does not cover permission requirements or rate limiting, so not a full 5.

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, zero waste: the resource and scope come first, the equivalence to like_conversation and boolean semantics second, the failure cases last. Every sentence carries information an agent needs.

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

Completeness4/5

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

For a mutation tool with no output schema, the description covers the write side effect, inverse behavior, scoping, and error conditions, while the schema fully documents all four params including idempotency. Remaining gaps are the response shape and auth/connection prerequisites, which are minor given the annotation coverage.

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 to the `liked` boolean by specifying that true likes on the platform and persists rather than toggling a local flag, and it clarifies the message_id must be a reply row rather than any dm_messages id.

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

Purpose5/5

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

States a specific verb+resource ('sets the liked state on a nested comment reply') and pins the exact data shape (a dm_messages row inside a comment thread on Instagram or Facebook). It also explicitly differentiates itself from the like_conversation sibling rather than leaving that to inference.

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

Usage Guidelines5/5

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

Names the alternative ('Same semantics as like_conversation but scoped to a reply row') and gives the selecting condition, plus a clear when-not: DM and YouTube reply rows can't be liked and return an error. An agent can route between like_conversation and like_message without opening either schema.

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

list_comment_dm_postsList posts for comment DMsA
Read-only
Inspect

Lists the connected Instagram account's 30 most recent posts, for post_id on a comment DM rule. Read live from Instagram.

NameRequiredDescriptionDefault
workspace_idYesWorkspace with the Instagram connection. Required. Get one from list_workspaces.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so safety is covered. The description adds real context beyond them: the result set is capped at the 30 most recent posts, it is scoped to the connected Instagram account, and it is fetched live from Instagram rather than cached — all of which affect expectations about freshness and completeness.

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?

One sentence, front-loaded with the verb and the resource, with the rule-related purpose and the live-read caveat following. The phrasing 'for post_id on a comment DM rule' is slightly compressed but nothing is wasted.

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 one-parameter read with no output schema, the description covers what is returned (30 most recent posts), whose account it comes from, and how fresh it is. The only mild gap is the absence of any note about what happens when the account has fewer than 30 posts or no Instagram connection.

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?

With a single parameter at 100% schema coverage, the schema already explains workspace_id and even points to list_workspaces. The description adds nothing about the parameter itself (the mention of post_id refers to the returned values, not the input), so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource (lists the connected Instagram account's 30 most recent posts) and ties the result to the post_id needed by a comment DM rule. It is clear on its own, though it never explicitly contrasts itself with nearby siblings such as list_comment_dm_rules or get_post_details.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: the phrase 'for post_id on a comment DM rule' suggests you call this when configuring a comment DM rule and need a post to target. There is no explicit when-not guidance and no named alternative for fetching post IDs or post details.

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

list_comment_dm_rulesList comment DM rulesA
Read-only
Inspect

Lists the workspace's Instagram comment DM rules (a keyword comment sends one private DM), with sent, failed and queued counts. Also says whether the plan includes comment DMs (access: included on Team, a paid add-on on Creator) and whether Instagram needs reconnecting (reconnect_reason). Instagram only.

NameRequiredDescriptionDefault
workspace_idYesWorkspace with the Instagram connection. Required. Get one from list_workspaces.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered; the description adds genuinely new behavioral context: the response carries sent/failed/queued counts, whether the plan includes comment DMs (Team included, paid add-on on Creator), and a reconnect_reason field for a broken Instagram connection. That is real payoff information an agent cannot get from the structured fields, especially since no output schema exists.

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?

Two tight sentences, front-loaded with what is listed before the supporting detail about access and reconnection. The trailing 'Instagram only.' fragment is slightly abrupt but earns its place as a hard scoping constraint; there is no 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, single-parameter listing tool with no output schema, the description covers what is returned, the account-type gating, and the failure mode (Instagram needing reconnection), which is close to everything an agent needs to call and interpret it. Only minor gaps remain, such as ordering or whether an empty list is distinguishable from an unconnected account.

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?

With a single parameter at 100% schema coverage, the schema already documents workspace_id as required and tells the caller to obtain one from list_workspaces. The description adds no additional meaning about the parameter (no format, no default, no alternate lookup), 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?

States a specific verb and resource ('Lists the workspace's Instagram comment DM rules') and then defines the domain concept inline ('a keyword comment sends one private DM'), which lets an agent distinguish this from create/update/delete_comment_dm_rule and from list_comment_dm_posts without opening any schema.

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

Usage Guidelines3/5

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

The 'Instagram only' constraint gives a clear applicability boundary, and the scope explanation implies this is the read/inspection entry point before creating or deleting rules. However, it never explicitly routes the agent away from the very similar sibling 'list_comment_dm_posts' or states when to use this versus those alternatives, leaving selection to inference.

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

list_conceptsList conceptsA
Read-only
Inspect

Lists content concepts (ideas/briefs) in a workspace's Concepts board (Library → Concepts), newest first. Returns each concept's id, title, status, notes, caption, per-platform captions, platforms, due date, the linked upload (once it has been turned into posts) and its attachments. Use the id with update_concept or create_post_drafts_from_concept. Requires Concepts to be turned on (Settings → Advanced).

NameRequiredDescriptionDefault
limitNoMaximum concepts to return (default 50, max 200).
statusNoOptional column filter: idea, draft, scheduled, published or archived.
workspace_idYesWorkspace whose concepts to list. Get from list_workspaces.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral context on top: result ordering, the feature-flag prerequisite that causes empty results, and the conditional nature of the linked upload field ("once it has been turned into posts").

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

Conciseness4/5

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

Front-loads purpose and location, then returns, then next steps and prerequisite — logical order with no filler. The field enumeration in the second sentence is long but earns its place because there is no output schema.

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

Completeness5/5

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

With no output schema, the description enumerates the returned fields, discloses the feature-gating prerequisite, and points at the tools that consume the returned ids. An agent has everything needed to decide to call it and to use the result.

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

Parameters3/5

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

Schema description coverage is 100% — limit (default 50, max 200), status enum values, and workspace_id sourcing from list_workspaces are all documented in the schema. The description adds no syntax or filtering nuance beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ("Lists content concepts (ideas/briefs)"), pins the location in the product UI (Library → Concepts), and specifies ordering (newest first). This clearly separates it from create_concept and update_concept in the sibling set.

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

Usage Guidelines4/5

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

Explicitly names the follow-up paths ("Use the id with update_concept or create_post_drafts_from_concept") and states the prerequisite ("Requires Concepts to be turned on (Settings → Advanced)"). It stops short of an explicit when-not-use/exclusion statement, so it lands just below the top band.

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

list_discord_channelsList Discord channelsA
Read-only
Inspect

Lists the Discord channels connected to a workspace (a workspace can have several under its one Discord connection). Use the returned ids as channelIds in update_post / batch_update_posts platform_settings for a Discord post; without channelIds the post goes to every channel with is_default: true. is_forum: true channels need a threadName (forum post title, max 100 characters; defaults to the caption's first line) and get the first comment as the first reply in that forum post; in text channels the first comment is a separate message right after the post. Channels are added in the ShortSync dashboard (Connections → Discord) or with the REST API's POST /v1/auth/discord/webhook; forum channels can only be added with a webhook URL, since Discord's authorize screen doesn't list them. Returns id, label, guild_id, guild_name, channel_id, is_default, is_forum, status (active or needs_reconnect), source and created_at per channel. Never returns webhook URLs.

NameRequiredDescriptionDefault
workspace_idYesWorkspace whose Discord channels to list. Get one from list_workspaces.

TDQS

A4.1/5.0
Behavior5/5

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

Beyond readOnlyHint, openWorldHint, and destructiveHint, the description discloses returned fields, status values (`active` or `needs_reconnect`), that webhook URLs are never returned, and forum-channel constraints including threadName defaults and comment-as-first-reply behavior. This is rich context that materially helps an agent interpret results and avoid misuse.

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

Conciseness4/5

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

The description is front-loaded with purpose and usage, then moves into forum behavior, channel-addition context, and return fields. Most sentences earn their place, but the channel-addition method sentence is slightly ancillary for invoking the tool.

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 carries the return-value burden by listing every returned field and status value. It also covers forum vs text comment behavior and the security-relevant note that webhook URLs are never returned, making it complete enough for correct invocation and interpretation.

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 `workspace_id` schema description already says to get one from list_workspaces. The description adds workspace-level context but no additional parameter syntax or meaning beyond the schema, so the baseline 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 a specific verb and resource: 'Lists the Discord channels connected to a workspace,' and clarifies the one-to-many workspace/Discord connection scope. It does not explicitly contrast with sibling tools such as list_platform_connections, so it falls short of full 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 Guidelines4/5

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

It gives clear context for use: the returned ids feed `channelIds` in update_post / batch_update_posts, and omitting `channelIds` targets every `is_default: true` channel. It also explains forum vs text comment handling, but does not name when to choose this tool over alternatives like list_platform_connections.

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

list_facebook_pagesList Facebook PagesA
Read-only
Inspect

Lists the Facebook Pages the user can post to with a Facebook login they already made in ShortSync (in this or any of their workspaces), and which Page this workspace posts as now. Use it to connect Facebook to another workspace or switch Pages without a new sign-in: pass a page id to select_facebook_page. When there is no Facebook login yet, the result includes a connect_url for the user to sign in to Facebook first.

NameRequiredDescriptionDefault
workspace_idYesWorkspace the Page is for. Get one from list_workspaces.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish readOnly=true, openWorld=true, and destructive=false, so the safety profile is clear. The description adds useful behavioral context about cross-workspace login reuse, current Page reporting, and conditional connect_url output, though it does not describe the page item shape in detail.

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 compact sentences, front-loaded with the core list operation. Each sentence adds distinct value: scope, usage/alternative, and the no-login fallback.

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 one-parameter read-only list tool with no output schema, the description covers the key operational context: whose Pages are listed, which Page is current, how to switch, and what happens without a Facebook login. Nothing essential for correct invocation 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%, and the single workspace_id parameter is fully documented in the schema, including how to obtain it from list_workspaces. The description does not add parameter-specific meaning 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?

The description states a specific verb and resource: it lists Facebook Pages the user can post to, plus the Page the current workspace posts as. It also distinguishes the tool from select_facebook_page, which is named as the follow-up action.

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: connecting Facebook to another workspace or switching Pages without a new sign-in. It routes the user to select_facebook_page for page selection and explains the no-login fallback via connect_url.

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

list_foldersList foldersA
Read-only
Inspect

Lists folders in a workspace, ordered alphabetically by name. Each row includes id, name, parent_id (null for top-level folders), position, and created_at. Folders can be nested up to 5 levels deep. Use this to resolve a folder_id before calling create_folder (as a parent), update_folder (to reparent), delete_folder, or move_video_to_folder.

NameRequiredDescriptionDefault
workspace_idYesWorkspace whose folders to list. Get it from list_workspaces. The user must be a member.

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 safety profile is covered; the description adds real context beyond that: return shape (id, name, parent_id, position, created_at), null semantics for top-level folders, and a hard nesting limit of 5 levels. The one meaningful gap is that it never says whether the result set is paginated or capped for large workspaces.

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 tightly packed sentences: purpose and ordering first, then return fields and the nesting constraint, then the usage routing. No filler, and the most decision-relevant content 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 usefully enumerates the returned fields and their null semantics, and gives an agent enough to call it correctly with the single required param. Missing only scale/pagination behavior, which matters for a listing tool in a workspace that could hold many folders.

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 the single workspace_id parameter is fully documented in the schema (including 'Get it from list_workspaces'). The description adds no parameter-level detail, so baseline 3 is appropriate — the schema does all the work here.

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

Purpose5/5

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

States a specific verb and resource ('Lists folders in a workspace') plus the ordering ('alphabetically by name'), which cleanly separates it from siblings like list_workspaces and list_concepts. An agent knows exactly what this returns without opening the schema.

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

Usage Guidelines5/5

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

Explicitly tells the agent when to reach for this tool: to resolve a folder_id before create_folder (as parent), update_folder (reparent), delete_folder, or move_video_to_folder. All four named siblings actually exist in the sibling list, so the routing advice is actionable rather than decorative.

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

list_import_itemsList importable contentA
Read-only
Inspect

Browses content the user can import from tools they connected in ShortSync (Settings > Integrations). Without source: lists the sources available to the user and whether each is connected. If one isn't, tell the user to connect it there. With source: lists its items (id, title, caption an import gets, duration_ms, created_at, plus source-specific fields). Sources with projects (has_containers) first return containers; pass one's id as container_id to list its items. Pass next_cursor back as cursor for more. Sources:

  • canva: The user's Canva designs, newest first; query searches titles. PNG imports one image per page (in order, ready for create_carousel); MP4 imports one video. The design title is the caption. Options: format (import): png|mp4, default png. png: one image per page. mp4: one video.

  • opusclip: Clips OpusClip cut from the user's long videos, with OpusClip's caption and hashtags. Projects first. Import takes 15-90 s while OpusClip renders.

  • klap: Clips Klap cut from the user's long videos, best first, with a caption Klap's AI writes at import. Projects first. Each import uses one export from the user's Klap plan and takes 20 s to 2.5 min.

  • twitch: Clips from the user's own Twitch channel, most viewed first. The clip title is the caption. Options: range (list): 7d|30d|365d|all, default all. Only clips made in the last 7d, 30d or 365d. format (import): portrait|landscape, default portrait. portrait falls back to landscape when Twitch has no portrait version.

  • heygen: Videos in the user's HeyGen account, newest first. Only status completed imports. The video title is the caption. Options: version (import): original|captioned, default original. captioned is HeyGen's version with burned-in captions, when it has one.

  • descript: Compositions in the user's Descript Drive (the one their token belongs to), imported as 1080p MP4. Projects first, most recently edited first. The composition name is the caption. Import takes up to 2.5 min while Descript renders; audio-only compositions can't be imported.

  • onedrive: Videos and images in the user's OneDrive. Pass a folder id as container_id to list inside it (root when omitted); items with type "folder" are subfolders, only type "file" imports. The file name is the caption.

  • box: Videos and images in the user's Box. Pass a folder id as container_id to list inside it (root when omitted); items with type "folder" are subfolders, only type "file" imports. The file name is the caption.

  • frameio: Videos and images in the user's Frame.io. Pass a folder id as container_id to list inside it (root when omitted); items with type "folder" are subfolders, only type "file" imports. The file name is the caption.

NameRequiredDescriptionDefault
queryNoSearch text, for sources that support it (canva).
cursorNonext_cursor from the previous page.
sourceNoOmit to list sources.
optionsNoList options for the source, e.g. { range: "30d" } for twitch.
container_idNoA project id from this tool's containers, or for onedrive and box a folder id (an item with type folder); the root when omitted.

TDQS

A4.7/5.0
Behavior5/5

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

The annotations already declare readOnlyHint, openWorldHint, and destructiveHint=false, but the description adds substantial behavior: connection prerequisites, pagination via next_cursor, container traversal for has_containers sources, and per-source item characteristics. It also covers source-specific defaults and constraints without contradicting the annotations.

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

Conciseness4/5

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

The description is front-loaded with general behavior before the source-specific bullets, and each source note carries practical detail. It is still lengthy and somewhat repetitive, such as repeated 'Projects first' phrasing, so it is comprehensive but not maximally concise.

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 complex nine-source listing tool with no output schema, the description covers connection state, pagination, container traversal, per-source item types, and option defaults. That is sufficient for an agent to call the tool correctly without needing additional structured return-value documentation.

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 adds meaningful semantics beyond the schema. It explains the source enum values, per-source options such as format, range, and version, container_id behavior for projects and folders, and how cursor maps to next_cursor.

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 ('Browses') and resource ('content the user can import') and explains both modes: omitting source lists connected sources, while supplying source lists that source's items. It clearly distinguishes listing from importing, so it is distinguishable from sibling tools such as import_items.

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 mode-selection guidance: omit source to discover sources, provide source to list items, and pass container_id for projects or folders. It also instructs the agent to tell users to connect unavailable sources in Settings > Integrations. It does not explicitly name import_items as the follow-up tool for importing selected items, so it falls short of a perfect 5.

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

list_inbox_connectionsList inbox connectionsA
Read-only
Inspect

Lists the workspace's platform connections that are wired into the DM inbox (Instagram, Facebook, YouTube, Threads, LinkedIn), with per-connection capability flags. Use this to answer 'which accounts can I reply to?' and to check whether a connection needs reconnecting before calling sync_inbox or reply_to_comment. Each row includes: has_comment_scope (can read + reply to post/video comments — always true for Threads once threads_manage_replies is granted; true for LinkedIn once w_member_social_feed / w_organization_social_feed are granted, though reading comments on LinkedIn also needs r_organization_social on org-context connections), has_messaging_scope (can also sync + reply to DMs — IG/FB only; YouTube, Threads, and LinkedIn have no DM concept), has_like_scope (can like/unlike comments — YouTube, Threads, and LinkedIn always false), and needs_reconnect (true when scopes are missing or the token has been marked as needing reconnect).

NameRequiredDescriptionDefault
workspace_idYesWorkspace whose inbox connections to list. Required — get one from list_workspaces.

TDQS

A4.1/5.0
Behavior5/5

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

Annotations only declare readOnly/non-destructive/openWorld=false; the description adds the substantive behavior an agent actually needs: per-platform capability matrix (Threads/LinkedIn comment scopes, IG/FB-only DMs, like-scope always false for three platforms) and the meaning of needs_reconnect (missing scopes or token flagged). This is exactly the context the annotations cannot carry.

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

Conciseness4/5

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

Purpose and usage are front-loaded in the first two sentences, then the row fields. The second sentence is a dense chain of nested parentheses that would scan better as a short list, but every clause carries platform-specific information an agent would otherwise have to guess.

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

Completeness5/5

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

There is no output schema, so the description does the work of documenting the returned row shape (has_comment_scope, has_messaging_scope, has_like_scope, needs_reconnect) in detail. Combined with the explicit downstream-tool gating, an agent has everything needed to call it and interpret results.

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?

Single parameter with 100% schema description coverage, including the 'get one from list_workspaces' hint already in the schema. The description adds no further meaning about workspace_id, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Lists the workspace's platform connections') and narrows scope to those 'wired into the DM inbox', listing the platforms covered. This scope language distinguishes it in substance from the sibling list_platform_connections, but that sibling is never named, so the differentiation is implicit rather than explicit.

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

Usage Guidelines4/5

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

Gives two concrete use cases ('which accounts can I reply to?' and pre-flight check before sync_inbox or reply_to_comment), naming the downstream tools it gates. It lacks an explicit 'do not use this for X, use list_platform_connections instead' exclusion, which is the one gap for this tool family.

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

list_inbox_conversationsList inbox conversationsA
Read-only
Inspect

Lists inbox conversation threads (post/video comments and DMs) in the given workspace, most recently active first. Returns id, platform, thread kind, participant, unread + like counts, spam/seen state, and a last-message preview. Supports the same filters as the inbox UI: platform, inbox_mode (all/comments/messages), sort (recent/most_liked/most_unread/oldest_unanswered), answered (all/unanswered/answered), free-text q search over participant + preview, unseen_only to hide already-seen rows, include_own to keep the workspace's own top-level comment threads (hidden by default because they need no action), and include_spam to include rows marked as spam. Pagination via limit + offset (next call: offset += returned count). Use this to find a conversation_id before calling reply_to_comment, like_conversation, mark_conversations_seen, or mark_conversations_spam.

NameRequiredDescriptionDefault
qNoFree-text search over participant_username and last_message_preview (case-insensitive substring match).
sortNo'recent' (default) sorts by last activity. 'most_liked' by like_count. 'most_unread' by unread_count. 'oldest_unanswered' by oldest inbound message time.
limitNoMax rows to return (default 20, max 100).
offsetNoRow offset for pagination. First page = 0; next page = previous offset + returned count.
answeredNo'all' (default), 'unanswered' (participant messaged after our last reply — needs attention), or 'answered'.
platformNoFilter by platform: instagram, facebook, youtube, threads, or linkedin. Omit to include all.
inbox_modeNo'all' (default) returns both DMs and comment threads. 'comments' returns only post/video comment threads. 'messages' returns only DM threads (IG/FB).
include_ownNoWhen true, also include the workspace's own top-level comment threads (default hides them because they need no reply).
unseen_onlyNoWhen true, hide rows the workspace has already seen (last_seen_at >= last_message_at).
include_spamNoWhen true, also include conversations the workspace has marked as spam (default hides them).
workspace_idYesWorkspace whose inbox to read. Required — get one from list_workspaces.
media_post_idNoRestrict to comment threads on a specific IG/FB post/reel id.
media_video_idNoRestrict to comment threads on a specific YouTube video id.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, non-destructive, closed-world), so the description doesn't need to restate it. Instead it adds genuinely non-obvious behavior: include_own is hidden by default 'because they need no action', spam rows are hidden by default, and unseen_only uses a last_seen_at >= last_message_at comparison. It also spells out the pagination protocol (offset += returned count), which is exactly the kind of operational detail annotations cannot convey.

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

Conciseness4/5

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

Front-loaded with purpose and return shape, then filters, then pagination mechanics, then the sibling hand-off — a logical order an agent can scan. It is dense but somewhat long, with a few clauses that duplicate what the schema already documents verbatim (limit/offset, q, sort).

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 13-parameter tool with no output schema, the description compensates by enumerating the returned fields (id, platform, thread kind, participant, unread/like counts, spam/seen state, preview) so an agent knows what it will get back. Combined with default-hiding behavior and pagination guidance, nothing essential for a correct first call is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns extra by explaining intent behind defaults rather than just restating them — e.g. why own top-level threads are suppressed and what 'unanswered' means in workflow terms. It remains largely a prose mirror of the schema for filters like platform and sort, which keeps it from a 5.

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

Purpose5/5

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

Opens with a specific verb and resource ('Lists inbox conversation threads') and immediately scopes what a thread is (post/video comments and DMs) plus the ordering ('most recently active first'). It distinguishes itself from get_conversation_messages by describing a filtered, paginated listing rather than a thread read, and enumerates the returned fields so an agent knows what the row contains.

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

Usage Guidelines4/5

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

Explicitly states the downstream use case: 'Use this to find a conversation_id before calling reply_to_comment, like_conversation, mark_conversations_seen, or mark_conversations_spam.' That is a strong when-to-use signal tied to real siblings. It stops short of naming when NOT to use it (e.g., use get_conversation_messages to read a thread's contents), so a 4 rather than a 5.

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

list_linkedin_authorsList LinkedIn authorsA
Read-only
Inspect

Lists who the workspace's LinkedIn posts can go out as: the person who connected LinkedIn, and the Company Pages they manage. Also returns the current choice. Pass an organization id to select_linkedin_author to post as that Page. Company Pages come from a cache; refresh: true asks LinkedIn again (at most once a minute and 10 times a day).

NameRequiredDescriptionDefault
refreshNoFetch the Company Pages from LinkedIn instead of the cache.
workspace_idYesWorkspace with LinkedIn connected. Get one from list_workspaces.

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 and openWorldHint=true, so safety is covered; the description adds non-obvious behavior — caching of Company Pages and concrete rate limits (at most once a minute, 10 times a day) — which directly affects how an agent should call it. It doesn't say what happens if the limit is exceeded or what permissions/connection state is required, so it isn't exhaustive.

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

Conciseness5/5

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

Three tight sentences: what it returns first, then the follow-up action, then the caching caveat with limits. No filler and nothing buried.

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

Completeness5/5

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

With no output schema, the description carries the return-value burden and does so — names the author types plus the current choice — and explains the cache/refresh behavior and the handoff to select_linkedin_author. Enough for an agent to call it and act on the result.

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

Parameters4/5

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

Schema coverage is 100%, so baseline would be 3, but the description adds real meaning beyond the schema: refresh triggers a live LinkedIn fetch with hard throttling, and organization ids are the handoff value for select_linkedin_author. This makes the refresh trade-off legible rather than just a boolean toggle.

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

Purpose5/5

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

States a specific verb and resource ('Lists who the workspace's LinkedIn posts can go out as') and enumerates the two things returned: the connecting person and the Company Pages they manage, plus the current selection. An agent can distinguish this from list_organizations or list_platform_connections without opening any schema.

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

Usage Guidelines4/5

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

Explicitly routes the next step: 'Pass an organization id to select_linkedin_author to post as that Page,' and explains when to use refresh: true versus the cache. It doesn't cover when to prefer this over other listing tools (e.g. list_organizations), so it stops short of full when/when-not guidance.

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

list_opusclip_clipsList OpusClip clipsA
Read-only
Inspect

Deprecated: use list_import_items with source opusclip. Lists the clips OpusClip made in one project: id (pass to import_opusclip_clips), title, duration_ms and the caption an import gets (OpusClip's description plus hashtags). Get project_id and org_id from list_opusclip_projects.

NameRequiredDescriptionDefault
org_idYesThe project's org_id from list_opusclip_projects.
project_idYesFrom list_opusclip_projects.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover readOnly/openWorld/non-destructive, so the safety profile is free. The description adds value the annotations do not: it spells out the returned fields and clarifies that the caption is OpusClip's description plus hashtags, which affects how an import will look. It does not mention pagination or result limits, which keeps it short of a 5.

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

Conciseness5/5

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

Two sentences, deprecation notice front-loaded so it is the first thing read. Every clause carries information: replacement target, return fields, caption composition, and ID provenance.

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

Completeness4/5

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

There is no output schema, and the description compensates by listing the returned fields and explaining the caption's composition. For a deprecated read tool with full schema coverage, that is close to complete; only result volume/pagination behavior is unaddressed.

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 parameter descriptions already say 'from list_opusclip_projects'. The description restates this sourcing hint, adding only slight reinforcement rather than new meaning, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource with scope: 'Lists the clips OpusClip made in one project', and enumerates the returned fields. It also names the replacement tool and the downstream tool (import_opusclip_clips), so an agent can place it precisely among the sibling list_* and import_* 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?

Explicitly tells the agent not to use it ('Deprecated: use list_import_items with source opusclip') and names the exact alternative plus the argument variant. It also explains prerequisites: get project_id and org_id from list_opusclip_projects.

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

list_opusclip_projectsList OpusClip projectsA
Read-only
Inspect

Deprecated: use list_import_items with source opusclip. Lists the user's OpusClip projects (long videos OpusClip cut into short clips), newest first, 24 per page. Each project has project_id, org_id (pass both to list_opusclip_clips and import_opusclip_clips), title, clip_count, stage (COMPLETE once the clips are ready) and created_at. Needs the user's OpusClip API key saved in ShortSync under Settings > Integrations (OpusClip Pro plan or higher); if it isn't, tell the user to add it there.

NameRequiredDescriptionDefault
pageNo0-based page number. Defaults to 0.

TDQS

A4.7/5.0
Behavior4/5

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

Beyond the annotations, the description discloses ordering, page size, key returned fields, the meaning of stage=COMPLETE, and the API-key prerequisite. That is strong behavioral context, though it does not cover rate limits or error behavior.

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

Conciseness5/5

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

The deprecation warning is front-loaded, followed by purpose, return shape, and prerequisite. The prose is dense but well organized, and every sentence contributes useful selection or setup information.

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

Completeness5/5

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

With no output schema, the description compensates by listing the important returned fields and their relevance. It also covers pagination, ordering, deprecation, and the API-key prerequisite, so an agent has enough information to invoke it correctly or redirect.

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

Parameters4/5

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

The schema already documents the single page parameter at 100% coverage. The description adds useful meaning by stating that results are returned 24 per page, which clarifies the unit of the page parameter beyond the schema.

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

Purpose5/5

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

The description gives a specific verb and resource ('Lists the user's OpusClip projects'), clarifies what those projects are, and immediately routes agents away from this deprecated tool to list_import_items with source opusclip. It also names the related clip tools, so it is clearly distinguishable from siblings.

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 marks the tool as deprecated and names the replacement tool plus the required source value. It also states the prerequisite that the user's OpusClip API key must be saved under Settings > Integrations and says what to tell the user if it is missing.

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

list_organizationsList organizationsA
Read-only
Inspect

Lists organizations the authenticated user is a member of, including their role in each (owner, admin, member). Use this to help the user choose which organization to operate on or to answer questions about the teams they belong to.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered upstream. The description adds useful disclosure of what comes back (membership plus role: owner, admin, member), but says nothing about ordering, result size, or behavior when the user belongs to a single organization.

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

Conciseness5/5

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

Two sentences, front-loaded with the operation and scope, then the usage guidance. No filler or restatement of the title.

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

Completeness4/5

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

With zero parameters and no output schema, the description still conveys the shape of the result (organizations plus the caller's role), which is the main thing an agent needs. It leaves minor gaps around ordering and pagination, but nothing that would block a correct call.

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

Parameters4/5

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

The tool takes no parameters and schema coverage is 100%, so there is nothing for the description to disambiguate. Baseline applies; the mention of the 'role' field is a small extra since no output schema exists.

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

Purpose4/5

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

States a specific verb and resource ('Lists organizations') plus the scope constraint ('the authenticated user is a member of') and the returned field (role). It does not explicitly contrast with the adjacent list_workspaces / list_workspace_people siblings, which an agent might confuse for the same hierarchy level.

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 two concrete situations to invoke it: choosing which organization to operate on, and answering questions about team membership. It stops short of exclusions or pointing at alternatives such as list_workspaces when the caller actually needs workspaces.

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

list_pinterest_boardsList Pinterest boardsA
Read-only
Inspect

Lists the boards on the Pinterest account connected to a workspace. Use this to find the boardId (and boardName) to pass in update_post / batch_update_posts platform_settings for a Pinterest post — a board is required for Pinterest publishing. Returns id, name, description, and privacy per board.

NameRequiredDescriptionDefault
workspace_idYesWorkspace whose Pinterest connection to use. Get one from list_workspaces.

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, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavior context by enumerating the returned fields (id, name, description, privacy) and tying the result to the workspace's Pinterest connection — useful since there is no output schema. It stops short of noting failure modes such as a missing/disconnected Pinterest account.

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, front-loaded with the action, then purpose, then return shape. Every sentence carries distinct information; nothing repeats the name or annotations.

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 one-parameter read tool with no output schema, the description covers what it lists, why an agent would call it, where the workspace ID comes from (via schema), and what is returned. An agent can call it correctly without further inference.

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?

With a single parameter at 100% schema coverage, the schema already documents `workspace_id` and even points to list_workspaces. The description adds no new syntax or constraints about that parameter, 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?

States a specific verb and resource ('Lists the boards on the Pinterest account connected to a workspace'), with the scope narrowed to the workspace's connection. It is clearly distinguishable from sibling listing tools like list_platform_connections or list_workspaces.

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

Usage Guidelines5/5

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

Explicitly says when to use it: to obtain the `boardId`/`boardName` needed for update_post / batch_update_posts platform_settings, and notes that a board is mandatory for Pinterest publishing. It names the downstream tools that consume the result, which is the key routing decision an agent faces.

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

list_platform_connectionsList connected platformsA
Read-only
Inspect

Lists the platform connections (YouTube, Instagram, TikTok, X, etc.) attached to a workspace, with the connected username, health status, and capability flags. Use this before create_post_draft or publish_now to see which platforms the user can actually post to. Per connection you get: health ('healthy' | 'needs_reconnect' | 'rate_limited' | 'disconnected') as a one-shot state signal ('disconnected' means the user disconnected it and the app shows it as not connected; get_connect_link connects it again), can_publish (true when the token can accept new posts), can_sync_analytics (true only when the platform is supported by the analytics pipeline AND the connection is healthy; Telegram and Discord always return false because they have no analytics. X returns true but only syncs stats once the workspace has added its own X API key in Settings > Integrations, and Google Business Profile syncs profile-level stats only), and the raw isActive + connection_status fields for reference. Instagram connections also return music_via_facebook: true when the user linked Facebook to unlock Instagram's music library (not a separate platform). Google Business Profile connections also return locations (id, title, address, can_post, is_default): one Google login can manage several business locations, and these ids go in platform_settings.locationIds via update_post. When health is 'needs_reconnect', the user must sign in to the platform again (publishing or syncing will fail until then): those connections include a reconnect_url to share with the user. To connect a platform that isn't listed, call get_connect_link.

NameRequiredDescriptionDefault
workspace_idYesWorkspace whose connections to list. Get one from list_workspaces.

TDQS

A4.4/5.0
Behavior4/5

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

With readOnlyHint=true already declaring safety, the description still adds substantial behavior: the four health states and their meaning, that reconnect_url is included when needs_reconnect, and platform-specific quirks (Telegram/Discord never sync analytics, X requires a workspace API key, Instagram's music_via_facebook, GBP locations). It stops short of stating ordering/pagination or empty-workspace behavior, so not a 5.

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

Conciseness4/5

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

Front-loaded correctly: purpose and when-to-use come first, per-field semantics after. It is dense — a single long paragraph packing several platform-specific exceptions — but nearly every clause carries decision-relevant information rather than 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?

No output schema exists, so the description carries the full burden of explaining return values, and it does: health enum semantics, can_publish, can_sync_analytics caveats per platform, isActive/connection_status, music_via_facebook, locations, and reconnect_url. An agent can interpret the response and act on it without further tools.

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?

Only one parameter and schema coverage is 100%; the schema already explains workspace_id and points to list_workspaces. The description adds no further guidance on that parameter, which matches the baseline-3 expectation when the schema does the work.

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

Purpose5/5

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

States a specific verb and resource ('Lists the platform connections ... attached to a workspace') and immediately enumerates what comes back (username, health status, capability flags). It is clearly distinguishable from siblings like list_workspaces, list_facebook_pages, or get_connect_link.

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

Usage Guidelines5/5

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

Gives an explicit trigger ('Use this before create_post_draft or publish_now to see which platforms the user can actually post to') and routes two edge cases to alternatives: get_connect_link for unlisted platforms and for 'disconnected' connections. When-not/how-to-remediate is covered.

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

list_repurposing_workflow_postsList repurposing workflow postsA
Read-only
Inspect

Lists the posts a Repurposing workflow picked up, newest first. Each entry has its status (scheduled, posted, drafted, skipped, failed, processing), the source post (platform, post_id, permalink), the caption, upload_id (the repost in the library, usable with get_post_details and the post tools), and posts: one per target platform with its post id, status, public url, scheduled_for and published_at. Skipped entries carry the reason in error. Paginate with the returned next_cursor. To stop an upcoming repost, use cancel_repurposing_workflow_post; to move it, use the normal scheduling tools on its post ids.

NameRequiredDescriptionDefault
limitNoOptional page size, 1 to 100. Default 25.
cursorNoOptional: next_cursor from the previous page.
statusNoOptional: only entries with this status.
workflow_idYesThe workflow. Get it from list_repurposing_workflows.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the readOnly annotations: enumerates the per-entry fields (status, source post, caption, upload_id, per-platform posts), explains that upload_id is usable with get_post_details, notes that skipped entries carry a reason in error, and states the pagination contract with next_cursor. This is substantive behavioral context an agent cannot infer from annotations.

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

Conciseness4/5

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

Front-loads the core purpose and ordering, then the return shape, then routing to alternatives — no filler sentences. The middle sentence enumerating all return fields is dense, but each element serves an agent's need.

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

Completeness5/5

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

No output schema exists, so the description must carry the return contract — and it does, naming every per-entry field, the status vocabulary, the error field for skipped entries, and the cursor mechanism. Nothing an agent needs to call and consume this tool is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so parameters like limit, cursor, and status enum are already fully documented. The description only adds the pagination hint ('Paginate with the returned next_cursor') and the semantics of the returned statuses, not new syntax or constraints. 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?

Opens with a specific verb and resource ('Lists the posts a Repurposing workflow picked up') and adds ordering ('newest first'). It is clearly distinct from list_repurposing_workflows (workflows) and list_scheduled_posts (scheduled posts).

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

Usage Guidelines4/5

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

Explicitly routes follow-up actions: use cancel_repurposing_workflow_post to stop a repost, and the normal scheduling tools to move one. The schema also points to list_repurposing_workflows for the workflow_id. No explicit 'don't use this when' exclusion, so not a full 5.

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

list_repurposing_workflowsList repurposing workflowsA
Read-only
Inspect

Lists a workspace's Repurposing workflows. A workflow reposts posts from a source to other connected accounts (target_connection_ids). source_type is 'platform_connection' (an Instagram or Facebook Page account, source_connection_id) or 'twitch' (clips from the creator's Twitch channel; source_account has the channel, source_connection_id is null). kind 'new_posts' reposts each new post automatically (publish_mode 'immediate' or 'draft'); kind 'existing' works through older posts on a weekly timetable (schedule_slots + timezone), scheduling them into the library up to 30 days ahead. Returns each workflow's settings, status (running, paused or finished), last_synced_at, last_error and, for scheduled workflows, queue { scheduled_count, waiting_count }. Use list_repurposing_workflow_posts for what a workflow has reposted or scheduled.

NameRequiredDescriptionDefault
workspace_idYesWorkspace whose workflows to list. Get one from list_workspaces.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare this as a safe read, and the description adds substantial behavioral detail: returned fields, status values, last_error, queue counts, scheduling horizon, and source/publish semantics. 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.

Conciseness4/5

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

Front-loaded with the purpose, then structured into source_type, kind, return values, and sibling guidance. It is information-dense and long for a list tool, but most sentences earn their place by compensating for the missing output schema.

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

Completeness5/5

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

Given one parameter, no output schema, and a domain-specific resource, the description is complete. It explains the workflow model, returned fields, status meanings, queue data, and where to look for reposted items.

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 fully documents workspace_id and points to list_workspaces, so the high schema coverage sets a baseline of 3. The description does not add meaning beyond the schema for the sole parameter.

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

Purpose5/5

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

States a specific verb and resource ('Lists a workspace's Repurposing workflows') and distinguishes it from list_repurposing_workflow_posts. The domain explanation makes the resource unambiguous without needing 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 Guidelines4/5

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

Explicitly points to list_repurposing_workflow_posts for reposted or scheduled items, which is a clear alternative. It does not explicitly state when not to use this tool versus create/update/delete siblings, but the listing purpose is clear.

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

list_saved_repliesList saved repliesA
Read-only
Inspect

Lists the workspace's saved replies for the inbox: reusable reply text the team has written, each with a name and content. Check this before drafting a reply to a comment or DM, and use a saved reply when one fits, adapted to the message. Listing sends nothing; to answer a thread, pass the final text to reply_to_comment.

NameRequiredDescriptionDefault
workspace_idYesWorkspace whose saved replies to list. Required. Get one from list_workspaces.

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, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description still adds useful reinforcement that "Listing sends nothing" — a real concern an agent might have when a listing is one step from replying — and discloses the returned fields (name and content) despite there being no output schema. It stops short of stating pagination or result-count behavior, which keeps it from a 5.

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

Conciseness5/5

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

Three short sentences, front-loaded with purpose, then the usage trigger, then the hand-off to reply_to_comment. Every sentence carries distinct information — definition, when to consult, and what to do next — with no restated title 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?

For a single-parameter read tool with no output schema, the description covers what it does, what it returns at a field level, the fact it has no side effects, and where the result flows next. Nothing an agent needs in order to call it correctly is missing.

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

Parameters3/5

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

There is a single parameter with 100% schema description coverage, and the schema already says workspace_id is required and points to list_workspaces. The description adds no further meaning about that parameter, so the baseline 3 for fully documented schemas applies.

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

Purpose5/5

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

States a specific verb and resource ("Lists the workspace's saved replies for the inbox") and immediately defines the domain concept as "reusable reply text the team has written, each with a name and content." That definition separates it cleanly from nearby siblings like list_comment_dm_rules or list_inbox_conversations without the agent needing to open any schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use trigger ("Check this before drafting a reply to a comment or DM") plus the action rule ("use a saved reply when one fits, adapted to the message"). It also names the correct downstream tool for the actual send ("pass the final text to reply_to_comment"), which is genuine alternative/replacement guidance.

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

list_scheduled_postsList scheduled postsA
Read-only
Inspect

Lists posts across the user's workspaces, defaulting to upcoming scheduled posts, soonest first. Pass status to filter by a different state, e.g. 'failed' to find posts that didn't publish, and platform to filter to one platform. Each post has id, workspace_id, platform, status, scheduled_for, video_upload_id, content_type (video, image, text or carousel), caption_preview (first line of the caption that platform posts) and, for failed posts, error_message and error_code. A failed post with duplicate_of wasn't a real failure: it was stopped because that post already went out, so don't retry it. A failed post with skipped_at_daily_limit wasn't a real failure either: a recurring occurrence had no room before its next repeat, and the series carries on. A post with moved_past_limit went past a platform's daily limit and moved to its scheduled_for on its own. Results come in pages: while next_cursor isn't null there are more posts, so call again with the same filters and cursor set to it. One upload posted to several platforms is one post per platform; pass group_by_upload: true to get one entry per upload and time with its platforms listed. Filter to one workspace by passing workspace_id; without it, all workspaces the user belongs to are searched.

NameRequiredDescriptionDefault
limitNoMaximum number of posts to return (default 20, max 100).
cursorNo`next_cursor` from the previous page. Keep the other parameters the same.
statusNoPost status to filter by: 'scheduled' (default), 'failed', 'draft', 'published', or 'ready'.
platformNoOnly posts for this platform, e.g. 'instagram' or 'snapchat'.
workspace_idNoRestrict results to one workspace. Use list_workspaces to discover valid ids.
group_by_uploadNoReturn `groups` instead of `posts`: one entry per upload and scheduled time, with the caption preview, content_type and each platform's post id and status. `limit` still counts posts, so an upload at the end of a page can continue on the next page as a second entry with the same video_upload_id and scheduled_for.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important behavioral details: default ordering, returned fields, pagination via `next_cursor`, grouping semantics, and special meanings for failed posts such as `duplicate_of`, `skipped_at_daily_limit`, and `moved_past_limit`. This is unusually transparent for a read-only listing tool and does not contradict 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?

Although long, the description is front-loaded and organized around concrete tasks: default behavior, filters, returned fields, failure semantics, pagination, grouping, and workspace scope. Every section adds operational value, and there is no filler or repetition.

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

Completeness5/5

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

For a read-only, six-parameter listing tool with no output schema, the description is complete: it explains the returned post fields, pagination behavior, grouping behavior, and non-obvious failure states. An agent has enough information to call it correctly and interpret the results.

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

Parameters4/5

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

Schema coverage is already 100%, so the schema documents all six parameters. The description still adds useful meaning beyond the schema, especially for `status` examples, the `group_by_upload` edge case, pagination with the same filters, and workspace scoping, though it adds little for `limit` and `cursor` beyond what the schema states.

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 gives a specific verb and resource: it lists posts across the user's workspaces, defaults to upcoming scheduled posts, and orders them soonest first. The scope and default behavior are unambiguous, though it does not explicitly name sibling alternatives such as get_post_details or list_video_uploads to route between them.

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

Usage Guidelines4/5

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

The description provides clear usage context: use the default for upcoming scheduled posts, pass `status` for other states such as 'failed', use `platform` to narrow by platform, and use `workspace_id` to restrict to one workspace. It gives practical when-to-use examples but does not explicitly exclude or compare this tool against sibling tools.

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

list_video_uploadsList uploadsA
Read-only
Inspect

Lists the user's uploads across accessible workspaces, most recent first. Returns id, workspace_id, filename, content_type (video, image, text, or carousel), folder_id, and created_at. Carousels also have carousel_items: each image or video in order, with its video_upload_id, original filename, content_type and 0-based position. Those items are uploads too, so they also appear in the list on their own. Pass content_type: 'carousel' to list only carousels. Results come in pages: while next_cursor isn't null there are more uploads, so call again with the same filters and cursor set to it. Use this to find a video_upload_id before calling create_post_draft or a scheduling tool.

NameRequiredDescriptionDefault
limitNoMaximum number of uploads to return (default 20, max 100).
cursorNo`next_cursor` from the previous page. Keep the other parameters the same.
content_typeNoOnly uploads of this type: video, image, text or carousel.
workspace_idNoRestrict results to a single workspace. Omit to include uploads from every workspace the user belongs to.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and non-destructive, and the description goes well beyond them: it discloses sort order (most recent first), cross-workspace default scope, the exact pagination contract (loop while next_cursor is non-null, reuse the same filters), and a subtle non-obvious trait — carousel sub-items are themselves uploads and therefore appear again as standalone list entries.

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

Conciseness4/5

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

Front-loaded with purpose, then returns, then carousel nuance, then pagination, then the recommended next step — a sensible order with no filler. It is on the denser side, but nearly every clause carries usable information.

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

Completeness5/5

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

With no output schema, the description compensates by enumerating returned fields and the nested carousel_items structure, and it fully specifies the pagination loop. For a read-only, four-optional-parameter list tool, nothing an agent needs to call it 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.

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 still adds operational meaning, showing how content_type 'carousel' should be used and that cursor paging requires keeping other filters identical. It adds less for limit and workspace_id, which the schema already explains.

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 ('Lists the user's uploads across accessible workspaces, most recent first') and immediately names the returned fields, so an agent can distinguish it from creation tools like create_video_upload or list_folders 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 Guidelines4/5

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

It gives a concrete triggering scenario — 'Use this to find a video_upload_id before calling create_post_draft or a scheduling tool' — and explains how to filter to carousels only. It does not state when to prefer a sibling listing tool (e.g., list_folders, list_import_items) or note any exclusions, so it falls short of full when/when-not guidance.

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

list_workspace_invitationsList workspace invitationsA
Read-only
Inspect

Lists the pending, unexpired email invitations to join a workspace (id, email, role, expires_at). Owners and admins only. Use the id with revoke_workspace_invitation.

NameRequiredDescriptionDefault
workspace_idYesWorkspace to manage. Get from list_workspaces.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered structurally. The description adds real context beyond that: the owners/admins authorization requirement and the fact that only pending, unexpired invitations are returned. It says nothing about ordering, pagination, or empty-result behavior, so it is good but not rich.

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 short sentences, front-loaded with what is listed and immediately followed by the authorization gate and next-step pointer. Every sentence carries information, with no redundancy.

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 single-parameter read tool with no output schema, the description covers the return fields inline (id, email, role, expires_at), the permission requirement, and the downstream tool. An agent has everything needed to invoke and interpret it.

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?

There is one parameter with 100% schema coverage, and the schema already tells the agent to get workspace_id from list_workspaces. The description adds no syntax or format detail beyond that, 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?

The description names a specific verb and resource ('Lists ... email invitations to join a workspace') and narrows the scope to pending, unexpired invitations. It also enumerates returned fields, which clearly separates it from siblings like list_workspace_members and list_workspace_people.

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 states an explicit permission gate ('Owners and admins only') and points to the follow-up action ('Use the id with revoke_workspace_invitation'). It does not explicitly contrast with list_workspace_members/list_workspace_people, but the pending-invitation framing makes the boundary implicit.

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

list_workspace_membersList workspace membersA
Read-only
Inspect

Lists the team members of a workspace: the people who can log in to it, with user_id, email, name and role (owner, admin, member or client), owner first. Any member can call it. These are login members of the workspace, not the tagged people from list_workspace_people. Use the user_id with update_workspace_member_role or remove_workspace_member.

NameRequiredDescriptionDefault
workspace_idYesWorkspace to manage. Get from list_workspaces.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description goes well beyond them: it discloses the permission model, the exact returned field set and role vocabulary, and the 'owner first' ordering. That ordering and cardinality behavior is not derivable from the schema or 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 tight sentences, front-loaded with the definition, then the disambiguation, then the follow-up routing. No filler, and nothing is repeated from the schema or annotations.

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 a single required parameter, no output schema, and annotations covering the safety profile, the description fills the remaining gaps by documenting the return shape and ordering in prose. Nothing an agent needs to select or 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?

There is only one parameter and schema coverage is 100% (workspace_id is described with its provenance in list_workspaces), so the schema does the work and the 3 baseline applies. The description clarifies the returned user_id but adds nothing about workspace_id semantics or format.

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

Purpose5/5

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

States a specific verb and resource ('Lists the team members of a workspace') and immediately qualifies the scope: login members, not tagged people. It enumerates the returned fields (user_id, email, name, role) and explicitly names the sibling it is not (list_workspace_people), so an agent can distinguish it without opening any schema.

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

Usage Guidelines5/5

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

Gives the eligibility condition ('Any member can call it'), an explicit exclusion versus list_workspace_people, and names the downstream tools the returned user_id feeds into (update_workspace_member_role, remove_workspace_member). The when-to-use and when-not-to-use cases are both covered.

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

list_workspace_peopleList workspace peopleA
Read-only
Inspect

Lists the workspace's @mention roster — the people (podcast guests, partners, teammates) that can be tagged in captions across LinkedIn, Facebook, YouTube, Instagram, TikTok, X, Threads, Bluesky, Pinterest, and Mastodon. Each entry carries per-platform handles and, for LinkedIn, the resolved URN. Use before upsert_workspace_person so you can check whether a person already exists and only patch missing handles.

NameRequiredDescriptionDefault
workspace_idYesWorkspace to list people from. Get from list_workspaces. The user must be a member.

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, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds useful behavioral context: the roster scope across ten platforms, per-platform handles, and the resolved LinkedIn URN. It does not discuss pagination or auth beyond membership, but with annotations that is a minor gap.

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?

Two sentences, front-loaded with what the tool returns and followed by usage guidance. The platform enumeration is somewhat long but earns its place by clarifying mention coverage across networks.

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 supplies the essential return context (roster entries, handles, LinkedIn URN). Combined with a fully documented single parameter and annotations covering safety, an agent has everything needed to call it correctly.

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

Parameters3/5

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

There is one parameter and schema description coverage is 100%, including how to obtain the workspace_id and the membership requirement. The description adds no additional parameter semantics beyond the schema, so the baseline of 3 applies.

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

Purpose5/5

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

The description names a specific verb ('Lists') and resource ('workspace's @mention roster') and explains what the roster contains (tagable people with per-platform handles). It is readily distinguishable from siblings such as upsert_workspace_person and resolve_linkedin_mention.

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 names the sibling to use before (upsert_workspace_person) and the reason: to check whether a person exists and only patch missing handles. That is a concrete when-to-use condition rather than implied guidance.

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

list_workspacesList workspacesA
Read-only
Inspect

Lists workspaces the authenticated user is a member of, with their role in each. Each workspace groups a set of platform connections (YouTube, Instagram, TikTok, X, etc.) and the posts published from them. Use this to resolve a workspace_id before calling other tools that need one.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, non-destructive, closed-world, so the safety profile needs no restating. The description adds non-obvious behavior: results are scoped to the caller's memberships and include the caller's role per workspace, which matters when picking the right workspace. No pagination or ordering behavior is disclosed.

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

Conciseness5/5

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

Two sentences, front-loaded with what is returned, then what a workspace is, then the usage trigger. No filler or restatement of the title.

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

Completeness4/5

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

With no output schema, the description carries the burden of saying what comes back, and it does: workspaces plus the user's role, and implicitly their IDs via the workspace_id reference. It could name other returned fields (name, connection count) but is sufficient for an agent to call it and use the result.

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?

Zero parameters, so there is nothing to disambiguate and the baseline is 4. The description correctly signals that the call takes no arguments and that the useful output key is workspace_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?

Specific verb+resource: lists workspaces, scoped to those the authenticated user is a member of, and states the returned attribute (role). It also explains what a workspace contains, distinguishing it from sibling list tools like list_organizations or list_platform_connections.

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?

"Use this to resolve a workspace_id before calling other tools that need one" gives an explicit trigger and sequencing hint, which is exactly what an agent needs for an ID-resolver tool. It does not explicitly exclude or compare against list_organizations / list_workspace_people, so it stops short of the 5 bar.

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

load_more_commentsLoad more commentsAInspect

Fetches one more page of older comments for a specific YouTube video, Instagram post/reel, or Facebook post, and upserts them into the inbox. The workspace's per-media cursor advances server-side so consecutive calls walk further back through the comment history. Set force=true to ignore the stored cursor and pull the newest page instead (use when the user asks for the latest comments on a video, so comments posted after last pagination aren't skipped). Returns new_count, total_conversations_returned, and exhausted (true when there are no more pages). Hits the platform APIs, so it counts against rate limits.

NameRequiredDescriptionDefault
forceNoWhen true, ignore the stored cursor + exhaustion flag and fetch the newest page. Use when the user wants the latest comments — comment platforms paginate newest→oldest, so normal load-more never catches new comments.
platformYesinstagram, facebook, or youtube.
workspace_idYesWorkspace whose inbox to extend. Required — get one from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
media_source_idYesThe platform-side id of the video or post to paginate. YouTube: video id. Instagram: media (post/reel) id. Facebook: post id. Get it from list_inbox_conversations (platform_metadata.video_id or post_id).

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, openWorldHint=true) it discloses that this is a write/upsert, that the cursor advances server-side and thus calls are stateful, that it hits platform APIs and counts against rate limits, and it names the returned fields. That is materially more than the structured fields convey.

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 action and platform scope, then the force escape hatch, then return shape, then rate-limit caveat. Dense but every sentence carries a distinct operational fact; the return-value sentence is slightly long given no output schema exists to lean on.

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, so the description compensates by naming new_count, total_conversations_returned, and exhausted. Combined with the stateful-cursor and rate-limit disclosures, an agent has everything needed to invoke and interpret it correctly.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3; the description earns extra by explaining the cursor/force interaction as a mechanism rather than restating the parameter, and by warning about the newest→oldest pagination trap.

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

Purpose5/5

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

States a precise verb+resource ('fetches one more page of older comments') plus the three supported platforms and the destination (upserts into inbox). The pagination framing — one page, older, cursor advances — clearly separates it from fetch/list siblings.

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

Usage Guidelines4/5

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

Explicitly states when to set force=true (user wants latest comments, avoiding skipped newer comments) versus the default cursor walk. It does not name sibling alternatives such as get_conversation_messages or sync_inbox, so the routing guidance is strong but incomplete.

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

mark_conversations_seenMark conversations as seenAInspect

Marks one or more inbox conversations as seen for the workspace by setting last_seen_at = now. Same effect as scrolling the rows into view in the inbox UI. Local by default; set send_read_receipt to also show the participant a read receipt on eligible Instagram DMs. Rows not in the workspace are silently ignored. Returns the ids that were actually updated.

NameRequiredDescriptionDefault
workspace_idYesWorkspace whose inbox to update. Required — get one from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
conversation_idsYesList of dm_conversations.id values to mark as seen (max 500). Get ids from list_inbox_conversations.
send_read_receiptNoAlso send Instagram's read receipt, so the participant sees their message was seen. Applies to Instagram DMs whose last message is theirs and under 24 hours old; others are skipped. Default false.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the write and non-destructive annotations, it discloses that the default effect is local, that the optional receipt is participant-visible on eligible Instagram DMs, and that out-of-workspace rows are silently ignored. It also explains the concrete timestamp behavior and states that only IDs actually updated are returned, which is especially useful without an output schema.

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

Conciseness5/5

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

Five short sentences front-load the operation and then cover the UI equivalent, optional external effect, ignore behavior, and result. There is no filler or redundant recitation of the parameter list.

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?

Together with the schema's ID sources, 500-item cap, receipt eligibility criteria, and idempotency-window details, the description is sufficient to select and invoke the tool correctly. Although there is no output schema, the description supplies the essential return contract: the IDs that were actually updated.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents every parameter. The description still adds useful cross-parameter semantics: workspace_id scopes conversation_ids, mismatched rows are ignored, and leaving send_read_receipt false keeps the operation local, while the schema supplies the remaining size, eligibility, and retry details.

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?

It uses a specific verb and resource—marking one or more workspace inbox conversations as seen—and identifies the exact state change, setting last_seen_at to the current time. The seen-state semantics and inbox UI analogy distinguish it from sibling actions such as liking conversations, marking them spam, or retrieving their messages.

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 UI analogy and local-by-default behavior make the intended use clear, and the description explicitly says to set send_read_receipt when the participant should also see a read receipt. It does not provide explicit when-not guidance or route the agent to alternatives such as mark_conversations_spam or sync_inbox.

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

mark_conversations_spamMark conversations as spamAInspect

Bulk-flips the ShortSync-local is_spam moderation flag on one or more inbox conversations. When is_spam=true the conversations disappear from the default inbox list (visible again with list_inbox_conversations include_spam=true); when is_spam=false the flag is cleared. Purely local — no platform hide/delete is performed, so unmarking always restores the row cleanly. Returns the ids that were actually updated.

NameRequiredDescriptionDefault
is_spamYestrue to mark as spam (hides the row from the default list). false to unmark.
workspace_idYesWorkspace whose inbox to update. Required — get one from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
conversation_idsYesList of dm_conversations.id values to flag (max 500). Get ids from list_inbox_conversations.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that nothing is destroyed on the platform, that hiding is scoped to the default list view, that unmarking fully restores the row, and that the return value is the set of ids actually updated (implying partial success is possible). This is exactly the sort of behavioral context annotations (readOnly=false, destructive=false) cannot convey.

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

Conciseness5/5

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

Front-loads the core action, then the consequence of each flag value, then the local-only caveat, then the return value. Four sentences, no filler, every clause carries information an agent needs.

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 covers the important return semantics (updated ids) and reversibility. It stops short of describing the full response shape or error/partial-failure behavior, but it is sufficient 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 every parameter is already documented, including the idempotency key semantics and the 500-id cap. The description restates the is_spam meaning rather than adding new syntax or edge-case detail, 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 ('Bulk-flips'), the exact resource and field (`is_spam` on inbox conversations), and the scope (one or more, bulk). It also distinguishes itself from platform moderation and from the read path (`list_inbox_conversations include_spam=true`), which separates it from siblings like mark_conversations_seen.

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

Usage Guidelines4/5

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

Explains the two modes clearly: is_spam=true hides rows from the default inbox, is_spam=false clears the flag. It also sets expectations that this is a local flag only, not a platform hide/delete, which steers an agent away from assuming real moderation. It does not name mark_conversations_seen or other siblings as alternatives, so a small gap remains.

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

move_video_to_folderMove upload to folderAInspect

Files a video upload into a folder, or removes it from any folder. Pass folder_id as a folder id to move the upload into that folder, or null to un-file it (make it appear under 'Unfoldered' in the Library). The folder must belong to the same workspace as the upload. Use list_video_uploads and list_folders to look up ids.

NameRequiredDescriptionDefault
folder_idYesTarget folder id, or null to remove the upload from its current folder. Must belong to the upload's workspace when non-null.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
video_upload_idYesThe upload to move. Get it from list_video_uploads.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false/destructiveHint=false, and the description adds real context beyond them: null is a valid un-file operation that surfaces the upload under 'Unfoldered', plus the same-workspace constraint. It doesn't mention idempotency (left to the schema) or the return shape, so not a 5.

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

Conciseness4/5

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

Front-loaded with the action, then the null mode, the workspace constraint, and the id-lookup hint. Every sentence carries information, though it runs slightly long for a two-mode mutation.

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?

Covers both operations, the workspace prerequisite, and id discovery, which is sufficient alongside full schema coverage and annotations. No output schema exists so return values needn't be explained, but it could mention retry/idempotency behavior more explicitly.

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 meaning with the 'Unfoldered' library outcome for a null folder_id and reinforces the workspace constraint. It stays close to what the schema documents, so a modest lift above 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?

States a specific verb and resource and covers both modes (file into a folder, remove from any folder) in the first sentence. An agent can distinguish it from update_folder/create_folder/list_folders 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 Guidelines4/5

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

Explains the when-to-use conditions well: pass a folder_id to move, null to un-file, and points to list_video_uploads and list_folders to resolve ids. It lacks an explicit 'use X tool instead when...' alternative, keeping 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.

publish_nowPublish post nowA
Destructive
Inspect

Publishes a draft or scheduled video post immediately (no delay). Cancels any existing schedule for the post, marks it queued, and hands it to the publish worker. Refuses posts that are already queued, processing, published, or in a terminal state. Typical flow: create_post_draft → publish_now.

NameRequiredDescriptionDefault
video_post_idYesThe video_posts.id to publish right now. Usually from create_post_draft or list_scheduled_posts.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
notify_on_successNoEmail the user when the post successfully publishes. Defaults to false.

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and openWorldHint=true, but the description adds substantive consequences: it cancels any existing schedule, marks the post queued, and hands it to the publish worker. It also discloses the refusal states, which is exactly the kind of precondition an agent needs before invoking a destructive mutation, and the idempotency semantics in the schema reinforce retry safety.

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

Conciseness5/5

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

Three tight sentences: the action is front-loaded, the side effects follow, and the workflow hint closes. No filler, and the most decision-relevant fact (immediate publish, schedule cancelled) comes first.

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

Completeness4/5

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

For a destructive mutation with no output schema, the description covers side effects, state transitions, and failure preconditions well. The remaining gap is that it does not say what a successful call returns (e.g., post ID and queued status), which an agent would need to chain follow-up calls in this multi-tool publishing workflow.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters and their purposes are already fully documented, including the 10-minute idempotency window. The description adds no parameter-level 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.

Purpose4/5

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

States a specific verb and resource with an explicit scope qualifier: 'Publishes a draft or scheduled video post immediately (no delay).' An agent can distinguish this from scheduling tools via the 'immediately/no delay' framing, but the two direct siblings, batch_publish_now and schedule_post, are never named, so it stops short of full 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 Guidelines4/5

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

Gives a clear when-to-use signal ('immediately, no delay') plus explicit when-not conditions — refuses posts already queued, processing, published, or terminal. The 'Typical flow: create_post_draft → publish_now' anchors it in a workflow. Missing is routing guidance for the obvious alternative, batch_publish_now, when multiple posts must go out.

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

remove_workspace_memberRemove workspace memberA
Destructive
Inspect

Removes a team member from a workspace so they lose access to it. Destructive: confirm with the user first, naming the person. Owners and admins can remove others; admins can't remove owners or admins; the owner can't be removed. Passing your own user_id makes you leave the workspace (owners must transfer ownership first). Get user_id from list_workspace_members.

NameRequiredDescriptionDefault
user_idYesThe member's user_id from list_workspace_members.
workspace_idYesWorkspace to manage. Get from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.8/5.0
Behavior5/5

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

The annotations already flag destructiveHint=true, but the description adds critical behavior beyond them: the permission matrix, the self-removal effect, the ownership-transfer requirement, and the need for user confirmation. These are exactly the operational details an agent needs before invoking a destructive membership mutation.

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

Conciseness4/5

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

The description is front-loaded and dense with useful constraints, with no wasted preamble. There is minor repetition of the schema's note that user_id comes from list_workspace_members, which keeps it just short of perfect conciseness.

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

Completeness5/5

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

For a destructive mutation with no output schema, the description covers what the tool does, who may call it, when it is forbidden, self-removal behavior, and the confirmation requirement. Nothing essential for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all three parameters, including idempotency_key. The description adds meaningful semantics for user_id by explaining that passing one's own user_id means leaving the workspace and that owners must transfer ownership first.

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

Purpose5/5

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

The description uses a specific verb and resource: it removes a team member from a workspace and explains the effect, that they lose access. This clearly distinguishes it from siblings like invite_workspace_member, revoke_workspace_invitation, and update_workspace_member_role.

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 preconditions and exclusions: owners/admins can remove others, admins cannot remove owners or admins, and the owner cannot be removed. It also tells the agent to confirm destructively with the user and explains the self-removal case and ownership-transfer prerequisite.

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

replace_post_mediaReplace post mediaA
Destructive
Inspect

Replaces the video or image behind a not-yet-published post (draft, ready, scheduled or failed) with another upload from the same workspace, like the dashboard's "Replace media". The post keeps its schedule, captions, first comments and platform settings; only the media file changes. Set apply_to_batch: true to also swap every other post in the same batch (same media, same status and, for scheduled posts, the same scheduled time), which is what you want when one upload was scheduled to several platforms at once. Upload the new file first with create_video_upload_from_url or create_video_upload + finalize_video_upload, then pass its id here. Refuses text posts, carousels, and posts that are queued, processing or published. Platform compatibility of the new file is not re-checked, so pick media that suits every platform in the batch.

NameRequiredDescriptionDefault
video_post_idYesThe video_posts.id whose media you want to replace. Get it from list_scheduled_posts or create_post_draft.
apply_to_batchNoAlso swap the other posts in this post's batch (same media, same status, same scheduled time). Default false: only this post is changed.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
new_video_upload_idYesThe video_uploads.id of the replacement video or image (from list_video_uploads or finalize_video_upload). Must be in the same workspace as the post; text posts and carousels can't be swapped in.

TDQS

A5/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, but the description adds the crucial nuance of what is preserved (schedule, captions, first comments, platform settings) versus what actually changes (only the media file), which tempers the destructive flag. It also discloses the meaningful risk that platform compatibility of the new file is not re-checked.

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, front-loaded with what changes and what is preserved, then prerequisites, then the batch flag, then the compatibility caveat. No sentence is redundant; the density is justified by genuinely distinct information.

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

Completeness5/5

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

For a destructive mutation with no output schema, the description covers permitted states, refusal cases, preserved fields, prerequisite tooling, batch scope, idempotency (via schema), and the compatibility caveat. Nothing an agent needs to invoke it safely 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 a baseline of 3 applies, but the description goes further by explaining the batch semantics that the schema only summarizes: batch means same media, same status, and for scheduled posts the same scheduled time. It also reinforces where each id comes from and the same-workspace constraint.

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 ("Replaces the video or image behind a not-yet-published post") and scopes it to four statuses, immediately separating it from update_post or delete-style siblings. The dashboard analogue ("Replace media") gives an agent a precise mental model.

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

Usage Guidelines5/5

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

Names the required prerequisite chain (create_video_upload_from_url or create_video_upload + finalize_video_upload) before calling, and enumerates the exclusions: text posts, carousels, and queued/processing/published posts. It also gives a decision rule for apply_to_batch ("what you want when one upload was scheduled to several platforms at once").

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

reply_to_commentReply to a comment or messageA
Destructive
Inspect

Posts a reply to an inbox conversation (a post comment thread or DM). Find the conversation_id with list_inbox_conversations. Instagram and Facebook DMs only work inside Meta's 7-day messaging window — replies to older DM threads are rejected. Comment threads and YouTube video comments have no window. Instagram DMs can also carry up to ten images or one PDF.

NameRequiredDescriptionDefault
bodyNoThe reply text. Required unless attachments are given. Keep it under 1000 bytes when sending attachments.
attachmentsNoInstagram DMs only. Up to ten images, or a single PDF on its own. They're sent first, as their own message, and the text follows. Each item needs a type and exactly one of url or attachment_id.
workspace_idNoOptional. Auto-resolved from the conversation when omitted; pass it if you already have it to skip the extra lookup.
conversation_idYesThe id returned by list_inbox_conversations for the thread to reply to.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the mutation profile is known; the description adds genuinely new behavioral facts — that replies to DM threads older than 7 days are rejected outright, and the per-platform attachment ceiling. It does not spell out the consequence of destructiveHint (the reply becomes publicly visible on the post, and there is no delete path mentioned here), which is the main remaining gap for a write tool.

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, front-loaded with the verb and scope, then sequencing constraint, then platform caveats. Each sentence adds a distinct fact — sibling routing, DM window, no-window platforms, attachment ceiling — with no restated boilerplate.

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 5-parameter write tool with no output schema, the description covers the essentials: where the required id comes from, which platforms are gated by a time window, and what payload limits exist. Remaining details (attachment structure, idempotency window, workspace auto-resolution) are fully carried by the rich schema, so nothing an agent needs is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter — body, attachments, workspace_id, conversation_id, idempotency_key — is already documented in the schema, including attachment ordering and idempotency retry semantics. The description's only parameter-adjacent contribution is restating the conversation_id source and the IG attachment limits, both of which the schema already covers. 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?

The description opens with a specific verb plus resource — "Posts a reply to an inbox conversation" — and immediately disambiguates the two resource types it covers (post comment thread vs. DM). An agent can distinguish this from list_inbox_conversations, get_conversation_messages, or like_message without opening any schema.

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

Usage Guidelines4/5

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

It gives a concrete prerequisite and routes the agent to the sibling that supplies it: "Find the conversation_id with list_inbox_conversations." It also states platform-specific eligibility (7-day Meta window for IG/FB DMs, no window for comment threads and YouTube), which tells the agent when the call can succeed or fail. It stops short of naming alternatives for adjacent actions (e.g., reading a thread before replying), so it is not a full when/when-not map.

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

resolve_linkedin_mentionResolve LinkedIn mentionA
Read-only
Inspect

Resolves a LinkedIn Company Page or workspace-member person to the urn:li:* identifier LinkedIn's Posts API needs for a real clickable mention. Accepts a bare vanity ('shortsync'), a full URL ('https://linkedin.com/company/shortsync-app/'), a display name (e.g. 'ShortSync'), or a pasted org URN. Returns up to 5 candidate URNs so the caller (or the human) can disambiguate. Feed the picked urn into upsert_workspace_person as platform_urns.linkedin so the mention will publish with the linked LinkedIn card. Personal LinkedIn URLs are refused unless the person has connected LinkedIn to this ShortSync workspace — LinkedIn's Posts API silently drops arbitrary person URNs.

NameRequiredDescriptionDefault
queryYesVanity slug, display name, LinkedIn URL, or `urn:li:organization:...` to resolve.
workspace_idYesWorkspace whose LinkedIn connection should perform the lookup. Get from list_workspaces. The user must be a member and the workspace must have LinkedIn connected (list_platform_connections to check).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/openWorld/non-destructive, yet the description still adds substantive behavior: it returns up to 5 candidate URNs for human disambiguation, it refuses personal URLs under a stated precondition, and it warns that LinkedIn's API silently drops arbitrary person URNs. These are non-obvious constraints an agent could not infer from structured fields.

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

Conciseness5/5

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

Purpose and accepted input forms are front-loaded, followed by output cardinality, then the downstream hand-off and the failure precondition. Every sentence carries distinct information; nothing is repeated from the title or schema.

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

Completeness5/5

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

For a two-parameter read-only resolver with no output schema, the description covers what it returns (up to 5 candidate URNs), what to do with the result, and the key failure mode. The workspace-connection precondition is also reinforced in the schema, so nothing needed to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description goes further by enumerating the concrete query input shapes — bare vanity ('shortsync'), full URL, display name ('ShortSync'), or pasted org URN — with worked examples that make the format ambiguity actionable rather than abstract.

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 (resolves) and a precise resource (LinkedIn Company Page or workspace-member person) and names the exact output artifact (`urn:li:*` identifier for Posts API mentions). This is distinguishable from every sibling, most of which deal with posts, folders, or analytics rather than identifier resolution.

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

Usage Guidelines4/5

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

Clearly frames the workflow context: call it to get a URN, then 'Feed the picked `urn` into upsert_workspace_person as platform_urns.linkedin' so the mention publishes with a real card. It also states a when-not condition — personal LinkedIn URLs are refused unless the person has connected LinkedIn to the workspace — and explains why (the API silently drops arbitrary person URNs). No sibling alternative exists to contrast against, which keeps it 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.

retry_postRetry failed postAInspect

Publishes a failed post again, like the Retry button in the ShortSync library. Runs the same checks as a new publish (subscription, daily platform limit, connection health, caption limits), clears the old error and re-queues the post now, or at scheduled_for when given. Doesn't use another monthly upload credit. Find failed posts with list_scheduled_posts (status: 'failed') or get_workspace_status. If the error was a disconnected account, have the user reconnect first; if the caption was too long, fix it with update_post or batch_update_posts (that re-queues it on its own).

NameRequiredDescriptionDefault
scheduled_forNoOptional ISO 8601 time to publish at instead of right now. Must be in the future and at most a year out.
video_post_idYesThe failed post to retry (video_posts.id).
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description nonetheless adds genuinely useful context the annotations cannot carry: the same validation checks as a new publish (subscription, daily limit, connection health, caption limits), that the old error is cleared, and that no monthly upload credit is consumed. It stops short of describing what a failed retry returns or how errors surface, which keeps it from a 5.

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

Conciseness4/5

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

Front-loaded with the action and the Retry-button analogy, then preconditions and alternatives. Four sentences is slightly long and the credit-saving detail could be trimmed, but each sentence carries actionable content rather than 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 mutation tool with no output schema and three well-documented parameters, the description covers the decision path (how to find failures), the preconditions (reconnect, fix caption), the side effects (checks re-run, error cleared, re-queued) and the cost model (no upload credit). An agent has everything needed to call this 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 100%, so the schema already documents all three parameters including the ISO 8601 future/one-year constraint and the idempotency window. The description only adds the behavioral nuance that scheduled_for re-queues rather than publishing immediately, and it never mentions idempotency_key. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb and resource ('Publishes a failed post again'), and pins down the exact scope (only failed posts) plus the mental model of the ShortSync Retry button. This distinguishes it cleanly from publish_now and schedule_post, which operate on new posts.

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 routes the agent: use list_scheduled_posts (status: 'failed') or get_workspace_status to find candidates, and use update_post/batch_update_posts instead when the failure was a caption-length problem since those re-queue on their own. It also states the prerequisite of the user reconnecting a disconnected account first.

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

revoke_workspace_invitationRevoke workspace invitationA
Destructive
Inspect

Revokes a pending invitation to a workspace so its link stops working. Owners and admins only. Get the invitation_id from list_workspace_invitations.

NameRequiredDescriptionDefault
workspace_idYesWorkspace to manage. Get from list_workspaces.
invitation_idYesThe invitation id from list_workspace_invitations.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known; the description adds real value on top by stating the authorization requirement and the concrete effect (the invite link stops working). It doesn't say whether the link dies immediately or whether the invitee is notified, which is the remaining behavioral gap.

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: effect first, restriction second, where to get the ID third. Nothing is padded and the most decision-relevant information leads.

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

Completeness4/5

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

For a destructive, no-output-schema mutation with full annotation coverage, the description supplies the authentication gate and the user-visible consequence. Missing only edge-case detail such as behavior on an already-accepted or expired invitation.

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 each parameter already documents its source, including the idempotency-key retry semantics. The description's line about getting invitation_id from list_workspace_invitations merely restates the schema, adding no new meaning; 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 (revokes) and resource (a pending workspace invitation) plus the outcome (its link stops working). The scope word 'pending' and the pointer to list_workspace_invitations separate it cleanly from list_workspace_invitations and invite_workspace_member.

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 a clear use condition (only pending invitations) and a prerequisite (owners and admins only), plus how to obtain the required ID. It stops short of naming the closest alternative — remove_workspace_member — for the case of removing an already-joined member, which is the most likely sibling confusion.

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

schedule_postSchedule postAInspect

Schedules an existing draft video post to publish at a specific future time. Typical flow: create_post_draft first, then schedule_post with the returned post's id. Pass scheduled_for (ISO 8601, at most 1 year out; past times are nudged to now + 30 seconds) or use_next_slot: true to take the next free saved posting time (see get_posting_slots). Pass recurrence to repeat the post on a cadence, like the app's "Repeat this post" (same shape as the public API).

NameRequiredDescriptionDefault
recurrenceNo"Repeat this post": publish the same post again on a cadence, like the app's Repeat option. scheduled_for is occurrence 1. Max 12 occurrences in total; each occurrence counts as one upload credit.
scheduled_forNoISO 8601 timestamp for when the post should publish. Max 1 year out. Required unless use_next_slot is true.
use_next_slotNoSchedule at the next free saved posting time for this workspace instead of scheduled_for. Fails when no posting times are saved (set them with update_posting_slots).
video_post_idYesThe video_posts.id to schedule. Typically obtained from create_post_draft.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
notify_on_successNoEmail the user when the post successfully publishes. Defaults to false.

TDQS

A5/5.0
Behavior5/5

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

The description provides crucial operational constraints not in the schema or annotations. It details the time limits (1 year out), the specific behavior for past times (nudged to now + 30 seconds), and links the recurrence shape to the public API.

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 structure is highly logical, following the flow from creation to scheduling options. It front-loads the core function and uses concise, technical language without unnecessary padding.

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 complexity of having multiple timing mechanisms (ISO, slot, recurrence) and requiring a prerequisite draft ID, the description successfully guides the agent through all necessary decision points.

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 vital semantic meaning. It explains the logic behind the `scheduled_for` constraint and how the complex recurrence object relates to the app's 'Repeat this post' feature.

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 that the tool schedules an existing draft video post. It distinguishes its function by specifying it targets 'draft video posts,' which is useful for distinguishing it from other post-creation or publishing tools in the sibling set.

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 provides a comprehensive workflow, explicitly stating that `create_post_draft` should typically be called first. Furthermore, it clarifies the three ways to define publication time: fixed ISO, using the next slot, or using recurrence.

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

select_facebook_pageSelect Facebook PageA
Destructive
Inspect

Connects Facebook to a workspace as the given Page, or switches the Page it posts as, using a Facebook login the user already made in ShortSync (no new sign-in). Get page ids from list_facebook_pages. Switching Pages clears the workspace's Facebook inbox for the old Page. Confirm the Page name with the user first.

NameRequiredDescriptionDefault
page_idYesPage id from list_facebook_pages.
workspace_idYesWorkspace to connect. Get one from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.4/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 goes further by naming exactly what is destroyed: switching Pages clears the workspace's Facebook inbox for the old Page. It also discloses the auth model ('no new sign-in', reuses a Facebook login), which is precisely the kind of context annotations cannot convey.

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

Conciseness5/5

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

Four compact sentences: action first, then sourcing, then the destructive side effect, then the confirmation guardrail. Every sentence carries distinct, decision-relevant information with zero 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 destructive, open-world mutation with no output schema, it covers sourcing, side effects, and a user-confirmation requirement — the essentials. The only gap is the lack of any statement about what the call returns or how failures surface.

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?

With schema description coverage at 100%, the schema already documents all three parameters, so baseline 3 applies. The description repeats the page_id provenance from list_facebook_pages but adds no new semantics and says nothing about idempotency_key beyond what the schema states.

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

Purpose5/5

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

The description uses a specific verb and resource ('Connects Facebook to a workspace as the given Page, or switches the Page it posts as') and defines the exact scope of the write. It is clearly distinct from the read-only sibling list_facebook_pages, which it references by name.

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 tells the agent where to source input ('Get page ids from list_facebook_pages') and imposes a procedural guardrail ('Confirm the Page name with the user first'). It does not state explicit when-not-to-use conditions, but the surrounding context and prerequisites are clear.

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

select_linkedin_authorSelect LinkedIn authorAInspect

Sets who the workspace's LinkedIn posts go out as by default: the connected person (author_type 'person') or one of their Company Pages (author_type 'organization' with an organization_id from list_linkedin_authors). Applies to posts published from now on.

NameRequiredDescriptionDefault
author_typeYes'person' for the connected profile, 'organization' for a Company Page.
workspace_idYesWorkspace with LinkedIn connected. Get one from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
organization_idNoRequired for 'organization'. An id from list_linkedin_authors.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare a non-destructive, closed-world write; the description adds a genuinely useful behavioral fact not in the annotations or schema: it applies only to posts published from now on, so existing content is unaffected. It doesn't mention the idempotency/retry semantics (left to the schema) or any permission prerequisites.

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 defines the action and its options, the second front-loads the temporal scope constraint. No filler or 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?

For a 4-parameter mutation with full schema coverage and no output schema, the description covers purpose, valid options, parameter sourcing, and temporal scope. Return value is not described, though the schema's idempotency note implies a result object; that is a minor gap.

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 explains author_type, workspace_id, organization_id, and idempotency_key. The description restates the author_type enum meanings and the provenance of organization_id, adding little beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Sets who the workspace's LinkedIn posts go out as by default') and immediately enumerates the two valid configurations, distinguishing it from sibling listing tools like list_linkedin_authors.

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?

Clear context for when to call it (to set the default publishing identity per workspace) and it routes the agent to list_linkedin_authors to obtain the required organization_id. It stops short of naming an explicit alternative or exclusion case, e.g. how this interacts with select_facebook_page or per-post author overrides.

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

sync_analyticsSync analyticsAInspect

Refreshes a workspace's post analytics (views, likes, comments, shares, account stats) from the connected platforms. Same operation as the Sync button on the ShortSync Analytics tab. Runs in the background and returns a job_id right away; a sync takes roughly 15 seconds to 5 minutes. Pass job_id (with the same workspace_id) to check progress instead of starting a new sync: status goes queued → running → completed/failed, and the analytics read tools return fresh numbers once it is completed. The read tools (get_workspace_analytics, get_post_analytics, get_video_analytics, get_folder_analytics, explain_post_analytics_state) already start a sync on their own when the data is over an hour old, so only call this when the user explicitly wants a refresh now. Only one sync runs per workspace at a time. Counts against the workspace's daily sync limit; Free plan workspaces can sync once per calendar month.

NameRequiredDescriptionDefault
job_idNoOptional: a job_id returned by an earlier call. When set, returns that job's progress and starts nothing.
platformNoOptional: sync only this platform (youtube, tiktok, instagram, etc.). Omit to sync every connected platform.
workspace_idYesWorkspace to sync. Required; get one from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: background execution, 15s–5min duration, one sync per workspace at a time, status lifecycle queued → running → completed/failed, and cost implications (daily sync limit, Free plan once per calendar month). The description does not contradict the readOnlyHint=false/openWorldHint=true/destructiveHint=false annotations.

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

Conciseness4/5

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

Front-loaded with the action, then constraints, then cost. It is dense and nearly every sentence carries actionable information, though the runtime/limit/polling details make it longer than strictly necessary for a single tool.

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

Completeness5/5

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

With no output schema, the description carries the return-value burden and does so: an immediate job_id, its status progression, and when results become visible in the read tools. Combined with the cost and concurrency rules, an agent has everything needed to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds real semantics on top: job_id must be paired with the same workspace_id and returns progress without starting work, and platform omission means all connected platforms. It does not discuss idempotency_key, but the schema already does.

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 specific verb+resource ('Refreshes a workspace's post analytics') and enumerates the data covered (views, likes, comments, shares, account stats). It also anchors the operation to a concrete UI equivalent ('Sync button on the ShortSync Analytics tab'), which separates it from the analytics read siblings.

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 states when NOT to call it: the read tools (get_workspace_analytics, get_post_analytics, get_video_analytics, get_folder_analytics, explain_post_analytics_state) auto-sync stale data, so only call this when the user wants a refresh now. It also explains how to poll with job_id instead of starting a second sync.

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

sync_inboxSync inboxAInspect

Pulls fresh comment threads and DMs from the connected platforms (Instagram, Facebook, YouTube, Threads, LinkedIn) into ShortSync's inbox cache. Same operation as clicking the refresh button in the inbox UI. Returns a per-connection DmSyncResult with counts of new conversations and messages plus any errors. Call this before list_inbox_conversations when the user asks for the latest activity — otherwise the tool serves cached data from the last sync. Hits the platform APIs so it counts against rate limits. Threads is beta-gated behind DM_INBOX_THREADS and LinkedIn behind DM_INBOX_LINKEDIN — accounts without the flag see those connections silently skipped rather than an error. LinkedIn coverage is uneven per account: only organization-context connections with r_organization_social can read post comments; personal-profile posts require partner-tier API access we don't have and return no conversations.

NameRequiredDescriptionDefault
platformsNoOptional list of platforms to sync (any of instagram, facebook, youtube, threads, linkedin). Omit to sync every DM-enabled connection in the workspace.
workspace_idYesWorkspace to sync. Required — get one from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that it hits platform APIs and consumes rate limits, that Threads/LinkedIn are flag-gated and silently skipped rather than erroring, and that LinkedIn post-comment coverage is limited by org context and partner-tier access. Annotations only cover readOnly/openWorld/destructive hints, so this adds substantial operational context.

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

Conciseness5/5

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

The core action and return shape are front-loaded, then progressively finer caveats (rate limits, beta flags, LinkedIn coverage). No sentence is redundant and each adds a distinct operational fact.

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 still describes the DmSyncResult return (per-connection counts plus errors), and it covers ordering relative to the read tool, rate-limit impact, and silent-skip failure modes. Nothing needed to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning to the 'platforms' filter by explaining that Threads and LinkedIn are beta-gated per connection and that omitting platforms syncs every DM-enabled connection. It says nothing additional about workspace_id or idempotency_key, which the schema already documents well.

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

Purpose5/5

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

States a specific verb ('pulls ... into ShortSync's inbox cache'), names the platforms covered, and maps to a concrete UI action. It is clearly distinguishable from sibling list_inbox_conversations, which reads the resulting cache rather than filling it.

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

Usage Guidelines5/5

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

Explicitly says to call this before list_inbox_conversations when the user asks for the latest activity, and states the consequence of skipping it (cached data from the last sync). The alternative and its selection condition are both named.

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

sync_repurposing_workflowRun repurposing workflow nowA
Destructive
Inspect

Runs a Repurposing workflow now instead of at its next automatic run (every 15 minutes): checks the source account for new posts and reposts them, or fills a scheduled workflow's next slots. Returns the counts (posted, scheduled, drafted, skipped, failed, waiting) and a one-line summary. Can run once a minute for new-posts workflows and every 5 minutes for scheduled ones. The workflow must be on.

NameRequiredDescriptionDefault
workflow_idYesThe workflow. Get it from list_repurposing_workflows.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare this is not read-only, is open-world, and is destructive, and the description supports that by explaining that it checks for new posts and reposts them or fills scheduled slots. It adds useful behavioral context such as the returned counts, one-line summary, rate limits, and the requirement that the workflow be enabled.

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 front-loaded with the core action and uses each sentence to convey distinct useful information: immediate execution, behavior, returns, limits, and prerequisite. There is no repetition 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 destructive open-world mutation tool with no output schema, the description supplies the key operational context an agent needs: what it does, when it runs, rate limits, prerequisite state, and return shape. It could be more complete about permissions or failure behavior, but the essentials are 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?

There is only one parameter, workflow_id, and the schema has 100% description coverage including where to get the ID. The description does not add parameter-specific meaning beyond the schema, 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 states a specific verb and resource: it runs a Repurposing workflow immediately rather than waiting for its automatic run. It also clarifies the two modes of action, checking for new posts and reposting them or filling scheduled slots, which distinguishes it from sibling management tools like update_repurposing_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?

Usage is clearly implied: use this when an immediate run is needed instead of the next automatic 15-minute run. It also gives prerequisites and limits, including that the workflow must be on and the rate limits of once per minute or every 5 minutes, though it does not explicitly name alternatives or exclusions.

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

update_comment_dm_ruleUpdate comment DM ruleA
Destructive
Inspect

Changes an Instagram comment DM rule, or turns it on or off with enabled. Only the fields you pass change. Turning a rule off always works, even on a lapsed plan. People who already got the rule's DM don't get it again after an edit.

NameRequiredDescriptionDefault
enabledNoTrue to send, false to pause.
messageNoThe DM text, up to 1,000 bytes. Include a line saying it's automated, such as 'This is an automated message.' Some places, like California and Germany, require that. The result's disclosure_missing is true when there's no such line.
post_idNoInstagram post id from list_comment_dm_posts to watch one post. Null or left out on create watches every post.
rule_idYesRule id from list_comment_dm_rules.
keywordsNoUp to 20 words or phrases people comment to get the DM. Whole words, any case: 'link' matches 'Link please' but not 'linked'. Emoji work too.
workspace_idYesWorkspace with the Instagram connection. Required. Get one from list_workspaces.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and openWorldHint=true, so the description's added value is what counts: it discloses merge semantics (only passed fields change), a billing exception (disabling works on a lapsed plan), and a recipient dedupe rule after edits. What it does not disclose is what 'destructive' actually means here — e.g. whether passing keywords replaces the whole list — nor any permission requirements.

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 short sentences, front-loaded with purpose, then merge semantics, then the plan exception, then the dedupe caveat. No restatement of the title or of schema content, and every sentence carries a distinct operational fact.

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

Completeness4/5

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

For a destructive, no-output-schema mutation this covers the essentials: partial-update behavior, an availability exception, and post-edit recipient behavior. Gaps remain around permissions, what a failed update returns, and how array fields like keywords behave on replacement, but nothing an agent needs to select the tool is missing.

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

Parameters3/5

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

Schema coverage is 100% and the per-parameter text is already rich (disclosure_missing, whole-word keyword matching, post_id/null scope), so the schema does the heavy lifting and the baseline of 3 applies. The one genuine addition is the partial-update guarantee ('Only the fields you pass change'), which the schema does not state about omitted fields.

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 ('Changes an Instagram comment DM rule') and immediately clarifies the toggle case via 'enabled'. The verb alone separates it from create_comment_dm_rule and delete_comment_dm_rule in the sibling list, so an agent can route without opening a schema.

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

Usage Guidelines4/5

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

'turns it on or off with enabled' and 'Only the fields you pass change' tell the agent this is the mutation path for existing rules, including the pause/resume shortcut. It gives clear context but never explicitly says when to use create_comment_dm_rule or delete_comment_dm_rule instead, so exclusions are left implicit.

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

update_conceptUpdate conceptA
Destructive
Inspect

Edits a content concept on the Concepts board. Pass only the fields to change. Empty string clears a text field (description, caption, first_comment, youtube_title); due_date null or "" clears the date. platform_captions and platform_first_comments are merged into the existing maps: a value sets that platform's override, an empty string removes it. platforms and tags replace the whole list. Get concept ids from list_concepts.

NameRequiredDescriptionDefault
tagsNoReplaces the tag list.
titleNoNew title (max 200 chars).
statusNoBoard column: idea, draft, scheduled, published or archived.
captionNoDefault caption used for every platform without an override.
due_dateNoPlanned date YYYY-MM-DD, or null / "" to clear.
platformsNoReplaces the target platform list, e.g. ["instagram","tiktok"].
concept_idYesThe concept to edit.
descriptionNoNew notes / brief (shown as 'Notes'). Not copied into posts.
content_typeNovideo, image, carousel, text or other.
first_commentNoShared first comment.
youtube_titleNoYouTube title.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
platform_captionsNoPer-platform caption overrides to merge, e.g. {"tiktok": "...", "instagram": ""}. Empty string removes an override.
platform_first_commentsNoPer-platform first comment overrides to merge. Empty string removes an override.

TDQS

A4.1/5.0
Behavior4/5

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

The description goes well past the annotations by spelling out the mutation model: empty string clears named text fields, null/"" clears the date, platform maps are merged per key while platforms/tags are wholesale replacements. That is exactly the kind of what-gets-destroyed detail destructiveHint=true alone cannot convey. It stops short of covering failure modes or permission requirements.

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

Conciseness5/5

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

Five short sentences, each carrying a distinct rule (scope, partial update, text clearing, date clearing, merge-vs-replace, id source). The most error-prone rule, clearing, is placed early and nothing is repeated.

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 14-parameter mutation tool with no output schema, the description covers the semantics an agent would most likely get wrong (clearing, merging, replacing) and points to the id source. It does not say what the response contains or what happens with an invalid status/content_type value, which is a minor remaining gap.

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 cross-parameter meaning the schema does not: it enumerates which fields are clearable via empty string (description, caption, first_comment, youtube_title) and contrasts merge semantics for platform maps against replace semantics for lists. Some of this duplicates the schema's own "Replaces the tag list" wording, so it is not purely additive.

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

Purpose4/5

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

States a specific verb and resource ("Edits a content concept on the Concepts board"), which is enough to separate it from update_post or create_concept. It never names a sibling explicitly, so the boundary with update_post is inferred 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?

"Pass only the fields to change" is explicit usage guidance for a PATCH-style tool, and "Get concept ids from list_concepts" removes the main precondition hurdle by naming the sibling that supplies ids. There is no explicit when-not or alternative-selection rule (e.g. versus update_post), which keeps it below a 5.

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

update_folderUpdate folderAInspect

Renames, repositions, or moves (reparents) a folder. Pass any subset of name / parent_id / position. parent_id: null moves the folder to the top level; a string reparents it under that folder (must be the same workspace, no cycles, max 5 levels deep). Names must stay unique among siblings. Returns the updated folder row.

NameRequiredDescriptionDefault
nameNoOptional new name (max 80 chars). Must be unique among the folder's siblings.
positionNoOptional integer position for manual ordering.
folder_idYesThe folder to update. Get it from list_folders.
parent_idNoOptional new parent folder id. Pass null to move the folder to the top level. Must belong to the same workspace. Cannot create a cycle or exceed 5 levels of nesting.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A3.9/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 description adds useful context: it specifies that searches are bounded (same workspace, no cycles, depth limit) and that the response is the updated folder row. It is missing auth/rate-limit details but goes beyond the annotations meaningfully.

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

Conciseness5/5

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

Three tightly packed sentences with no filler. The core behavior ('Renames, repositions, or moves') is front-loaded, followed by parameter usage and constraints.

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

Completeness5/5

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

There is no output schema, and the description states the return value ('Returns the updated folder row'). All key constraints for a mutation tool (workspace scope, cycles, depth, sibling name uniqueness) are covered, so an agent has what it needs.

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 explains parent_id: null, uniqueness, cycle constraints, and depth limits. The description largely restates these constraints (plus 'Pass any subset'), so the baseline 3 is appropriate even though it adds no new detail beyond the schema.

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 opens with specific verbs and resource: 'Renames, repositions, or moves (reparents) a folder.' The use of 'reparents' distinguishes it from move_video_to_folder at the resource level. However, it does not explicitly name sibling tools like create_folder or delete_folder to differentiate, leaving a slight gap.

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?

It tells the agent to 'Pass any subset of name / parent_id / position,' which gives usage mechanics. It also states constraints (same workspace, no cycles, max 5 levels, unique sibling names). But it never says when to choose this tool over siblings or when updates are inappropriate, leaving usage implicit.

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

update_postUpdate postA
Destructive
Inspect

Edits caption, title, description, first comment, custom thumbnail (image URL or timeline frame), and platform-specific settings on any not-yet-published post — drafts, ready-to-publish, scheduled, and failed posts are all editable. Writes to the shared video_settings row so every unpublished post attached to the same upload sees the change. Use platform_caption / platform_first_comment for per-platform overrides on this post's platform. Refuses posts that are already queued for publish, currently processing, or already published. Captions over a platform's limit are rejected (a shared caption is checked against every unpublished post on the upload). Fixing the caption of a post that failed for an over-limit caption re-queues it automatically — the result's status shows where it went. Custom covers (custom_thumbnail_url / custom_thumbnail_upload_id) apply to video posts on YouTube, Instagram Reels, Facebook Reels and Pinterest; image posts don't take a cover.

NameRequiredDescriptionDefault
titleNoNew title. Used by YouTube, Facebook, Pinterest, Tumblr (an optional heading above the post text) and Reddit (the post title, max 300 chars, only when platform_settings.title is empty); ignored by platforms without a title concept. This is the upload's shared title, so changing it also changes the YouTube, Facebook, Pinterest and Tumblr titles of the same upload. To set a Reddit-only title, use platform_settings.title on the Reddit post instead.
captionNoNew shared caption. Applies to every platform that doesn't have a per-platform override.
descriptionNoNew long-form description. Used by YouTube, Facebook, Pinterest, Tumblr and Reddit. On Pinterest this is the pin description; on Tumblr it is the post text; on Reddit it is the post body.
first_commentNoShared first comment. Auto-posted after the post by platforms that support it (YouTube, Instagram, Facebook, Threads, Bluesky, X, LinkedIn, Mastodon, and Discord: in Discord text channels it's a separate message right after the post, in forum channels the first reply in the post's thread). Empty string clears it.
video_post_idYesThe video_posts.id whose text/settings you want to edit.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
platform_captionNoPer-platform caption override for this post's platform. Overrides `caption` on that one platform only; leave empty string to clear. Do NOT use for Pinterest or YouTube: those platforms use `title` and `description` instead of captions. On Tumblr it overrides the description as the post text.
platform_settingsNoAI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly (Story only, no Reel or feed post; single videos up to 60 seconds, single images and carousels, which go to Stories as one frame per slide with video slides over 60 seconds left out)/trialReel (boolean; Reels only: posts a Trial Reel shown to non-followers first)/trialGraduationStrategy ("SS_PERFORMANCE" (default): Instagram shares it with followers automatically if it performs well; "MANUAL": the user shares it from the Instagram app; Instagram has no time-based option)/isPaidPartnership/brandPartners (string[], up to 2 brand usernames on a paid partnership; needs Facebook Login for Instagram; for a sponsored post also set TikTok commercialContentDisclosure + isBrandedContent and YouTube hasPaidProductPlacement)/productTags (array of {product_id, x?, y?} from the account's Instagram Shop, single images and Reels; beta, needs Facebook Login for Instagram)/poll ({ options: 2 to 4 strings of max 25 chars, extended: boolean, keeps it open past 3 days }; feed posts, carousels and Reels, the caption is the question; beta, needs Facebook Login for Instagram or the post fails)/commentPrompt (boolean; the caption becomes a prompt answered in the comments; not with poll; beta, needs Facebook Login for Instagram or the post fails)/storyCaption (boolean; shows the caption on the Story, first frame only on carousels; beta)/isAiGenerated (boolean — adds Instagram's "AI info" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly (single videos up to 60 seconds and single photos)/isAiGenerated (boolean; adds Facebook's "AI info" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility ("PUBLIC" | "CONNECTIONS" | "LOGGED_IN"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: "ONE_DAY" | "THREE_DAYS" | "SEVEN_DAYS" | "FOURTEEN_DAYS", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility ("public" | "unlisted" | "private"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention ("none" | "here" | "everyone", default "none"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain "discord"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no "#", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like "AskReddit", "r/AskReddit" also works, or "u_username" for the user's own profile; a bare name is always a subreddit, so "jane" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility ("public" | "unlisted" | "private", default "public"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: "BOOK" | "ORDER" | "SHOP" | "LEARN_MORE" | "SIGN_UP" | "CALL"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of "spotlight" and/or "story", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand.
follow_up_commentsNoUp to 4 more comments after the first comment (5 per post in total), posted on the same platforms as the first comment. Shared by every post of the upload; passing it replaces the current list, [] clears it. Not posted on X, which only gets the first comment. On Threads, Bluesky, Mastodon and Pixelfed each one replies to the previous comment, so they read as a thread.
custom_thumbnail_urlNoPublic https:// URL to a cover/thumbnail image (jpeg, png, webp, or gif, max 20 MB). ShortSync downloads the image, stores it in the workspace's bucket, and attaches it to the video_settings row so every unpublished post on this upload uses it at publish time. Used as the cover on YouTube, Instagram Reels, Facebook Reels and Pinterest; other platforms pick their own cover (TikTok uses a frame, set with thumbnail_timestamp_ms). Pass an empty string to remove the current custom thumbnail. Same SSRF guards as create_video_upload_from_url apply: https only, public IPs, Content-Length required. Mutually exclusive with thumbnail_timestamp_ms.
first_comment_enabledNoSet false to skip the first comment on this post's platform entirely (neither the per-platform nor the shared first comment is posted). Set true to turn it back on. Same toggle as the dashboard's per-platform first-comment switch.
platform_first_commentNoPer-platform first comment override for this post's platform. Empty string clears the override and falls back to the shared first_comment.
thumbnail_timestamp_msNoExtract a frame from the upload's own video at this timestamp (milliseconds from the start) and store it as the video's 'Thumbnail from Timeline' (video_settings.generated_thumbnail_url), matching what the dashboard scrubber writes. Video-only: refuses text posts, image uploads, and carousel parents. Must be within the video's duration. Publish-time behavior: this DOES NOT overwrite a custom_thumbnail_url the user already set. Platforms that read `custom_thumbnail_url || generated_thumbnail_url` (YouTube, Facebook Reels, Pinterest, and others) will use this timeline frame only when no custom cover is present. Platforms that read custom only (Instagram in particular) will NOT use this frame as a cover — pass custom_thumbnail_url or custom_thumbnail_upload_id for those. If the user wants the timeline frame to override an existing custom cover, first clear the custom with `custom_thumbnail_url: ""`, then set the timestamp. Mutually exclusive with custom_thumbnail_url and custom_thumbnail_upload_id.
custom_thumbnail_upload_idNoAlternative to custom_thumbnail_url: reference an existing image upload (a video_uploads row whose content_type is 'image') and use it as the cover for this post. Use this when the user already uploaded the cover image via create_video_upload_from_url or create_video_upload and wants to attach it to a video's post rather than re-hosting it publicly. The image must be in the same workspace as this post. Mutually exclusive with custom_thumbnail_url and thumbnail_timestamp_ms.
first_comment_delay_minutesNoMinutes after the post goes live to post the first comment. 0 = right away (default). Up to 10080 (7 days). Shared by every post of the upload.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only say readOnly=false, destructive=true, openWorld=true; the description goes much further by disclosing the shared video_settings side effect that reaches every unpublished post on the upload, the caption-limit validation and its cross-post check, the auto re-queue of failed posts, and the per-platform cover applicability. That is exactly the mutation blast-radius and error behavior an agent needs beyond the hints.

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

Conciseness5/5

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

Front-loaded with what can be edited and on which post states, then the shared-row side effect, then refusals, then validation and re-queue behavior, then the cover caveat. Sentences are long but each carries a distinct rule, and there is no filler or restatement of the tool name.

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 15-parameter mutation with a nested platform_settings blob and no output schema, it covers eligible post states, side effects, rejection causes, re-queue behavior, and points at result.status for outcome. The platform-specific detail lives in the schema, so nothing operationally essential is missing here.

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 still adds navigational meaning by contrasting shared fields with per-platform overrides and by stating which platforms actually consume custom covers (video posts on YouTube, IG Reels, FB Reels, Pinterest). It leaves idempotency_key, follow_up_comments and thumbnail_timestamp_ms entirely to the schema, which keeps it at 4 rather than 5.

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

Purpose4/5

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

States a specific verb (edits) plus the exact resources touched (caption, title, description, first comment, custom thumbnail, platform-specific settings) and bounds them to not-yet-published posts. That scope statement implicitly separates it from publish_now/retry_post/delete_published_post, but no sibling tool is named explicitly, so it stops just short of a 5.

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

Usage Guidelines4/5

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

Gives explicit when-not conditions — it refuses posts already queued for publish, currently processing, or already published — and directs per-platform overrides to platform_caption/platform_first_comment. It never names an alternative tool (e.g. batch_update_posts) for bulk edits, so the routing guidance is clear but not complete.

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

update_posting_slotsUpdate posting slotsA
Destructive
Inspect

Sets the user's daily posting times for a workspace, like editing the time slots in Settings. Pass times (hand-picked "HH:mm" list, replaces the current list and clears any interval) or interval (a range that generates the times, like the app's auto-fill), plus optional timezone and platform_times. Omitted fields stay as they are. move_posts_past_limits turns the workspace's automatic move past daily limits on or off (owners and admins only) and can be sent on its own. Returns the saved slots and the next free ones. Same behavior as PUT /api/v1/posting-slots.

NameRequiredDescriptionDefault
timesNoDaily times in 24-hour "HH:mm", e.g. ["09:00", "17:30"]. Replaces the saved list; [] clears it.
intervalNoGenerate times from a range instead of listing them. An end at or before the start wraps past midnight. null clears the interval but keeps the times.
timezoneNoIANA timezone the times are in, e.g. "Europe/Helsinki". null clears it (UTC is used).
workspace_idYesWorkspace to update. Get one from list_workspaces.
platform_timesNoPer-platform default times that seed the per-platform picker, e.g. { "twitter": "07:00" }. null clears them.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
move_posts_past_limitsNoWorkspace setting, on by default. true moves a scheduled post to its next free slot when it hits a platform's daily limit; false lets it fail. Applies to everyone in the workspace.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true, and the description earns credit by explaining what is destroyed: passing times replaces the existing list and clears any interval, and omitted fields are left intact. It also discloses permission scoping for move_posts_past_limits and that the call can be sent with that field alone, though it omits side effects on already-scheduled posts and does not mention the idempotency/retry behavior documented only in the schema.

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

Conciseness4/5

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

Dense but front-loaded: the core action and the two mutually exclusive input modes come first, followed by optional fields and the return value. It is one long block rather than a structured list, and the closing endpoint reference is mildly redundant against the title.

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

Completeness4/5

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

For a 7-parameter mutation with destructiveHint and no output schema, the description covers the essential mechanics, what persists, the permission gate, and what is returned (saved slots plus next free ones). Remaining gaps are edge cases like invalid time formats and effects on existing scheduled posts.

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 value by spelling out the mutual exclusion between times and interval (one replaces/clears the other) and that move_posts_past_limits can be sent on its own as a standalone workspace toggle. That mutual-exclusion framing is the main non-obvious semantic an agent needs.

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 ("Sets the user's daily posting times for a workspace") and grounds it in the familiar Settings UI and the PUT /api/v1/posting-slots endpoint, which makes it clearly distinct from the read-only get_posting_slots sibling.

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

Usage Guidelines4/5

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

The description makes the times-vs-interval choice explicit (using one replaces/clears the other) and notes that omitted fields are preserved, plus the owner/admin restriction on move_posts_past_limits. It does not say when to read current slots first (e.g. call get_posting_slots) or when not to use it, so it stops short of explicit alternatives.

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

update_repurposing_workflowUpdate repurposing workflowA
Destructive
Inspect

Changes a Repurposing workflow's settings, or pauses it (enabled: false) and turns it back on (enabled: true). Pass any subset of the settings. The source account and kind can't be changed; create a new workflow instead. Pausing a scheduled ('existing') workflow takes stop_action for the posts it scheduled that haven't gone out yet. A new-posts workflow turned back on starts from now, so posts made while it was paused aren't reposted. Returns the updated workflow.

NameRequiredDescriptionDefault
nameNoOptional name for the workflow (max 80 characters), e.g. 'Reels to TikTok'. null or empty shows the default label for its kind.
enabledNofalse pauses the workflow, true turns it back on.
timezoneNoScheduled workflows: IANA time zone the slots are in, e.g. 'Europe/Helsinki'.
stop_actionNoScheduled workflows: what happens to posts it scheduled that haven't gone out yet. 'drafts' (default) keeps them in the library as drafts, 'remove' deletes them. Published posts always stay.
workflow_idYesThe workflow. Get it from list_repurposing_workflows.
include_fromNoScheduled workflows: only repost source posts published on or after this date (ISO 8601).
publish_modeNoNew-posts workflows only: 'immediate' publishes each repost right away, 'draft' saves it to the library for review. Scheduled ('existing') workflows always schedule.
content_typesNoWhich post types to repost. Default: all three.
include_untilNoScheduled workflows: only repost source posts published on or before this date (ISO 8601).
publish_orderNoScheduled workflows: work through the source's posts newest or oldest first, or (Twitch only) most viewed first. Default newest.
caption_suffixNoOptional text added to every repost's caption (max 500 characters). null clears it.
schedule_slotsNoScheduled ('existing') workflows: publishing times per weekday, keys '0' (Sunday) to '6' (Saturday), values 'HH:mm' lists, up to 5 a day. Example: { "1": ["10:00"], "3": ["10:00", "16:00"] }.
target_optionsNoPer-target options: { pinterest?: { board_id, board_name? }, reddit?: { subreddit }, discord?: { channel_ids: [] }, google_business?: { location_ids: [] }, caption_mode?: 'title_and_description' | 'split' | 'title', settings?: { <platform>: { ... } } }. Board ids come from list_pinterest_boards, channel ids from list_discord_channels. caption_mode: on YouTube, Pinterest, Reddit and Tumblr the title is the caption's first line; the description is the whole caption (title_and_description), the caption without its first line (split) or empty (title). settings: per-platform settings in the same camelCase shape as update_post's platform_settings (e.g. { youtube: { privacyStatus: 'unlisted', categoryId: '20' }, tiktok: { privacyLevel: 'SELF_ONLY' } }); anything unset uses the member's saved upload settings (YouTube defaults to public). Per-post fields (titles, alt text, subtitles, polls) are ignored.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
target_connection_idsNoConnections to repost to (ids from list_platform_connections), not the source. Pinterest needs target_options.pinterest.board_id and Reddit needs target_options.reddit.subreddit.

TDQS

A4.7/5.0
Behavior5/5

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

Adds substantial behavior beyond annotations: pause/resume semantics, what happens to scheduled posts via stop_action, that published posts remain, and that re-enabled new-posts workflows start from now without reposting missed posts. This is valuable disclosure for a destructive mutation.

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 the tool's job, then covers key caveats in a few dense sentences with no filler. Appropriate for a 15-parameter destructive update tool.

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 full schema coverage, annotations, and no output schema required, the description is complete enough. It also states the return value and the most important irreversible behaviors.

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 descriptions already cover all parameters, so the baseline is 3. The description adds cross-parameter meaning: immutable source/kind fields, pause state transitions, and scheduled-vs-new-posts behavior for enabled and stop_action.

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?

Uses a specific verb and resource and immediately distinguishes the operation as changing settings or pausing/resuming an existing workflow. Its scope is clear against create/delete/list workflow siblings.

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

Usage Guidelines4/5

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

Explains that any subset of settings may be passed and that source account/kind cannot be changed, directing the user to create a new workflow instead. It does not explicitly compare against every adjacent tool, but the main alternative condition is stated.

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

update_workspace_member_roleUpdate workspace member roleA
Destructive
Inspect

Changes a workspace member's role to member, admin or owner. Only the workspace owner can do this, and not on themselves. Setting role "owner" TRANSFERS OWNERSHIP: the acting owner is demoted to admin, so confirm with the user before doing that. Get user_id from list_workspace_members.

NameRequiredDescriptionDefault
roleYesNew role. owner transfers ownership.
user_idYesThe member's user_id from list_workspace_members.
workspace_idYesWorkspace to manage. Get from list_workspaces.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the destructiveHint annotation by explaining exactly what is destroyed: setting role to owner demotes the acting owner to admin, transferring ownership irreversibly. It also discloses the authorization constraint and the self-modification restriction, which 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.

Conciseness5/5

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

Four dense sentences, front-loaded with the action and the highest-risk consequence. No filler, no restatement of the title, and the warning appears before any parameter guidance.

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 three-required-parameter mutation with no output schema, the description supplies the permission model, the self-restriction, the ownership-transfer consequence, and the prerequisite lookup. Nothing an agent needs to call it safely is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are already documented, including the enum note that owner transfers ownership. The description largely restates that and the user_id provenance already stated in the schema, adding little parameter-level meaning beyond what is structured.

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?

Starts with a specific verb and resource ("Changes a workspace member's role") and enumerates the exact target values (member, admin, owner). An agent can distinguish this from invite_workspace_member or remove_workspace_member without opening any schema.

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

Usage Guidelines4/5

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

States the precondition clearly ("Only the workspace owner can do this, and not on themselves") and adds a confirmation requirement for the ownership-transfer case. It also routes the agent to list_workspace_members for the user_id, though it never names adjacent alternatives like remove_workspace_member or invite_workspace_member for role-adjacent operations.

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

upgrade_planGet upgrade linkAInspect

Creates a Stripe checkout link so the user can upgrade their ShortSync plan. Auto-detects the appropriate upgrade (Free → Creator, Creator → Team) unless you override with the plan parameter. Returns a one-click checkout URL the user can open to complete the upgrade. Call this when a publishing or scheduling tool returns an upload-limit or subscription error.

NameRequiredDescriptionDefault
planNoTarget plan. Auto-detected when omitted (Free users get "creator", Creator users get "team").
intervalNoBilling interval. Defaults to monthly. Yearly saves ~20%.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, openWorldHint=true, and destructiveHint=false, and the description is consistent with that, adding that an external Stripe checkout is created and a one-click URL is returned. It also discloses the auto-detection rules (Free → Creator, Creator → Team). It doesn't say whether repeated calls create multiple checkout sessions or what permissions/billing access the user needs, which keeps it from a 5.

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

Conciseness5/5

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

Three sentences, front-loaded with the action, then the default behavior, then the invocation trigger. Every sentence carries distinct information with no repetition.

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

Completeness5/5

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

With no output schema, the description appropriately states the return value (a one-click checkout URL). Two optional enum parameters are fully documented, and the trigger condition plus auto-detection cover everything an agent needs to invoke 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 both parameters have enums with full descriptions, so the schema already carries the semantics. The description's mention of the `plan` override merely restates the schema's auto-detection note and adds nothing about `interval` beyond what the schema says.

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 ('Creates a Stripe checkout link') plus the exact goal (upgrade the ShortSync plan). No sibling tool touches billing or upgrades, so an agent can identify this immediately from the name and description pair.

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

Usage Guidelines5/5

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

Explicitly names the trigger: 'Call this when a publishing or scheduling tool returns an upload-limit or subscription error.' It also explains the auto-detect default and the `plan` override path, so both the entry condition and the escape hatch are clear.

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

upsert_workspace_personSave workspace personA
Destructive
Inspect

Creates or updates a person in the workspace's mention list (the people the upload flow can @mention per platform). The person is matched by name, ignoring case. A new name creates a person. For an existing person, the handles you pass replace the stored ones for those platforms and the rest are kept; with merge_existing=false the existing person is returned unchanged. Use this to fill in a podcast guest's LinkedIn/Facebook/YouTube handles before the user drafts a post, so the mention popover in the upload flow has them ready. Keys in handles must be one of: instagram, tiktok, youtube, facebook, twitter, linkedin, threads, bluesky, pinterest, mastodon.

NameRequiredDescriptionDefault
nameYesDisplay name (e.g. 'John Smith'). Max 100 chars, cannot contain [ or ]. Uniqueness is enforced case-insensitively within the workspace, so 'John Smith' and 'john smith' are treated as the same person.
handlesNoPer-platform handle strings. Empty string clears a stored handle. Any handle for a platform not in instagram, tiktok, youtube, facebook, twitter, linkedin, threads, bluesky, pinterest, mastodon is rejected. LinkedIn handles are stored as-typed; the URN lookup only fires from the ShortSync UI.
workspace_idYesWorkspace to add the person to. Get from list_workspaces. The user must be a member.
platform_urnsNoPre-resolved platform URNs (currently only LinkedIn 'urn:li:organization:...' / 'urn:li:member:...'). Only set this if you already have the resolved URN; otherwise leave empty and let the ShortSync UI resolve it when the user next opens the person.
merge_existingNoWhen true (default), an existing person's handles/URNs are merged: keys you provide overwrite, keys you omit are kept. When false, existing rows are left untouched and the response says reused_existing=true.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the annotations, it explains case-insensitive matching by name, creation versus update behavior, per-platform handle replacement with omitted platforms preserved, and merge_existing=false leaving existing rows untouched. This clarifies exactly what the destructive update does and what is preserved, which is strong behavioral context.

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

Conciseness5/5

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

The description is front-loaded with what the tool does and how matching works, then adds update semantics, the intended use case, and the allowed handle keys. It is dense but every sentence contributes useful selection or invocation context.

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 six-parameter nested-object mutation with destructiveHint=true, the description covers purpose, matching, merge behavior, and handle constraints. It does not fully describe the success response shape, though schema notes on merge_existing partially cover that.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all six parameters, including allowed handle keys and merge semantics. The description reinforces the handle key restriction but adds little parameter 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.

Purpose4/5

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

The description states a specific CRUD-style operation on a well-defined resource: creates or updates a person in the workspace mention list used by the upload flow. It clearly separates this from generic post/upload tools, but does not explicitly contrast with siblings such as list_workspace_people or resolve_linkedin_mention.

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 concrete when-to-use scenario: filling in a podcast guest's LinkedIn/Facebook/YouTube handles before drafting so the mention popover is ready. It does not state when not to use it or name alternative tools, so it falls short of the 5-level alternative guidance.

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. 12 tool updates
    • Changedbatch_update_posts1 field changed
      • changedInput schema / properties / updates / items / properties / platform_settings / description
        Previous value: -"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Same for a paid partnership / sponsored post: Instagram isPaidPartnership (plus brandPartners, up to 2 brand usernames; needs Facebook Login for Instagram), TikTok commercialContentDisclosure + isBrandedContent, YouTube hasPaidProductPlacement. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; trialReel (boolean) and trialGraduationStrategy (SS_PERFORMANCE, the default, shares to followers automatically if it performs well; MANUAL means the user shares it from the Instagram app) on Instagram Reels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Same for a paid partnership / sponsored post: Instagram isPaidPartnership (plus brandPartners, up to 2 brand usernames; needs Facebook Login for Instagram), TikTok commercialContentDisclosure + isBrandedContent, YouTube hasPaidProductPlacement. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; poll ({ options, extended }) or commentPrompt on Instagram feed posts, carousels and Reels, and storyCaption on Instagram Stories (all beta); trialReel (boolean) and trialGraduationStrategy (SS_PERFORMANCE, the default, shares to followers automatically if it performs well; MANUAL means the user shares it from the Instagram app) on Instagram Reels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."
    • Addedcreate_comment_dm_rule
    • Addeddelete_comment_dm_rule
    • Changedinvite_workspace_member1 field changed
      • changedInput schema / properties / role / description
        Previous value: -"Role they get on accepting. Default member. client is a restricted role for agency clients (Team plan)."New value: +"Role they get on accepting. Default member. client is a restricted role for agency clients."
    • Addedlist_comment_dm_posts
    • Addedlist_comment_dm_rules
    • Addedlist_saved_replies
    • Changedmark_conversations_seen1 field changed
      • addedInput schema / properties / send_read_receipt
        Added value: +{
        +  "description": "Also send Instagram's read receipt, so the participant sees their message was seen. Applies to Instagram DMs whose last message is theirs and under 24 hours old; others are skipped. Default false.",
        +  "type": "boolean"
        +}
    • Changedreply_to_comment3 fields changed
      • addedInput schema / properties / attachments
        Added value: +{
        +  "description": "Instagram DMs only. Up to ten images, or a single PDF on its own. They're sent first, as their own message, and the text follows. Each item needs a type and exactly one of url or attachment_id.",
        +  "items": {
        +    "properties": {
        +      "attachment_id": {
        +        "description": "A Meta attachment id. Images only.",
        +        "type": "string"
        +      },
        +      "title": {
        +        "description": "Display name shown in the inbox.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "image",
        +          "file"
        +        ],
        +        "type": "string"
        +      },
        +      "url": {
        +        "description": "Public https URL Meta can fetch. Images: PNG, JPEG or GIF up to 8 MB. Files: PDF up to 25 MB.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / body / description
        Previous value: -"The reply text. Must be non-empty."New value: +"The reply text. Required unless attachments are given. Keep it under 1000 bytes when sending attachments."
      • changedInput schema / required
        Previous value: -[
        -  "conversation_id",
        -  "body"
        -]New value: +[
        +  "conversation_id"
        +]
    • Addedupdate_comment_dm_rule
    • Changedupdate_post1 field changed
      • changedInput schema / properties / platform_settings / description
        Previous value: -"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly (Story only, no Reel or feed post; single videos up to 60 seconds, single images and carousels, which go to Stories as one frame per slide with video slides over 60 seconds left out)/trialReel (boolean; Reels only: posts a Trial Reel shown to non-followers first)/trialGraduationStrategy (\"SS_PERFORMANCE\" (default): Instagram shares it with followers automatically if it performs well; \"MANUAL\": the user shares it from the Instagram app; Instagram has no time-based option)/isPaidPartnership/brandPartners (string[], up to 2 brand usernames on a paid partnership; needs Facebook Login for Instagram; for a sponsored post also set TikTok commercialContentDisclosure + isBrandedContent and YouTube hasPaidProductPlacement)/productTags (array of {product_id, x?, y?} from the account's Instagram Shop, single images and Reels; beta, needs Facebook Login for Instagram)/isAiGenerated (boolean — adds Instagram's \"AI info\" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly (single videos up to 60 seconds and single photos)/isAiGenerated (boolean; adds Facebook's \"AI info\" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility (\"PUBLIC\" | \"CONNECTIONS\" | \"LOGGED_IN\"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: \"ONE_DAY\" | \"THREE_DAYS\" | \"SEVEN_DAYS\" | \"FOURTEEN_DAYS\", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility (\"public\" | \"unlisted\" | \"private\"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention (\"none\" | \"here\" | \"everyone\", default \"none\"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain \"discord\"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no \"#\", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like \"AskReddit\", \"r/AskReddit\" also works, or \"u_username\" for the user's own profile; a bare name is always a subreddit, so \"jane\" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility (\"public\" | \"unlisted\" | \"private\", default \"public\"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: \"BOOK\" | \"ORDER\" | \"SHOP\" | \"LEARN_MORE\" | \"SIGN_UP\" | \"CALL\"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of \"spotlight\" and/or \"story\", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly (Story only, no Reel or feed post; single videos up to 60 seconds, single images and carousels, which go to Stories as one frame per slide with video slides over 60 seconds left out)/trialReel (boolean; Reels only: posts a Trial Reel shown to non-followers first)/trialGraduationStrategy (\"SS_PERFORMANCE\" (default): Instagram shares it with followers automatically if it performs well; \"MANUAL\": the user shares it from the Instagram app; Instagram has no time-based option)/isPaidPartnership/brandPartners (string[], up to 2 brand usernames on a paid partnership; needs Facebook Login for Instagram; for a sponsored post also set TikTok commercialContentDisclosure + isBrandedContent and YouTube hasPaidProductPlacement)/productTags (array of {product_id, x?, y?} from the account's Instagram Shop, single images and Reels; beta, needs Facebook Login for Instagram)/poll ({ options: 2 to 4 strings of max 25 chars, extended: boolean, keeps it open past 3 days }; feed posts, carousels and Reels, the caption is the question; beta, needs Facebook Login for Instagram or the post fails)/commentPrompt (boolean; the caption becomes a prompt answered in the comments; not with poll; beta, needs Facebook Login for Instagram or the post fails)/storyCaption (boolean; shows the caption on the Story, first frame only on carousels; beta)/isAiGenerated (boolean — adds Instagram's \"AI info\" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly (single videos up to 60 seconds and single photos)/isAiGenerated (boolean; adds Facebook's \"AI info\" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility (\"PUBLIC\" | \"CONNECTIONS\" | \"LOGGED_IN\"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: \"ONE_DAY\" | \"THREE_DAYS\" | \"SEVEN_DAYS\" | \"FOURTEEN_DAYS\", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility (\"public\" | \"unlisted\" | \"private\"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention (\"none\" | \"here\" | \"everyone\", default \"none\"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain \"discord\"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no \"#\", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like \"AskReddit\", \"r/AskReddit\" also works, or \"u_username\" for the user's own profile; a bare name is always a subreddit, so \"jane\" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility (\"public\" | \"unlisted\" | \"private\", default \"public\"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: \"BOOK\" | \"ORDER\" | \"SHOP\" | \"LEARN_MORE\" | \"SIGN_UP\" | \"CALL\"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of \"spotlight\" and/or \"story\", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand."
    • Changedupdate_posting_slots1 field changed
      • addedInput schema / properties / move_posts_past_limits
        Added value: +{
        +  "description": "Workspace setting, on by default. true moves a scheduled post to its next free slot when it hits a platform's daily limit; false lets it fail. Applies to everyone in the workspace.",
        +  "type": "boolean"
        +}
  2. 2 tool updates
    • Changedlist_scheduled_posts3 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "`next_cursor` from the previous page. Keep the other parameters the same.",
        +  "type": "string"
        +}
      • changedInput schema / properties / group_by_upload / description
        Previous value: -"Return `groups` instead of `posts`: one entry per upload and scheduled time, with the caption preview and each platform's post id and status. `limit` still counts posts."New value: +"Return `groups` instead of `posts`: one entry per upload and scheduled time, with the caption preview, content_type and each platform's post id and status. `limit` still counts posts, so an upload at the end of a page can continue on the next page as a second entry with the same video_upload_id and scheduled_for."
      • addedInput schema / properties / platform
        Added value: +{
        +  "description": "Only posts for this platform, e.g. 'instagram' or 'snapchat'.",
        +  "type": "string"
        +}
    • Changedlist_video_uploads2 fields changed
      • addedInput schema / properties / content_type
        Added value: +{
        +  "description": "Only uploads of this type: video, image, text or carousel.",
        +  "type": "string"
        +}
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "`next_cursor` from the previous page. Keep the other parameters the same.",
        +  "type": "string"
        +}
  3. 3 tool updates
    • Changedcreate_repurposing_workflow1 field changed
      • changedInput schema / properties / feed_url / description
        Previous value: -"With source_integration 'rss': a YouTube channel or playlist link (youtube.com/@name), an Apple Podcasts show link or an RSS/Atom feed URL. Not a single video. Feeds are checked about every 15 minutes."New value: +"With source_integration 'rss': an Apple Podcasts show link or an RSS/Atom feed URL. YouTube channel links are refused. Feeds are checked about every 15 minutes."
    • Changedimport_items1 field changed
      • changedInput schema / properties / source / enum
        Previous value: -[
        -  "canva",
        -  "opusclip",
        -  "klap",
        -  "twitch",
        -  "heygen",
        -  "descript",
        -  "onedrive",
        -  "box"
        -]New value: +[
        +  "canva",
        +  "opusclip",
        +  "klap",
        +  "twitch",
        +  "heygen",
        +  "descript",
        +  "onedrive",
        +  "box",
        +  "frameio"
        +]
    • Changedlist_import_items1 field changed
      • changedInput schema / properties / source / enum
        Previous value: -[
        -  "canva",
        -  "opusclip",
        -  "klap",
        -  "twitch",
        -  "heygen",
        -  "descript",
        -  "onedrive",
        -  "box"
        -]New value: +[
        +  "canva",
        +  "opusclip",
        +  "klap",
        +  "twitch",
        +  "heygen",
        +  "descript",
        +  "onedrive",
        +  "box",
        +  "frameio"
        +]
  4. 1 tool update
    • Changedupdate_post1 field changed
      • changedInput schema / properties / platform_settings / description
        Previous value: -"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly (Story only, no Reel or feed post; single videos up to 60 seconds and single images, not carousels)/trialReel (boolean; Reels only: posts a Trial Reel shown to non-followers first)/trialGraduationStrategy (\"SS_PERFORMANCE\" (default): Instagram shares it with followers automatically if it performs well; \"MANUAL\": the user shares it from the Instagram app; Instagram has no time-based option)/isPaidPartnership/brandPartners (string[], up to 2 brand usernames on a paid partnership; needs Facebook Login for Instagram; for a sponsored post also set TikTok commercialContentDisclosure + isBrandedContent and YouTube hasPaidProductPlacement)/productTags (array of {product_id, x?, y?} from the account's Instagram Shop, single images and Reels; beta, needs Facebook Login for Instagram)/isAiGenerated (boolean — adds Instagram's \"AI info\" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly (single videos up to 60 seconds and single photos)/isAiGenerated (boolean; adds Facebook's \"AI info\" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility (\"PUBLIC\" | \"CONNECTIONS\" | \"LOGGED_IN\"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: \"ONE_DAY\" | \"THREE_DAYS\" | \"SEVEN_DAYS\" | \"FOURTEEN_DAYS\", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility (\"public\" | \"unlisted\" | \"private\"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention (\"none\" | \"here\" | \"everyone\", default \"none\"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain \"discord\"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no \"#\", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like \"AskReddit\", \"r/AskReddit\" also works, or \"u_username\" for the user's own profile; a bare name is always a subreddit, so \"jane\" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility (\"public\" | \"unlisted\" | \"private\", default \"public\"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: \"BOOK\" | \"ORDER\" | \"SHOP\" | \"LEARN_MORE\" | \"SIGN_UP\" | \"CALL\"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of \"spotlight\" and/or \"story\", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly (Story only, no Reel or feed post; single videos up to 60 seconds, single images and carousels, which go to Stories as one frame per slide with video slides over 60 seconds left out)/trialReel (boolean; Reels only: posts a Trial Reel shown to non-followers first)/trialGraduationStrategy (\"SS_PERFORMANCE\" (default): Instagram shares it with followers automatically if it performs well; \"MANUAL\": the user shares it from the Instagram app; Instagram has no time-based option)/isPaidPartnership/brandPartners (string[], up to 2 brand usernames on a paid partnership; needs Facebook Login for Instagram; for a sponsored post also set TikTok commercialContentDisclosure + isBrandedContent and YouTube hasPaidProductPlacement)/productTags (array of {product_id, x?, y?} from the account's Instagram Shop, single images and Reels; beta, needs Facebook Login for Instagram)/isAiGenerated (boolean — adds Instagram's \"AI info\" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly (single videos up to 60 seconds and single photos)/isAiGenerated (boolean; adds Facebook's \"AI info\" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility (\"PUBLIC\" | \"CONNECTIONS\" | \"LOGGED_IN\"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: \"ONE_DAY\" | \"THREE_DAYS\" | \"SEVEN_DAYS\" | \"FOURTEEN_DAYS\", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility (\"public\" | \"unlisted\" | \"private\"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention (\"none\" | \"here\" | \"everyone\", default \"none\"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain \"discord\"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no \"#\", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like \"AskReddit\", \"r/AskReddit\" also works, or \"u_username\" for the user's own profile; a bare name is always a subreddit, so \"jane\" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility (\"public\" | \"unlisted\" | \"private\", default \"public\"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: \"BOOK\" | \"ORDER\" | \"SHOP\" | \"LEARN_MORE\" | \"SIGN_UP\" | \"CALL\"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of \"spotlight\" and/or \"story\", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand."
  5. 1 tool update
    • Changedcreate_repurposing_workflow3 fields changed
      • addedInput schema / properties / feed_url
        Added value: +{
        +  "description": "With source_integration 'rss': a YouTube channel or playlist link (youtube.com/@name), an Apple Podcasts show link or an RSS/Atom feed URL. Not a single video. Feeds are checked about every 15 minutes.",
        +  "type": "string"
        +}
      • changedInput schema / properties / source_integration / description
        Previous value: -"Repost clips from the user's connected Twitch channel instead of a platform account: every new clip (kind 'new_posts') or older clips on a timetable (kind 'existing'). Needs Twitch connected in Settings > Integrations. Can't be changed later."New value: +"'twitch': repost clips from the user's connected Twitch channel (needs Twitch connected in Settings > Integrations). 'rss': post items from the feed in feed_url. Either way every new item (kind 'new_posts') or older items on a timetable (kind 'existing'). Can't be changed later."
      • changedInput schema / properties / source_integration / enum
        Previous value: -[
        -  "twitch"
        -]New value: +[
        +  "twitch",
        +  "rss"
        +]
  6. 15 tool updates
    • Changedbatch_schedule_posts4 fields changed
      • addedInput schema / properties / recurrence
        Added value: +{
        +  "description": "\"Repeat this post\": publish the same post again on a cadence, like the app's Repeat option. scheduled_for is occurrence 1. Max 12 occurrences in total; each occurrence counts as one upload credit.",
        +  "properties": {
        +    "count": {
        +      "description": "Total occurrences including the first. Required when end_type is count.",
        +      "maximum": 12,
        +      "minimum": 2,
        +      "type": "integer"
        +    },
        +    "end_date": {
        +      "description": "Last day (YYYY-MM-DD, inclusive). Required when end_type is date.",
        +      "type": "string"
        +    },
        +    "end_type": {
        +      "description": "End after a number of occurrences (count) or on a date (end_date).",
        +      "enum": [
        +        "count",
        +        "date"
        +      ],
        +      "type": "string"
        +    },
        +    "interval": {
        +      "description": "Repeat every N units.",
        +      "maximum": 12,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "unit": {
        +      "enum": [
        +        "day",
        +        "week",
        +        "month"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "interval",
        +    "unit",
        +    "end_type"
        +  ],
        +  "type": "object"
        +}
      • changedInput schema / properties / scheduled_for / description
        Previous value: -"ISO 8601 timestamp for when all posts should publish. Max 1 year out. Times in the past are nudged to now + 30 seconds."New value: +"ISO 8601 timestamp for when all posts should publish. Max 1 year out. Times in the past are nudged to now + 30 seconds. Required unless use_next_slot is true."
      • addedInput schema / properties / use_next_slot
        Added value: +{
        +  "description": "Give each upload the next free saved posting time (see get_posting_slots) instead of one shared scheduled_for.",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "video_post_ids",
        -  "scheduled_for"
        -]New value: +[
        +  "video_post_ids"
        +]
    • Addedcreate_text_post
    • Addeddelete_published_post
    • Addeddelete_upload
    • Addedget_account_growth
    • Addedget_posting_slots
    • Addedinvite_workspace_member
    • Addedlist_workspace_invitations
    • Addedlist_workspace_members
    • Addedremove_workspace_member
    • Addedretry_post
    • Addedrevoke_workspace_invitation
    • Changedschedule_post4 fields changed
      • addedInput schema / properties / recurrence
        Added value: +{
        +  "description": "\"Repeat this post\": publish the same post again on a cadence, like the app's Repeat option. scheduled_for is occurrence 1. Max 12 occurrences in total; each occurrence counts as one upload credit.",
        +  "properties": {
        +    "count": {
        +      "description": "Total occurrences including the first. Required when end_type is count.",
        +      "maximum": 12,
        +      "minimum": 2,
        +      "type": "integer"
        +    },
        +    "end_date": {
        +      "description": "Last day (YYYY-MM-DD, inclusive). Required when end_type is date.",
        +      "type": "string"
        +    },
        +    "end_type": {
        +      "description": "End after a number of occurrences (count) or on a date (end_date).",
        +      "enum": [
        +        "count",
        +        "date"
        +      ],
        +      "type": "string"
        +    },
        +    "interval": {
        +      "description": "Repeat every N units.",
        +      "maximum": 12,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "unit": {
        +      "enum": [
        +        "day",
        +        "week",
        +        "month"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "interval",
        +    "unit",
        +    "end_type"
        +  ],
        +  "type": "object"
        +}
      • changedInput schema / properties / scheduled_for / description
        Previous value: -"ISO 8601 timestamp for when the post should publish. Max 1 year out."New value: +"ISO 8601 timestamp for when the post should publish. Max 1 year out. Required unless use_next_slot is true."
      • addedInput schema / properties / use_next_slot
        Added value: +{
        +  "description": "Schedule at the next free saved posting time for this workspace instead of scheduled_for. Fails when no posting times are saved (set them with update_posting_slots).",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "video_post_id",
        -  "scheduled_for"
        -]New value: +[
        +  "video_post_id"
        +]
    • Addedupdate_posting_slots
    • Addedupdate_workspace_member_role
  7. 2 tool updates
    • Changedbatch_update_posts1 field changed
      • changedInput schema / properties / updates / items / properties / platform_settings / description
        Previous value: -"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Same for a paid partnership / sponsored post: Instagram isPaidPartnership (plus brandPartners, up to 2 brand usernames; needs Facebook Login for Instagram), TikTok commercialContentDisclosure + isBrandedContent, YouTube hasPaidProductPlacement. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Same for a paid partnership / sponsored post: Instagram isPaidPartnership (plus brandPartners, up to 2 brand usernames; needs Facebook Login for Instagram), TikTok commercialContentDisclosure + isBrandedContent, YouTube hasPaidProductPlacement. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; trialReel (boolean) and trialGraduationStrategy (SS_PERFORMANCE, the default, shares to followers automatically if it performs well; MANUAL means the user shares it from the Instagram app) on Instagram Reels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."
    • Changedupdate_post1 field changed
      • changedInput schema / properties / platform_settings / description
        Previous value: -"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly (Story only, no Reel or feed post; single videos up to 60 seconds and single images, not carousels)/isPaidPartnership/brandPartners (string[], up to 2 brand usernames on a paid partnership; needs Facebook Login for Instagram; for a sponsored post also set TikTok commercialContentDisclosure + isBrandedContent and YouTube hasPaidProductPlacement)/productTags (array of {product_id, x?, y?} from the account's Instagram Shop, single images and Reels; beta, needs Facebook Login for Instagram)/isAiGenerated (boolean — adds Instagram's \"AI info\" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly (single videos up to 60 seconds and single photos)/isAiGenerated (boolean; adds Facebook's \"AI info\" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility (\"PUBLIC\" | \"CONNECTIONS\" | \"LOGGED_IN\"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: \"ONE_DAY\" | \"THREE_DAYS\" | \"SEVEN_DAYS\" | \"FOURTEEN_DAYS\", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility (\"public\" | \"unlisted\" | \"private\"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention (\"none\" | \"here\" | \"everyone\", default \"none\"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain \"discord\"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no \"#\", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like \"AskReddit\", \"r/AskReddit\" also works, or \"u_username\" for the user's own profile; a bare name is always a subreddit, so \"jane\" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility (\"public\" | \"unlisted\" | \"private\", default \"public\"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: \"BOOK\" | \"ORDER\" | \"SHOP\" | \"LEARN_MORE\" | \"SIGN_UP\" | \"CALL\"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of \"spotlight\" and/or \"story\", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly (Story only, no Reel or feed post; single videos up to 60 seconds and single images, not carousels)/trialReel (boolean; Reels only: posts a Trial Reel shown to non-followers first)/trialGraduationStrategy (\"SS_PERFORMANCE\" (default): Instagram shares it with followers automatically if it performs well; \"MANUAL\": the user shares it from the Instagram app; Instagram has no time-based option)/isPaidPartnership/brandPartners (string[], up to 2 brand usernames on a paid partnership; needs Facebook Login for Instagram; for a sponsored post also set TikTok commercialContentDisclosure + isBrandedContent and YouTube hasPaidProductPlacement)/productTags (array of {product_id, x?, y?} from the account's Instagram Shop, single images and Reels; beta, needs Facebook Login for Instagram)/isAiGenerated (boolean — adds Instagram's \"AI info\" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly (single videos up to 60 seconds and single photos)/isAiGenerated (boolean; adds Facebook's \"AI info\" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility (\"PUBLIC\" | \"CONNECTIONS\" | \"LOGGED_IN\"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: \"ONE_DAY\" | \"THREE_DAYS\" | \"SEVEN_DAYS\" | \"FOURTEEN_DAYS\", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility (\"public\" | \"unlisted\" | \"private\"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention (\"none\" | \"here\" | \"everyone\", default \"none\"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain \"discord\"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no \"#\", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like \"AskReddit\", \"r/AskReddit\" also works, or \"u_username\" for the user's own profile; a bare name is always a subreddit, so \"jane\" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility (\"public\" | \"unlisted\" | \"private\", default \"public\"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: \"BOOK\" | \"ORDER\" | \"SHOP\" | \"LEARN_MORE\" | \"SIGN_UP\" | \"CALL\"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of \"spotlight\" and/or \"story\", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand."
  8. 2 tool updates
    • Changedimport_items1 field changed
      • changedInput schema / properties / source / enum
        Previous value: -[
        -  "canva",
        -  "opusclip",
        -  "klap",
        -  "twitch",
        -  "heygen"
        -]New value: +[
        +  "canva",
        +  "opusclip",
        +  "klap",
        +  "twitch",
        +  "heygen",
        +  "descript",
        +  "onedrive",
        +  "box"
        +]
    • Changedlist_import_items2 fields changed
      • changedInput schema / properties / container_id / description
        Previous value: -"A project id from this tool's containers."New value: +"A project id from this tool's containers, or for onedrive and box a folder id (an item with type folder); the root when omitted."
      • changedInput schema / properties / source / enum
        Previous value: -[
        -  "canva",
        -  "opusclip",
        -  "klap",
        -  "twitch",
        -  "heygen"
        -]New value: +[
        +  "canva",
        +  "opusclip",
        +  "klap",
        +  "twitch",
        +  "heygen",
        +  "descript",
        +  "onedrive",
        +  "box"
        +]
  9. 2 tool updates
    • Changedcreate_repurposing_workflow3 fields changed
      • changedInput schema / properties / publish_order / description
        Previous value: -"Scheduled workflows: work through the source's posts newest or oldest first. Default newest."New value: +"Scheduled workflows: work through the source's posts newest or oldest first, or (Twitch only) most viewed first. Default newest."
      • changedInput schema / properties / publish_order / enum
        Previous value: -[
        -  "newest",
        -  "oldest"
        -]New value: +[
        +  "newest",
        +  "oldest",
        +  "most_viewed"
        +]
      • changedInput schema / properties / source_integration / description
        Previous value: -"Repost every new clip from the user's connected Twitch channel instead of a platform account. Needs Twitch connected in Settings > Integrations; kind must be 'new_posts'. Can't be changed later."New value: +"Repost clips from the user's connected Twitch channel instead of a platform account: every new clip (kind 'new_posts') or older clips on a timetable (kind 'existing'). Needs Twitch connected in Settings > Integrations. Can't be changed later."
    • Changedupdate_repurposing_workflow2 fields changed
      • changedInput schema / properties / publish_order / description
        Previous value: -"Scheduled workflows: work through the source's posts newest or oldest first. Default newest."New value: +"Scheduled workflows: work through the source's posts newest or oldest first, or (Twitch only) most viewed first. Default newest."
      • changedInput schema / properties / publish_order / enum
        Previous value: -[
        -  "newest",
        -  "oldest"
        -]New value: +[
        +  "newest",
        +  "oldest",
        +  "most_viewed"
        +]
  10. 3 tool updates
    • Changedcreate_repurposing_workflow3 fields changed
      • changedInput schema / properties / source_connection_id / description
        Previous value: -"The Instagram or Facebook Page connection to repost from (list_platform_connections). Can't be changed later."New value: +"The Instagram or Facebook Page connection to repost from (list_platform_connections). Omit when source_integration is set. Can't be changed later."
      • addedInput schema / properties / source_integration
        Added value: +{
        +  "description": "Repost every new clip from the user's connected Twitch channel instead of a platform account. Needs Twitch connected in Settings > Integrations; kind must be 'new_posts'. Can't be changed later.",
        +  "enum": [
        +    "twitch"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "workspace_id",
        -  "source_connection_id",
        -  "target_connection_ids"
        -]New value: +[
        +  "workspace_id",
        +  "target_connection_ids"
        +]
    • Addedimport_items
    • Addedlist_import_items
  11. 2 tool updates
    • Changedbatch_update_posts1 field changed
      • changedInput schema / properties / follow_up_comments / description
        Previous value: -"Up to 4 more comments after the first comment (5 per post in total), posted on the same platforms as the first comment. Shared by every post of the upload; passing it replaces the current list, [] clears it. On X, Threads, Bluesky, Mastodon and Pixelfed each one replies to the previous comment, so they read as a thread."New value: +"Up to 4 more comments after the first comment (5 per post in total), posted on the same platforms as the first comment. Shared by every post of the upload; passing it replaces the current list, [] clears it. Not posted on X, which only gets the first comment. On Threads, Bluesky, Mastodon and Pixelfed each one replies to the previous comment, so they read as a thread."
    • Changedupdate_post2 fields changed
      • changedInput schema / properties / follow_up_comments / description
        Previous value: -"Up to 4 more comments after the first comment (5 per post in total), posted on the same platforms as the first comment. Shared by every post of the upload; passing it replaces the current list, [] clears it. On X, Threads, Bluesky, Mastodon and Pixelfed each one replies to the previous comment, so they read as a thread."New value: +"Up to 4 more comments after the first comment (5 per post in total), posted on the same platforms as the first comment. Shared by every post of the upload; passing it replaces the current list, [] clears it. Not posted on X, which only gets the first comment. On Threads, Bluesky, Mastodon and Pixelfed each one replies to the previous comment, so they read as a thread."
      • changedInput schema / properties / platform_settings / description
        Previous value: -"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly/isPaidPartnership/brandPartners (string[], up to 2 brand usernames on a paid partnership; needs Facebook Login for Instagram; for a sponsored post also set TikTok commercialContentDisclosure + isBrandedContent and YouTube hasPaidProductPlacement)/productTags (array of {product_id, x?, y?} from the account's Instagram Shop, single images and Reels; beta, needs Facebook Login for Instagram)/isAiGenerated (boolean — adds Instagram's \"AI info\" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly/isAiGenerated (boolean; adds Facebook's \"AI info\" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility (\"PUBLIC\" | \"CONNECTIONS\" | \"LOGGED_IN\"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: \"ONE_DAY\" | \"THREE_DAYS\" | \"SEVEN_DAYS\" | \"FOURTEEN_DAYS\", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility (\"public\" | \"unlisted\" | \"private\"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention (\"none\" | \"here\" | \"everyone\", default \"none\"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain \"discord\"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no \"#\", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like \"AskReddit\", \"r/AskReddit\" also works, or \"u_username\" for the user's own profile; a bare name is always a subreddit, so \"jane\" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility (\"public\" | \"unlisted\" | \"private\", default \"public\"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: \"BOOK\" | \"ORDER\" | \"SHOP\" | \"LEARN_MORE\" | \"SIGN_UP\" | \"CALL\"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of \"spotlight\" and/or \"story\", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly (Story only, no Reel or feed post; single videos up to 60 seconds and single images, not carousels)/isPaidPartnership/brandPartners (string[], up to 2 brand usernames on a paid partnership; needs Facebook Login for Instagram; for a sponsored post also set TikTok commercialContentDisclosure + isBrandedContent and YouTube hasPaidProductPlacement)/productTags (array of {product_id, x?, y?} from the account's Instagram Shop, single images and Reels; beta, needs Facebook Login for Instagram)/isAiGenerated (boolean — adds Instagram's \"AI info\" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly (single videos up to 60 seconds and single photos)/isAiGenerated (boolean; adds Facebook's \"AI info\" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility (\"PUBLIC\" | \"CONNECTIONS\" | \"LOGGED_IN\"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: \"ONE_DAY\" | \"THREE_DAYS\" | \"SEVEN_DAYS\" | \"FOURTEEN_DAYS\", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility (\"public\" | \"unlisted\" | \"private\"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention (\"none\" | \"here\" | \"everyone\", default \"none\"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain \"discord\"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no \"#\", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like \"AskReddit\", \"r/AskReddit\" also works, or \"u_username\" for the user's own profile; a bare name is always a subreddit, so \"jane\" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility (\"public\" | \"unlisted\" | \"private\", default \"public\"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: \"BOOK\" | \"ORDER\" | \"SHOP\" | \"LEARN_MORE\" | \"SIGN_UP\" | \"CALL\"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of \"spotlight\" and/or \"story\", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand."
  12. 2 tool updates
    • Changedbatch_update_posts2 fields changed
      • addedInput schema / properties / first_comment_delay_minutes
        Added value: +{
        +  "description": "Minutes after the post goes live to post the first comment. 0 = right away (default). Up to 10080 (7 days). Shared by every post of the upload.",
        +  "maximum": 10080,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / follow_up_comments
        Added value: +{
        +  "description": "Up to 4 more comments after the first comment (5 per post in total), posted on the same platforms as the first comment. Shared by every post of the upload; passing it replaces the current list, [] clears it. On X, Threads, Bluesky, Mastodon and Pixelfed each one replies to the previous comment, so they read as a thread.",
        +  "items": {
        +    "properties": {
        +      "delay_minutes": {
        +        "description": "Minutes after the post goes live. 0 = right after the post (about a minute later, after the first comment).",
        +        "maximum": 10080,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "skip_platforms": {
        +        "description": "Platforms that skip this comment, e.g. [\"twitter\", \"linkedin\"].",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "text": {
        +        "description": "The comment text.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 4,
        +  "type": "array"
        +}
    • Changedupdate_post2 fields changed
      • addedInput schema / properties / first_comment_delay_minutes
        Added value: +{
        +  "description": "Minutes after the post goes live to post the first comment. 0 = right away (default). Up to 10080 (7 days). Shared by every post of the upload.",
        +  "maximum": 10080,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / follow_up_comments
        Added value: +{
        +  "description": "Up to 4 more comments after the first comment (5 per post in total), posted on the same platforms as the first comment. Shared by every post of the upload; passing it replaces the current list, [] clears it. On X, Threads, Bluesky, Mastodon and Pixelfed each one replies to the previous comment, so they read as a thread.",
        +  "items": {
        +    "properties": {
        +      "delay_minutes": {
        +        "description": "Minutes after the post goes live. 0 = right after the post (about a minute later, after the first comment).",
        +        "maximum": 10080,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "skip_platforms": {
        +        "description": "Platforms that skip this comment, e.g. [\"twitter\", \"linkedin\"].",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "text": {
        +        "description": "The comment text.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 4,
        +  "type": "array"
        +}
  13. 3 tool updates
    • Addedimport_opusclip_clips
    • Addedlist_opusclip_clips
    • Addedlist_opusclip_projects
  14. 3 tool updates
    • Changedbatch_update_posts1 field changed
      • changedInput schema / properties / updates / items / properties / platform_settings / description
        Previous value: -"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Same for a paid partnership / sponsored post: Instagram isPaidPartnership (plus brandPartners, up to 2 brand usernames; needs Facebook Login for Instagram), TikTok commercialContentDisclosure + isBrandedContent, YouTube hasPaidProductPlacement. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."
    • Addedcompare_instagram_accounts
    • Changedupdate_post1 field changed
      • changedInput schema / properties / platform_settings / description
        Previous value: -"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly/isPaidPartnership/brandPartners (string[], up to 2 brand usernames on a paid partnership; beta, needs Facebook Login for Instagram)/productTags (array of {product_id, x?, y?} from the account's Instagram Shop, single images and Reels; beta, needs Facebook Login for Instagram)/isAiGenerated (boolean — adds Instagram's \"AI info\" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly/isAiGenerated (boolean; adds Facebook's \"AI info\" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility (\"PUBLIC\" | \"CONNECTIONS\" | \"LOGGED_IN\"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: \"ONE_DAY\" | \"THREE_DAYS\" | \"SEVEN_DAYS\" | \"FOURTEEN_DAYS\", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility (\"public\" | \"unlisted\" | \"private\"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention (\"none\" | \"here\" | \"everyone\", default \"none\"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain \"discord\"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no \"#\", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like \"AskReddit\", \"r/AskReddit\" also works, or \"u_username\" for the user's own profile; a bare name is always a subreddit, so \"jane\" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility (\"public\" | \"unlisted\" | \"private\", default \"public\"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: \"BOOK\" | \"ORDER\" | \"SHOP\" | \"LEARN_MORE\" | \"SIGN_UP\" | \"CALL\"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of \"spotlight\" and/or \"story\", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly/isPaidPartnership/brandPartners (string[], up to 2 brand usernames on a paid partnership; needs Facebook Login for Instagram; for a sponsored post also set TikTok commercialContentDisclosure + isBrandedContent and YouTube hasPaidProductPlacement)/productTags (array of {product_id, x?, y?} from the account's Instagram Shop, single images and Reels; beta, needs Facebook Login for Instagram)/isAiGenerated (boolean — adds Instagram's \"AI info\" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly/isAiGenerated (boolean; adds Facebook's \"AI info\" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility (\"PUBLIC\" | \"CONNECTIONS\" | \"LOGGED_IN\"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: \"ONE_DAY\" | \"THREE_DAYS\" | \"SEVEN_DAYS\" | \"FOURTEEN_DAYS\", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility (\"public\" | \"unlisted\" | \"private\"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention (\"none\" | \"here\" | \"everyone\", default \"none\"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain \"discord\"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no \"#\", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like \"AskReddit\", \"r/AskReddit\" also works, or \"u_username\" for the user's own profile; a bare name is always a subreddit, so \"jane\" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility (\"public\" | \"unlisted\" | \"private\", default \"public\"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: \"BOOK\" | \"ORDER\" | \"SHOP\" | \"LEARN_MORE\" | \"SIGN_UP\" | \"CALL\"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of \"spotlight\" and/or \"story\", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand."
  15. 11 tool updates
    • Changedbatch_update_posts7 fields changed
      • addedInput schema / properties / caption
        Added value: +{
        +  "description": "Shared caption for every post in the call (an entry's own caption wins).",
        +  "type": "string"
        +}
      • addedInput schema / properties / description
        Added value: +{
        +  "description": "Shared description for every post in the call (an entry's own description wins).",
        +  "type": "string"
        +}
      • addedInput schema / properties / first_comment
        Added value: +{
        +  "description": "Shared first comment for every post in the call (an entry's own first_comment wins).",
        +  "type": "string"
        +}
      • addedInput schema / properties / title
        Added value: +{
        +  "description": "Shared title for every post in the call (an entry's own title wins).",
        +  "type": "string"
        +}
      • changedInput schema / properties / updates / description
        Previous value: -"Array of per-post edits (max 50). Each entry targets one video_post_id and may set any combination of text/settings fields."New value: +"Per-post edits (max 50 posts in total with video_post_ids). Each entry targets one video_post_id and may set any combination of text/settings fields."
      • addedInput schema / properties / video_post_ids
        Added value: +{
        +  "description": "Posts that get the top-level caption/title/description/first_comment and nothing else. Use with or instead of updates.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "updates"
        -]
    • Addedconnect_discord_webhook
    • Changedfinalize_video_upload2 fields changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Workspace the upload belongs to. Must match the workspace_id passed to create_video_upload."New value: +"Optional. Workspace the upload belongs to; found from upload_id when left out. If given, it must match the workspace_id passed to create_video_upload."
      • changedInput schema / required
        Previous value: -[
        -  "upload_id",
        -  "workspace_id"
        -]New value: +[
        +  "upload_id"
        +]
    • Addedget_connect_link
    • Addedget_workspace_status
    • Addedlist_facebook_pages
    • Addedlist_linkedin_authors
    • Changedlist_scheduled_posts1 field changed
      • addedInput schema / properties / group_by_upload
        Added value: +{
        +  "description": "Return `groups` instead of `posts`: one entry per upload and scheduled time, with the caption preview and each platform's post id and status. `limit` still counts posts.",
        +  "type": "boolean"
        +}
    • Addedselect_facebook_page
    • Addedselect_linkedin_author
    • Changedupdate_post1 field changed
      • changedInput schema / properties / platform_settings / description
        Previous value: -"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly/isPaidPartnership/isAiGenerated (boolean — adds Instagram's \"AI info\" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly/isAiGenerated (boolean; adds Facebook's \"AI info\" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility (\"PUBLIC\" | \"CONNECTIONS\" | \"LOGGED_IN\"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: \"ONE_DAY\" | \"THREE_DAYS\" | \"SEVEN_DAYS\" | \"FOURTEEN_DAYS\", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility (\"public\" | \"unlisted\" | \"private\"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention (\"none\" | \"here\" | \"everyone\", default \"none\"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain \"discord\"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no \"#\", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like \"AskReddit\", \"r/AskReddit\" also works, or \"u_username\" for the user's own profile; a bare name is always a subreddit, so \"jane\" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility (\"public\" | \"unlisted\" | \"private\", default \"public\"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: \"BOOK\" | \"ORDER\" | \"SHOP\" | \"LEARN_MORE\" | \"SIGN_UP\" | \"CALL\"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of \"spotlight\" and/or \"story\", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob for this post's platform. Shallow-merged into video_settings.platform_settings[platform] — keys you pass overwrite, keys you omit are preserved. Keys are stored in camelCase; snake_case keys are converted automatically. Shape is platform-specific: TikTok has privacyLevel, disableComment, disableDuet, disableStitch, isAigc (boolean — labels the post as AI-generated content), commercialContentDisclosure (boolean — must be true for isYourBrand/isBrandedContent to take effect), isYourBrand, isBrandedContent, and autoAddMusic (photo/carousel only — TikTok auto-picks background music); YouTube has tags/categoryId/playlistIds/privacyStatus/madeForKids/containsSyntheticMedia (boolean — AI/altered-content disclosure); Instagram has collaborators/userTags/locationId/shareToFeed/shareToStory/storyOnly/isPaidPartnership/brandPartners (string[], up to 2 brand usernames on a paid partnership; beta, needs Facebook Login for Instagram)/productTags (array of {product_id, x?, y?} from the account's Instagram Shop, single images and Reels; beta, needs Facebook Login for Instagram)/isAiGenerated (boolean — adds Instagram's \"AI info\" label)/altText (string, single image posts, alt text for screen readers, max 1000 chars)/altTexts (object, carousels: alt text per image keyed by the image's upload id); Facebook has shareToStory/storyOnly/isAiGenerated (boolean; adds Facebook's \"AI info\" label to Reels, photos and carousels, not to Stories or text posts); LinkedIn has visibility (\"PUBLIC\" | \"CONNECTIONS\" | \"LOGGED_IN\"; Company Pages always post PUBLIC), plus on text posts only either poll ({ question: max 140 chars, options: 2 to 4 strings of max 30 chars, duration: \"ONE_DAY\" | \"THREE_DAYS\" | \"SEVEN_DAYS\" | \"FOURTEEN_DAYS\", default SEVEN_DAYS }; single choice, can't be edited once posted) or document ({ url: public https URL to a .pdf, .ppt, .pptx, .doc or .docx up to 100 MB and 300 pages, title: name shown on the document }), not both; set either to null to remove it; Mastodon has visibility (\"public\" | \"unlisted\" | \"private\"), language (BCP-47), textOnly, and on text posts only poll ({ options: 2 to 4 strings of max 50 chars, durationMinutes: 5 to 10080, default 1440, multiple: boolean });X (twitter) and Threads also take poll on text posts only (the caption is the question): X { options: 2 to 4 strings of max 25 chars, durationMinutes: 5 to 10080, default 1440 }, Threads { options: 2 to 4 strings of max 25 chars }, open 24 hours; Telegram and Discord take poll on text posts with its own question: Telegram { question: max 300 chars, options: 2 to 10 strings of max 100 chars, multiple: boolean }, sent alone when the caption equals the question, otherwise right after the caption, and open until closed in Telegram; Discord { question: max 300 chars, options: 2 to 10 strings of max 55 chars, durationMinutes: whole hours 60 to 46080, default 1440, multiple: boolean }; Telegram has textOnly; Discord has channelIds (array of channel ids from list_discord_channels; omit to post to every default channel), silent (boolean — no push/desktop notifications), mention (\"none\" | \"here\" | \"everyone\", default \"none\"), threadName (forum post title, max 100 chars — needed for forum channels, falls back to the caption's first line), username (overrides the webhook's display name, max 80 chars, must not contain \"discord\"), and textOnly (boolean, video uploads only — sends just the caption as a plain channel message); Discord has no custom thumbnail, and its first comment (max 2000 chars) is posted only in forum channels, as the first reply in the post's thread; Tumblr has blogName (short name of one of the connection's blogs; omit to post to the primary blog), tags (array of strings, no \"#\", no commas, max 30), title (optional heading above the post text, max 4096 chars; overrides the shared title), and textOnly (boolean, video uploads only — posts just the title and post text as a text post); Tumblr's post text is the description (up to 5,000 chars), falling back to the caption; Tumblr has no custom thumbnail and no first comment; Reddit has subreddit (required; bare name like \"AskReddit\", \"r/AskReddit\" also works, or \"u_username\" for the user's own profile; a bare name is always a subreddit, so \"jane\" posts to r/jane, never to u/jane), title (the Reddit post title, max 300 chars; the publisher reads platform_settings.title first and only falls back to the upload's shared title when it's empty, so set it here to give Reddit its own title without touching other platforms' titles), nsfw (boolean, default false), and flairId (id from the subreddit's flair list; some subreddits require a flair); Reddit's post body is the description; Reddit has no carousels, no custom thumbnail and no first comment; Pixelfed has visibility (\"public\" | \"unlisted\" | \"private\", default \"public\"), sensitive (boolean, default false — blurs the media behind a warning), and spoilerText (content-warning text, max 140 chars, only used when sensitive is true); Pixelfed has no custom thumbnail, and its first comment (max 500 chars) is posted as a reply under the post; Google Business Profile (google_business) has locationIds (array of location ids from the google_business connection's `locations` in list_platform_connections; omit to post to the default locations; the post fans out to each), ctaType (optional button: \"BOOK\" | \"ORDER\" | \"SHOP\" | \"LEARN_MORE\" | \"SIGN_UP\" | \"CALL\"; null clears it), ctaUrl (http(s) link, required with every ctaType except CALL, which dials the profile's phone number), and textOnly (boolean, video uploads only; posts just the caption, since Google Business Profile can't post video); Google Business Profile has a 1500-character caption, no custom thumbnail and no first comment; Snapchat has formats (array of \"spotlight\" and/or \"story\", at least one) and skipSaveToProfile (boolean, Spotlight-only — hides the video from the Public Profile grid but keeps it in the discovery feed). Hashtags aren't a separate field on Snapchat — write them inline in the caption (Spotlight caption cap 160 chars; Story doesn't use the caption at all). Pinterest has link (destination URL where users land after tapping the pin, must be a full URL like https://example.com), boardId (target board ID — required for publishing), boardName (display name, optional), and altText (screen-reader text, max 500 chars). Call get_post_details first to see the current values, and only touch keys you understand."
  16. 1 tool update
    • Changedupsert_workspace_person1 field changed
      • changedInput schema / properties / platform_urns / description
        Previous value: -"Pre-resolved platform URNs (currently only LinkedIn 'urn:li:organization:...' / 'urn:li:member:...'). Only set this if you already have the resolved URN — otherwise leave empty and let the ShortSync UI resolve it when the user next opens the person."New value: +"Pre-resolved platform URNs (currently only LinkedIn 'urn:li:organization:...' / 'urn:li:member:...'). Only set this if you already have the resolved URN; otherwise leave empty and let the ShortSync UI resolve it when the user next opens the person."

Publisher details

Operator
Night Tech Oy (ShortSync) · Publisher source
Vendor relationship
First-party · Publisher source
Trust center
Not available
Restrictions
Available on every plan, including Free. Uploads and analytics syncs count against the plan's monthly upload quota (5 uploads a month on Free). Tool calls are limited to 60 per minute per token. · Publisher source

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    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.
    187 npm
    106
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    AI-powered social media posting across 14 platforms. Post to Twitter, Instagram, TikTok, Facebook, LinkedIn, YouTube and more with one command. AI adapts content per platform, schedules posts, and generates 30-day content calendars.
    6
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.