Skip to main content
Glama

Tailwind App

Server Details

Tailwind MCP server — list Pinterest accounts and create, schedule, and manage Pinterest posts.

Ownership verified
Status
Healthy
Uptime
62.0% over 22 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-03-26
URL
ChatGPT
Tailwind
Claude
–

TDQS

A4.1/5.0

Scored across 76 tools

Disambiguation3/5

The set has many closely related clusters: list_pins vs list_posts vs list_board_pins vs list_top_pins, three analytics tools, schedule vs timeslot tools, and multiple design/generation tools. The descriptions cross-reference each other well and usually explain the distinction, but the volume and subtle boundaries still create meaningful misselection risk.

Naming Consistency5/5

Tool names consistently use snake_case with a verb-first pattern, such as create_post, list_boards, update_feed, delete_timeslot, and schedule_post. Singular/plural variants like create_post/create_posts and update_post/update_posts are also used predictably.

Tool Count1/5

Seventy-six tools is far beyond a practical, well-scoped tool surface for this domain. Many specialized operations could be consolidated or hidden behind a smaller set of higher-level tools, and the sheer count imposes heavy selection burden.

Completeness5/5

The surface covers the Pinterest/Tailwind lifecycle comprehensively: accounts, boards, sections, board lists, pins, scheduling, timeslots, feeds, saved keywords, analytics, design operations, billing/usage, and feedback channels. The explicitly acknowledged missing Communities/Turbo Groups capability is handled through request_capability and is not a core lifecycle gap.

Available Tools

76 tools
cancel_generationA
DestructiveIdempotent
Inspect

Use this when the user wants to stop a Pin generation started by generate_pins_from_url before it runs. It only works while the generation is still queued: a cancelled generation is never charged and reads back as failed with failureCode generation-cancelled. Most generations start within seconds; after that the credits are committed and the cancel is refused, so poll get_generation_status until it finishes and use delete_post on any resulting drafts the user does not want. A 404 within ~10 seconds of starting the generation is a transient indexing artifact: retry the cancel, don't stop.

NameRequiredDescriptionDefault
generationIdYesGeneration ID returned by generate_pins_from_url

Output Schema

NameRequiredDescription
generationYes

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses billing semantics (never charged if cancelled), the resulting state (reads back as failed with failureCode generation-cancelled), the refusal condition, and a non-obvious transient 404 retry rule. The idempotentHint=true annotation is reinforced by 'retry the cancel, don't stop'.

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 its precondition, then layered with failure-mode guidance; nearly every sentence adds a distinct operational fact. It runs long and the 404 artifact note is niche, but it is not 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?

An output schema exists so return values need not be explained, and the description still covers the full lifecycle: eligibility window, billing outcome, failure code, refusal behavior, and recovery paths. Nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter is already documented as 'Generation ID returned by generate_pins_from_url', which the description restates rather than extends. Baseline 3 applies since the schema carries the parameter semantics.

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

Purpose5/5

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

States a specific verb and resource ('stop a Pin generation started by generate_pins_from_url') and ties it to the exact sibling that creates the object. An agent can distinguish it from get_generation_status and delete_post 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 explicit when-to-use ('while the generation is still queued'), when-not ('after that the credits are committed and the cancel is refused'), and named alternatives for each fallback path (poll get_generation_status, then delete_post on unwanted drafts). This is a complete routing decision tree.

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

connect_feedAInspect

Use this when the user wants Tailwind to automatically create Pins from their blog or RSS feed. Subscribes to a feed and assigns its Pins to one Pinterest account. This is an ongoing automation, not a one-time import: once a day, Tailwind checks the feed and drafts a SmartPin for each new post, and every generated Pin consumes SmartPin credits by its design tier — the same as a manual generation — so a busy feed drives ongoing credit use. Pins are created as drafts for review; nothing is scheduled or published automatically. Make sure the user understands that before connecting. The feed's current posts are snapshotted as the baseline, so nothing already published generates a Pin — only posts that appear after connecting do. feedUrl must be an actual feed URL: when you only have a site URL, or are not sure, call preview_feed first. accountId must be a currently connected account — a feed assigned to a disconnected one would be skipped every day without any error, so it is refused instead. A feed URL that is already connected returns a conflict error rather than a duplicate. Connecting itself spends no credits. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
feedUrlYesThe RSS feed URL to watch — the feedUrl from preview_feed, or a URL the user gave that is already a feed. Must use http or https.
keywordsNoKeywords applied to every Pin this feed generates, up to 50. Terms from list_saved_keywords work well here.
accountIdYesNumeric Tailwind account ID from list_accounts. Generated Pins are assigned to this account. Cannot be changed later.
designTierNoDesign treatment for generated Pins, which also sets what each one costs in SmartPin credits. Defaults to basic. premium requires premiumStyle.
premiumStyleNoRequired when designTier is premium, and must be null or absent otherwise. Send null when moving a feed off the premium tier so its stored style is cleared.
autoRegenerateNoWhether each Pin this feed generates keeps being periodically redesigned on the generationFrequency cadence. Each redesign is a SmartPin generation of its own.
generationFrequencyNoHow often each generated Pin is redesigned when autoRegenerate is on. This is NOT how often the feed is checked for new posts — that is once a day, always.

Output Schema

NameRequiredDescription
feedYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say this is a non-read-only, non-idempotent, open-world write; the description goes far beyond them by disclosing daily polling cadence, per-Pin SmartPin credit consumption by design tier, that Pins arrive as unscheduled drafts, that a baseline snapshot suppresses existing posts, that duplicate feeds return a conflict, and that disconnected accounts are rejected. It also notes connecting itself costs no credits, which resolves the most likely user objection.

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 purpose and the ongoing-automation framing before cost and edge cases, and nearly every sentence carries decision-relevant information. It runs long (roughly eleven sentences) and folds cost, baseline, and error behavior together without structural signposting, which makes it slower to scan than it needs to be.

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

Completeness5/5

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

Given an output schema, full parameter descriptions, and annotations, the description supplies exactly the behavioral context structured fields cannot express: recurring credit cost, draft status, baseline snapshot, conflict and disconnected-account failure modes. Nothing an agent needs before calling 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 semantics: feedUrl must be a genuine feed URL with preview_feed as the fallback, accountId must be a currently connected account because a disconnected one fails silently, and the account choice must be confirmed with the user. It leaves designTier, premiumStyle, autoRegenerate, and generationFrequency 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 — subscribes to a feed and assigns its generated Pins to one Pinterest account — and immediately disambiguates it from one-time imports and from the preview/update siblings. An agent can distinguish it from connect_pinterest_account, generate_pins_from_url, and update_feed 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 triggering condition (user wants automatic Pin creation from a blog/RSS feed), an explicit non-use case (not a one-time import), a routing rule to preview_feed when only a site URL is available, and a pre-call clarification step with list_accounts when multiple accounts exist. Exclusions and alternatives are both named.

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

connect_pinterest_accountA
Read-onlyIdempotent
Inspect

Use this when the user wants to connect another Pinterest account to Tailwind, asks how many Pinterest accounts their plan allows, or has an account whose tokenStatus is unauthorized in list_accounts or get_account. Returns a link the user opens in their browser to finish connecting through Pinterest. Pass accountId to re-authorize that existing account; omit it to add a new one. Adding a new account is checked first: when the user is not an organization admin or the plan has no room, no link is returned and the response says why. Calling this changes nothing: the account is connected, and any billing change is shown, only when the user completes the flow in the browser. The browser must be signed in to the same Tailwind organization, and to the Pinterest account the user wants to connect, because Pinterest connects whichever Pinterest account is signed in.

NameRequiredDescriptionDefault
accountIdNoNumeric Tailwind account ID from list_accounts to re-authorize. Omit to add a new Pinterest account.

Output Schema

NameRequiredDescription
urlYesLink for the user to open in a browser. Null when blocked is set.
actionYesWhether the link adds a new account or re-authorizes accountId
blockedYesWhy a new account cannot be added; null when it can
accountLimitYesPinterest accounts the plan allows. Null when the plan has no account cap, and on reconnect links.

TDQS

A4.7/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: it returns a browser link, no account/billing change occurs until the user completes the browser flow, new-account checks can fail before returning a link, and the browser must be signed into the correct Tailwind organization and Pinterest account. This is consistent with readOnlyHint, openWorldHint, and idempotentHint.

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 triggering conditions, then explains return behavior, the accountId branch, gating, and browser prerequisites. Every sentence contributes operational context for a tool with a multi-step external flow.

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?

Complete for this tool: annotations cover safety and openness, an output schema exists, and the description still supplies the critical external-flow prerequisites and gating behavior that structured fields do not capture.

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 schema already documents accountId as the Tailwind account ID from list_accounts for re-authorization and omission for adding a new account. The description reinforces that distinction but does not add much parameter 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 specific verb and resource: connect a Pinterest account to Tailwind. It also explicitly references list_accounts and get_account for detecting unauthorized tokenStatus, so an agent can distinguish this action from the read-only sibling tools.

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

Usage Guidelines5/5

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

Gives explicit triggers: user wants to connect another Pinterest account, asks about plan account limits, or has an unauthorized tokenStatus. It also explains the accountId branch clearly: pass it to re-authorize an existing account, omit it to add a new one, and notes the admin/plan-room precheck for new accounts.

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

create_boardAInspect

Use this when the user wants a new Pinterest board: creates a board on their account (accountId from list_accounts) and returns its numeric boardId, ready to pass to create_post or schedule_post. Creating a board is free — it does not consume Pin credits. Use the boardId this returns rather than re-listing to find the board: list_boards is served from a cache, so a just-created board may not appear in it yet. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
nameYesBoard name, up to 180 characters
privacyNoWhether the board is visible on the Pinterest profile. Defaults to public; a secret board is visible only to the account owner and its collaborators.
accountIdYesNumeric Tailwind account ID returned by list_accounts
descriptionNoOptional board description, up to 500 characters

Output Schema

NameRequiredDescription
boardYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare the mutation/safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the description's job is to add context — which it does with the credit-cost fact and the cache-lag caveat for list_boards. It stops short of stating permissions/scope requirements or failure modes for the create call itself.

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?

Content is front-loaded on the trigger and return value, and every sentence carries operational information (credits, cache behavior, account disambiguation). It is on the long side for one tool but has no filler.

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

Completeness5/5

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

With an output schema present the description needn't detail the return shape, yet it still names boardId and its downstream consumers (create_post, schedule_post). Combined with the annotated safety profile and full schema coverage, an agent has everything needed to call it correctly.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents name, privacy, accountId, and description. The description only reinforces the accountId source, adding no new semantics for privacy or the description field 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?

Opens with a precise verb+resource+scope ('creates a board on their account') and makes the return value explicit (numeric boardId). It is clearly distinguishable from create_board_section, create_board_list, and list_boards by naming what it does and where its output goes.

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 ('when the user wants a new Pinterest board'), the prerequisite path (accountId from list_accounts), and an explicit disambiguation/instruction to ask the user when multiple accounts exist rather than choosing. It also routes the agent away from the list_boards alternative for retrieving the new board.

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

create_board_listAInspect

Use this when the user wants a saved board list: a named, ordered grouping of their boards, used to publish one Pin across those boards with create_post's intervalBoards. A board list is Tailwind's own grouping, so saving one changes nothing on Pinterest, and it is free — it does not consume Pin credits. Give the boards in publishing order, by boardId from list_boards (or one create_board just returned). The response gives the new list's boardListId. Calling twice saves two lists, so if a call's outcome is unclear, check list_board_lists before retrying. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
nameYesBoard list name, up to 255 characters
boardsYesEvery board the list holds, in publishing order. Each board may appear only once. Interval Pinning takes at most 20 boards per Pin, so a list longer than that cannot be passed whole as create_post's intervalBoards.
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
boardListYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only flag non-read-only, non-idempotent, non-destructive; the description goes well beyond that by disclosing that the action is Tailwind-local and changes nothing on Pinterest, is free (no Pin credits), and that duplicate calls create duplicate lists. The retry guidance and the 20-board interval-pinning limit are exactly the behavioral context annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the trigger condition, then progressively adds cost, ordering, return value, idempotency, and account selection — a sensible priority order. It is on the long side and the "it is free — it does not consume Pin credits" clause is slightly redundant, but no sentence is filler.

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

Completeness5/5

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

For a 3-parameter write tool with an output schema, nothing material is missing: the data source for boardId, ordering semantics, cost, side-effect scope, duplicate-call risk, retry path, and account ambiguity are all addressed, so 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.

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 adds meaning by specifying that boards must be supplied in publishing order and that boardId values come from list_boards or a just-created create_board, plus noting the returned boardListId. It stops short of covering name constraints or the per-board section option, which the schema already handles.

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 ("create a saved board list") and immediately defines the resource: "a named, ordered grouping of their boards." It also ties the object to a downstream use (create_post's intervalBoards), which distinguishes it cleanly from siblings like update_board_list, list_board_lists, and delete_board_list.

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 when the user wants a saved board list"), names the alternative for the ambiguous-retry case (check list_board_lists before retrying), and routes account disambiguation to list_accounts with instructions to ask the user rather than choose. Exclusions and prerequisites are both present.

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

create_board_sectionAInspect

Use this when the user wants to add a section to a Pinterest board: creates a named section on a board by boardId (from list_boards, excluding collaborator entries, whose structure this account cannot change) and returns its section ID. Creating a section is free — it does not consume Pin credits. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
nameYesSection name, up to 180 characters
boardIdYesNumeric Pinterest board ID returned by list_boards — never a board name or URL
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
sectionYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the lower bar applies. The description still adds non-obvious context beyond them: section creation consumes no Pin credits, and collaborator-owned board structure is immutable. It does not cover behavior on duplicate section names or failure modes, which would be needed for 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, each carrying distinct and necessary information: purpose plus return value, cost, then the account-selection precondition. No filler and no restatement of the name or schema fields.

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?

An output schema exists, so return values need no elaboration, and the description still names the section ID. With annotations covering the mutation profile, the description supplies the remaining decision-critical context: valid boardId source, cost, and account-selection behavior.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description goes beyond it by constraining which boardIds are valid — those from list_boards, excluding collaborator entries — a selection rule the schema does not state. It adds nothing about the name parameter's 180-character limit or accountId resolution, but that is already in 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 a named section on a board") with the identifying key (boardId) and the return value (section ID). It is clearly distinct from create_board, update_board_section, and delete_board_section in the sibling list.

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?

Opens with an explicit trigger ("Use this when the user wants to add a section to a Pinterest board") and adds a real exclusion: boards that appear as collaborator entries in list_boards cannot be used. It also gives a concrete disambiguation rule for accountId when list_accounts returns multiple accounts, telling the agent to ask rather than guess.

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

create_media_uploadAInspect

Use this when the user wants to Pin their own image or video file: a Canva export, a photo or video on disk, anything without a publicly accessible URL. Creates a single-use upload in Tailwind's media staging and returns its uploadId, a write-only uploadUrl, the contentType that uploadUrl accepts, and two expiry times: one for uploadUrl and a later one for uploadId. The tool has two modes. With file, an attachment object that the host application supplies for a file the user attached, the server downloads the attachment and stages its bytes during the call, so the returned uploadId already refers to the staged media. Hosts that do not supply attachment objects leave file out and use the extension mode. With only extension, nothing is staged yet: the bytes are staged when they are sent to uploadUrl in an HTTP PUT whose Content-Type equals contentType. create_post accepts the uploadId as its uploadId input, in place of mediaUrl. Each uploadId attaches to exactly one Pin. Creating an upload costs no credits. Not for media that already has a public URL, which create_post takes directly as mediaUrl.

NameRequiredDescriptionDefault
fileNoAn attachment object for a file the user attached, filled in by the host application. Only the host can supply it: an object you construct yourself, or a file path, is not a valid value. If the host does not provide one, omit this and use `extension` with uploadUrl. When it is present the server downloads the file and stages its bytes during the call, so no PUT to uploadUrl is involved.
extensionYesThe file's extension, with or without a leading dot and in any case (jpg, .PNG, mp4). It determines both the upload's media type and the Content-Type the signed URL is issued for. Accepted: jpg, jpeg, png, svg, gif, webp, heic, mp4, mov, qt. When `file` is also present its mime_type/file_name take precedence, so a wrong guess here is not fatal.

Output Schema

NameRequiredDescription
uploadYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, idempotentHint=false, openWorldHint=true), it discloses that the upload is single-use, that uploadId binds to exactly one Pin, that expiry windows differ for uploadUrl vs uploadId, that the URL is write-only, and that creating an upload costs no credits. It also explains the two internal modes and exactly when a PUT is or is not required.

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 critical routing information (when to use, when not, alternative) is front-loaded, and the mode explanation follows logically. It runs long for a two-parameter tool, and restating the return payload slightly duplicates the output schema, but most sentences carry operational weight.

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?

An agent has everything needed to call it correctly and to chain into create_post, and the two-mode branching (host attachment vs. extension + PUT) is fully spelled out. With an output schema present, the description need not explain returns, yet it adds useful framing about expiry ordering.

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%, but the description adds the mode-level framing: `file` is host-supplied only and triggers server-side download during the call, while `extension` alone stages nothing until an HTTP PUT with the matching Content-Type. That is real semantic value, though some of it duplicates the schema's own text about omitting `file` and using `extension`.

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 — creating a single-use media upload in Tailwind's staging — and immediately scopes it to user-owned files without a public URL. It explicitly contrasts with create_post/mediaUrl, so an agent can distinguish it from siblings 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?

It gives concrete when-to-use examples (Canva export, photo or video on disk) and an explicit when-not: media with a public URL should go to create_post as mediaUrl. It even tells the agent which sibling consumes the output (create_post's uploadId input), 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_postAInspect

Use this when the user wants to create a Pinterest Pin from an image or video — as a draft (omit both sendAt and useNextOpenSlot), or published on a schedule. A draft is saved in Tailwind only: nothing is created on Pinterest, so it does not appear in Pinterest's own drafts or on the user's profile, and it stays unpublished until it is scheduled with schedule_post. To schedule, pass title, description, url, EITHER boardId (numeric ID from list_boards) or intervalBoards, and ONE of: useNextOpenSlot: true, which places the Pin in the account's next open smart schedule slot, or sendAt, an explicit ISO 8601 time. To publish the SAME Pin to several Boards spaced over time — Tailwind's interval Pinning, and what a saved Board list describes — pass intervalBoards instead of boardId, with intervalType for the spacing; do that rather than calling create_post once per Board, which would publish them all at once. Prefer useNextOpenSlot whenever the user has not named a specific time ("schedule this", "post it at a good time", "add it to my queue") — Tailwind's smart schedule is the product, and it applies the account's Pin Spacing rules for the destination URL, which an invented timestamp cannot. Reserve sendAt for a time the user actually asked for. Scheduling is the charged step — drafts are free, and what a scheduled Pin costs depends on the account's billing: modular-billing accounts with Publishing access, whether subscribed or granted, spend one Pin credit per Pin, except on winback plans, which schedule without charge; modular accounts without Publishing draw on a limited free-trial allowance; and legacy and Shopify accounts spend no credits at all, bounded by their plan's post limit for the billing period instead. To put the Pin in a Board section, pass boardSectionId alongside boardId (from list_board_sections). The media comes from exactly one of two sources: mediaUrl for anything with a public URL, or uploadId for the user's own file bytes, staged first with create_media_upload. To create a multi-image carousel Pin instead of a single image, pass carouselItems: two to five images total, the cover in mediaUrl/uploadId and the rest as carouselItems, each with its own mediaUrl or uploadId — images only, no product tags, and every image must share the same width-to-height ratio. Returns the new Pin's postId. To change an existing Pin's title, description, link, Board, Board section, alt text or product tags, use update_post rather than deleting and recreating it — only a change of image needs delete_post plus a fresh create_post. To schedule an existing draft, use schedule_post. Neither this tool nor a Pinterest Pin has a keyword field: a keyword reaches Pinterest only as words in the Pin's title or description. Tailwind keeps keywords in the organization's Saved Keywords list, where each term can be tied to destination URLs; that list is what the Pin Scheduler's Add keywords control shows for a Pin's link. list_saved_keywords with url returns the keywords saved for a Pin's link, and save_keywords with urls adds terms to that list. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
urlNoDestination URL when the pin is clicked. Required when scheduling — it is also what Pin Spacing rules are keyed on, so useNextOpenSlot needs it.
titleNoPin title (max 100 characters). Required when scheduling.
sendAtNoExplicit publish time (ISO 8601, e.g. 2025-01-15T10:00:00Z), in the future. Use only when the user named a specific time — otherwise use useNextOpenSlot. Cannot be combined with useNextOpenSlot. Omit both for a draft. Requires title, description, url, and either boardId or intervalBoards. It sets only the initial time and is not an exemption from Pin Spacing: a later respace or schedule shuffle can still move the Pin.
altTextNoAlt text for accessibility (max 500 characters)
boardIdNoTarget Pinterest board ID. Must be the numeric board ID (e.g. "1106196864631757445") from list_boards — not a board name or URL. Required when scheduling.
mediaUrlNoPublicly accessible URL of the image or video to pin. Exactly one of mediaUrl or uploadId is required; must be omitted when uploadId is provided.
uploadIdNoThe uploadId from create_media_upload, once its bytes are staged: during that call when it carried an attached file, otherwise by a PUT to its uploadUrl. This is how a file with no public URL gets pinned. Single-use: it can be attached to exactly one Pin. Exactly one of mediaUrl or uploadId is required; must be omitted when mediaUrl is provided.
accountIdYesNumeric Tailwind account ID returned by list_accounts
mediaTypeNoType of media (default: image). Ignored when uploadId is provided — the upload's own extension already determined its type.
descriptionNoPin description (max 800 characters). Required when scheduling.
intervalDaysNoExact number of days between Boards, overriding intervalType's preset. Use for a gap the presets do not cover — e.g. intervalType "weekly" with intervalDays 14 for a fortnight.
intervalModeNoHow each Board's time is chosen. "slots" (the default) lands every Board on a real smart schedule slot, so the gap may stretch when slots are full — prefer it. "exact" lands each Board exactly the interval after the previous one, keeping the first Pin's time of day, and ignores the schedule.
intervalTypeNoHow far apart the Boards publish. Required with intervalBoards, and only valid with it.
carouselItemsNoTurns this into a carousel Pin: further images in order after the cover in mediaUrl/uploadId, one to four entries so the carousel holds two to five images total (Pinterest's limit). Images only — a video carousel is rejected, as are product tags, and every image (cover included) must share the same width-to-height ratio. Each entry takes a mediaUrl or an uploadId, and the two forms can be mixed across entries.
boardSectionIdNoSection of boardId to publish into. Requires boardId, and is rejected if it is not a section of that board. Omit to publish to the board root. Use list_board_sections to look up section IDs.
intervalBoardsNoPublish this one Pin across several Boards, spaced out over time — Tailwind's interval Pinning. Give the Boards in the order they should publish; the first is the Board the Pin itself lands on and the rest follow one interval apart. Use this instead of boardId whenever the user wants one image on several Boards ("pin this to all my recipe boards", "spread this across my boards weekly"), rather than calling create_post once per Board — that would publish them all at the same time, for the same cost. Requires intervalType, and sendAt or useNextOpenSlot. Cannot be combined with boardId. Each Board becomes its own scheduled Pin and is charged accordingly: one Pin credit each on modular billing with Publishing access (winback plans excepted), and no credits on legacy and Shopify accounts, where they count against the plan's post limit instead.
isSimplifiedPinNoWhether to create a simplified pin (default: true). Set to false for a standard pin.
useNextOpenSlotNoSchedule into the account's next open smart schedule slot, honoring its Pin Spacing rules for this Pin's url. Use this instead of computing a time yourself whenever the user has not named one. Cannot be combined with sendAt. Omit both for a draft. Requires title, description, url, and either boardId or intervalBoards.
productTagPinIdsNoPinterest product-catalog pin IDs to tag on the pin (business accounts only; max 24). Providing any forces a simplified pin, since Pinterest rejects tags on standard pins.

Output Schema

NameRequiredDescription
postYes
intervalPostsNoEvery Pin an intervalBoards create produced, in Board order and including `post` itself. Absent for a single-Board Pin. This is the only place the grouping appears — each Pin is stored as an ordinary single-Board Pin, so a later get_post or list_posts cannot tell they belong together. Keep these IDs if the user may want to change or delete the set.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), and the description adds the non-obvious consequences: a draft exists only in Tailwind and never reaches Pinterest, scheduling is the charged step with a per-billing-model cost breakdown, uploadId is single-use, and each intervalBoards entry becomes its own charged Pin. Nothing here conflicts with 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.

Conciseness3/5

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

It is front-loaded correctly — prose before scheduling before media before sibling routing — but at roughly 600 words it over-runs what a tool description needs. The keyword paragraph wanders into Saved Keywords behavior and two other tools' semantics, and the modular/legacy/winback billing breakdown is longer than the decision it supports.

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 19-parameter mutation tool this leaves nothing material unsaid: draft vs. publish semantics, required field combinations, carousel constraints, section placement, cost model, account disambiguation, and the return value (postId, also covered by the output schema). An agent has everything needed to call it correctly on the first attempt.

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 100% schema coverage the schema already documents each parameter, so per the baseline this would be a 3. The description earns one more by adding cross-parameter semantics the schema states only locally: the media source must be exactly one of mediaUrl/uploadId, boardSectionId goes alongside boardId and must belong to that board, and intervalBoards requires intervalType plus sendAt or useNextOpenSlot. The carousel ratio/mixed-source rules are also restated in prose form an agent can act on.

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

Purpose5/5

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

The opening sentence names a specific verb and resource (create a Pinterest Pin) and immediately splits the two modes — draft vs. scheduled — with the exact parameter condition distinguishing them. It also names the siblings it is not (schedule_post, update_post, delete_post, create_media_upload, create_post called per-Board), so an agent can place it in the toolset without opening a schema.

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

Usage Guidelines5/5

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

Explicit routing rules throughout: use useNextOpenSlot when the user named no time, reserve sendAt for an explicitly named time, use intervalBoards rather than calling create_post once per Board, use update_post for edits and delete_post plus a fresh create_post only for an image change, and ask the user which account when list_accounts returns several. Each alternative comes with the condition that selects it.

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

create_postsAInspect

Use this when the user wants many Pinterest Pins created at once, such as importing a spreadsheet or a list of Pins: up to 175 Pins in one call, each with its own image, title, description, link, Board and schedule. Each entry takes the same fields as create_post except intervalBoards and carouselItems, which a batch refuses per entry; those Pins go through create_post one at a time. A draft entry (no sendAt and no useNextOpenSlot) may leave out the image if it has a title, description or url: it is saved with Tailwind's placeholder image, and the user adds the real image later with Change media in Tailwind's Pin Scheduler, since these tools cannot change a Pin's image. The call returns a batchId straight away and the Pins are created in the background, one at a time in the order given; get_post_batch reports each entry as created, failed or pending. A batch the account cannot pay for is refused whole, with nothing created. Each scheduled entry is charged as create_post would charge it, and drafts are free. Submitting the identical batch again within 7 days returns the original batch rather than creating its Pins twice. To retry the entries that failed, put only those entries in a new create_posts call with retryOfBatchId set to the batch they failed in. For a larger import, split it into batches of up to 175. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
postsYesOne entry per Pin, each with create_post's fields except intervalBoards and carouselItems. Results come back in this order.
accountIdYesNumeric Tailwind account ID returned by list_accounts
retryOfBatchIdNoWhen resending entries that failed, the batchId they failed in. Without it, resending the exact entries of a batch returns that batch instead of trying them again.

Output Schema

NameRequiredDescription
batchYes

TDQS

A4.8/5.0
Behavior5/5

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

Adds substantial behavior beyond annotations: asynchronous return of a batchId with background creation in order, per-entry failure states readable via get_post_batch, all-or-nothing refusal on insufficient funds, per-entry charging with free drafts, 7-day duplicate-batch dedupe, and the placeholder-image limitation that the tools cannot change a Pin's image. The dedupe behavior is a useful nuance alongside idempotentHint=false and does not contradict it.

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 trigger condition and batch size, but the remainder is a single dense run-on paragraph mixing charging, dedupe, retry, and account-selection rules. Every sentence carries information, yet splitting into shorter statements would improve scannability without loss.

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=false, non-idempotent bulk mutation with an output schema, the description covers what an agent needs: batching limits, async result model, failure recovery, cost side effects, and account disambiguation. Nothing essential to 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 still adds value by stating that entries take create_post's fields minus intervalBoards and carouselItems, that draft entries may omit the image while scheduled ones may not, and how retryOfBatchId overrides the duplicate-batch shortcut. It stops short of clarifying per-field nuances beyond the schema, so it earns a 4 rather than 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+scale ('many Pinterest Pins created at once... up to 175 Pins in one call') and immediately differentiates from the sibling create_post for entries that can't be batched. An agent can distinguish create_posts from create_post, schedule_post, and create_media_upload 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?

Explicitly names alternatives and conditions: intervalBoards/carouselItems go through create_post one at a time, larger imports split into batches of 175, failed entries retried via a new create_posts with retryOfBatchId, and the account must be confirmed with list_accounts when ambiguous. This is when-to/when-not coverage rather than implied usage.

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

create_timeslotAInspect

Use this when the user wants to add a posting time to their recurring weekly schedule: creates one smart schedule timeslot on the given day at the given time. Free — managing the schedule costs no credits, in the dashboard or here. This changes WHEN future Pins publish; it does not schedule a Pin. To put a specific Pin on the schedule, use create_post or schedule_post with useNextOpenSlot instead.

There is no duplicate check, matching the dashboard: calling twice with the same day and time leaves two slots at that time. Read list_timeslots first when adding to a schedule that already exists, so you can see what is there and avoid stacking Pins on one moment. Each call adds exactly ONE slot, so spreading a clustered schedule over mornings means one call per slot you want. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
timeYesTime of day as 24-hour HH:MM, zero-padded (e.g. "09:30", "18:05"). Not 12-hour, not HHMM.
timezoneNoIANA timezone the time is expressed in (e.g. America/New_York). Omit to use the account's own timezone, which is what the user almost always means.
accountIdYesNumeric Tailwind account ID returned by list_accounts
dayPreferenceYesDay of week: 0 = Sunday, 1 = Monday, through 6 = Saturday. Ask the user which day rather than guessing.

Output Schema

NameRequiredDescription
timeslotYes

TDQS

A4.6/5.0
Behavior4/5

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

Far beyond the annotations, it discloses that the operation is free (no credits), that there is no duplicate check and calling twice leaves two slots — behavior consistent with idempotentHint=false — and that each call adds exactly one slot. It stops short of describing the response payload, but the output schema covers that.

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 trigger, the negative scoping, and the alternatives are front-loaded, and every paragraph carries actionable content. It runs long at four paragraphs, and the 'spreading a clustered schedule' sentence restates the one-slot-per-call point, but nothing is filler.

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

Completeness5/5

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

For a four-parameter creation tool with full schema coverage, annotations, and an output schema, the description covers everything an agent needs: trigger, exclusions, alternatives, duplicate behavior, prerequisite reads, and account disambiguation. Return values are legitimately left to the output schema.

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 day numbering, HH:MM formatting, and timezone omission. The description adds practical semantics on top: one slot per call so a spread-out schedule needs multiple calls, and the instruction not to pick an accountId on the user's behalf.

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

Purpose5/5

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

The first sentence states a specific verb and resource — 'creates one smart schedule timeslot on the given day at the given time' — and immediately scopes it to recurring weekly scheduling rather than Pin publishing. It explicitly contrasts itself with create_post and schedule_post, so an agent can route correctly 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?

It gives an explicit trigger ('when the user wants to add a posting time'), an explicit exclusion ('this does not schedule a Pin'), and named alternatives (create_post or schedule_post with useNextOpenSlot). It also adds prerequisites: read list_timeslots first for existing schedules, and ask the user which account when list_accounts returns multiple.

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

delete_boardA
DestructiveIdempotent
Inspect

Use this ONLY when the user has explicitly asked to delete a Pinterest board: permanently deletes the board by boardId (from list_boards, and never a collaborator entry — those belong to someone else and cannot be deleted by this account) AND every Pin saved to it. This cannot be undone — the Pins are destroyed on Pinterest, not moved or archived, and Tailwind cannot restore them. Confirm with the user before calling, and set confirm to true only after they agree; the call is refused without it. Tell them the board and every Pin on it will be destroyed, and quote list_boards' Pin count as an approximate figure — it comes from a cached snapshot and the board may hold MORE Pins than it reports, so never present it as the exact number at risk. The response reports the deleted board's name and pin count. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
boardIdYesNumeric Pinterest board ID returned by list_boards — never a board name or URL
confirmYesSet to true only after the user has confirmed, in this conversation, that this board and every Pin on it should be permanently destroyed. Any other value refuses the call and deletes nothing.
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
boardYes
deletedYesWhether the board was deleted

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, and the description goes well beyond them: irreversibility, that Pins are destroyed rather than moved or archived, that Tailwind cannot restore them, and that the call is refused without confirm=true. It also discloses the response contents and warns that list_boards' Pin count is a cached snapshot that may understate the true number at risk.

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 long, but front-loaded with the hard constraint first, then exclusions, then the confirmation protocol. Some redundancy exists — the confirm requirement is stated in the description and again in the schema — but nearly every clause carries operational weight.

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, open-world mutation with three required params, the description covers authorization/confirmation, irreversibility, ID provenance, multi-account disambiguation, and return shape. An output schema exists, and the description still summarizes the response appropriately without duplicating 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 baseline is 3, but the description adds real meaning: boardId must come from list_boards and must never be a collaborator board, and confirm is a refusal gate rather than a mere flag. The accountId ambiguity rule (ask the user when list_accounts returns multiple) adds genuine selection semantics beyond 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 (permanently deletes a Pinterest board) plus the scope of the deletion (the board AND every Pin on it). It also distinguishes itself from adjacent sibling operations by excluding collaborator boards and pointing to list_boards as the ID source, so an agent can separate it from delete_board_list, delete_board_section, and delete_post.

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 gate ('Use this ONLY when the user has explicitly asked to delete a Pinterest board'), an explicit exclusion (collaborator entries belong to someone else and cannot be deleted here), and a pre-call disambiguation rule for multi-account users via list_accounts. When-not and alternative-selection guidance are both present rather than inferred.

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

delete_board_listA
DestructiveIdempotent
Inspect

Use this ONLY when the user has explicitly asked to delete one of their board lists: deletes the saved grouping by boardListId (from list_board_lists). The boards in it, and every Pin on them, stay exactly as they are on Pinterest; only Tailwind's grouping is removed, and it cannot be restored. Confirm with the user before calling, and set confirm to true only after they agree; the call is refused without it. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
confirmYesSet to true only after the user has confirmed, in this conversation, that this board list should be deleted. Any other value refuses the call and deletes nothing.
accountIdYesNumeric Tailwind account ID returned by list_accounts
boardListIdYesBoard list ID returned by list_board_lists — never a list name

Output Schema

NameRequiredDescription
deletedYesWhether the board list was deleted
boardListYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds critical context they cannot convey: the deletion is irreversible ('cannot be restored'), the underlying boards/Pins are unaffected, and the call is mechanically refused unless confirm=true. This is exactly the extra information an agent needs before a destructive call.

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 a single dense paragraph but front-loads the most important constraint (ONLY when explicitly asked) before the destructive semantics and confirmation mechanics. Every sentence carries operational weight; only the account-selection sentence is slightly tangential, though still relevant to correct invocation.

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 an output schema present and all three required parameters fully documented, the description only needs to cover prerequisites, side effects, and ambiguity handling — and it does all three. Nothing an agent needs to call this destructively and safely is missing.

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

Parameters4/5

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

Schema coverage is 100% and the parameter descriptions are already strong, so baseline 3 applies. The description still adds value by stating where boardListId comes from (list_board_lists) and framing confirm as a conversation-dependent gate rather than a plain flag; the accountId ambiguity guidance is likewise beyond the schema.

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

Purpose5/5

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

States a specific verb and resource (deletes the saved grouping by boardListId) and immediately clarifies the scope boundary: boards and Pins on Pinterest stay, only Tailwind's grouping is removed. That distinguishes it from delete_board and delete_board_section in the sibling list without the agent needing to open a schema.

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

Usage Guidelines5/5

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

Explicit gating: 'Use this ONLY when the user has explicitly asked to delete one of their board lists', plus a required confirmation step and refusal behavior. It also supplies a fallback procedure when accountId is ambiguous (ask the user, never choose). Both when-to-use and when-not are stated.

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

delete_board_sectionA
DestructiveIdempotent
Inspect

Use this when the user wants to remove a section from a Pinterest board: deletes a section by sectionId (from list_board_sections). The Pins in the section are NOT deleted — they move back to the board itself. This is not the same as delete_board, which destroys the board and every Pin on it. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
boardIdYesNumeric Pinterest board ID returned by list_boards — never a board name or URL
accountIdYesNumeric Tailwind account ID returned by list_accounts
sectionIdYesBoard section ID returned by list_board_sections

Output Schema

NameRequiredDescription
deletedYesWhether the section was deleted
sectionIdYesID of the deleted section

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds the single most decision-relevant fact they cannot express: the Pins inside the section are NOT deleted and move back to the board. It also pre-empts a destructive misselection by contrasting the blast radius with delete_board, and adds an account-ambiguity safety rule.

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 use case, then the critical side effect, then the disambiguation, then the escalation rule — each sentence carries a distinct decision-relevant payload with no restatement of the name 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?

With an output schema, full annotation coverage, and 100% parameter documentation, the remaining burden is behavioral and routing context — exactly what the description supplies. An agent has everything needed to call this safely and 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% and each parameter already documents its source tool (list_boards, list_accounts, list_board_sections), so the schema carries the semantics. The description only echoes the sectionId provenance and adds account-choice guidance rather than new per-parameter 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 and resource ('deletes a section by sectionId') plus the scope ('from a Pinterest board'), and explicitly distinguishes itself from delete_board. An agent can identify the operation and its argument source 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?

Opens with an explicit when-to-use trigger ('when the user wants to remove a section'), names the sibling it must not be confused with ('not the same as delete_board'), and gives a concrete pre-call protocol for ambiguous account selection. Nothing about tool selection 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_feedA
Destructive
Inspect

Use this when the user wants Tailwind to stop watching a feed for good. Removes the subscription: the daily check stops and no further Pins are generated from it. SmartPins the feed already generated are left alone — only future ones stop. Takes a feedId from list_feeds. Fails with a not-found error if the feed is not this organization's, so a successful result means it really was removed. To stop generation temporarily instead, pause it with update_feed. Confirm with the user before deleting a feed they did not explicitly name.

NameRequiredDescriptionDefault
feedIdYesThe `id` of a feed returned by list_feeds, connect_feed or get_feed

Output Schema

NameRequiredDescription
feedIdYesThe feed id that was removed
deletedYesAlways true — failures raise an error instead

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds real substance beyond them: what survives the delete ('SmartPins the feed already generated are left alone'), which only future Pins stop, and the not-found failure mode with its implication (success means it really was removed). That's strong; the main omissions are auth/permission requirements and whether the removal is reversible or recoverable.

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

Conciseness5/5

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

Front-loaded with the action and its effect, then consequences, then the alternative, then the safety caveat — a sensible order of decreasing call-criticality. Every sentence carries distinct information; nothing repeats the schema or annotations verbatim.

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?

This is a destructive one-param tool with an output schema and full annotation coverage, and the description still covers effect scope, data preservation, error semantics, the temporary alternative, and a confirmation policy. Nothing an agent needs to call it safely is missing.

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

Parameters4/5

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

Schema coverage is 100% and the schema already documents feedId's sources (list_feeds, connect_feed, get_feed), so the baseline is 3. The description earns above baseline by tying feedId to an organization-scoping failure ('Fails with a not-found error if the feed is not this organization's'), which the schema does not say.

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 ('Removes the subscription') plus the concrete consequence ('the daily check stops and no further Pins are generated'). It also distinguishes itself from update_feed (pause) and from cancel_generation in the sibling set, 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?

Explicitly names the trigger ('when the user wants Tailwind to stop watching a feed for good') and the alternative for the temporary case ('pause it with update_feed'). It goes further with a confirmation rule for feeds the user did not explicitly name, which is exactly the kind of operational guidance an agent needs.

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

delete_postA
DestructiveIdempotent
Inspect

Use this when the user wants to delete a Pin draft or scheduled Pin in Tailwind: permanently deletes an unpublished Pin by postId (from create_post or list_posts). Only works on Pins not yet published to Pinterest — published Pins cannot be deleted through Tailwind, and deletion cannot be undone. To change a Pin's title, description, link, Board, Board section, alt text or product tags, use update_post instead of deleting it; only a change of image needs a delete and a fresh create_post. To take a scheduled Pin off the schedule but keep it, use unschedule_post instead. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
postIdYesPost ID of the unpublished Pin to delete, from create_post or list_posts
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
postIdYesID of the deleted post
deletedYesWhether the post was deleted

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: deletion is permanent and cannot be undone, only unpublished Pins are eligible, and published Pins cannot be deleted through Tailwind. It also warns against arbitrarily choosing an account, which is important 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 front-loaded with the primary action and scope, followed by clear alternative-tool routing and account-selection guidance. Despite its length, every sentence carries useful decision or safety 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 a destructive mutation with rich annotations, a complete input schema, and an output schema, the description covers the key risks, eligibility constraints, and alternative tools. Nothing material for correct invocation appears to be missing.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already well documented. The description repeats that postId comes from create_post or list_posts and adds account-selection guidance, but does not add much semantic detail about the parameter values themselves 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 states a specific verb and resource: permanently deletes an unpublished Pin by postId. It immediately clarifies the critical scope restriction — only unpublished Pins, not published ones — which distinguishes it from generic delete tools and makes the operation unambiguous.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance and names alternatives: use update_post to change metadata, create_post for image changes, and unschedule_post to keep a scheduled Pin. It also specifies an account-selection workflow when multiple accounts exist, 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.

delete_saved_keywordA
Destructive
Inspect

Use this when the user asks to remove or delete one keyword from their saved list. Takes the keyword's id from list_saved_keywords, not the keyword text. Fails with a not-found error if the id is not on this user's list, so a successful result means the keyword really was removed. Confirm with the user before deleting keywords they did not explicitly name.

NameRequiredDescriptionDefault
keywordIdYesThe `id` field of a keyword returned by list_saved_keywords

Output Schema

NameRequiredDescription
deletedYesAlways true — failures raise an error instead
keywordIdYesThe keyword id that was removed

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered. The description adds genuine value beyond that: the not-found failure mode when the id is not on the user's list, and the guarantee that a successful result means the keyword really was removed. A user-confirmation norm is also surfaced.

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 the triggering condition, then the parameter convention, then the failure semantics, then the safety caveat. Nothing is redundant and each sentence adds a distinct piece of 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?

A single-parameter destructive tool with full schema coverage, complete annotations, and an output schema needs little more. The description covers trigger, id sourcing, failure behavior, and confirmation — everything required to invoke it safely and correctly.

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

Parameters4/5

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

Schema coverage is 100% and the schema itself documents keywordId, so the baseline is 3. The description goes slightly further by stressing the id comes from list_saved_keywords and explicitly not the keyword text, which prevents a common misuse of a string identifier 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 ("remove or delete one keyword from their saved list") and the singular "one keyword" implicitly distinguishes it from the sibling delete_saved_keywords bulk tool. An agent can tell exactly which operation this performs 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?

"Use this when the user asks to remove or delete one keyword" gives a clear triggering condition, and the confirmation guidance ("Confirm with the user before deleting keywords they did not explicitly name") adds a concrete usage rule. It stops short of explicitly naming delete_saved_keywords as the alternative for bulk removal, so the contrast is inferred rather than stated.

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

delete_saved_keywordsA
Destructive
Inspect

Use this when the user asks to remove several keywords from their saved list at once, e.g. clearing out a group of terms. Takes keyword ids from list_saved_keywords, up to 100 per call. All-or-nothing: if any id is not on this user's list, nothing is deleted and the error names the unknown ids — so a partial failure never leaves you guessing which keywords survived. Always confirm the specific keywords with the user before calling this.

NameRequiredDescriptionDefault
keywordIdsYes`id` fields from list_saved_keywords. Up to 100 per call.

Output Schema

NameRequiredDescription
deletedYesAlways true — failures raise an error instead
deletedCountYesHow many keywords were removed

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds non-obvious semantics the schema cannot express: all-or-nothing atomicity, the fact that ownership failure aborts the whole batch, and that the error enumerates the unknown ids. That directly answers an agent's biggest risk question for a bulk destructive call.

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, all load-bearing: trigger, id source, atomicity contract, and the confirmation requirement. Usage guidance is front-loaded and the destructive-action caveat lands before an agent commits to the call.

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?

Output schema exists so return shape needs no explanation, and the description covers the remaining risks for a destructive bulk tool: batch limits, validation failure mode, and required user confirmation. Nothing an agent needs to invoke this 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% and the schema already documents keywordIds as 'id fields from list_saved_keywords, up to 100 per call' plus min/max items. The description repeats that same information for the id source and the 100 cap rather than adding new meaning, 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 ('remove several keywords from their saved list at once'), and the phrase 'several ... at once' implicitly carves it out from the singular delete_saved_keyword sibling. It stops short of naming that sibling explicitly, so the differentiation relies on 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?

Gives the triggering condition ('when the user asks to remove several keywords'), points to list_saved_keywords as the id source, caps the batch at 100, and adds a required precondition (confirm the specific keywords with the user first). An agent has everything needed to decide whether to call this.

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

delete_timeslotA
DestructiveIdempotent
Inspect

Use this when the user wants to stop posting at one recurring time: removes a single smart schedule timeslot by timeslotId (from list_timeslots). Free. Confirm with the user before calling, and say which day and time is going away.

Pins already scheduled onto this slot are NOT unscheduled and are NOT deleted — they keep their existing times and simply no longer sit on a recurring slot. Removing a slot only stops future Pins from being placed there. If the user wants fewer posting times overall, deleting the specific slots they dislike is safer than rebuild_schedule, which discards every slot and regenerates the lot. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
accountIdYesNumeric Tailwind account ID returned by list_accounts
timeslotIdYesTimeslot ID returned by list_timeslots

Output Schema

NameRequiredDescription
timeslotYes

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 idempotentHint=true, but the description adds genuinely new behavioral context: existing scheduled Pins are neither unscheduled nor deleted, only future placement stops. It also discloses cost ('Free') and an irreversibility-avoidance protocol (confirm before calling, state which day/time is removed).

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

Conciseness4/5

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

Purpose is front-loaded in the first clause, followed by the consequential behavior. It is on the long side and the account-selection guidance reads as a general policy appended to this tool, costing some tightness, but no sentence is 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?

For a destructive two-parameter delete with an output schema and rich annotations, the description covers trigger, side-effect boundaries, alternative tool, confirmation protocol, and account disambiguation. 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.

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 described there, so the schema does the heavy lifting. The description only adds the provenance hint that timeslotId comes from list_timeslots; accountId usage is addressed but only as a selection policy, not as parameter semantics. 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?

States a specific verb and resource: 'removes a single smart schedule timeslot by timeslotId'. It also names the source of the ID (list_timeslots) and implicitly contrasts with update_timeslot and rebuild_schedule, so the agent can distinguish it from siblings without opening a schema.

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

Usage Guidelines5/5

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

Explicit trigger ('when the user wants to stop posting at one recurring time'), an explicit alternative with the condition that selects it ('deleting the specific slots they dislike is safer than rebuild_schedule'), a confirmation requirement, and a disambiguation rule for multiple accounts. That is unusually complete routing guidance.

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

generate_pin_copyAInspect

Writes Pin titles and descriptions with Tailwind's Ghostwriter, using the organization's saved brand context — tone, style, and audience captured from their own content — and files the result in their Ghostwriter history so it is available in the dashboard alongside everything else they have generated. Use it when the user asks for Tailwind or Ghostwriter to write their Pin copy, or for copy in their saved brand voice. Asynchronous and metered: each call spends the user's plan credits, takes under a minute, and returns a generation id to poll with get_copy_generation_status. Org-scoped — no accountId needed. Pinterest Pin copy only; it does not write blog posts, emails, or product listings. Every call generates and charges again, so poll the id you have rather than re-calling.

NameRequiredDescriptionDefault
ctaNoCall to action to end each Pin with.
topicYesWhat the Pin is about — the product, post, or idea, in the user's own words.
keywordsNoUp to 10 keywords to work into the copy.
contentTypeYesThe angle the copy should take.
priorOutputsNoCopy the user already has, so this generation varies from it instead of repeating it. Pass the pins from an earlier call when the user asks for more options.

Output Schema

NameRequiredDescription
generationYes

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that calls are metered against plan credits, non-idempotent in a costly way ('every call generates and charges again'), asynchronous with sub-minute latency, and that output persists to Ghostwriter history visible in the dashboard. It also clarifies org scoping and that no accountId is required — none of which the annotation block 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?

Four sentences, front-loaded with what it does, then when to use it, then the operational constraints that most affect a wrong call (cost, async polling), then the negative scope. Each 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?

For an async, metered generation tool this covers everything an agent needs: cost model, latency, the returned generation id plus the sibling to poll, org scoping, and output persistence. Return shape is handled by the existing output schema, so no gap remains.

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

Parameters3/5

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

Schema description coverage is 100%, so topic, cta, keywords, contentType, and priorOutputs are already fully documented in structured form. The description adds only the org-scoping fact ('no accountId needed') rather than any parameter mechanics, 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 — writes Pin titles and descriptions via Tailwind's Ghostwriter — and explicitly bounds scope: 'Pinterest Pin copy only; it does not write blog posts, emails, or product listings.' That exclusion plus the named polling sibling makes it unmistakable against neighbors like generate_pins_from_url or regenerate_pin_design.

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 ('when the user asks for Tailwind or Ghostwriter to write their Pin copy, or for copy in their saved brand voice') and an explicit anti-pattern ('poll the id you have rather than re-calling'), naming get_copy_generation_status as the alternative. 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.

generate_pins_from_urlAInspect

Use this when the user wants Tailwind's AI to create Pin drafts in Tailwind from a web page (a blog post, product page, or article URL). Asynchronous and metered: each generation spends the user's plan credits by design tier (approximately 3 for basic, 7 for premium, 1 for no-template/photo-only — resolved server-side), takes 1-3 minutes, and returns a generation id to poll with get_generation_status. Takes an accountId from list_accounts. Once the status is success, the drafts appear in list_posts (status draft) carrying a matching generationId. Calling this again for the same URL while a generation is in flight returns the SAME generation with deduplicated: true and charges nothing — but repeating the call after it completes starts and charges a NEW generation, so poll before retrying. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
urlYesThe web page to generate Pins from (http/https, max 2048 characters). Query parameters and fragments are ignored — variants of one page count as the same URL.
titleNoDisplay name for this generation source in the user's Tailwind dashboard (max 256 characters). Defaults to the URL.
keywordsNoUp to 10 keywords to guide the generated Pin copy
accountIdYesNumeric Tailwind account ID returned by list_accounts
designTierNoDesign tier for the generated Pins (default: basic). basic = template designs (~3 credits), premium = AI-designed images (~7 credits), no-template = the page's own photos only (~1 credit). Ignored when the URL already has a SmartPin on this account — its stored configuration is reused.
premiumStyleNoVisual style for premium designs. Required when designTier is "premium"; must be omitted otherwise.

Output Schema

NameRequiredDescription
generationYes

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, idempotent=false, openWorld=true; the description goes far beyond by disclosing that the call is asynchronous, metered with per-tier credit costs (~3/~7/~1, resolved server-side), takes 1-3 minutes, and charges the user. It also explains the deduplication nuance — in-flight repeats return the SAME generation with deduplicated: true and cost nothing, while post-completion repeats start and bill a NEW generation — which clarifies rather than contradicts idempotentHint=false.

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 'use this when' trigger, then ordered by operational need: cost, latency, polling, dedup, account selection. Dense but almost every clause carries a distinct operational fact; the parenthetical credit breakdown is the only mildly redundant part.

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 the full async lifecycle an agent needs: prerequisites, cost, latency, polling target, where results surface (list_posts with matching generationId), and the retry hazard. An output schema exists, so return-value detail is correctly 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 coverage is 100%, so the schema already documents url, title, keywords, accountId, designTier and premiumStyle. The description adds only the accountId provenance (list_accounts) and reiterates tier credit costs already present in the schema; keywords and title get no narrative treatment. 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?

Opens with a specific verb+resource+scope: 'create Pin drafts in Tailwind from a web page (blog post, product page, or article URL).' This cleanly separates it from generate_pin_copy (copy only) and create_post (single post creation) 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?

Gives strong prerequisites (accountId from list_accounts, ask the user when multiple accounts exist, don't pick for them) and a retry protocol (poll get_generation_status before repeating). It stops short of an explicit 'use X instead when...' contrast against similarly named siblings like generate_pin_copy or regenerate_pin_design.

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

get_accountA
Read-onlyIdempotent
Inspect

Use this when you already have an accountId and need that one account's details — its username, display name, connection status, time zone, or claimed domain — without listing every account. Takes an accountId from list_accounts. Prefer list_accounts when you do not have an accountId yet, or when the user's request could mean any of their accounts. A 404 means the account is not yours or is no longer connected to Tailwind; the message says which. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
accountYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, closed-world, and non-destructive behavior, so the description does not need to repeat safety basics. It adds meaningful behavioral context beyond annotations: the 404 meaning covers both ownership and disconnected-account cases, and the ambiguity rule prevents the agent from silently choosing an 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?

The description is front-loaded with the primary use case, followed by the alternative, error meaning, and ambiguity handling. Every sentence contributes distinct operational guidance, with 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?

The tool has one required parameter, full schema coverage, annotations covering safety traits, and an output schema, so return-format details are unnecessary. The description covers selection criteria, alternatives, failure interpretation, and disambiguation policy, leaving no material gap for correct invocation.

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

Parameters4/5

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

Schema coverage is 100% and the single parameter's description already says it is a numeric Tailwind account ID returned by list_accounts. The tool description reinforces the provenance and adds failure semantics tied to that ID, so it provides modest value beyond the schema without being the primary parameter documentation.

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 ('get_account') and names the exact details returned: username, display name, connection status, time zone, and claimed domain. It also explicitly distinguishes this from listing every account, so an agent can tell it apart from siblings like list_accounts.

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 ('when you already have an accountId') and when-not-to-use guidance ('Prefer list_accounts when you do not have an accountId yet'). It additionally handles the ambiguity case by instructing the agent to ask the user rather than guessing when multiple accounts exist.

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

get_account_analyticsA
Read-onlyIdempotent
Inspect

Use this when the user asks how their Pinterest account is performing overall — impressions, engagement, saves, clicks — or wants a trend over time: returns account-wide totals plus a per-day series. Covers claimed and unclaimed content alike, the same numbers Pinterest Insights shows in Tailwind. Totals combine paid (promoted) and organic activity unless contentType says otherwise: pass ORGANIC for how unpromoted Pins are doing, or PAID for promoted only. get_pin_analytics figures are always organic-only, so compare them against ORGANIC totals, not the default blend.

This is the account rollup. For the best-performing Pins use list_top_pins; for one Pin use get_pin_analytics. Reading analytics is free and consumes no credits. Omit startDate and endDate for the last 30 days; supply BOTH to choose a window (supplying one is an error). Dates are UTC YYYY-MM-DD. Pinterest reports at most 90 days back and at most a 90-day span. The range actually used comes back as startDate/endDate — report those, do not assume the period. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
endDateNoLast day of the window (inclusive), UTC YYYY-MM-DD. Requires startDate.
accountIdYesNumeric Tailwind account ID returned by list_accounts
startDateNoFirst day of the window, UTC YYYY-MM-DD. Requires endDate. Omit both for 30 days.
contentTypeNoWhich activity to count: ORGANIC for unpromoted performance only, PAID for promoted (ad) performance only, ALL for both blended. Defaults to ALL.

Output Schema

NameRequiredDescription
endDateYesLast day actually reported on, inclusive
accountIdYes
startDateYesFirst day actually reported on
contentTypeYesThe paid/organic filter actually applied
dailyMetricsYesPer-day metrics across the window, earliest first
summaryMetricsYesPinterest metrics, camelCased. A null value means Pinterest has not finished computing that metric for that day; an absent one means it does not report it for this subject.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, it discloses cost ('free, consumes no credits'), hard API limits (90-day lookback and 90-day span), that the effective range is echoed back as startDate/endDate and should be reported rather than assumed, and that totals blend paid and organic by default. That is exactly the kind of behavior 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-loaded with the core purpose and scoping constraints, and nearly every sentence carries operational value. A few clauses are mildly redundant with the schema (both dates required, UTC YYYY-MM-DD) and 'This is the account rollup' repeats the first sentence.

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?

Output schema exists, so return-shape explanation is unnecessary. Everything else an agent needs to invoke correctly is present: account disambiguation, default window, window limits, enum semantics, cross-tool comparability, and credit cost.

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 earns above that by explaining what the ORGANIC/PAID/ALL enum means relationally — get_pin_analytics numbers are organic-only and must be compared against ORGANIC totals, not the blend. Date pairing rules are restated from the schema rather than extended, so it stops short 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?

States a specific verb and resource with explicit scope: account-wide totals (impressions, engagement, saves, clicks) plus a per-day series, covering claimed and unclaimed content. It directly distinguishes itself from get_pin_analytics ('the account rollup') and list_top_pins, so an agent can pick it 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?

Names the alternatives and the condition that selects each: list_top_pins for best-performing Pins, get_pin_analytics for a single Pin. It also gives explicit routing rules for contentType (ORGANIC vs PAID vs default blend) and a disambiguation protocol — ask the user which account when list_accounts returns multiple.

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

get_account_usageA
Read-onlyIdempotent
Inspect

Use this before a credit- or post-consuming action, especially a bulk one (many generations, connecting an RSS feed with connect_feed, scheduling many Pins), or when the user asks how many credits or posts they have left or when they refill. Returns remaining credits, the monthly allowance and when it resets, plus the post allowance where the plan has one. Free: this read spends nothing.

Read billingSystem, scope and unlimitedScheduling first. When unlimitedScheduling is true (the modular winback plan), scheduling Pins spends no credits, whatever the credit balance says. On modular billing, credits belong to this account and pay for scheduling (one credit per Pin, unless unlimitedScheduling is true) as well as AI generation; postLimit is null. On legacy and Shopify billing, scope is "organization": one credit pool and one post allowance are shared by every account in the organization, so every account reports the same numbers and you must never add them up across accounts. That pool pays for credit-priced features such as AI generation (generate_pins_from_url, generate_pin_copy, and every SmartPin a connected feed drafts) and Turbo, while ordinary scheduling spends postLimit instead of credits.

This is a planning snapshot, not permission. Trial allowances are tracked separately, so zero credits does not mean nothing can be done and a positive balance does not guarantee an action will succeed. When an action is refused anyway, report the refusal it returns. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
scopeYesWho every value belongs to. "organization": one pool shared by all the organization's accounts, reported identically on each. "account": this account alone.
creditsYes
postLimitYesThe post allowance ordinary scheduling spends on legacy and Shopify billing, for the current usage period only. Null when the billing system does not meter posts (modular).
billingSystemYesWhich billing system the account's organization is on
unlimitedSchedulingYesTrue when the account is on the modular winback plan, which schedules Pins without spending credits while reporting zero monthly credits. Credits still pay for AI generation. Always false on legacy and Shopify billing: there, read postLimit, which covers the current usage period only.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark it readOnly/non-destructive, and the description reinforces this with 'Free: this read spends nothing' — consistent, not contradictory. It adds behavior the annotations cannot: how credits are scoped per billing system (modular vs legacy/Shopify organization-wide pools that must never be summed), that unlimitedScheduling nullifies credit consumption, that postLimit is null on modular billing, and that this is a planning snapshot rather than an authorization check.

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 trigger condition before the billing nuance, and every clause is substantive. It is nonetheless long for a single-parameter read tool, and the instruction to 'read billingSystem, scope and unlimitedScheduling first' is slightly ambiguous about whether those values come from this call or from get_account.

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?

Output schema exists, yet the description still summarizes the payload (credits, allowance, reset, postLimit) so an agent knows what it will get. Given the genuine complexity of multiple billing models, it supplies the interpretation rules an agent needs to avoid misreading the numbers, and the annotations cover the safety profile.

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

Parameters4/5

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

Schema coverage is 100%, and the schema already explains that accountId comes from list_accounts, so the baseline is 3. The description adds real meaning beyond that: it explains the account-scoping consequence (legacy/Shopify accounts share one pool and report identical numbers) and prescribes asking the user when multiple accounts exist, which materially affects how accountId should be chosen.

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/reports) and resource (remaining credits, monthly allowance and reset date, post allowance) rather than restating the name. It distinguishes itself from get_account/list_subscriptions by framing the output as a credit-and-post planning snapshot, and names related actions (connect_feed, scheduling Pins) that consume the resources it reports.

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

Usage Guidelines5/5

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

Gives explicit when-to-use conditions: before any credit- or post-consuming action, especially bulk ones, or when the user asks how many credits/posts remain and when they refill. It also gives an explicit procedural guardrail — ask the user which account when list_accounts returns more than one — rather than letting the agent pick.

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

get_board_keyword_relevanceAInspect

Use this when the user asks how well one of their boards covers a keyword or topic, or when auditing whether a board is on-topic. Scores a board's own live Pinterest content against a keyword and returns the Pins that earned the score, each with its own relevance. This reads the board's real Pins from Pinterest, not just what Tailwind scheduled to it, so it covers Pins added outside Tailwind too. Metered: each scored call spends one plan credit, so score the board once and reuse the result rather than re-calling per question. A board that returns state "absent" yielded no readable Pins — it is empty, or the Pinterest connection needs reconnecting — and is not charged; report that as unknown coverage, never as poor coverage. Large boards are scored from a capped sample; when truncated is true say the score covers part of the board. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
boardIdYesNumeric Pinterest board ID from list_boards — never a board name or URL
keywordYesThe keyword or topic to score the board against
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
relevanceYes

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: metering (one plan credit per scored call), that absent boards are not charged, that large boards are scored from a capped sample with a 'truncated' flag to relay, and that it reads real Pinterest Pins rather than only Tailwind-scheduled ones. These are cost, fidelity, and failure-mode details an agent cannot get from readOnlyHint/openWorldHint alone, and none of them contradict those 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 the 'Use this when' trigger, then each subsequent sentence carries a distinct operational rule (source of Pins, metering, absent handling, truncation, account ambiguity) with no restatement of the name or schema. Dense but every sentence earns its place.

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

Completeness5/5

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

An output schema exists so return shape needn't be explained, and the description covers the remaining agent-relevant gaps: cost per call, degraded/absent results, sampling truncation, and multi-account disambiguation. Nothing needed to call this correctly or interpret its output 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 a bump by adding account-selection semantics for accountId (don't pick an account on the user's behalf when multiple exist), which is a constraint the schema does not express. It says nothing extra about boardId or keyword, but those are already fully documented.

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 — scores a board's live Pinterest content against a keyword and returns the Pins with per-Pin relevance — which is distinct from siblings like list_board_pins (raw listing) or get_pin_analytics. The opening clause names the exact user question it answers, so an agent can route to it without inspecting 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 trigger ('user asks how well a board covers a keyword or topic', 'auditing whether a board is on-topic'), explicit anti-pattern ('score the board once and reuse the result rather than re-calling per question'), and explicit precondition (ask which account if list_accounts returns more than one). It also tells the agent what to do with an 'absent' result — report unknown coverage, never poor coverage.

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

get_copy_generation_statusA
Read-onlyIdempotent
Inspect

Use this to poll a Pin copy generation started by generate_pin_copy. It usually completes in under a minute: poll every ~5 seconds. When status is success, result.pins holds the title and description pairs — offer them to the user, or pass one to create_post. This polls Ghostwriter copy only; generate_pins_from_url generations are polled with get_generation_status instead.

NameRequiredDescriptionDefault
jobIdYesCopy generation ID returned by generate_pin_copy

Output Schema

NameRequiredDescription
generationYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the read-only/idempotent safety profile, and the description adds real value beyond them: expected latency, poll cadence, the result.pins payload shape, and the scope boundary against get_generation_status. It only gestures at 'status is success' without enumerating failure/pending states or what to do if polling runs long, which is the one 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?

Four short sentences, each doing distinct work, with purpose front-loaded and the sibling disambiguation last. Nothing repeats the schema or the annotations.

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

Completeness4/5

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

With annotations, a 100%-documented single parameter, and an output schema, the definition covers everything needed to call the tool correctly and act on the result. Only the non-success status handling is left implicit.

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 jobId is fully documented as the ID returned by generate_pin_copy, so the schema carries the load. The description reinforces provenance but adds no new syntax or format information. Baseline 3 applies 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 (poll) and resource (a Pin copy generation started by generate_pin_copy), and explicitly rules out the confusingly similar get_generation_status used for generate_pins_from_url jobs. An agent can pick it apart from its siblings 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 exact trigger (after calling generate_pin_copy), the polling recipe (~every 5 seconds, typically under a minute), and two concrete next actions on success (offer to user, or pass one to create_post). It also names the alternative tool and the condition that selects it.

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

get_design_regeneration_statusA
Read-onlyIdempotent
Inspect

Use this to poll a design regeneration started by regenerate_pin_design. It usually completes in a few minutes: poll every ~15 seconds. On success it returns a variationUrl — the new design, which is NOT yet applied to the Pin. Pass that URL to select_pin_design_variation to make it the active design. The billing field reports what was charged and, for a failed regeneration, whether the refund has landed.

NameRequiredDescriptionDefault
regenerationIdYesThe id returned by regenerate_pin_design

Output Schema

NameRequiredDescription
regenerationYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent), and the description adds substantive behavior on top: the returned URL is NOT applied to the Pin, and the billing field reports charges plus refund state on failure. That is 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?

Four short sentences, front-loaded with purpose, then cadence, then the critical gotcha (not applied yet), then the return fields. Nothing is wasted and the most failure-prone detail is not 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?

Despite output schema being present, the description still flags the two return fields that drive downstream decisions (variationUrl, billing), so an agent knows what to do on success and on failed regeneration. Nothing needed to invoke or interpret 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 coverage is 100%, so regenerationId is already documented as 'the id returned by regenerate_pin_design'. The description reinforces that lineage through its usage narrative but adds no format or constraint detail beyond the schema. 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?

States a specific verb and resource — poll the status of a design regeneration — and ties it to the originating tool regenerate_pin_design, which cleanly separates it from get_generation_status, get_copy_generation_status and get_pin_design. An agent can pick this 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 Guidelines5/5

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

Gives an explicit polling cadence (~15 seconds, typically completes in a few minutes) and names the required follow-up: pass the returned variationUrl to select_pin_design_variation. The full lifecycle — start, poll, apply — is spelled out rather than left to inference.

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

get_feedA
Read-onlyIdempotent
Inspect

Use this when you already have a feedId and need one feed's current state — whether it is active or paused, when it was last checked, why its last check failed, or how many SmartPins it has generated — without listing every feed. Takes a feedId from list_feeds or connect_feed. A not-found error means the feed is not this organization's or has been removed. Org-scoped: needs no accountId.

NameRequiredDescriptionDefault
feedIdYesThe `id` of a feed returned by list_feeds, connect_feed or get_feed

Output Schema

NameRequiredDescription
feedYes

TDQS

A4.5/5.0
Behavior5/5

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

The annotations already establish read-only, idempotent, non-destructive behavior, and the description adds useful operational context: what state fields can be inspected, what a not-found error means, and that the tool is org-scoped with no accountId required. This goes meaningfully beyond the structured annotations.

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

Conciseness5/5

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

The description is front-loaded with the use case, then adds source, error semantics, and org scoping in compact sentences. Every sentence carries useful information and there is no filler.

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

Completeness5/5

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

For a single-parameter read tool with an output schema and rich annotations, the description covers the remaining ambiguities: when to use it, where feedId comes from, error implications, and org scoping. 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?

There is only one parameter and the schema description coverage is 100%, so the schema already explains feedId fully. The description repeats the feedId provenance from list_feeds/connect_feed and adds org-scoping context, but it does not add format or syntax details 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 states a specific verb and resource: retrieve one feed's current state by feedId. It explicitly distinguishes this from listing feeds and enumerates the kind of state returned, so an agent can tell it apart from list_feeds or preview_feed.

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

Usage Guidelines4/5

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

It gives a clear precondition (you already have a feedId) and the main alternative behavior (avoid listing every feed). It also says where feedId comes from, but it does not explicitly cover when to use update_feed, delete_feed, or preview_feed instead.

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

get_generation_statusA
Read-onlyIdempotent
Inspect

Use this to poll a Pin generation started by generate_pins_from_url. Generation typically completes in 1-3 minutes: poll every ~15 seconds, and don't give up before ~30 minutes — retryable failures can hold processing for several minutes, and a hung generation can stay processing for ~25 minutes before the terminal generation-request-timed-out status appears. A 404 within ~10 seconds of starting the generation is a transient indexing artifact — retry it, don't stop. When status is success, call list_posts with status draft and filter by the matching generationId to find the generated Pins.

NameRequiredDescriptionDefault
generationIdYesGeneration ID returned by generate_pins_from_url

Output Schema

NameRequiredDescription
generationYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial behavioral context the annotations cannot: completion timing, that retryable failures can hold processing for minutes, that a hung generation can sit ~25 minutes before a terminal generation-request-timed-out status, and that an early 404 is a transient indexing artifact rather than a real error.

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 purpose, then progressively more detailed timing/retry guidance, then the follow-up action. Every sentence supplies information an agent needs to poll correctly; nothing is filler despite the length.

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?

An output schema exists, so return values need not be explained. Given a polling tool with one required param, the description covers cadence, timeouts, false-negative 404s, and the downstream retrieval path — everything needed to use it correctly.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter's schema text already says it is the 'Generation ID returned by generate_pins_from_url'; the description's mention adds no syntax or format detail beyond that. Baseline 3 applies since 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 (poll) and resource (Pin generation status) and ties it to the originating tool generate_pins_from_url, which distinguishes it from siblings like get_copy_generation_status and get_design_regeneration_status. An agent can select it without opening the schema.

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

Usage Guidelines5/5

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

Gives an explicit polling cadence (~15s), a stop condition (~30 min ceiling with the reason), retry guidance for transient 404s, and a concrete next step (call list_posts with status draft and filter by generationId). When-to-use and what-to-do-after are both spelled out.

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

get_pin_analyticsA
Read-onlyIdempotent
Inspect

Use this when the user asks how a specific Pin performed: returns that Pin's totals over a window, a per-day series, and lifetime totals that ignore the window. This is the only analytics tool that reports comments (totalComments) and reactions (totalReactions), in lifetimeMetrics; get_account_analytics and list_top_pins do not. Figures are organic-only: Pinterest's per-Pin analytics exclude paid (promoted) distribution, so a promoted Pin reads far lower here than in list_top_pins or get_account_analytics — that gap is expected, not an error.

Only a Pin this account OWNS can be read; anything else returns 404, including a Pin on a group board this account merely collaborates on. Pinterest itself would report on those, but this endpoint does not — do not retry a shared-board Pin, and do not tell the user the id was wrong. A 403 means Pinterest permanently forbids analytics for that Pin — it will never report, so do not retry it. Reading analytics is free and consumes no credits. pinId is the PINTEREST Pin id, NOT the Tailwind postId that list_posts and get_post return as id; a published post carries the Pinterest id in its own pinId field, so pass that. list_pins and list_top_pins return it too. Passing a Tailwind postId returns a 404. Omit startDate and endDate for the last 30 days; supply BOTH to choose a window (supplying one is an error). Dates are UTC YYYY-MM-DD. Pinterest reports at most 90 days back and at most a 90-day span. The range actually used comes back as startDate/endDate — report those, do not assume the period. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
pinIdYesThe PINTEREST Pin id (a numeric string): the `pinId` field on a published post from list_posts or get_post, or a pinId from list_pins or list_top_pins. NOT the Tailwind postId (the post's `id`).
endDateNoLast day of the window (inclusive), UTC YYYY-MM-DD. Requires startDate.
accountIdYesNumeric Tailwind account ID returned by list_accounts
startDateNoFirst day of the window, UTC YYYY-MM-DD. Requires endDate. Omit both for 30 days.

Output Schema

NameRequiredDescription
pinIdYes
boardIdNoThe Pinterest board the Pin is saved to — the same id list_boards returns
endDateYes
accountIdYes
startDateYes
dailyMetricsYesPer-day metrics across the window, earliest first
summaryMetricsYesPinterest metrics, camelCased. A null value means Pinterest has not finished computing that metric for that day; an absent one means it does not report it for this subject. Per-Pin fields include impression, save, saveRate, pinClick, outboundClick, profileVisit, userFollow, and video metrics on video Pins. Comment and reaction counts are not windowed: read them from lifetimeMetrics.
lifetimeMetricsNoTotals since the Pin was created, ignoring the requested window. The only place Pinterest reports totalComments (the comment count) and totalReactions; absent when Pinterest reports none.

TDQS

A4.8/5.0
Behavior5/5

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

Far exceeds what the annotations cover. Annotations only say read-only, idempotent, open-world; the description adds that figures are organic-only, that a promoted Pin reads low here versus siblings and that gap is expected, that non-owned Pins return 404 (including shared boards) and must not be retried or blamed on a bad id, that 403 is permanent, and that calls consume no credits. These are exactly the traits an agent needs to interpret and recover from responses.

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

Conciseness4/5

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

Front-loaded with the core purpose and the differentiator, then ordered by operational importance (data caveats, error semantics, parameter gotchas, account disambiguation). It is dense with no filler, but the postId/404 warning is restated in both the pinId paragraph and the error paragraph, which costs a little.

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?

Complete for a four-parameter read tool with a rich output schema: purpose, window semantics, data-scope caveats, error taxonomy, id-type confusion, and account disambiguation are all addressed. Since an output schema exists, the description is not obliged to enumerate return fields, and it isn't a gap that it doesn't.

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 constraints the schema does not carry: at most 90 days back and at most a 90-day span, both dates required together, dates are UTC, and the effective range is echoed back as startDate/endDate and should be reported rather than assumed. The pinId-vs-postId warning largely duplicates 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 ('returns that Pin's totals over a window, a per-day series, and lifetime totals') and immediately differentiates itself: 'This is the only analytics tool that reports comments (totalComments) and reactions (totalReactions)... get_account_analytics and list_top_pins do not.' An agent can distinguish this from every analytics 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?

Explicit about when to use it (user asks how a specific Pin performed), which alternatives to use instead (get_account_analytics, list_top_pins), and what to do with a multi-account situation ('ask the user which account to use before calling this — do not choose for them'). It also gives negative guidance on retries and on how to phrase failures to the user.

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

get_pin_designA
Read-onlyIdempotent
Inspect

Use this to read the design of a Pin that Tailwind's AI generated, before changing it. Returns the tier, every variation already rendered, sourceImageCandidates (other source photos the design can be rebuilt around), and supportedOperations — the list of design tools that actually work on this Pin. Call this first and follow that list: the operations differ by tier, and calling one the Pin does not support is rejected. Takes an accountId from list_accounts and a postId from list_posts. Check that Pin first: it needs a generationId (without one this fails with design_not_found), and a published Pin (status sent) fails with post_already_published. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
postIdYesPin ID from list_posts
accountIdYesNumeric Tailwind account ID from list_accounts

Output Schema

NameRequiredDescription
designYes

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent annotations by naming the preconditions (needs a generationId) and the exact failure modes (design_not_found, post_already_published for status 'sent'). It also discloses that available operations vary by tier, which is behavioral context an agent cannot 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.

Conciseness4/5

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

Front-loads the purpose and the return payload, then layers prerequisites, error cases, and the account-ambiguity rule in a logical order. Slightly overlong because the 'Takes an accountId from list_accounts and a postId from list_posts' sentence duplicates the schema, but every other sentence earns its place.

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

Completeness5/5

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

For a read tool with full annotations and an output schema, the description covers what an agent still needs: sequencing, tier-dependent operation support, prerequisites, and known error states. Nothing material to 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% and the schema already states accountId comes from list_accounts and postId from list_posts, so most of the description's parameter text is redundant. It does add real meaning for accountId by specifying the multi-account disambiguation behavior, which the schema does not express.

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 ('read the design of a Pin') with a precise scope: the AI-generated design, plus the returned fields (tier, variations, sourceImageCandidates, supportedOperations). It is clearly differentiated from siblings like update_pin_design, regenerate_pin_design, get_post, and get_post_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?

Explicit sequencing guidance ('Call this first and follow that list'), an exclusion rationale ('calling one the Pin does not support is rejected'), and a pre-call disambiguation rule for multi-account users ('ask the user which account to use ... do not choose for them'). This is about as actionable as usage guidance gets.

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

get_pin_spacing_ruleA
Read-onlyIdempotent
Inspect

Use this when the user asks how far apart Pins to a destination URL will be spaced, why Pins to one URL land days apart, or whether Pin Spacing will get in the way of a planned cadence: returns the Pin Spacing rule Tailwind applies to Pins linking to that url, either the account-wide DEFAULT rule or a URL-specific CUSTOM rule, with its spacing in days. It is resolved the same way useNextOpenSlot resolves it, so a linked URL reports its base URL's rule and linkedToUrl names that base. A null rule means Pin Spacing does not constrain the URL. useNextOpenSlot on create_post and schedule_post honors this rule. An explicit sendAt sets only a Pin's initial time and is not an exemption: a later Pin Spacing respace or schedule shuffle can still move that Pin, and no tool can lock it in place. Read-only: rules can only be changed in the Tailwind dashboard. For every rule on the account at once, use list_pin_spacing_rules. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
urlYesThe Pin destination URL to look up, the same value create_post takes as url
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
urlYesThe URL that was looked up, as sent
ruleYesThe applied rule; null when Pin Spacing does not constrain the URL
linkedToUrlYesThe base URL whose rule url follows when url is a linked URL; null otherwise

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/non-destructive, yet the description adds substantial behavior: rules resolve like useNextOpenSlot, linked URLs report the base URL's rule with linkedToUrl naming it, null means spacing does not constrain the URL, and rules can only be changed in the dashboard. It also preempts a likely misconception by stating an explicit sendAt is not an exemption from later respacing.

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?

Trigger conditions are front-loaded and the routing alternative and account-selection caveat come at logical points. It is dense and runs long, with the sendAt and dashboard sentences sitting slightly off the core lookup purpose, but each still conveys usable behavior 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?

With an output schema present, the description needn't enumerate return fields, yet it still explains the null case and the linkedToUrl field's meaning. For a two-parameter read tool, an agent has everything needed to call it correctly and interpret 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 both parameters are documented structurally; the description adds meaning by tying url to the same value create_post accepts and explaining linked-URL base resolution. That is genuine added semantics, though it does not elaborate further on accountId 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?

States a specific verb and resource: returns the Pin Spacing rule (DEFAULT or CUSTOM) that Tailwind applies to Pins linking to a given URL, including spacing in days. It explicitly contrasts with list_pin_spacing_rules (all rules at once), so an agent can separate the two without opening schemas.

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

Usage Guidelines5/5

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

Opens with concrete trigger conditions ("how far apart Pins will be spaced," "why Pins land days apart," "whether Pin Spacing will get in the way of a planned cadence") and names the alternative tool for the adjacent need. It also gives an explicit procedural rule: if multiple accounts exist and the user did not pick one, ask rather than choose.

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

get_postA
Read-onlyIdempotent
Inspect

Use this when the user asks about one specific Pinterest Pin and a postId is already known (from create_post, schedule_post, or list_posts): returns that single Pin's current status, media, title, description, destination url, board, and scheduled or published time. Reading one Pin by ID is the precise way to confirm what a Pin looks like now — paging list_posts to hunt for it is not. It is also how the user sees a Pin's image: clients that show Tailwind's Pin card render this result with the image, which exists only in Tailwind and is not found by a web or image search. A deleted Pin stays readable with status "deleted" for at least 28 days, after which it becomes eligible for automatic purge; once purged, and for a postId that never existed on this account, the call returns a not-found error. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
postIdYesPost ID of the Pin to read, from create_post or list_posts
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
postYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds real behavioral context beyond them: deleted Pins remain readable with status "deleted" for ~28 days before purge eligibility, purged or never-existent IDs return a not-found error, and the image is a Tailwind-only asset invisible to web/image search. That is exactly the kind of consequence-and-edge-case disclosure annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the trigger condition and the returned fields, then layered with edge cases in rough priority order. It runs five sentences and includes a slightly rhetorical aside ('paging list_posts to hunt for it is not'), but every clause carries operational information.

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

Completeness5/5

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

An output schema exists, yet the description still names the concrete fields and covers the failure modes (deleted-but-readable window, purge, not-found), the image-rendering caveat, and the account-selection prerequisite. For a simple 2-parameter read, 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.

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 state postId comes from create_post/list_posts and accountId comes from list_accounts, so the description is largely restating structured data. Its only added meaning is the multi-account disambiguation rule, which is usage guidance rather than parameter semantics. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource (read one Pinterest Pin by postId) and enumerates exactly what comes back: status, media, title, description, destination url, board, and scheduled/published time. It also explicitly contrasts itself with list_posts, so an agent can distinguish it from the paging 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 a concrete trigger (user asks about one Pin and a postId is already known) and names the provenance of that ID (create_post, schedule_post, list_posts). It also states an explicit anti-pattern ('paging list_posts to hunt for it is not' the precise way) and a prerequisite fork: if multiple accounts exist and the user didn't specify, ask rather than choose.

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

get_post_batchA
Read-onlyIdempotent
Inspect

Use this to check on a create_posts batch. It reports every entry in the order submitted as created (with its postId), failed (with the reason, the same one create_post would give) or pending, and the batch's status is completed once nothing is pending. A full batch takes a few minutes, so check every 10 seconds or so. An entry that failed with a note that the Pin may exist should be looked up with list_posts before it is sent again. Results are kept for 7 days.

NameRequiredDescriptionDefault
batchIdYesThe batch id create_posts returned

Output Schema

NameRequiredDescription
batchYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, non-destructive behavior, and the description adds substantial context beyond them: batches take a few minutes, completed means nothing is pending, failure reasons match create_post, and results are retained for 7 days. It also explains the special retry caveat for Pin-may-exist failures.

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 purpose, then proceeds through result states, timing, retry guidance, and retention. Every sentence contributes operational information without 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?

For a polling status tool with an output schema, the description covers what an agent needs: how to interpret statuses, how often to poll, how long results persist, and how to handle a failed entry before retrying. Nothing material 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 the single batchId parameter is already documented as the batch id returned by create_posts. The description reinforces that context but does not add format or validation detail beyond the schema.

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

Purpose5/5

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

The description states a specific verb and resource: check on a create_posts batch and report entries as created, failed, or pending. It clearly distinguishes this status-check tool from create_posts and create_post by naming the batch workflow it belongs to.

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 usage guidance: use this after create_posts, poll every 10 seconds or so, and look up entries with a Pin-may-exist failure note using list_posts before resending. This routes the agent correctly and names an alternative when retry risk exists.

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

get_post_imageA
Read-onlyIdempotent
Inspect

Use this when you need to see what one Pinterest Pin's picture looks like, for example to read the words in a graphic or to match drafts to the copy prepared for them, and a postId is already known (from list_posts, get_post, or create_post): returns the Pin's image as an MCP image content block after a one-line summary of its type and size. Whether the model sees the picture depends on the client: ChatGPT currently passes on only the summary, so there the image's text and contents cannot be read. It is the cover image of an image or carousel Pin, or a video Pin's cover, never the video itself. Images hosted by Tailwind come back 1000px wide. When the image is over 4MB, a video has no cover, or the image's host refuses the fetch, the call fails with a message naming the image's URL instead. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
postIdYesPost ID of the Pin whose image to return, from list_posts or get_post
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
postIdYes
mimeTypeYes
byteLengthYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/openWorld, yet the description adds substantial behavior the agent could not otherwise know: it returns an MCP image content block after a one-line summary, ChatGPT clients only surface the summary, Tailwind-hosted images are 1000px wide, and it fails with a URL-naming error for >4MB images, coverless videos, or refused fetches.

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 use case, then returns, then client caveat, then edge cases, then the account caveat — a sensible ordering. It is dense and long for a two-parameter read tool, but nearly every sentence carries distinct operational information.

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

Completeness5/5

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

Even with an output schema present, the description covers the return shape, client-dependent visibility, sizing, and the full failure envelope, plus the multi-account prerequisite. Nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description goes further by stating where postId comes from and adding an accountId disambiguation policy (ask the user if multiple accounts) that the schema does not express.

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 ('see what one Pinterest Pin's picture looks like', 'returns the Pin's image as an MCP image content block') and explicitly scopes it to cover images, not videos or design variations. This separates it from get_post and get_pin_design which are the plausible alternatives.

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 trigger conditions ('when you need to read the words in a graphic or match drafts to copy'), names the prerequisite ('a postId is already known') and its sources (list_posts, get_post, create_post). It also adds a when-not-to-decide rule: ask the user which account before calling if list_accounts returns multiple.

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

get_scheduleA
Read-onlyIdempotent
Inspect

Use this when the user asks what is on their Pinterest schedule, when their next opening is, or how full their queue looks: returns the account's schedule over a date window as concrete dated entries, each marked open, scheduled, publishing or published. Unlike list_timeslots — which returns the recurring weekly rules and no occupancy — this shows which specific times are actually free. Read it to answer questions and to reason about the queue. Do NOT read an open entry and then pass its time back as sendAt to schedule a Pin: what is open at read time can be taken by the time the write lands. Pass useNextOpenSlot: true to create_post or schedule_post instead, which resolves and claims a slot in one step. Defaults to the next 14 days from now; from/to accept ISO 8601 datetimes and the window cannot exceed 60 days. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
toNoEnd of the window (ISO 8601). Defaults to 14 days after the start. At most 60 days after it.
fromNoStart of the window (ISO 8601, e.g. 2025-01-15T00:00:00Z). Defaults to now.
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
windowYesThe window actually read, as Unix timestamps
scheduleYesDated schedule entries, earliest first

TDQS

A4.8/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 the read-then-write race condition: a slot open at read time may be taken before the write lands. It also documents the default 14-day window, the 60-day cap, and the account-ambiguity handling requirement, which are important behavioral traits an agent would not otherwise know.

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 definition is front-loaded with the use case and the sibling contrast, and most sentences carry real information. It is somewhat long and repeats schema details such as ISO 8601 formatting, the 14-day default, and the 60-day cap, which could be trimmed, but it avoids 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 presence of an output schema and rich annotations, the description is complete for this tool's complexity. It covers purpose, alternatives, date-window behavior, race-condition risk, and account-selection procedure, so an agent has everything needed to invoke 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 schema already documents from/to as ISO 8601 with their defaults and the 60-day maximum. The description adds value by tying those parameters to the default-window behavior and by giving explicit guidance on accountId: ask the user which account to use rather than selecting one automatically when list_accounts returns multiple accounts.

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 ('returns the account's schedule over a date window as concrete dated entries') and explicitly differentiates itself from the sibling tool list_timeslots by contrasting dated occupancy entries with recurring weekly rules. An agent can tell exactly what this tool does and how it differs 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?

It gives explicit triggering questions ('what is on their Pinterest schedule', 'when their next opening is', 'how full their queue looks') and a clear when-not-to-use rule: do not read an open entry and pass its time back as sendAt. It names the correct alternative workflow (useNextOpenSlot with create_post/schedule_post) and includes an account-selection prerequisite when multiple accounts exist.

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

list_accountsA
Read-onlyIdempotent
Inspect

Use this when the user wants to see their connected Pinterest accounts, or as the first step of any Pinterest Pin workflow: lists the Pinterest accounts connected to the user's Tailwind organization with each account's accountId, username, display name, connection status, and time zone. Call this first — every account-scoped tool requires an accountId from this list. To connect another Pinterest account, or reconnect one whose tokenStatus is unauthorized, use connect_pinterest_account. (The org-scoped feed tools — preview_feed, list_feeds, get_feed, update_feed, delete_feed — do not; connect_feed does, since it assigns a feed's Pins to one account.) When more than one account comes back and the user did not say which one to use, ask the user which account to use before acting on any of them — do not choose for them.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
accountsYesPinterest accounts connected to the organization

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds workflow-level behavior the annotations cannot: this is the prerequisite step for account-scoped tools, it surfaces connection status and a tokenStatus of unauthorized, and it instructs the agent to ask the user rather than pick an account. That is meaningful context beyond the structured safety hints.

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 core directive (call this first) is front-loaded and every sentence carries routing information. The parenthetical listing five feed tools is dense and slightly bloats the middle, but it does prevent a real misrouting error, so the cost is defensible rather than wasted.

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

Completeness5/5

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

An output schema exists, yet the description still names the returned fields (accountId, username, display name, connection status, time zone), which tells the agent what can be read off the response without opening the schema. Combined with prerequisite and multi-account guidance, nothing an agent needs is missing for this zero-param list tool.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. Its discussion of accountId refers to downstream tools' requirements rather than this tool's input, which is useful orientation but not parameter semantics 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 (lists) and a precisely scoped resource (Pinterest accounts connected to the user's Tailwind organization), plus the fields returned per account. It is distinguishable at a glance from siblings like list_feeds, get_account, and connect_pinterest_account.

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 first because every account-scoped tool requires an accountId, names connect_pinterest_account for the connect/reconnect path, and carves out the org-scoped feed tools as exceptions while noting connect_feed does need an accountId. It even prescribes the behavior when multiple accounts come back and the user was ambiguous.

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

list_board_listsA
Read-onlyIdempotent
Inspect

Use this when the user asks about their board lists, when auditing how their boards are organized, or when they name one of their board lists as where a Pin should go: lists the account's board lists (Tailwind's named groupings of boards, used to publish one Pin to several boards in order). Each list gives its boards in publishing order. To actually publish to a list, read its boards here and pass them as create_post's intervalBoards, keeping this order — the list itself is not a target you can pass anywhere, and a list is a saved grouping that can change, so what you publish to is the boards it holds right now. A board on the account that appears in no list is not covered by any grouping; a list entry whose board id is absent from list_boards points at a board that no longer exists on the account. create_board_list, update_board_list and delete_board_list manage the lists themselves. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
boardListsYesBoard lists configured on the account

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare this a safe, idempotent read, so the description focuses on behavior the annotations can't express: lists are snapshots that can change, a list is not a passable target, boards must be passed as intervalBoards in the returned order, and entries whose board id is missing from list_boards are stale. That stale-reference and ordering guidance is genuinely beyond structured data.

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 'Use this when' trigger, then the definition, then the handoff to create_post. It is dense and slightly run-on in the middle section, but nearly every clause carries operational 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?

For a one-parameter read with an output schema, this covers everything an agent needs: when to call it, what a list means, how to consume the ordered boards downstream, how to handle dangling board ids, which siblings mutate lists, and the account-selection prerequisite.

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

Parameters4/5

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

Schema coverage is 100% and the single accountId parameter is fully documented in the schema, so the baseline would be 3. The description adds real semantic guidance by tying accountId to list_accounts output and specifying a disambiguation behavior when multiple accounts exist.

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 account's board lists') and immediately defines what a board list is ('Tailwind's named groupings of boards, used to publish one Pin to several boards in order'). This distinguishes it from sibling readers like list_boards and list_board_sections, which an agent could otherwise confuse with 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?

Enumerates three concrete triggering situations (user asks about lists, auditing board organization, user names a list as a Pin destination) and names the sibling mutation tools (create_board_list, update_board_list, delete_board_list) that handle list management instead. It also gives an explicit precondition: if the account is ambiguous and list_accounts returns multiple, ask the user rather than choosing.

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

list_board_pinsA
Read-onlyIdempotent
Inspect

Use this when the user wants to see, audit, export or reorganize the Pins already saved on one of their Pinterest boards, including secret boards: what is on a board, what was added to it recently, or which Pins sit in which section. Returns every Pin on the board however it got there, with its Pinterest URL, image URL, destination link, saved time and section. Free: no credits. get_board_keyword_relevance only scores a board's Pins against a keyword and spends a credit, so it is not a way to list them.

Pins come in Pinterest's board order, which is mostly newest first but not strictly; to sort by date, sort by createdAt yourself. startDate and endDate filter on createdAt (when the Pin was saved to the board) and either may be given alone. A page can hold fewer Pins than limit, or none, while cursor is still returned: keep calling with that cursor until it is absent, and only then report the board as fully listed. boardSectionId matches list_board_sections, and is null for a Pin on the board itself. pinId is the PINTEREST Pin id, which get_pin_analytics and save_pins_to_board take; it is not a Tailwind postId. imageUrl is a link to the image, not the image itself. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
limitNoPins to read from Pinterest per page, 1 to 250. Defaults to 100.
cursorNoThe cursor from the previous list_board_pins response, to fetch the next page
boardIdYesNumeric Pinterest board ID returned by list_boards, never a board name
endDateNoOnly Pins saved at or before this UTC date-time, e.g. 2026-10-07T23:59:59Z
accountIdYesNumeric Tailwind account ID returned by list_accounts
startDateNoOnly Pins saved at or after this UTC date-time, e.g. 2026-10-01T00:00:00Z

Output Schema

NameRequiredDescription
pinsYesPins on this page, in Pinterest's board order
cursorNoPass back as cursor for the next page. Absent once every Pin on the board has been listed.
boardIdYes
accountIdYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint. The description adds substantive context beyond them: no credit cost, pagination semantics where a short or empty page may still include a cursor, non-strict newest-first ordering, and ID/link distinctions such as pinId being the Pinterest ID rather than a Tailwind postId.

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 purpose and use cases, then moves through return behavior, pagination, parameter semantics, and account handling. Although long, the sentences are information-dense and each addresses a real ambiguity.

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 an output schema present, the description still covers pagination termination, date filtering, section IDs, account selection, and ID types. That is enough for an agent to invoke the tool correctly in ambiguous cases.

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. The description adds meaning beyond the schema: startDate and endDate filter on createdAt when the Pin was saved, boardSectionId matches list_board_sections and is null for board-level Pins, and pinId is the Pinterest Pin ID used by get_pin_analytics and save_pins_to_board.

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 names a specific resource (Pins already saved on a Pinterest board) and scope (secret boards, sections, saved time), and distinguishes it from get_board_keyword_relevance. It does not explicitly differentiate from the sibling list_pins, so a 4 rather than a 5.

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

Usage Guidelines5/5

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

It gives explicit trigger conditions ('when the user wants to see, audit, export or reorganize...') and a when-not case: get_board_keyword_relevance only scores against a keyword and spends a credit. It also handles account ambiguity by instructing to ask the user when multiple accounts exist.

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

list_boardsA
Read-onlyIdempotent
Inspect

Use this when the user wants to see their Pinterest boards, or whenever you need a boardId — this is how to get the boardId values that create_post and schedule_post take. Lists the Pinterest boards on an account (accountId from list_accounts) with each board's numeric ID, name, description, follower count and Pin count. This is also how to audit board descriptions: a board with no description comes back with no description field at all, so the boards missing one are the boards where it is absent. It is also how to find boards that have gone quiet: pinsModifiedAt is when Pinterest last recorded a change to the board's Pins, so an old date marks a board that needs refreshing, with no need to read its Pins. The Pin count comes from a cached snapshot and can lag behind Pinterest, so treat it as a lower bound rather than an exact figure. Board IDs are numeric — never pass a board name or URL where a boardId is expected. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
boardsYesPinterest boards on the account

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare read-only/idempotent/non-destructive, but the description adds substantive traits beyond them: the Pin count comes from a cached snapshot and lags (treat as lower bound), pinsModifiedAt is a staleness proxy, and a board with no description omits the field entirely rather than returning null. These are non-obvious data-quality caveats 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.

Conciseness4/5

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

Usage intent and the boardId-for-create_post rationale are front-loaded, and every sentence carries content. It runs long, though, and the audit/quiet-board framing drifts somewhat from the core 'list boards for an account' purpose, making it denser than it needs to be.

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

Completeness5/5

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

An output schema exists so return values need not be explained, yet the description still supplies the interpretive caveats (staleness, absent description field, cached counts) that matter for correctly acting on the output. Nothing an agent needs in order to call and interpret this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the single accountId param is documented, so baseline is 3. The description adds value by tying accountId's provenance to list_accounts and by warning that board IDs are numeric and must never be substituted with a name or URL — guidance the schema does not state.

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 Pinterest boards on an account") and enumerates the returned fields. It is clearly separable from nearby siblings like list_group_boards, list_board_pins and list_board_sections, which target different resources.

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

Usage Guidelines5/5

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

Explicitly names the triggering intent ("when the user wants to see their Pinterest boards") and the downstream consumer ("this is how to get the boardId values that create_post and schedule_post take"). It also gives an explicit disambiguation rule: if the account is unspecified and list_accounts returns multiple, ask the user rather than choosing.

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

list_board_sectionsA
Read-onlyIdempotent
Inspect

Use this when the user asks about the sections on a Pinterest board, or when you need a section ID: lists the sections on a board by boardId (from list_boards). Sections are subdivisions within a single board. Returns an empty list when the board has no sections, which is normal. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
boardIdYesNumeric Pinterest board ID returned by list_boards — never a board name or URL
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
sectionsYesSections on the board

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds genuinely new behavioral context — that an empty list is a normal result for boards without sections — which prevents an agent from treating it as a failure. It does not describe pagination or volume limits, keeping it short of a 5.

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

Conciseness4/5

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

Front-loaded with the triggering condition, then the mechanism, then the edge case, then the account caveat. Four sentences, all functional, though the account-selection sentence is dense and could be split or 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?

With an output schema present, return shape needn't be explained, yet the description still covers the one return behavior an agent must not misread (empty list). Prerequisites and account-ambiguity handling are covered; no meaningful gap remains for a two-parameter read tool.

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

Parameters3/5

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

Schema coverage is 100% and both parameters already document their source and format ("never a board name or URL"), so the schema does the heavy lifting. The description only repeats the boardId provenance, 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?

Uses a specific verb and resource ("lists the sections on a board by boardId") and scopes it explicitly against siblings by noting sections are subdivisions within a single board, so an agent won't confuse it with list_boards or list_board_pins. It also states the derived use case (obtaining a section ID).

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 ("when the user asks about the sections on a Pinterest board, or when you need a section ID"), names the prerequisite source for boardId (list_boards), and includes a decision rule for the ambiguous-account case: ask the user rather than guessing.

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

list_feedsA
Read-onlyIdempotent
Inspect

Use this when the user asks which RSS feeds or blogs they have connected to Tailwind, or when you need a feedId for get_feed, update_feed or delete_feed. Lists the organization's feed subscriptions newest first, each with the Pinterest account its Pins go to, its status, and how many SmartPins it has generated. Feeds belong to the organization, not to an account: omit accountId to see all of them, or pass one to see only the feeds assigning Pins to that account. Unlike list_accounts, list_boards and the other account-scoped tools, accountId here narrows an org-wide list rather than gating it — do not carry over an accountId from an earlier, unrelated call: if the user asked about their feeds in general, omit it, even when an accountId is already in context for a different account. Results are paginated; pass the returned nextCursor to read further.

NameRequiredDescriptionDefault
limitNoFeeds per page, 1-100. Defaults to 50.
cursorNonextCursor from a previous call, to read the next page.
accountIdNoOptional. Only feeds whose Pins are assigned to this account (a numeric Tailwind account ID from list_accounts). Omit to list every feed in the organization.

Output Schema

NameRequiredDescription
feedsYesThe feed subscriptions, newest first
hasMoreYesWhether more feeds exist beyond this page
nextCursorNoPass as `cursor` to read the next page. Absent on the last page.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds behavior the annotations don't: newest-first ordering, the org-wide rather than account-gated scoping model, and cursor-based pagination with nextCursor. It stops short of any auth or rate-limit context, and some of the return-field detail overlaps the 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.

Conciseness4/5

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

Front-loaded with the trigger and purpose, and every sentence carries information. The accountId carry-over warning runs long and could be tightened to one sentence without losing meaning.

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

Completeness5/5

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

Covers purpose, when to call, how to scope accountId, pagination mechanics, and what fields come back, while an output schema handles the return shape. Nothing an agent needs to invoke this correctly 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 baseline is 3, but the description adds real semantics the schema can't: accountId narrows an org-wide list rather than gating access, unlike sibling account-scoped tools, plus an explicit warning not to carry over an unrelated accountId. That distinction is the single most likely invocation error and it is addressed directly.

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 (list the organization's feed subscriptions) and immediately names what each entry contains. It explicitly distinguishes itself from list_accounts, list_boards and other account-scoped tools, so an agent can separate it from siblings without opening a schema.

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

Usage Guidelines5/5

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

Gives concrete triggers (user asks which feeds/blogs they have connected, or a feedId is needed for get_feed/update_feed/delete_feed) and names the sibling tools that consume the output. It also handles the non-obvious case: omit accountId for a general question even when an accountId is in context.

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

list_group_boardsA
Read-onlyIdempotent
Inspect

Use this when the user wants to see what public Pinterest group boards exist for a topic, or wants benchmark context for how boards in their niche are named and sized. Returns public collaborative boards matching a keyword from Tailwind's Group Board Finder. These are OTHER people's public boards — they are not the user's own boards (use list_boards for those), and their board ids cannot be passed to create_post or schedule_post. Results are cached and refreshed in the background, so check status before reporting: ready means the boards returned are what we have (an empty list means a completed search genuinely found none), warming means a search is still running and you should tell the user to check back rather than reporting no results, and unavailable means the search failed and no benchmark data can be given for this keyword. Tailwind Communities (formerly Tribes) has no tool here: these tools cannot list the user's Communities, share Pins to one, or read how a Community performs. Tailwind is replacing Communities with Turbo Groups, niche groups of creators who see and engage with each other's Pins in Turbo, which the user joins from suggestions in their Turbo feed and finds again under My Groups in the Tailwind app. Turbo Groups has no tool either. A request for either one is a missing capability that request_capability records; Pinterest group boards (list_group_boards) are a different feature and do not answer it.

NameRequiredDescriptionDefault
keywordYesTopic to search for, e.g. "home decor". Trimmed, whitespace-collapsed and lowercased before lookup; 100 characters maximum. Use the user's actual niche terms rather than a broad category.

Output Schema

NameRequiredDescription
boardsYesPublic group boards matching the keyword, most-followed first
statusYes`ready` — the boards are what we have, including an empty list. `warming` — a search is running and nothing is cached yet. `unavailable` — the most recent search failed.
keywordYesThe normalized keyword the results are keyed on
lastCompletedAtNoWhen a search for this keyword last completed successfully
retryAfterSecondsNoOn `warming`, how long to wait before asking again

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare read-only/idempotent/open-world, but the description adds behavior the annotations cannot: caching with background refresh and the three-state `status` contract, including that `warming` must not be reported as 'no results'. It also warns that returned board ids are unusable downstream, which prevents a concrete 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?

Front-loaded with the trigger, the sibling contrast, and the status contract in that order. The Communities/Turbo Groups paragraph is long relative to the tool's core job, but it earns its place by preventing misfires on unsupported requests.

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

Completeness5/5

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

Despite an output schema existing (so return shape needn't be spelled out), the description still supplies the status semantics needed to interpret that output correctly. Safety, scope, alternatives, and failure modes are all 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?

Schema coverage is 100% and the only parameter's description already covers normalization, length limit, and niche-term guidance. The description adds only the 'matching a keyword from Tailwind's Group Board Finder' framing, so the schema does the heavy lifting — 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 and resource (list public Pinterest group boards), names the data source (Tailwind's Group Board Finder), and explicitly contrasts with list_boards. An agent can distinguish this from every sibling without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit trigger conditions (user wants to see public boards for a topic or benchmark naming/sizing), an explicit exclusion with the correct alternative (use list_boards for the user's own boards), and rules out create_post/schedule_post consumers. It also pre-empts two related-but-unsupported requests (Communities, Turbo Groups) and points to request_capability.

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

list_pinsA
Read-onlyIdempotent
Inspect

Use this when the user wants every Pin on their Pinterest account, or Pins from a date range: an inventory, an export, weekly counts, or finding a Pin by its link or title. Returns Pins newest first however they were published, including Pins created directly on Pinterest or by another tool, and Pins on secret boards. list_posts only covers Pins Tailwind scheduled, and list_top_pins only returns ranked winners, so neither is a complete inventory.

Each Pin carries isRepin (saved from another Pin, including the account's own Pins saved to another board), creativeType (Pinterest's format, e.g. REGULAR, VIDEO, SHOPPING), boardId, destinationUrl with any UTM parameters, and createdAt. Pass pinType ORIGINAL for Pins the account created or SAVED for saves of other people's Pins. A save of the account's own Pin to another board is in neither, so the two can sum to less than ALL: to count every save, use ALL and isRepin. To find a Pin by URL or title, page through and match destinationUrl or title yourself: there is no search filter.

startDate and endDate filter on createdAt and either may be given alone. A page can hold fewer Pins than limit, or none, while cursor is still returned: keep calling with that cursor until it is absent, and only then report totals as complete. pinId is the PINTEREST Pin id, which get_pin_analytics takes; it is not a Tailwind postId. Reading Pins is free and consumes no credits. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
limitNoPins to read from Pinterest per page, 1 to 250. Defaults to 100.
cursorNoThe cursor from the previous list_pins response, to fetch the next page
endDateNoOnly Pins created at or before this UTC date-time, e.g. 2026-10-07T23:59:59Z
pinTypeNoORIGINAL for Pins the account created (isRepin false), SAVED for saves of other people's Pins, ALL for everything. Defaults to ALL.
accountIdYesNumeric Tailwind account ID returned by list_accounts
startDateNoOnly Pins created at or after this UTC date-time, e.g. 2026-10-01T00:00:00Z

Output Schema

NameRequiredDescription
pinsYesPins on this page, newest first
cursorNoPass back as cursor for the next page. Absent once every Pin has been listed.
pinTypeYesThe Pin filter actually applied
accountIdYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already establish a safe read-only, idempotent operation, but the description adds substantial behavioral context: results are newest first, include secret-board Pins and Pins created by other tools, and each Pin carries isRepin, creativeType, boardId, destinationUrl with UTMs, and createdAt. It also discloses the important pinType edge case, pagination behavior with cursors, and that reading Pins consumes no credits.

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 use case and is organized logically from purpose to fields, pinType behavior, pagination, and account selection. It is somewhat long for a list tool and repeats the link/title lookup guidance, but nearly every sentence carries operational value.

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

Completeness5/5

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

Given an output schema and annotations that already cover safety, the description supplies everything else an agent needs: scope, sibling distinctions, field meanings, pinType edge cases, date filtering, pagination completion rules, ID semantics, credit cost, and account-selection ambiguity. Nothing material for correct invocation appears 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 beyond the schema: it explains that ORIGINAL and SAVED can both miss an account's own Pin saved to another board, that ALL plus isRepin is needed to count every save, that startDate and endDate may be supplied alone, and that pinId is a Pinterest ID rather than a Tailwind postId. It leaves limit and accountId mostly to the schema, so it is strong but not exhaustive.

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: every Pin on the Pinterest account, optionally within a date range, for inventory, export, weekly counts, or lookup by link/title. It explicitly distinguishes this from list_posts and list_top_pins, so an agent can select it confidently without opening sibling schemas.

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

Usage Guidelines5/5

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

It names the alternatives and the conditions that select them: list_posts covers only Tailwind-scheduled Pins and list_top_pins returns ranked winners, neither being a complete inventory. It also states there is no search filter, explains the pagination loop, and instructs the agent to ask the user which account to use when multiple accounts exist.

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

list_pin_spacing_rulesA
Read-onlyIdempotent
Inspect

Use this when the user asks what Pin Spacing rules their account has, or when planning a high-volume schedule across many destination URLs: lists the account-wide default rule, every URL-specific custom rule, and the linked URLs that follow another URL's rule. Pin Spacing is the minimum number of days Tailwind keeps between scheduled Pins that share a destination URL, so a daily cadence needs enough distinct URLs to fill it. To find the rule one particular URL gets, call get_pin_spacing_rule rather than matching URLs against this list: matching ignores http/https and trailing slashes, and a linked URL inherits its base URL's rule. Read-only: rules can only be changed in the Tailwind dashboard. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
linkedUrlsYesURLs that follow another URL's rule; Pins to a linked URL and its base share one spacing window
customRulesYes
defaultRuleYesThe account-wide rule for every URL without a custom rule; null when the account has none

TDQS

A4.7/5.0
Behavior4/5

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

Adds real context beyond the annotations: rules cannot be mutated here (only in the dashboard), matching ignores http/https and trailing slashes, and linked URLs inherit their base URL's rule. It also warns against client-side URL matching, which is a genuine behavioral pitfall. Minor gap: no note on result size or ordering, though the output schema covers shape.

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

Conciseness5/5

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

Front-loaded with the trigger condition, then contents, then a domain definition, then the sibling alternative, then operational constraints. Every sentence carries distinct information; nothing is redundant 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?

For a single-parameter read-only tool with a full output schema and rich annotations, the description covers triggers, alternatives, domain semantics, mutation limits, and account disambiguation. 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% and the accountId description already points at list_accounts, so baseline is 3. The description goes further by mandating that the agent ask the user which account to use when multiple accounts exist rather than guessing, which is meaningful semantics the schema does not convey.

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

Purpose5/5

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

States a specific verb and resource (lists the account-wide default rule, URL-specific custom rules, and linked URLs) and explicitly distinguishes itself from the sibling get_pin_spacing_rule. An agent can identify what this returns without opening the output 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 trigger ('when the user asks what Pin Spacing rules their account has'), a secondary trigger (planning a high-volume schedule across many URLs), and an explicit exclusion routing to get_pin_spacing_rule for single-URL lookups. It also specifies the account-disambiguation protocol before calling.

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

list_postsA
Read-onlyIdempotent
Inspect

Use this when the user wants to see their Pinterest Pins — drafts, scheduled (queued), published (sent), failed, or missed: lists an account's Pins filtered by status (default queued) and returns each Pin's postId for use with get_post, schedule_post and delete_post. Takes an accountId from list_accounts. status draft omits drafts not yet assigned to any Pinterest account (such as some Made For You drafts), which the Pin Scheduler counts in its "drafts that aren't assigned to a Pinterest account yet" banner. The draft count can be lower than the dashboard's by that number: that gap is expected, not missing drafts, but a larger one is worth reporting. Assigning them to this account from that banner makes them list. Results are cursor-paginated; listing sent, uploading or missed Pins requires startDate and endDate. Queued Pins come back in schedule order, soonest first, and without a startDate start from now, so overdue ones are listed only as missed; every other status comes back newest first. A missed Pin is a queued Pin whose scheduled time passed without it publishing; it is listed with status missed, while get_post reports it as queued. Failed, missed and uploading Pins match the date window by their scheduled time, except a failed Pin that had already published, which matches by when it published. A Pin that Tailwind's AI generated, from generate_pins_from_url or a connected feed, is saved as a draft and never publishes on its own: it waits until someone reviews it and either schedules or discards it, and many users never come back to do that. list_posts with status draft is where those drafts wait; the ones carrying a generationId are the generated ones. A review reads each draft's title, description, url and mediaUrl (get_post_image shows the picture), judges it by whatever criteria the user has given, and then approves it with schedule_post, fixes its copy first with update_post, changes its picture through get_pin_design, or discards it with delete_post. Tailwind stores no review criteria: they live with the user and the agent. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
limitNoNumber of posts to return (1-100, default: 50)
cursorNoPagination cursor from a previous list_posts response
statusNoFilter by post status (default: queued). draft = drafts assigned to this account, including AI-generated drafts waiting for review (they carry generationId); failed = publishing failed; missed = still queued after its scheduled time passed
endDateNoFilter posts before this date (ISO 8601). Required for sent, uploading and missed status; for queued and failed, pass both startDate and endDate or neither. For missed, a date after now counts as now.
accountIdYesNumeric Tailwind account ID returned by list_accounts
startDateNoFilter posts after this date (ISO 8601). Required for sent, uploading and missed status; for queued and failed, pass both startDate and endDate or neither.

Output Schema

NameRequiredDescription
postsYesPosts matching the filters
cursorNoPagination cursor for the next page; absent when there are no more posts

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnly/non-destructive annotations, the description discloses default status behavior, cursor pagination, date-range requirements, ordering rules, how missed Pins differ from get_post reporting, and the special handling of AI-generated drafts. It also states the account-selection prerequisite clearly.

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

Conciseness3/5

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

The core purpose and usage are front-loaded, but the description is very long and includes extended review-workflow guidance and draft-banner context that could be trimmed for a listing tool. Some draft-related details are repeated across 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?

Given the tool's complexity and the presence of a full schema, annotations, and an output schema, the description is highly complete. It covers status semantics, date constraints, pagination, ordering, account disambiguation, and draft-review edge cases that an agent would otherwise miss.

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 six parameters. The description still adds meaning beyond the schema: it explains the default queued status, the draft-assignment omission, the date-window matching rules for failed/missed/uploading Pins, and the ordering implications of status and dates.

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 (lists an account's Pins) and enumerates the statuses it can return. It distinguishes the tool from get_post, schedule_post, and delete_post by explaining that each Pin's postId is returned for those follow-up actions.

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

Usage Guidelines4/5

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

It gives explicit usage context ('Use this when the user wants to see their Pinterest Pins') and references alternatives for single-Pin retrieval, scheduling, updating, and deleting. It also gives a strong prerequisite for account selection, though it does not explicitly contrast list_posts with sibling list tools like list_pins or list_board_pins.

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

list_saved_keywordsA
Read-onlyIdempotent
Inspect

Use this when the user asks what keywords they have saved, or when you need their own keyword list to write Pin titles and descriptions, pick a board topic, or plan content. Returns the organization's Saved Keywords list from Tailwind — terms the user has already chosen to track. This is NOT keyword research: it will not discover new keywords or report how a term is trending, it only reads back what is already on their list. Pass url to read only the keywords saved for one destination URL, e.g. to check what a Pin's link already has before calling save_keywords. Results are paginated newest-first; pass the returned nextCursor to read further.

NameRequiredDescriptionDefault
urlNoOnly return saved keywords associated with this destination URL, e.g. a Pin's link. Must be a full http or https URL and match the saved URL exactly, trailing slash included; http and https are treated as the same. A bare domain such as https://example.com matches keywords saved for any page on it. Cannot be combined with search.
limitNoKeywords per page, 1-100. Defaults to 50.
cursorNonextCursor from a previous call, to read the next page.
searchNoOnly return saved keywords containing this text. Cannot be combined with url.

Output Schema

NameRequiredDescription
hasMoreYesWhether more saved keywords exist beyond this page
keywordsYesThe saved keywords, newest first
nextCursorNoPass as `cursor` to read the next page. Absent on the last page.
totalCountYesTotal saved keywords matching the search or url, across all pages

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety profile is covered; the description adds genuinely new behavior: results are paginated newest-first and nextCursor must be threaded to read further. It reinforces read-only semantics ('only reads back what is already on their list'). Rate limits and page-size fallback behavior are left to the schema, keeping it just 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?

Front-loaded with the trigger condition, followed by purpose, then the negative boundary, then the url use case, then pagination. Every sentence contributes distinct information with no restatement of the name or the schema, and the 'NOT keyword research' clause is placed where an agent will read it early.

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?

An output schema exists, so return-shape detail is rightly omitted, and pagination plus cursor threading are covered. With four optional parameters across list/filter/page concerns, the description is essentially complete; only minor items such as default page size or total-count behavior are left to the schema.

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

Parameters4/5

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

Schema coverage is 100% and the url parameter is fully documented there, so the baseline would be 3. The description still adds an operational use case for url the schema does not express — checking what a Pin's link already has before calling save_keywords — which meaningfully informs how to use the filter rather than merely restating it.

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 ('Returns the organization's Saved Keywords list') and immediately bounds the scope. It explicitly distinguishes itself from keyword research AND from write-side siblings like save_keywords, so an agent can select it without opening the schema. Nothing about the intent is left ambiguous.

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 triggering conditions ('when the user asks what keywords they have saved', 'to write Pin titles... pick a board topic... plan content') plus an explicit exclusion ('This is NOT keyword research: it will not discover new keywords or report how a term is trending'). It also names save_keywords as the complementary write path in the context of the url check.

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

list_subscriptionsA
Read-onlyIdempotent
Inspect

Use this to check whether a Pinterest account has active, paying access — for example before starting a setup or launch flow that depends on a paid feature, or when the user asks what plan or subscription they are on. Read the entitled boolean for the answer; the subscriptions list explains what is backing it. Works identically whichever billing system the account's organization is on, so you never need to branch on that. An account with no paying access returns entitled: false and an empty list — that is a normal answer, not an error. This is a read and costs no credits. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
entitledYesWhether the account currently has active, paying access. Check this before relying on a paid capability.
billingSystemYesWhich billing system the account's organization is on
subscriptionsYesWhat is backing the access. An account billed org-wide (legacy or Shopify) always has exactly one entry describing its organization-wide plan; a modular-billing account has one entry per current entitlement and may have several (e.g. Publishing and SEO) or none. Only current entitlements appear — ended subscriptions and expired grants are omitted.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description goes further by stating it costs no credits, behaves identically across billing systems so no branching is needed, and that `entitled: false` with an empty list is a normal answer rather than an error. The last point is especially valuable because it prevents an agent from treating a valid negative result as a failure.

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

Conciseness4/5

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

The purpose is front-loaded in the first clause and each subsequent sentence adds usable information (output semantics, cross-billing-system invariance, empty-result normalization, credit cost, account disambiguation). It runs slightly long, with a minor redundancy in the 'so you never need to branch on that' clause, but nothing is filler.

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

Completeness5/5

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

For a one-parameter read with an output schema, the description covers everything an agent needs: when to call, how to pick the account, what the returned fields mean, and that an empty result is expected. Return-value explanation beyond the output schema is a bonus rather than a 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% and the single `accountId` parameter is fully documented as a Tailwind account ID from list_accounts, so the schema carries most of the load. The description still adds operative meaning by specifying how to resolve an ambiguous account selection before calling, which is not in 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 names a specific verb and resource — check whether a Pinterest account has active, paying access — and immediately ties it to the concrete output field (`entitled`). It is clearly separable from siblings like get_account, get_account_usage, or list_accounts because it is scoped to subscription entitlement rather than account metadata or usage.

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 trigger conditions (before a setup or launch flow that depends on a paid feature, or when the user asks what plan they are on) and an explicit prerequisite workflow: if the user did not specify an account and list_accounts returns more than one, ask the user rather than choosing. That is a when-to-use, a when-ambiguous rule, and a named sibling to consult.

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

list_timeslotsA
Read-onlyIdempotent
Inspect

Use this when the user asks what their posting schedule looks like, or which times Tailwind recommends: lists the account's smart schedule timeslots. Each slot is a RECURRING WEEKLY time (day of week + HH:MM + timezone), not a concrete date, and this read says nothing about which upcoming occurrences are already taken — use get_schedule for that, which returns dated entries marked open or occupied. This is a read for showing or explaining the recurring schedule, and the place to get the timeslotId that update_timeslot and delete_timeslot need. It is NOT the way to schedule a Pin into it. To place a Pin on the schedule, pass useNextOpenSlot: true to create_post or schedule_post: that resolves the next genuinely open slot and applies the account's Pin Spacing rules for the Pin's destination url. Do not compute an occurrence from these slots and pass it as sendAt — that ignores which slots are occupied and ignores Pin Spacing, so Pins stack up and land off-schedule. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
timeslotsYesRecurring weekly smart schedule timeslots for the account

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already establish a safe read, but the description adds substantive behavioral context beyond them: slots are recurring weekly, the read says nothing about which occurrences are occupied, and computing sendAt from them ignores occupancy and Pin Spacing rules. It also discloses the account-selection requirement when multiple accounts exist.

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 primary purpose and then layered with practical constraints. It is longer than average, but most sentences earn their place by preventing specific scheduling errors; there is some repetition around the do-not-schedule-Pins warning that keeps it just short of a 5.

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?

Output schema exists, so return value detail is not required. Given the scheduling pitfalls, the description covers the important context: what the tool returns conceptually, what it omits, how it relates to get_schedule, and how to obtain a timeslotId. Nothing material 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?

There is only one parameter and schema coverage is 100%, so the schema already documents accountId as the numeric ID from list_accounts. The description adds useful semantics by stating that if multiple accounts exist the agent must ask the user rather than choose one, which goes beyond the schema.

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

Purpose5/5

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

States a specific verb and resource (lists the account's smart schedule timeslots) and immediately clarifies that each slot is a recurring weekly time rather than a concrete date. It explicitly distinguishes itself from get_schedule and from create_post/schedule_post, so an agent can separate it from siblings without opening schemas.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance (showing or explaining the recurring schedule), names the alternative for dated occupancy (get_schedule), and identifies itself as the source of the timeslotId needed by update_timeslot and delete_timeslot. It also provides an explicit when-not-to-use path: do not schedule Pins from these slots and do not compute sendAt manually; use useNextOpenSlot with create_post or schedule_post instead.

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

list_top_pinsA
Read-onlyIdempotent
Inspect

Use this when the user asks which of their Pins are doing best, what is working, or wants their top performers: returns the account's best Pins over a window, in Pinterest's own ranked order. Metrics and ranking combine paid (promoted) and organic activity unless contentType says otherwise, so by default ad spend can crowd organic Pins out of the list and a promoted Pin can rank far higher than its organic-only get_pin_analytics numbers suggest. Pass contentType ORGANIC to rank on unpromoted performance alone, or PAID for promoted only.

Ranks by ENGAGEMENT unless sortBy says otherwise, and tells you which metric it used — say so when reporting, since "top" means nothing without it. Only these five metrics rank: ENGAGEMENT, SAVE, IMPRESSION, OUTBOUND_CLICK, PIN_CLICK.

Each Pin carries creativeType, Pinterest's creative format (REGULAR, VIDEO, CAROUSEL, IDEA, COLLAGE and others), so this is how to compare performance across formats — group or filter by it rather than guessing a format from the title. It is null when Pinterest did not report one.

Each Pin also carries boardId, the Pinterest board it is saved to (the same id list_boards returns), so this is how to compare performance across boards — group by it rather than guessing a board from the title.

When isPartial is true, Pinterest limited the lookups and the Pins in omittedPinIds are missing from the ranking: say the list is incomplete, and retry shortly for the full one.

This is also how you get a Pinterest pinId to pass to get_pin_analytics. Do not re-sort the results — the order returned IS the ranking. Reading analytics is free and consumes no credits. Omit startDate and endDate for the last 30 days; supply BOTH to choose a window (supplying one is an error). Dates are UTC YYYY-MM-DD. Pinterest reports at most 90 days back and at most a 90-day span. The range actually used comes back as startDate/endDate — report those, do not assume the period. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
sortByNoMetric to rank by. Defaults to ENGAGEMENT, which measures what people did with a Pin rather than how often Pinterest showed it.
endDateNoLast day of the window (inclusive), UTC YYYY-MM-DD. Requires startDate.
accountIdYesNumeric Tailwind account ID returned by list_accounts
startDateNoFirst day of the window, UTC YYYY-MM-DD. Requires endDate. Omit both for 30 days.
contentTypeNoWhich activity to count: ORGANIC for unpromoted performance only, PAID for promoted (ad) performance only, ALL for both blended. Defaults to ALL.

Output Schema

NameRequiredDescription
pinsYesBest-performing Pins, best first
sortByYesThe metric the list is actually ranked by
endDateYes
accountIdYes
isPartialNoTrue when some Pins Pinterest ranked are missing from pins because Pinterest limited the lookups. A retry shortly should return the full list.
startDateYes
contentTypeYesThe paid/organic filter actually applied
omittedPinIdsNoThe ranked Pins left out of pins for that reason, in ranking order.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely non-obvious behavior: paid and organic are blended by default so ad spend can crowd out organic Pins, the returned order IS the ranking and must not be re-sorted, isPartial/omittedPinIds signals an incomplete list, and reads consume no credits. It also warns that the range actually used comes back in the response rather than being assumed.

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 user-intent trigger and the ranked-order guarantee, then organized by concern (ranking basis, per-Pin fields, partial results, dates, account selection). It is long but nearly every sentence carries a distinct constraint; minor redundancy appears where the date rules restate the schema, and the creativeType/boardId grouping advice is slightly expansive for its importance.

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 five-parameter ranked-analytics tool it covers everything an agent needs to call and report correctly: window defaults and limits, ranking metric disclosure, paid/organic blending, incompleteness handling, the pinId handoff to get_pin_analytics, and the multi-account disambiguation rule. Return-field detail is bonus given an output schema exists.

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 explaining the consequence of each parameter — that contentType ALL blends paid and organic and can distort the ranking, that only five metrics are rankable, and that supplying one date is an error, not a default. It does not add much beyond the enum labels for the metric choices themselves, which the schema already enumerates.

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 in the opening line ('returns the account's best Pins over a window, in Pinterest's own ranked order') and anchors it to the user intent that triggers it ('which of their Pins are doing best'). It explicitly separates itself from the closest sibling by noting this is how you get a pinId for get_pin_analytics and that analytics numbers differ from these rankings.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('what is working', 'top performers'), when-to-switch ('Pass contentType ORGANIC ... or PAID for promoted only'), and when a prerequisite blocks the call ('if the user did not say which account ... and list_accounts returns more than one, ask the user ... do not choose for them'). It also names the hard limits (90 days back, 90-day span, both dates or neither) that determine whether the call is even valid.

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

open_schedule_calendarA
Read-onlyIdempotent
Inspect

Use this when the user wants to see their Pinterest schedule as a calendar: opens an interactive calendar of an account's scheduled, publishing, published, failed and missed Pins, in the account's time zone, with weekly, 3-day and monthly views and a switcher between the user's Pinterest accounts. Takes no arguments. Returns the Pinterest accounts connected to the user's Tailwind organization, the same list list_accounts returns; the calendar reads each account's Pins through list_posts.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
accountsYesPinterest accounts connected to the organization

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the annotations, the description adds useful behavioral context: the calendar shows multiple Pin statuses in the account time zone, offers weekly/3-day/monthly views, and includes an account switcher. It also explains that the calendar reads Pins through list_posts and returns the connected accounts, though it does not describe loading or interaction behavior.

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

Conciseness5/5

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

The description is front-loaded with the primary usage condition and then supplies only relevant operational details. Every sentence contributes: usage trigger, calendar contents/views, no-argument requirement, returned accounts, and underlying Pin source.

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 zero-parameter, read-only UI-opening tool with an output schema and full annotation coverage, the description is sufficiently complete. It explains what opens, what the calendar displays, how accounts are returned, and how Pin data is sourced.

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 has zero parameters, so the baseline is 4. The description correctly reinforces this with 'Takes no arguments,' and there are no parameter semantics to document.

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

Purpose5/5

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

The description states a specific action, 'opens an interactive calendar,' and a specific resource, the account's scheduled/publishing/published/failed/missed Pins. It also distinguishes the tool from list_accounts and list_posts by explaining that it reuses those account and Pin data sources rather than duplicating 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 gives a clear triggering condition: 'Use this when the user wants to see their Pinterest schedule as a calendar.' It does not explicitly name exclusions or alternatives such as get_schedule, so the guidance is strong but not fully complete.

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

pause_publishingA
DestructiveIdempotent
Inspect

Use this when the user wants to stop every scheduled Pin on an account from publishing for a while, for example to correct copy across many queued Pins before any of them goes out: pauses publishing for the whole account. Nothing about the Pins changes: queued Pins keep their scheduled times and drafts stay drafts. While paused, any Pin whose scheduled time arrives fails instead of publishing, and it stays failed after resume_publishing: it has lost its slot, and schedule_post can reschedule it. The rest of the schedule does not shift forward. This is an account-wide switch, not an edit: update_post changes one Pin, and unschedule_post takes one Pin off the schedule. The pause applies to the Pinterest account itself, so it also covers any other Tailwind account connected to the same Pinterest account. Pausing an already paused account changes nothing. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
publishingYes

TDQS

A4.6/5.0
Behavior4/5

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

Goes well past the annotations: it explains what does NOT change (scheduled times preserved, drafts stay drafts), what happens to Pins whose slot arrives during the pause (they fail and stay failed after resume), that the schedule does not shift forward, and that other Tailwind accounts on the same Pinterest account are affected. That coverage is strong, though there's no mention of return shape (an output schema exists) or whether the pause can be scoped in duration.

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 primary intent, then consequences, then alternatives, then the account-selection rule — a sensible ordering. It is a dense block of ~8 sentences and some clauses (the 'failed Pin has lost its slot' explanation) could be trimmed, but nearly every sentence carries decision-relevant 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 single-parameter, destructive, idempotent account-wide toggle with an output schema, the description covers the side effects, the post-resume state, the cross-account blast radius, and the idempotency edge case. An agent has what it needs to act and to explain consequences to the user.

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% for the sole accountId parameter, so the schema carries the definition. The description still adds non-schema meaning by describing how to resolve an ambiguous accountId via list_accounts and the requirement to ask the user — a real semantic rule the schema does not express.

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 gives a specific verb and scope — 'pauses publishing for the whole account' — and explicitly frames it as an account-wide switch rather than an edit. It names sibling tools (update_post, unschedule_post, schedule_post, resume_publishing) so an agent can separate it from adjacent operations 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?

States the triggering user intent directly ('when the user wants to stop every scheduled Pin... for a while') and contrasts it against the alternative single-Pin tools. It also resolves the disambiguation case: if accountId is unclear and list_accounts returns multiple, ask the user rather than guessing.

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

preview_feedA
Read-onlyIdempotent
Inspect

Use this before connect_feed when the user gives a website or blog URL rather than a feed URL, or to confirm what a feed contains before subscribing. Resolves the URL, discovering the site's feed when given a plain page URL, and reports what would be subscribed to. Returns kind "feed" with the resolved feedUrl and a sample of its newest entries when there is one answer, or kind "candidates" when the site exposes several feeds — in that case show the user the candidates and ask which to use, then pass that feedUrl to connect_feed. Nothing is saved and no credits are spent. Org-scoped: needs no accountId.

NameRequiredDescriptionDefault
urlYesA website URL or a feed URL. Must use http or https.

Output Schema

NameRequiredDescription
kindYes"feed" when one feed was resolved (feedUrl, hostname, title, totalPages, sectionCount, sections and sampleEntries are present); "candidates" when the site exposes several (feeds is present — pick one)
feedsNoOnly when kind is "candidates": the feeds the site exposes
titleNoThe feed's own title, when it declares one
feedUrlNoThe resolved feed URL to pass to connect_feed
hostnameNoThe feed's site
sectionsNoThe first 25 sections, each with how many entries it holds
totalPagesNoHow many entries the feed currently lists
sectionCountNoHow many URL-path sections the entries fall into
sampleEntriesNoUp to 10 of the newest entries

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already cover readOnly/destructive/idempotent, but the description adds business-critical context beyond them: nothing is saved, no credits are spent, and it is org-scoped so no accountId is needed. It also explains the two possible response shapes and what the agent should do with each.

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 when-to-use condition, followed by behavior and the branch handling for 'candidates'. Multi-sentence but every sentence earns its place—no filler or 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?

Given the rich annotations and an output schema, the description is complete for a one-parameter read-only discovery tool. It covers preconditions, both response branches, next steps, and safety/cost implications.

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 documents the single url parameter. The description adds useful semantics beyond that—explaining that a plain page URL triggers feed discovery, which clarifies why either URL type is accepted and what happens with each.

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 (preview) and resource (feed), and immediately distinguishes itself from connect_feed as the non-committal inspection step. An agent can tell exactly what it does 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 trigger conditions (user gave a website/blog URL instead of a feed URL, or wants to confirm feed contents before subscribing) and the alternative (connect_feed). It also prescribes the follow-up action for the 'candidates' case, 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.

preview_update_postsA
Read-onlyIdempotent
Inspect

Use this when the user wants many existing Pinterest Pins edited at once, each with its own new values: for example, correcting one wrong word or link across a queue of scheduled Pins whose descriptions otherwise differ. This is the first of the two calls a bulk edit takes, and it changes nothing. It takes up to 50 entries, each naming a postId (from list_posts or get_post) and the fields to change on that Pin, with the same fields and rules as update_post. It returns, for every entry in order, the Pin's current values and the values it would have after the edit (will_update), or the reason the edit would be refused (failed), plus a previewToken when every entry would update. update_posts saves the batch only with that previewToken and the identical posts, within 30 minutes; a batch with refused or unchecked entries gets no token until those entries are removed or fixed and the batch is previewed again. This tool does not search or match text: a find-and-replace is the caller reading the Pins, computing each Pin's new value, and sending those values here. Tailwind keeps no history of Pin copy, so the preview is where the user sees the before-and-after for each Pin before anything is overwritten. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
postsYesOne entry per Pin: its postId plus at least one field to change. A postId may appear only once.
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
resultsYesOne result per entry, in request order
summaryYes
expiresAtNoWhen previewToken stops being accepted (ISO 8601)
previewTokenNoPassed to update_posts with the same posts to save this batch. Absent when any entry is failed or not_attempted; the batch then needs fixing and a new preview.

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint/idempotent annotations: it discloses that nothing is mutated, the per-entry success/failure return shape (will_update vs failed), that a previewToken is issued only when every entry would update, that update_posts requires that token plus identical posts within 30 minutes, and that a refused or unchecked entry blocks the token until fixed. It also explains why the preview matters — Tailwind keeps no copy history, so this is the user's only before-and-after view.

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 trigger and the 'changes nothing' fact, then moves through return shape, token lifecycle, and caveats. Nearly every sentence carries behavioral information, though the token-expiry and no-history sentences are dense and could be tightened into a shorter paragraph without losing meaning.

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

Completeness5/5

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

An output schema exists, yet the description still summarizes the per-entry return contract (current values, will_update, failed reason, previewToken) and the follow-up call's constraints, so an agent can plan the two-step bulk edit without inspecting sibling schemas. 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.

Parameters5/5

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

Schema coverage is already 100%, so the baseline would be 3; the description adds real value on top by stating the 50-entry cap, that postId must come from list_posts or get_post, that each postId may appear only once, and — most usefully — that the per-Pin fields follow 'the same fields and rules as update_post,' which lets the agent reuse that tool's semantics.

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

Purpose5/5

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

States a specific verb and resource — previewing edits to many existing Pinterest Pins at once — and explicitly frames itself as 'the first of the two calls a bulk edit takes, and it changes nothing.' That framing cleanly separates it from update_post (single Pin) and update_posts (the commit step).

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 triggering condition ('user wants many existing Pins edited at once, each with its own new values'), the concrete scenario (correcting one wrong word across a queue of scheduled Pins), and an explicit non-use case ('This tool does not search or match text'), redirecting the agent to compute values itself. It also prescribes the update_posts follow-up and an account-disambiguation step before calling.

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

rebuild_scheduleA
Destructive
Inspect

Use this ONLY when the user has explicitly asked to regenerate their entire posting schedule from scratch: DELETES every SmartSchedule timeslot the account has and generates slotsPerDay new ones on each of the 7 days, spread between 5am and 11pm in the account's timezone. This is the dashboard's "Generate new SmartSchedule" button. Free, but it cannot be undone — the times the user had are gone, including any they set by hand.

Confirm with the user before calling, and tell them their current times will be replaced. Do NOT reach for this to fix a few bad times: to spread a clustered schedule, or to change specific times, use update_timeslot, delete_timeslot and create_timeslot, which leave the rest of the schedule alone. There is no way to ask for a particular part of the day — the generator spreads slots across the whole 5am-11pm window, so it cannot satisfy "mornings only".

Evergreen (SmartLoop) slots are the one exception and survive untouched; everything list_timeslots shows is replaced. Pins already scheduled keep the times they were given and are not deleted. Two rebuilds cannot run at once: a second one while the first is still going is refused, so do not retry on a timeout without checking list_timeslots first. If a rebuild fails outright, call list_timeslots before deciding what to do: the delete and the insert are separate steps, so a failure part-way can leave the account with no posting times at all, and re-running the rebuild is what restores them. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
accountIdYesNumeric Tailwind account ID returned by list_accounts
slotsPerDayYesHow many posting times to generate per day, 1 to 50. The total becomes this times 7. Ask the user rather than guessing; the dashboard's own default is 5.

Output Schema

NameRequiredDescription
rebuiltYesWhether the schedule was replaced
slotsPerDayYesSlots generated per day
timeslotCountYesTotal slots the schedule now holds
timezoneSourceYesuser = generated in the account's own timezone; fallback = the account has none set and America/New_York was used, which is worth telling the user

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover destructive/non-idempotent, but the description adds far more: irreversibility including hand-set times, the evergreen SmartLoop exception, pins retaining their times, mutual exclusion of concurrent rebuilds, the refusal-on-timeout behavior, and the partial-failure mode where delete and insert are separate steps leaving the account with no times.

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 gating rule and the destructive effect, then failure modes, then account selection — a sensible ordering. It runs long (~250 words), but nearly every sentence carries non-obvious operational information; only the dashboard-button analogy is expendable.

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 prerequisites, confirmation requirement, exceptions (SmartLoop, pins), concurrency, timeout handling, and recovery after partial failure — everything an agent needs to call this destructive tool safely. Return values are covered by the output schema, so no gap remains.

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 baseline is 3; the description adds real meaning by explaining that slotsPerDay drives a whole-window spread with no way to target a sub-window of the day, and by reinforcing the ask-the-user rule for accountId. It stops short of restating ranges, which the schema already handles.

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 scope ('regenerate their entire posting schedule from scratch'), quantifies the effect (deletes every SmartSchedule timeslot, generates slotsPerDay new ones on each of 7 days between 5am-11pm), and distinguishes itself from update_timeslot/delete_timeslot/create_timeslot 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 Guidelines5/5

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

Explicit gating ('ONLY when the user has explicitly asked'), explicit exclusions ('Do NOT reach for this to fix a few bad times'), named alternatives for those cases, an explicit limitation ('cannot satisfy "mornings only"'), and an account-selection rule when list_accounts returns multiple.

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

record_widget_eventAInspect

Records a product-usage event from Tailwind's Pin card and schedule calendar views: a view showing its first data, a calendar view or account change, or a Pin image that failed to load. Accepts only these fixed events with counts, view names and an image's host name, never Pin content or IDs. Returns an acknowledgement with no data.

NameRequiredDescriptionDefault
eventYesWhich interface event happened.
detailsYesThe event's fields. Each event has its own fixed set.
widgetVersionYesBuild identifier of the view that sent the event.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly=false, destructive=false, idempotent=false, openWorld=false, so the safety profile is covered. The description adds genuinely new behavioral facts: it returns an acknowledgement with no data, and it deliberately excludes Pin content and IDs (a privacy/scope guarantee). Missing only retry/rate-limit or duplicate-event semantics.

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 dense sentences with the scope and the accepted event list front-loaded, and the return-value note placed last. It is efficient, though the middle clause packing events and field types together reads slightly crowded.

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, and the description compensates by stating the return is an acknowledgement with no data. For a 3-param telemetry tool the only real gap is that the `details` object's per-event field sets are described only in aggregate ('Each event has its own fixed set') rather than itemized, which the brief field hints only partially cover.

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 each parameter is already documented. The description adds some semantics by naming the kinds of values in the nested `details` object (counts, view names, an image's host name) and by reinforcing the fixed enum of `event`, but the per-event field sets remain unenumerated. Baseline 3 is appropriate when the schema carries most of the load.

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 ('Records a product-usage event') and enumerates the exact event types it accepts (first data render, calendar/account change, image failure). No sibling tool does anything comparable, so an agent can identify it immediately without confusion with e.g. report_issue or get_account_usage.

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

Usage Guidelines3/5

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

The description implies context ('from Tailwind's Pin card and schedule calendar views') and explicitly bounds the inputs ('Accepts only these fixed events ... never Pin content or IDs'), which functions as a when-not constraint. However it never states when an agent should call this versus other reporting or diagnostic tools, and no alternative is named.

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

regenerate_pin_designAInspect

Use this to have Tailwind's AI generate a NEW design for an AI-designed (premium) Pin. Asynchronous and metered: it spends about 7 of the user's plan credits, takes a few minutes, and returns an id to poll with get_design_regeneration_status. Only works when get_pin_design lists "regenerate" in supportedOperations.

Because it spends the user's credits, confirm with the user before calling it, and say what it will cost. Calling it again after one finishes starts and charges ANOTHER regeneration, so poll before retrying.

The result does NOT replace the Pin's design on its own: a finished regeneration returns a variationUrl that you then pass to select_pin_design_variation. Tell the user the new design is ready and let them choose, rather than applying it silently. Afterwards get_pin_design reports workspaceStatus pending_apply with the new design as pendingMediaUrl; that is the expected resting state, not a failure, and it stays that way until the user picks the design.

To REVISE the design the Pin already has, rather than replace it, pass selectedVariationUrl as well: the active variation's templateImageUrl from get_pin_design. Without it the generator has nothing to revise and produces an unrelated design for the same credits, which is rarely what someone asking to adjust their current design wants. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
titleNoText to overlay on the new design. This is not the Pin's title.
postIdYesPin ID from list_posts
mediaUrlNoPublicly reachable image to generate the new design from, such as a URL from get_pin_design's sourceImageCandidates
uploadIdNoImage staged with create_media_upload. Use instead of mediaUrl, not with it.
accountIdYesNumeric Tailwind account ID from list_accounts
premiumStyleNoVisual style for the new design. Defaults to the Pin's existing style.
userFeedbackNoWhat to change, in the user's own words (e.g. 'make the text bigger and use warmer colors')
selectedVariationUrlNoThe design to revise: the active variation's templateImageUrl from get_pin_design. Pass it whenever the user wants their current design adjusted. Omit it only to generate a fresh, unrelated design.

Output Schema

NameRequiredDescription
regenerationYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark this as non-read-only, non-idempotent, and open-world, but the description adds critical behavior: asynchronous, takes a few minutes, spends about 7 credits, repeated calls charge again, and the result does not automatically replace the Pin's design. It also explains the pending_apply resting state so the agent doesn't mistake it for failure.

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

Conciseness4/5

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

The description is long, but the cost and async nature are front-loaded, and the multi-step workflow justifies most of the length. A few points are repeated for emphasis (credits, polling, confirmation), but each paragraph carries distinct operational 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 costly, asynchronous, multi-step tool with an output schema, the description covers the full lifecycle: precondition check, credit confirmation, polling, variation selection handoff, and expected pending_apply state. An agent has everything needed to invoke it correctly without guessing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema for the most consequential parameter, selectedVariationUrl, by explaining that omitting it produces an unrelated design rather than a revision, and it also clarifies that account selection should be confirmed with the user. This adds meaningful semantic guidance beyond the field-level 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?

States a specific verb and resource: generate a NEW AI design for a premium Pin using Tailwind's AI. It distinguishes this from revising an existing design and from applying a design via select_pin_design_variation, so an agent can tell it apart from sibling tools.

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

Usage Guidelines5/5

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

Gives explicit preconditions ('only works when get_pin_design lists regenerate in supportedOperations'), cost-confirmation guidance, retry guidance ('poll before retrying'), and an account-selection rule when list_accounts returns multiple accounts. It clearly explains when to pass selectedVariationUrl versus when to omit it.

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

report_issueAInspect

Sends a report about a wrong result from a Tailwind tool to the people who maintain these tools, who read every report. Use this when the user asks to report a problem or send feedback to the Tailwind team about a result: an output they tell you is wrong, a result that contradicts another result, or one you had to work around. If you notice a wrong result yourself, tell the user what you found and offer to report it; send it only if they agree. Describe what was asked for, what came back, and why it is wrong: 'list_boards returned 4 boards but the same account shows 11 in get_account' is actionable, 'boards are broken' is not. Name the tool you think is at fault in tool, even if you are unsure of the exact name — a near miss is still useful. What you write is recorded in Tailwind's analytics and posted to an internal Tailwind channel for staff to read, so describe the problem rather than quoting the user's content, and never include credentials or personal data. Write the report itself in English, even when you are working with the user in another language: the Tailwind staff who read these do not all read the user's language, and a report they cannot read is acted on late or not at all. Translate what you need to say rather than leaving it out, and keep speaking to the user in their own language. This does not fix anything now and returns nothing you can use, so tell the user the report was sent and carry on with the corrected information. Do not use it for calls that plainly failed: a rejected argument, an expired connection, or an out-of-credits message are errors to handle, not wrong answers. If the feedback is about something Tailwind has no tool for, use request_capability instead.

NameRequiredDescriptionDefault
toolNoThe tool you believe returned the wrong result. Your best guess is fine — it is not checked against the tool list.
descriptionYesWhat you asked for, what came back, and why it is wrong, in plain English sentences. Include the concrete case that prompted it.

Output Schema

NameRequiredDescription
receivedYesAlways true — failures raise an error instead

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 (readOnlyHint=false, openWorldHint=true, destructiveHint=false) by disclosing where the content goes (Tailwind analytics plus an internal staff channel), the privacy constraint (no credentials or personal data, describe rather than quote user content), the language requirement (write in English regardless of conversation language), and that the call fixes nothing and returns nothing usable. These are non-obvious side effects an agent could not infer from the structured fields.

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

Conciseness4/5

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

Front-loaded with purpose and trigger, then consent, then content requirements, then exclusions — a sensible order. It is long, and the language/translation passage runs several sentences for one instruction, but essentially every sentence carries an operational rule 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 two-parameter reporting tool with an output schema, everything an agent needs is present: trigger conditions, consent flow, what to put in each field, privacy limits, language policy, post-call user messaging ('tell the user the report was sent and carry on'), and routing to the sibling tool. Nothing material is left to inference.

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 signal: it tells the agent to name the suspected tool in `tool` even when unsure ('a near miss is still useful'), and it models the `description` parameter with a concrete good/bad pair ('list_boards returned 4 boards but the same account shows 11 in get_account' versus 'boards are broken'). That is meaningful guidance beyond the schema's own field docs.

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 — 'Sends a report about a wrong result from a Tailwind tool to the people who maintain these tools' — and immediately distinguishes itself from request_capability for missing-tool feedback. An agent can tell what this does and what it does not do without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit triggers ('when the user asks to report a problem', a wrong output, a contradicting result, a workaround), an explicit exclusion ('Do not use it for calls that plainly failed: a rejected argument, an expired connection, or an out-of-credits message'), and a named alternative (request_capability). It even specifies the consent protocol — offer to report, send only if the user agrees — which is the exact decision point an agent faces.

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

request_capabilityAInspect

Sends a feature request or a missing-capability report to Tailwind's product team, who read these. Use this when the user asks to send feedback or a feature request to the Tailwind team. If you find something Tailwind's tools cannot do — a tool you expected and could not find, a field or filter that does not exist, or a step you had to work around or abandon — tell the user and offer to pass it along; send it only if they agree. Describe what the user was trying to accomplish and what was missing, not just a tool name — 'no way to edit a scheduled Pin's board after creating it' is actionable, 'update_board_v2 missing' is not. What you write is recorded in Tailwind's analytics and posted to an internal Tailwind channel for staff to read, so describe the gap rather than quoting the user's content, and never include credentials or personal data. Write the report itself in English, even when you are working with the user in another language: the Tailwind staff who read these do not all read the user's language, and a report they cannot read is acted on late or not at all. Translate what you need to say rather than leaving it out, and keep speaking to the user in their own language. This does not fix anything now and returns no result you can use, so tell the user it was sent and continue with what Tailwind can do. Do not use it for things that failed for another reason: a rejected argument, an expired connection, or an out-of-credits message are not missing capabilities. Tailwind Communities (formerly Tribes) has no tool here: these tools cannot list the user's Communities, share Pins to one, or read how a Community performs. Tailwind is replacing Communities with Turbo Groups, niche groups of creators who see and engage with each other's Pins in Turbo, which the user joins from suggestions in their Turbo feed and finds again under My Groups in the Tailwind app. Turbo Groups has no tool either. A request for either one is a missing capability that request_capability records; Pinterest group boards (list_group_boards) are a different feature and do not answer it.

NameRequiredDescriptionDefault
descriptionYesWhat you were trying to do and what was missing, in plain English sentences. Include the concrete case that prompted it.

Output Schema

NameRequiredDescription
receivedYesAlways true — failures raise an error instead

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only say it is a non-read-only, open-world, non-idempotent write; the description goes far beyond that by disclosing that the text is recorded in Tailwind's analytics and posted to an internal staff channel, that credentials and personal data must never be included, and that the report must be written in English even when conversing in another language. It also sets expectations that nothing is fixed now and no usable result is returned, which prevents the agent from waiting on an outcome.

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 correctly — purpose first, then when to use, then safety constraints — and nearly every sentence carries a rule or a disambiguation. It is nonetheless very long for a one-parameter tool, and the Communities/Turbo Groups excursion, while useful, could be tightened without losing its routing value.

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

Completeness5/5

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

For a one-param, open-world write with an output schema present, the description covers everything the agent needs: eligibility, consent flow, content constraints, data-handling rules, language requirement, and the fact that the call produces no actionable return. Nothing essential 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 already 100% for the single `description` parameter, but the description still adds real semantic guidance: describe the user's goal and the gap, not a tool name, with a concrete good example ('no way to edit a scheduled Pin's board after creating it') and a bad one ('update_board_v2 missing'). The English-output requirement is an additional constraint the schema does not express.

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

Purpose4/5

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

The first sentence gives a specific verb and destination: 'Sends a feature request or a missing-capability report to Tailwind's product team.' That is unambiguous about what the tool does. It never distinguishes itself from the close sibling `report_issue`, which an agent could easily confuse with this one, so sibling differentiation is absent.

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 trigger ('when the user asks to send feedback or a feature request'), the self-initiated path (detect a missing capability, tell the user, offer, send only with consent), and explicit exclusions ('a rejected argument, an expired connection, or an out-of-credits message are not missing capabilities'). It also pre-resolves a specific confusion: Communities/Turbo Groups requests are in scope, while `list_group_boards` for Pinterest group boards is a different feature.

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

resume_publishingA
Idempotent
Inspect

Use this when the user wants an account's scheduled Pins to start publishing again after pause_publishing: resumes publishing for the whole account. Queued Pins whose scheduled time is still ahead publish at that time, unchanged. Pins whose time arrived during the pause have already failed and are not retried; list_posts with status failed lists them, and schedule_post reschedules one. A Pin failed by a pause reports failure reason publishing_paused. One failed by a pause before October 15, 2026 reports max_pin_limit instead; its failure time falls inside the pause, and it does not mean the account hit a limit. Resuming an account that is not paused changes nothing. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
publishingYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare the safety profile (idempotent, non-destructive, write), and the description adds substantial behavior beyond them: queued Pins publish unchanged, arrived-during-pause Pins are not retried, and the publishing_paused/max_pin_limit failure-reason semantics are explained with a date caveat. That is exactly the context annotations cannot carry.

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

Conciseness4/5

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

The trigger condition is front-loaded before the failure-handling detail, and each sentence carries operational information. It is dense and the October 15, 2026 caveat is long-winded, but it describes a real trap rather than 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?

With an output schema present and rich annotations, the description covers the remaining gaps an agent needs: the post-resume state of queued Pins, the non-retry behavior, and the misleading failure reason. Nothing required 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% and the single accountId parameter is fully documented in the schema, so the baseline is 3. The description adds scope meaning ('whole account') and disambiguation guidance for choosing the account, which is a genuine step above 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 states a specific verb and resource ('resumes publishing for the whole account') and explicitly positions itself against the sibling pause_publishing. An agent can distinguish it from pause_publishing and the post-level alternatives 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?

It gives the trigger condition ('after pause_publishing'), the no-op case ('resuming an account that is not paused changes nothing'), and routes failures to list_posts and schedule_post by name. It also handles the multi-account ambiguity by instructing the agent to ask the user rather than choose.

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

revert_pin_designA
Idempotent
Inspect

Use this to put a Pin back to the original photo the design was built from, discarding the generated design. Free and instant. Only works when get_pin_design lists "revert" in supportedOperations, which requires the Pin to still carry its original photo. The generated variations remain available, so this is reversible with select_pin_design_variation. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
postIdYesPin ID from list_posts
accountIdYesNumeric Tailwind account ID from list_accounts

Output Schema

NameRequiredDescription
designYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare mutation, idempotency, and non-destructiveness; the description adds meaningful context beyond them, including 'Free and instant', the prerequisite original photo, and the fact that generated variations remain available and the action is reversible. The word 'discarding' does not contradict destructiveHint=false because the description immediately qualifies it as reversible.

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 action, then adds cost, eligibility, reversibility, and account handling in four tight sentences. Every sentence earns its place and no important information is 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?

For a two-parameter mutation with annotations and an output schema, the description covers purpose, preconditions, side effects, reversibility, cost, and account disambiguation. Nothing an agent needs in order to call it correctly appears to be missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds an account-selection rule beyond the schema: if the user did not specify an account and list_accounts returns multiple, ask rather than choosing for them. It does not add further format semantics for postId, which the schema already documents.

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: putting a Pin back to its original photo and discarding the generated design. It distinguishes the operation from design generation by naming get_pin_design for eligibility checks and select_pin_design_variation for reversal, 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 Guidelines5/5

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

It gives an explicit precondition: only works when get_pin_design lists 'revert' in supportedOperations and the Pin still carries its original photo. It also names select_pin_design_variation as the reversible alternative and instructs the agent to ask the user when multiple accounts exist, which is unusually specific routing guidance.

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

save_keywordsA
Idempotent
Inspect

Use this when the user asks to save, add, or track keywords, or agrees to add terms you suggested. Adds keywords to the organization's Saved Keywords list in Tailwind — the same list the dashboard shows. Matching is case-insensitive, so re-sending a term already on the list returns the stored one rather than creating a duplicate; the response is the saved state of every term you sent, whether new or pre-existing. Saving keywords is free and does not consume credits. Do not call this to look keywords up — use list_saved_keywords for that.

NameRequiredDescriptionDefault
keywordsYesKeywords to save. Up to 50 per call.

Output Schema

NameRequiredDescription
keywordsYesThe saved keywords, including any that were already on the list

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover the safety profile (non-destructive, idempotent), and the description adds material context beyond them: case-insensitive matching, dedupe semantics on re-send, the shape of the response (saved state of every term, new or pre-existing), and that the operation is free with no credit cost.

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 trigger condition, then dedupe behavior, then cost, then the anti-pattern routing. Each sentence carries distinct information with no restatement of the name 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 single-parameter mutation with an output schema and full schema coverage, the description supplies the trigger, the alternate tool, idempotence behavior, and cost implications. 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.

Parameters3/5

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

Schema description coverage is 100%, so the baseline applies; the schema already documents term length limits, the optional urls array, and the 50-item cap. The description adds only indirect meaning by explaining that re-sent terms return the stored record, and says nothing specific about the urls sub-field.

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 (save/add) and resource (organization's Saved Keywords list in Tailwind), and explicitly distinguishes itself from list_saved_keywords. An agent can identify the operation without opening the schema.

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

Usage Guidelines5/5

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

Gives both trigger conditions ('when the user asks to save, add, or track keywords, or agrees to add terms you suggested') and an explicit exclusion naming the sibling tool to use instead for lookups. 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.

save_pins_to_boardAInspect

Use this when the user wants existing Pinterest Pins added to one of their boards — "add these to my board", "fill this board with X", "build me a board about X". Saves Pins that already exist on Pinterest onto the board (a repin); it does not create new Pins from the user's own images, which is create_post.

Billing: saving onto a board create_board made in the last hour is free for up to 50 Pins in total, across calls. Any other save is billed like scheduling a Pin: one credit per saved Pin on credit plans, or one post from the plan's post allowance. A save the plan cannot cover is refused with nothing saved; call get_account_usage first when saving many Pins to an existing board.

This is the last step of build-a-board-about-X: create_board → get_recommended_pins for that new boardId → save_pins_to_board with the ids the user picked. Show the user the recommended Pins and let them choose before calling this, unless they have already said to add everything.

Returns savedCount and failedCount. A Pin that could not be saved — usually deleted, or a boardId that does not exist — is counted in failedCount rather than failing the call, so a result of savedCount 0 is a complete failure even though the call succeeded. Which Pins failed is not reported, so re-read the board if the user needs to know.

Do NOT retry this call after a timeout or an unclear result. Pinterest treats a repeat save as a second Pin, so a retry duplicates whatever already landed; re-read the board instead. For the same reason, do not pass the same Pin id twice in one call. Re-running get_recommended_pins is safe — it excludes Pins already saved to the board — so use it, not a blind retry, to find what is still missing. Keep batches to a few dozen ids — a large batch of slow saves can still time out with a 504, and saves already in flight are not cancelled, so re-read the board rather than retrying blind. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
pinIdsYesNumeric Pinterest Pin IDs to save, e.g. the ids from get_recommended_pins — never a Pin URL. Must not contain duplicates.
boardIdYesNumeric Pinterest board ID from list_boards — never a board name or URL
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
savedCountYesPins saved onto the board
failedCountYesPins that could not be saved. Which ones is not reported.

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: it discloses the billing rule (free within an hour of create_board up to 50 Pins, otherwise one credit/post per Pin, with all-or-nothing refusal), the partial-failure semantics of savedCount/failedCount, and that ids of failed Pins are not reported. It also warns that the call is effectively non-idempotent on retry (Pinterest treats a repeat save as a second Pin) and that a 504 timeout does not cancel in-flight saves.

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 trigger and the disambiguation, then sequences billing, workflow, return semantics and retry hazards. Each paragraph carries actionable content, but the billing and retry sections are long prose that could be compressed into tighter bullets without losing meaning.

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

Completeness5/5

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

An output schema exists, yet the description still explains the one non-obvious thing it can't convey statically: savedCount 0 with a successful call is a total failure. Combined with account-ambiguity handling, batch sizing and the retry prohibition, an agent has everything needed to call this safely.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds real meaning on top: pinIds should come from get_recommended_pins, must not contain duplicates, and should be kept to a few dozen per call despite the 50-id maximum. boardId's origin in create_board is also reinforced by the workflow paragraph.

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 (saving existing Pinterest Pins onto a board, a repin) and explicitly distinguishes it from create_post, which makes new Pins from the user's own images. Sibling differentiation is unambiguous.

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

Usage Guidelines5/5

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

Gives literal user phrasings that should trigger it, names the alternative (create_post) and when not to use it, lays out the create_board → get_recommended_pins → save_pins_to_board sequence, and tells the agent to confirm selection with the user before calling. It also says to call get_account_usage first for large saves to an existing board, and to ask which account when list_accounts returns several.

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

schedule_postA
DestructiveIdempotent
Inspect

Use this when the user wants to schedule or reschedule an existing Pin draft or queued Pin in Tailwind: takes the postId of an existing Pin (from create_post or list_posts) plus exactly ONE of useNextOpenSlot: true or an ISO 8601 sendAt. Prefer useNextOpenSlot whenever the user has not named a specific time — it places the Pin in the account's next open smart schedule slot and applies the account's Pin Spacing rules for the Pin's destination url, which a timestamp you compute yourself cannot. Reserve sendAt for a time the user actually asked for. The Pin must already have title, description, and url set; a draft without a board also needs boardId (numeric ID from list_boards). Pass boardSectionId to schedule it into a Board section — and note that passing boardId on its own clears any section the Pin already had, since a section is only valid on its own Board. Does not work on published Pins. A draft exists only in Tailwind, not on Pinterest, until this step: scheduling is what puts it into Tailwind's publishing flow. Moving a draft onto the schedule is the charged step: one Pin credit on modular billing with Publishing access, whether subscribed or granted, though winback plans schedule without charge and modular accounts without Publishing draw on a free-trial allowance; legacy and Shopify accounts spend no credits and count it against the plan's post limit instead. Rescheduling a Pin that is already queued costs nothing on any of them. To create and schedule a new Pin in one step, use create_post instead. To take a queued Pin off the schedule and back to draft, use unschedule_post. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
postIdYesPost ID of the draft or queued Pin to schedule, from create_post or list_posts
sendAtNoExplicit publish time (ISO 8601, e.g. 2025-01-15T10:00:00Z), in the future. Use only when the user named a specific time. Provide exactly one of sendAt or useNextOpenSlot. It sets only the initial time and is not an exemption from Pin Spacing: a later respace or schedule shuffle can still move the Pin.
boardIdNoTarget Pinterest board ID. Must be the numeric board ID (e.g. "1106196864631757445") from list_boards — not a board name or URL. Required when scheduling a draft post that doesn't already have a board assigned.
accountIdYesNumeric Tailwind account ID returned by list_accounts
boardSectionIdNoSection to publish into, validated against the board this Pin ends up on. Send "" to publish to the board root. Sending boardId WITHOUT this field clears any section the Pin already had, because a section is only valid on its own board. Use list_board_sections to look up section IDs.
useNextOpenSlotNoSchedule into the account's next open smart schedule slot, honoring its Pin Spacing rules for this Pin's url. Use this instead of computing a time yourself whenever the user has not named one. Provide exactly one of sendAt or useNextOpenSlot.

Output Schema

NameRequiredDescription
postYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark this as a non-read-only, destructive, idempotent, open-world mutation, and the description layers substantial context on top: prerequisites (title/description/url must be set, boardId needed for boardless drafts), a subtle data-loss trap (passing boardId alone clears an existing section), and the credit/billing consequences by plan type, including that rescheduling a queued Pin is free. That is exactly the kind of consequence disclosure annotations cannot express.

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

Conciseness4/5

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

Front-loaded with the decision-critical rule (exactly one of useNextOpenSlot or sendAt) and then the trap and prerequisites, so the most important content comes first. It is a single dense paragraph and the plan-by-plan billing taxonomy (winback, modular trial, legacy, Shopify) is longer than most agents need, costing some economy without burying the leading 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 six-parameter mutation with an output schema and full schema coverage, everything an agent needs is present: prerequisites, the one-of constraint, the section-clearing hazard, cost implications, account-disambiguation policy, and sibling routing. Return values need not be described because an output schema exists.

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 carries the parameter meanings and the baseline is 3. The description nonetheless adds decision-level semantics the schema does not: why useNextOpenSlot beats a self-computed timestamp (Pin Spacing rules), that exactly one of the two may be supplied, and the boardId/boardSectionId interaction; it also redirects to list_boards for numeric IDs.

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?

Opening clause names the specific verb (schedule/reschedule) and the specific resource (an existing Pin draft or queued Pin in Tailwind), and immediately pins down its identity with the required postId plus one-of sendAt/useNextOpenSlot signature. It explicitly distinguishes itself from create_post and unschedule_post, so an agent can route correctly without opening schemas.

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

Usage Guidelines5/5

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

Gives explicit when-to-use rules with a stated default preference (use useNextOpenSlot when the user named no time, reserve sendAt for an explicitly requested time) and names the alternatives for adjacent tasks (create_post, unschedule_post). It also adds a real precondition for invocation flow: if the user didn't name an account and list_accounts returns multiple, ask before calling. Exclusions are stated too (does not work on published Pins).

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

select_pin_design_variationA
Idempotent
Inspect

Use this to make one of a Pin's existing design variations the active one. Free and instant — no rendering, no credits. Pass a templateImageUrl from get_pin_design's variations list, or the variationUrl a finished regeneration produced. Also how to apply the design behind workspaceStatus "pending_apply": pass its pendingMediaUrl. When that design came from a regeneration the user has not chosen yet, confirm with them first rather than applying it to tidy the state. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
postIdYesPin ID from list_posts
accountIdYesNumeric Tailwind account ID from list_accounts
templateImageUrlYesA templateImageUrl from get_pin_design, a regeneration's variationUrl, or a pendingMediaUrl

Output Schema

NameRequiredDescription
designYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare idempotent=true, destructiveHint=false, readOnlyHint=false; the description adds value beyond that with cost/performance traits ('free and instant — no rendering, no credits') and a real safety caveat about not applying an unchosen regenerated design just to tidy state.

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 action and its cost profile, then layers the input sources and the two user-confirmation rules. Dense but every sentence carries an instruction; the account-selection rule is slightly generic but still actionable here.

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?

An output schema exists, so return values need no explanation. For a 3-parameter mutation the description covers cost, input provenance, a state-tidying trap, and multi-account disambiguation — 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, but the description goes further by mapping templateImageUrl to three distinct sources and tying the pendingMediaUrl case to workspaceStatus 'pending_apply'. Some overlap with the schema's own templateImageUrl description limits it to a 4.

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 — making an existing design variation the active one on a Pin. 'Existing design variations' implicitly separates it from regenerate_pin_design and revert_pin_design, though neither sibling is named directly.

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 entry paths (get_pin_design variations, a regeneration's variationUrl, a pendingMediaUrl) and names the decisive conditions: confirm with the user when a regenerated design hasn't been chosen, and ask which account when list_accounts returns multiple. Explicit when/when-not guidance with named prerequisite tools.

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

tag_saved_keywordsA
Idempotent
Inspect

Use this when the user asks to tag, label, or group saved keywords, e.g. marking the ones that match their own site content. Applies tags by name to keywords on the organization's Saved Keywords list, using the keyword ids from list_saved_keywords. A tag name the user has not used before is created; an existing one is reused, never duplicated. Every keyword gets every tag you send, and re-applying a tag a keyword already has changes nothing. If any keyword id is not on this user's list, nothing is changed and the error names the unknown ids. Tags show on the dashboard's Saved Keywords page, where the user can filter and export by them. Free; does not consume credits.

NameRequiredDescriptionDefault
tagsYesTag names, e.g. "owned content". Up to 10 per call, 100 characters each.
keywordIdsYes`id` fields from list_saved_keywords. Up to 100 per call.

Output Schema

NameRequiredDescription
keywordsYesThe keywords you sent, with their tags as they stand after this change

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing create-if-new/reuse-never-duplicate tag behavior, all-or-nothing atomicity when an unknown keyword id is present, the error naming unknown ids, dashboard visibility with filter/export, and that the call is free. Idempotency is declared in annotations, but the atomicity and side-effect surface here are genuinely additive.

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 tightly packed sentences, front-loaded with the usage trigger, then semantics, then failure mode, then cost/visibility. No sentence is filler and each carries a distinct fact an agent needs.

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?

Output schema exists, so return shape need not be explained. The description still covers the mutation contract, failure behavior, who sees the result, and billing impact — everything needed to call this safely with two required params.

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 semantics: keywordIds must come from list_saved_keywords, tags are applied by name, and every keyword receives every tag sent. That 'cross-product' semantics is not evident from the schema alone.

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 (tag) and resource (saved keywords on the organization's Saved Keywords list), and the scope is distinct from siblings like untag_saved_keywords, save_keywords, and delete_saved_keywords. 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 Guidelines4/5

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

Gives an explicit trigger: 'when the user asks to tag, label, or group saved keywords,' including the motivating scenario of marking owned content. It also names list_saved_keywords as the id source. It stops short of naming untag_saved_keywords as the inverse alternative, so a 4 rather than 5.

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

unschedule_postA
DestructiveIdempotent
Inspect

Use this when the user wants to take a scheduled (queued) Pinterest Pin off the schedule without losing it, for example to hold back a time-sensitive Pin or revise it before it publishes: moves the Pin back to draft by postId (from list_posts, create_post or schedule_post). The Pin keeps its postId, image, title, description, link, Board, Board section, alt text, product tags and carousel images; only its scheduled time is removed. Works on any queued Pin on the account, whether it was created in Tailwind, through the API or here, including a missed Pin whose time has passed. Any Pin credit charged for scheduling it is returned, as when unscheduling in the Tailwind dashboard; a Pin scheduled on a free-trial allowance or in an earlier billing period, or on a legacy or Shopify plan, has nothing to return. Scheduling the draft again with schedule_post charges again. Only queued Pins can be unscheduled: a published Pin has to be changed in the Pinterest app, and a draft is already off the schedule. Use this rather than delete_post plus a fresh create_post whenever the Pin should be kept. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
postIdYesPost ID of the scheduled (queued) Pin to move back to draft, from list_posts
accountIdYesNumeric Tailwind account ID returned by list_accounts

Output Schema

NameRequiredDescription
postYes

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by explaining exactly what is preserved (postId, image, title, description, link, Board, section, alt text, product tags, carousel images) and that only scheduled time is removed. It also discloses non-obvious side effects: Pin credit return behavior, exceptions for free-trial/legacy/Shopify plans, and that rescheduling charges again.

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 conditions before detailing preservation and credit behavior. It is somewhat long and dense, but nearly every sentence carries relevant operational nuance for a destructive scheduling 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?

The tool has an output schema, so return values need not be explained, and the description covers preconditions, preservation behavior, credit side effects, alternatives, and account ambiguity. An agent has enough information to call this correctly without additional context.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented. The description adds useful sourcing context for postId (list_posts, create_post, schedule_post) and account selection guidance, but does not substantially deepen the schema semantics beyond that.

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: unschedules a queued Pinterest Pin and moves it back to draft by postId. It explicitly distinguishes this from delete_post plus create_post and from schedule_post, so an agent can select it without opening sibling schemas.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance: taking a scheduled Pin off the schedule while keeping it, holding back time-sensitive Pins, or revising before publishing. It also states when-not-to-use it for published Pins and drafts, and gives the account-disambiguation rule when list_accounts returns multiple accounts.

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

untag_saved_keywordsA
Idempotent
Inspect

Use this when the user asks to remove a tag or label from saved keywords. Removes tags by name from keywords on the organization's Saved Keywords list, using the keyword ids from list_saved_keywords; the tag names a keyword carries are in its tags field there. The tag itself is kept for reuse even if no keyword carries it any more. Removing a tag a keyword does not have changes nothing. If any keyword id or tag name does not exist for this user, nothing is changed and the error names what was not found.

NameRequiredDescriptionDefault
tagsYesTag names, e.g. "owned content". Up to 10 per call, 100 characters each.
keywordIdsYes`id` fields from list_saved_keywords. Up to 100 per call.

Output Schema

NameRequiredDescription
keywordsYesThe keywords you sent, with their tags as they stand after this change

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: the tag entity is preserved for reuse even when orphaned, removing an absent tag is a silent no-op, and the operation is atomic — an unknown keyword id or tag name aborts the whole change and the error names the missing item. That atomicity and the orphan-retention behavior are not derivable from destructiveHint=false or idempotentHint=true.

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 usage trigger is front-loaded, followed by mechanics, then edge-case semantics in descending importance. Five sentences, each carrying distinct information with no restatement of the name 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?

Two required array params, 100% schema coverage, and an output schema means return values need not be explained. The description covers the trigger, the id source, the atomicity failure mode, and the non-destructive tag-retention rule — everything needed to call it safely.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds cross-tool provenance the schema lacks: keywordIds are 'id' fields from list_saved_keywords and the tag names to target live in that tool's `tags` field. It does not repeat the per-call limits, which the schema already documents.

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 ('removes tags by name') against a specific resource ('keywords on the organization's Saved Keywords list'), and the opening sentence scopes it to tag/label removal. An agent can distinguish this from tag_saved_keywords and delete_saved_keywords purely from the description.

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 when the user asks to remove a tag or label from saved keywords' gives a clear trigger condition and the description points at list_saved_keywords as the source of valid ids. It does not explicitly name the inverse tool (tag_saved_keywords) or state when removal should be rejected in favor of a different operation, so it stops short of full routing guidance.

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

update_boardA
DestructiveIdempotent
Inspect

Use this when the user wants to rename a Pinterest board or change its description: updates an existing board by boardId (from list_boards). Boards marked as collaborator entries in list_boards belong to someone else — the account can pin to them but cannot rename them, so do not pass those IDs here. Supply at least one of name or description; anything you omit is left as it is. A board's privacy cannot be changed here — flipping a public board to secret would hide every Pin on it from everyone but the owner. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
nameNoNew board name, up to 180 characters
boardIdYesNumeric Pinterest board ID returned by list_boards — never a board name or URL
accountIdYesNumeric Tailwind account ID returned by list_accounts
descriptionNoNew board description, up to 500 characters

Output Schema

NameRequiredDescription
boardYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag this as a non-readOnly, destructive, idempotent, open-world mutation, and the description adds genuinely new context on top: omitted fields are left unchanged (patching semantics), collaborator boards are write-blocked for the caller, and privacy is immutable because flipping secret would hide all Pins. It also spells out a required human-confirmation step before calling, which the annotations do not express.

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

Conciseness4/5

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

Purpose and the primary constraint are front-loaded, and every sentence carries information; nothing is filler. It is a single dense paragraph, though, and the account-disambiguation rule plus the boardId provenance warning would scan faster as distinct clauses or bullets.

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

Completeness5/5

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

With an output schema present, return values need no explanation, and the annotations carry the safety profile. The description still supplies everything an agent needs to call correctly: ID provenance, partial-update semantics, blocked board classes, excluded field, and the account-choice protocol.

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 covers each parameter's type and source. The description nonetheless adds constraints absent from the schema, notably the 'at least one of name or description' rule (the schema only requires accountId and boardId) and the instruction that boardId must come from list_boards and never be a collaborator entry or a board name/URL.

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 concrete verb and resource plus the exact editable scope: rename a Pinterest board or change its description, keyed by boardId. This clearly separates it from create_board, delete_board, update_board_section and update_board_list 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 explicit when-to-use, when-not-to-use (collaborator board IDs belong to someone else and must not be passed here), a precondition (at least one of name or description), and an account-selection rule (ask the user when list_accounts returns more than one). It also names the alternative route for privacy changes, which is out of scope here.

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

update_board_listA
DestructiveIdempotent
Inspect

Use this when the user wants to rename one of their board lists, add or remove boards in it, or change the order its boards publish in: replaces the list's name and boards with exactly what you send. Send the whole list every time, in publishing order. A board you leave out is removed from the list, so to rename only, resend its current boards from list_board_lists unchanged; to reorder, send the same boards in the new order. Removing a board from a list never changes the board or its Pins on Pinterest. Free, and safe to retry with the same arguments. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
nameYesThe list's name after the update, up to 255 characters
boardsYesEvery board the list holds, in publishing order. Each board may appear only once. Interval Pinning takes at most 20 boards per Pin, so a list longer than that cannot be passed whole as create_post's intervalBoards.
accountIdYesNumeric Tailwind account ID returned by list_accounts
boardListIdYesBoard list ID returned by list_board_lists — never a list name

Output Schema

NameRequiredDescription
boardListYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, and the description adds the specifics those hints cannot carry: the call is a full replacement, any board omitted is removed from the list, and removing a board does not alter the board itself or its Pins on Pinterest. It also confirms retry safety and that the operation is free, which are not in the annotations.

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

Conciseness4/5

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

Front-loaded with the trigger condition, then the replacement contract, then the compensating procedures and caveats; nearly every clause carries decision-relevant information. Minor redundancy with the schema's boards description (the intervalBoards note) and the 'free' remark is incidental, but neither derails the 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?

A destructive, idempotent full-replacement tool with an output schema and fully documented parameters — the description covers everything an agent needs before calling: trigger, replacement semantics, what survives, retry behavior, and the account-disambiguation protocol. No material gap remains.

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

Parameters4/5

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

Schema coverage is 100% and the schema already documents publishing order, uniqueness, and the 20-board interval constraint, so most parameter meaning is pre-supplied. The description still adds one genuinely new semantic: the boards array behaves as a replace-set, so omission means removal — the decisive behavior an agent needs when filling that 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+resource (update a board list) and enumerates the three concrete sub-operations it supports: rename, add/remove boards, reorder publishing. It also distinguishes itself from the read-side sibling by pointing at list_board_lists as the source of current boards, so an agent can tell it apart from create_board_list/delete_board_list 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?

Explicitly says when to use it ('when the user wants to rename... add or remove boards... or change the order'), then gives the exact procedure for the two tricky cases: rename-only must resend current boards unchanged, reorder must resend the same boards in a new order. It also adds a genuine precondition: if list_accounts returns more than one account and the user didn't specify, ask rather than choosing.

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

update_board_sectionA
DestructiveIdempotent
Inspect

Use this when the user wants to rename a section on a Pinterest board: renames a section by sectionId (from list_board_sections) on a board by boardId (from list_boards). If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
nameYesNew section name, up to 180 characters
boardIdYesNumeric Pinterest board ID returned by list_boards — never a board name or URL
accountIdYesNumeric Tailwind account ID returned by list_accounts
sectionIdYesBoard section ID returned by list_board_sections

Output Schema

NameRequiredDescription
sectionYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds value beyond that with the account-disambiguation rule and the ID provenance chain the agent must walk first. It does not say that the prior section name is overwritten or whether name collisions are rejected — the main 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.

Conciseness4/5

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

Two sentences, front-loaded with the trigger and action, with the disambiguation rule placed last where it acts as a guard. Every clause does work, though the parenthetical tool references repeat schema content and add some length.

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

Completeness4/5

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

With an output schema present, return values need no explanation, and the description covers purpose, ID sourcing, and account selection — enough for correct invocation. It could say what happens to the existing name (destructive per annotations) and whether the new name must be unique, but nothing critical 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 each parameter already documents its source (boardId from list_boards, sectionId from list_board_sections, accountId from list_accounts). The description's mention of sectionId and boardId provenance merely restates the schema, and it adds nothing about the 180-character limit on 'name' or format expectations beyond what is already written.

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 — 'renames a section on a Pinterest board' — and identifies 'section' as the renamed attribute, which cleanly separates it from the sibling create_board_section, delete_board_section, and update_board (which renames the board itself). The triggering phrase 'Use this when the user wants to rename a section' makes it immediately selectable.

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

Usage Guidelines4/5

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

Gives an explicit positive trigger plus a concrete precondition: if the account is unspecified and list_accounts returns multiple, ask the user rather than choosing. It also names the lookup tools that supply each ID (list_board_sections, list_boards), effectively documenting the required call sequence. It stops short of stating when NOT to use this (e.g. renaming the board itself, which is update_board), but the context is otherwise clear.

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

update_feedA
DestructiveIdempotent
Inspect

Use this when the user wants to pause or resume a feed, or change the defaults applied to the Pins it generates (keywords, design tier and style, regeneration). Takes a feedId from list_feeds; send only the fields to change, and at least one. Pause with status "paused" and resume with status "active". Pausing keeps the subscription but stops the daily check, so the feed's record of already-seen posts stops advancing: everything the site publishes during the pause counts as new on resume and will generate Pins — and spend credits — until the backlog clears (up to 25 per feed per day). If the user wants generation to stop for good without that catch-up, use delete_feed instead. Resuming re-checks the feed's Pinterest account and is refused if it is no longer connected. The account a feed is assigned to cannot be changed. Editing spends no credits.

NameRequiredDescriptionDefault
feedIdYesThe `id` of a feed returned by list_feeds, connect_feed or get_feed
statusNo"paused" stops the daily check; "active" resumes it and catches up on posts published during the pause.
keywordsNoKeywords applied to every Pin this feed generates, up to 50. Terms from list_saved_keywords work well here.
designTierNoDesign treatment for generated Pins, which also sets what each one costs in SmartPin credits. Omitting this leaves the feed on its current tier — it does not reset it to basic — so to move a feed to the cheaper basic tier you have to send designTier explicitly. premium requires premiumStyle.
premiumStyleNoRequired when designTier is premium, and must be null or absent otherwise. Send null when moving a feed off the premium tier so its stored style is cleared.
autoRegenerateNoWhether each Pin this feed generates keeps being periodically redesigned on the generationFrequency cadence. Each redesign is a SmartPin generation of its own.
generationFrequencyNoHow often each generated Pin is redesigned when autoRegenerate is on. This is NOT how often the feed is checked for new posts — that is once a day, always.

Output Schema

NameRequiredDescription
feedYes

TDQS

A4.8/5.0
Behavior5/5

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

Goes well past the annotations: discloses the credit-spending catch-up consequence of pausing (backlog up to 25 Pins/feed/day), that resume is refused if the Pinterest account is disconnected, that a feed's account assignment is immutable, and that editing itself costs no credits. This directly explains the destructive hint in operational terms.

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 trigger condition, then constraints, then consequences — well ordered. Somewhat dense with parenthetical detail (the 25-per-day figure, credit notes), but nearly every sentence carries operational weight.

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 the decision boundary, required inputs, partial-update rules, side effects, failure modes, and cost implications for a 7-parameter mutation tool; an output schema exists so return values need no explanation. Nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3, but the description adds patch semantics not encoded in the schema (only send changed fields, at least one) and clarifies status intent. It does not restate designTier/premiumStyle coupling, which the schema already handles 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?

Opens with a specific verb and resource plus the three distinct operations it covers (pause/resume, edit defaults), and names delete_feed as the contrasting sibling. An agent can distinguish it from delete_feed and pause_publishing 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?

Explicitly states when to use it, when to prefer delete_feed instead, the partial-update rule ('send only the fields to change, and at least one'), and the exact enum values that pause vs resume. No inference required.

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

update_pin_designA
Idempotent
Inspect

Use this to re-render a template-designed Pin with a new overlay title, new colors, or a new image. Free and synchronous, but it re-renders the design server-side and can take several seconds. Only works when get_pin_design lists "update" in supportedOperations — AI-generated (premium) Pins change through regenerate_pin_design instead. Send everything you want changed in ONE call: each call is a separate render, and omitted fields keep their current values. For a new image, pass a publicly reachable mediaUrl, or an uploadId from create_media_upload. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
titleNoText overlaid on the design. This is not the Pin's title.
colorsNoDesign colors as hex values, e.g. #0077CC
postIdYesPin ID from list_posts
mediaUrlNoPublicly reachable image to rebuild the design around, such as a URL from get_pin_design's sourceImageCandidates
uploadIdNoImage staged with create_media_upload. Use instead of mediaUrl, not with it.
accountIdYesNumeric Tailwind account ID from list_accounts

Output Schema

NameRequiredDescription
designYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (non-read-only, idempotent, non-destructive), the description discloses cost and latency (free but synchronous, server-side render that can take several seconds) and the partial-update contract that omitted fields keep their current values. Those are exactly the traits an agent needs before deciding to call this versus a fast read. No contradiction with the annotation profile.

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 regenerate alternative come first, then cost/latency, then the batching and image rules, then the account caveat. Every sentence carries information, but the final account-selection sentence is long and slightly tangential to the call itself.

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?

An output schema exists, so return values do not need explaining. Combined with full annotation coverage and a 100%-documented schema, the description supplies the remaining decision-critical context: eligibility precondition, latency, partial-update semantics, image sourcing, and account disambiguation.

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 would be 3, but the description adds value the schema does not spell out: mediaUrl and uploadId are mutually exclusive alternatives, mediaUrl must be publicly reachable, and the uploadId comes from create_media_upload. The account-selection rule also clarifies what to do with accountId, even though it does not document the field format itself.

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 (re-render a template-designed Pin) plus the three things that can change (overlay title, colors, image). It explicitly distinguishes itself from the sibling that handles AI-generated Pins: regenerate_pin_design.

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 precondition (get_pin_design must list "update" in supportedOperations), an explicit alternative for the excluded case (regenerate_pin_design), and an explicit batching rule (send everything in ONE call because each call is a separate render). It also tells the agent to ask the user to pick an account when list_accounts returns more than one.

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

update_postA
DestructiveIdempotent
Inspect

Use this when the user wants to change an existing Pinterest Pin's copy — its title, description, destination link, board, Board section, alt text, product tags, or whether it is a simplified or standard Pin — on a draft or a scheduled (queued) Pin, by postId (from create_post, list_posts or get_post). Supply at least one of title, description, url, boardId, boardSectionId, altText, productTagPinIds or isSimplifiedPin — a call with only accountId and postId is rejected. Use productTagPinIds to tag catalog products on a Pin that was created without them, to change which products it tags, or — with an empty array — to remove its tags; there is no need to delete and recreate the Pin for any of that. Use isSimplifiedPin to switch a Pin between simplified (true) and standard (false) in place, again without recreating it. Moving the Pin with boardId alone clears any Board section it was in, because a section is only valid on its own Board: pass boardSectionId as well to land it in a section of the new Board, or "" to put it at the Board root. Only the fields you send are changed; everything else is left as it is. This edits one Pin per call; the same edit across several Pins goes through preview_update_posts and then update_posts, which take up to 50 Pins at once and show each Pin's before-and-after before anything is saved. Editing is free and does not consume a credit. This does NOT schedule, reschedule or unschedule: use schedule_post or unschedule_post for that, and note the Pin's image cannot be changed at all — that needs a delete_post plus a fresh create_post. A Pin already published to Pinterest cannot be edited through Tailwind; the user has to edit it in the Pinterest app. Neither this tool nor a Pinterest Pin has a keyword field: a keyword reaches Pinterest only as words in the Pin's title or description. Tailwind keeps keywords in the organization's Saved Keywords list, where each term can be tied to destination URLs; that list is what the Pin Scheduler's Add keywords control shows for a Pin's link. list_saved_keywords with url returns the keywords saved for a Pin's link, and save_keywords with urls adds terms to that list. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
urlNoNew destination URL for the Pin
titleNoNew Pin title. Cannot be empty.
postIdYesPost ID of the draft or scheduled Pin to edit, from create_post or list_posts
altTextNoNew accessibility alt text
boardIdNoMove the Pin to this board. Numeric Pinterest board ID from list_boards — never a board name or URL
accountIdYesNumeric Tailwind account ID returned by list_accounts
descriptionNoNew Pin description. Cannot be empty.
boardSectionIdNoMove the Pin into this section, validated against the board it ends up on. Send "" to move it to the board root. Sending boardId WITHOUT this field clears any section the Pin already had, because a section is only valid on its own board. Use list_board_sections to look up section IDs.
isSimplifiedPinNotrue makes the Pin a simplified Pin, false a standard Pin; omit it to leave the Pin's design as it is. false is refused while the Pin has product tags, since Pinterest rejects tags on standard Pins: send productTagPinIds: [] in the same call to remove them.
productTagPinIdsNoPinterest product-catalog pin IDs to tag on the Pin, replacing whatever tags it has now (business accounts only; max 24). Send an empty array to remove every tag; omit the field to leave the Pin's tags alone. Tagging forces a simplified Pin, since Pinterest rejects tags on standard Pins, and tags are refused on a carousel Pin because Pinterest will not publish that combination — an empty array is still accepted on one, so tags can be cleared off it.

Output Schema

NameRequiredDescription
postYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already flag this as a non-readonly, destructive, idempotent mutation, and the description adds real behavioral context on top: partial-update semantics ('Only the fields you send are changed'), the fact that editing costs no credit, the publisher-side restriction on already-published Pins, and the image being immutable. It loses a point because the boardId/boardSectionId clearing rule and the productTagPinIds replacement semantics are largely restatements of what the input schema already documents.

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

Conciseness3/5

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

The core is front-loaded and efficient, but the middle section drifts into a three-sentence digression on keywords, the Saved Keywords list, list_saved_keywords and save_keywords that is only loosely connected to editing a Pin. That padding sits between the operational rules and the closing account-disambiguation instruction, diluting a description that would otherwise be tight.

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 10-parameter mutation tool with an output schema, everything an agent needs is present: valid inputs, cross-field constraints, mutation scope, cost, irreversibility paths, sibling routing, and an account-selection prerequisite. Nothing about calling it correctly is left to inference.

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 already 100%, so the baseline is 3; the description earns more by adding constraints the schema cannot express — at minimum one of the eight editable fields must be supplied or the call is rejected, postId must come from a listed source, and empty-array productTagPinIds removes tags while isSimplifiedPin toggles design in place. It also ties parameters together (boardId plus boardSectionId, isSimplifiedPin false refused while tags exist).

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 — 'change an existing Pinterest Pin's copy' — and enumerates exactly which fields are editable (title, description, url, board, section, alt text, product tags, simplified flag). It also states the scope ('This edits one Pin per call', 'draft or a scheduled (queued) Pin'), which cleanly separates it from update_posts, create_post and delete_post.

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 with the required identifier source (create_post, list_posts, get_post), explicit when-not for scheduling ('use schedule_post or unschedule_post'), for image changes (delete_post plus create_post), for bulk edits (preview_update_posts then update_posts, up to 50 Pins), and for already-published Pins. It even adds a prerequisite rule: if list_accounts returns more than one account and the user didn't specify, ask rather than choose.

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

update_postsA
DestructiveIdempotent
Inspect

Use this when the user has seen and agreed to a bulk Pin edit that preview_update_posts returned, to save it. This is the second of the two calls a bulk edit takes. It takes the same accountId and posts that were previewed and the previewToken the preview returned; a batch that differs from the preview in any way, or a token older than 30 minutes, is rejected with nothing changed, and so is a call with no previewToken. Each Pin is then saved on its own, and results lists every entry in request order as updated, failed (with the reason) or not_attempted (not reached before the time limit; unchanged, and safe to send again). Each updated result's previous holds the edited fields' values from before the edit in this tool's input form; those entries, previewed and saved the same way, undo the edit. An empty title, description or url is absent from previous, since it cannot be emptied again; an empty alt text is reported as an empty string, which clears it. Editing is free and never changes when a Pin publishes. It cannot change a Pin's image or a Pin already published to Pinterest. For a single Pin, update_post is the equivalent call. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
postsYesOne entry per Pin: its postId plus at least one field to change. A postId may appear only once.
accountIdYesNumeric Tailwind account ID returned by list_accounts
previewTokenYespreviewToken from the preview_update_posts call for exactly these posts, within 30 minutes

Output Schema

NameRequiredDescription
resultsYesOne result per entry, in request order
summaryYes

TDQS

A4.8/5.0
Behavior5/5

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

Despite annotations covering destructive/idempotent/open-world behavior, the description adds substantial context beyond them: the 30-minute token expiry, rejection of any batch that differs from the preview with nothing changed, per-Pin results in request order with updated/failed/not_attempted statuses, and undo semantics via previous values. It also discloses limits — cannot change image or published Pins, editing is free and does not alter publish time.

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

Conciseness4/5

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

The description is front-loaded with usage conditions and then adds operational detail. It is dense and long, but nearly every clause carries actionable information about validation, partial failure, or undo behavior. A slightly more structured presentation would improve scanability.

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 bulk mutation requiring a preview handshake, the description supplies the full workflow, validation rules, result semantics, undo behavior, limitations, and account-selection prerequisite. Even though an output schema exists, the description correctly explains the important non-obvious return structure (per-Pin updated/failed/not_attempted and previous values).

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 beyond the schema: the previewToken must come from preview_update_posts for exactly the same posts and be under 30 minutes old, and the posts/accountId must match the preview or the call is rejected. This materially clarifies the required parameters.

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

Purpose5/5

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

The description opens with a precise verb and scope: it saves a bulk Pin edit that preview_update_posts returned, as the second of a two-call workflow. It explicitly distinguishes itself from preview_update_posts and from the single-Pin update_post, 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 exactly when to use this tool: only after the user has seen and agreed to a preview, with the same accountId/posts and the previewToken. It also names alternatives (update_post for a single Pin) and a prerequisite/ambiguity rule (ask the user which Pinterest account if multiple accounts exist).

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

update_timeslotA
DestructiveIdempotent
Inspect

Use this when the user wants an existing posting time moved: changes a smart schedule timeslot's day, time or timezone. Pass the timeslotId from list_timeslots, plus only the fields that change — anything omitted keeps its current value. At least one of dayPreference, time or timezone is required. Free.

This is the right tool for fixing a badly spread schedule: move the slots that are clustered rather than rebuilding everything, which would discard the whole schedule and generate a new one. Pins already scheduled onto this slot keep the time they were given; moving the slot changes where FUTURE Pins land, so the user may still see Pins at the old time until those publish. If the user did not say which Pinterest account to use and list_accounts returns more than one, ask the user which account to use before calling this — do not choose for them.

NameRequiredDescriptionDefault
timeNoTime of day as 24-hour HH:MM, zero-padded (e.g. "09:30", "18:05"). Not 12-hour, not HHMM.
timezoneNoIANA timezone to move the slot into (e.g. America/New_York). Omit to keep the timezone the slot already has, which may differ from the account's.
accountIdYesNumeric Tailwind account ID returned by list_accounts
timeslotIdYesTimeslot ID returned by list_timeslots
dayPreferenceNoDay of week: 0 = Sunday, 1 = Monday, through 6 = Saturday. Ask the user which day rather than guessing.

Output Schema

NameRequiredDescription
timeslotYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond annotations, the description explains that omitted fields keep their current values, that already-scheduled Pins retain their assigned time, and that moving a slot only affects where future Pins land. This is important mutation context, especially for a tool annotated as destructive and idempotent, and it does not contradict those annotations.

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

Conciseness5/5

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

The description is front-loaded with the primary use case, then layers in the rebuild alternative, mutation side effects, and account-selection guardrail. Every sentence contributes operational guidance, and no information is repeated without 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?

The description covers the mutation's effects, required inputs, omitted-field behavior, alternative tool selection, and account-selection prerequisites. Since an output schema exists, it does not need to explain return values, and it provides enough context for an agent to invoke the tool correctly.

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

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 parameter formats and sources. The description adds useful semantics beyond the schema by stating that omitted fields are preserved and that at least one of dayPreference, time, or timezone is required, though it does not repeat every parameter detail.

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

Purpose5/5

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

The description states a specific verb and resource: moving/changing an existing smart schedule timeslot's day, time, or timezone. It also explicitly distinguishes this from rebuilding a schedule, naming the alternative behavior that would discard the whole schedule and generate a new one. An agent can identify the tool's 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 Guidelines5/5

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

It gives explicit usage conditions, including that timeslotId comes from list_timeslots, that only changed fields should be passed, and that at least one of dayPreference, time, or timezone is required. It also contrasts this with rebuild_schedule and gives account-selection guidance when multiple Pinterest accounts exist.

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. 6 tool updates
    • Changedcreate_post2 fields changed
      • addedOutput schema / properties / intervalPosts / items / properties / boardName
        Added value: +{
        +  "description": "Name of the Board in boardId, as Tailwind last saw it when listing the account's Boards. Returned by get_post and list_posts only; absent when the Pin has no Board or the Board has not been listed yet, such as one just made with create_board",
        +  "type": "string"
        +}
      • addedOutput schema / properties / post / properties / boardName
        Added value: +{
        +  "description": "Name of the Board in boardId, as Tailwind last saw it when listing the account's Boards. Returned by get_post and list_posts only; absent when the Pin has no Board or the Board has not been listed yet, such as one just made with create_board",
        +  "type": "string"
        +}
    • Changedget_post1 field changed
      • addedOutput schema / properties / post / properties / boardName
        Added value: +{
        +  "description": "Name of the Board in boardId, as Tailwind last saw it when listing the account's Boards. Returned by get_post and list_posts only; absent when the Pin has no Board or the Board has not been listed yet, such as one just made with create_board",
        +  "type": "string"
        +}
    • Changedlist_posts1 field changed
      • addedOutput schema / properties / posts / items / properties / boardName
        Added value: +{
        +  "description": "Name of the Board in boardId, as Tailwind last saw it when listing the account's Boards. Returned by get_post and list_posts only; absent when the Pin has no Board or the Board has not been listed yet, such as one just made with create_board",
        +  "type": "string"
        +}
    • Changedschedule_post1 field changed
      • addedOutput schema / properties / post / properties / boardName
        Added value: +{
        +  "description": "Name of the Board in boardId, as Tailwind last saw it when listing the account's Boards. Returned by get_post and list_posts only; absent when the Pin has no Board or the Board has not been listed yet, such as one just made with create_board",
        +  "type": "string"
        +}
    • Changedunschedule_post1 field changed
      • addedOutput schema / properties / post / properties / boardName
        Added value: +{
        +  "description": "Name of the Board in boardId, as Tailwind last saw it when listing the account's Boards. Returned by get_post and list_posts only; absent when the Pin has no Board or the Board has not been listed yet, such as one just made with create_board",
        +  "type": "string"
        +}
    • Changedupdate_post1 field changed
      • addedOutput schema / properties / post / properties / boardName
        Added value: +{
        +  "description": "Name of the Board in boardId, as Tailwind last saw it when listing the account's Boards. Returned by get_post and list_posts only; absent when the Pin has no Board or the Board has not been listed yet, such as one just made with create_board",
        +  "type": "string"
        +}
  2. 1 tool update
    • Changedlist_posts2 fields changed
      • changedInput schema / properties / endDate / description
        Previous value: -"Filter posts before this date (ISO 8601). Required for sent, uploading and missed status; for failed, pass both startDate and endDate or neither. For missed, a date after now counts as now."New value: +"Filter posts before this date (ISO 8601). Required for sent, uploading and missed status; for queued and failed, pass both startDate and endDate or neither. For missed, a date after now counts as now."
      • changedInput schema / properties / startDate / description
        Previous value: -"Filter posts after this date (ISO 8601). Required for sent, uploading and missed status; for failed, pass both startDate and endDate or neither."New value: +"Filter posts after this date (ISO 8601). Required for sent, uploading and missed status; for queued and failed, pass both startDate and endDate or neither."
  3. 6 tool updates
    • Changedcreate_post2 fields changed
      • changedOutput schema / properties / intervalPosts / items / properties / generationId / description
        Previous value: -"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review. Required by get_pin_design and the tools that edit a Pin's design; without it they fail with design_not_found"
      • changedOutput schema / properties / post / properties / generationId / description
        Previous value: -"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review. Required by get_pin_design and the tools that edit a Pin's design; without it they fail with design_not_found"
    • Changedget_post1 field changed
      • changedOutput schema / properties / post / properties / generationId / description
        Previous value: -"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review. Required by get_pin_design and the tools that edit a Pin's design; without it they fail with design_not_found"
    • Changedlist_posts1 field changed
      • changedOutput schema / properties / posts / items / properties / generationId / description
        Previous value: -"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review. Required by get_pin_design and the tools that edit a Pin's design; without it they fail with design_not_found"
    • Changedschedule_post1 field changed
      • changedOutput schema / properties / post / properties / generationId / description
        Previous value: -"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review. Required by get_pin_design and the tools that edit a Pin's design; without it they fail with design_not_found"
    • Changedunschedule_post1 field changed
      • changedOutput schema / properties / post / properties / generationId / description
        Previous value: -"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review. Required by get_pin_design and the tools that edit a Pin's design; without it they fail with design_not_found"
    • Changedupdate_post1 field changed
      • changedOutput schema / properties / post / properties / generationId / description
        Previous value: -"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review. Required by get_pin_design and the tools that edit a Pin's design; without it they fail with design_not_found"
  4. 6 tool updates
    • Changedcreate_post2 fields changed
      • changedOutput schema / properties / intervalPosts / items / properties / generationId / description
        Previous value: -"ID of the AI generation (generate_pins_from_url) that produced this post; absent for posts created any other way"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"
      • changedOutput schema / properties / post / properties / generationId / description
        Previous value: -"ID of the AI generation (generate_pins_from_url) that produced this post; absent for posts created any other way"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"
    • Changedget_post1 field changed
      • changedOutput schema / properties / post / properties / generationId / description
        Previous value: -"ID of the AI generation (generate_pins_from_url) that produced this post; absent for posts created any other way"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"
    • Changedlist_posts2 fields changed
      • changedInput schema / properties / status / description
        Previous value: -"Filter by post status (default: queued). draft = drafts assigned to this account; failed = publishing failed; missed = still queued after its scheduled time passed"New value: +"Filter by post status (default: queued). draft = drafts assigned to this account, including AI-generated drafts waiting for review (they carry generationId); failed = publishing failed; missed = still queued after its scheduled time passed"
      • changedOutput schema / properties / posts / items / properties / generationId / description
        Previous value: -"ID of the AI generation (generate_pins_from_url) that produced this post; absent for posts created any other way"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"
    • Changedschedule_post1 field changed
      • changedOutput schema / properties / post / properties / generationId / description
        Previous value: -"ID of the AI generation (generate_pins_from_url) that produced this post; absent for posts created any other way"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"
    • Changedunschedule_post1 field changed
      • changedOutput schema / properties / post / properties / generationId / description
        Previous value: -"ID of the AI generation (generate_pins_from_url) that produced this post; absent for posts created any other way"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"
    • Changedupdate_post1 field changed
      • changedOutput schema / properties / post / properties / generationId / description
        Previous value: -"ID of the AI generation (generate_pins_from_url) that produced this post; absent for posts created any other way"New value: +"ID of the AI generation that produced this post, from generate_pins_from_url or a connected feed; absent for posts created any other way. A draft with one is a generated draft waiting for review"
  5. 76 tool updates
    • First observedcancel_generation
    • First observedconnect_feed
    • First observedconnect_pinterest_account
    • First observedcreate_board
    • First observedcreate_board_list
    • First observedcreate_board_section
    • First observedcreate_media_upload
    • First observedcreate_post
    • First observedcreate_posts
    • First observedcreate_timeslot
    • First observeddelete_board
    • First observeddelete_board_list
    • First observeddelete_board_section
    • First observeddelete_feed
    • First observeddelete_post
    • First observeddelete_saved_keyword
    • First observeddelete_saved_keywords
    • First observeddelete_timeslot
    • First observedgenerate_pin_copy
    • First observedgenerate_pins_from_url
    • First observedget_account
    • First observedget_account_analytics
    • First observedget_account_usage
    • First observedget_board_keyword_relevance
    • First observedget_copy_generation_status
    • First observedget_design_regeneration_status
    • First observedget_feed
    • First observedget_generation_status
    • First observedget_pin_analytics
    • First observedget_pin_design
    • First observedget_pin_spacing_rule
    • First observedget_post
    • First observedget_post_batch
    • First observedget_post_image
    • First observedget_recommended_pins
    • First observedget_schedule
    • First observedlist_accounts
    • First observedlist_board_lists
    • First observedlist_board_pins
    • First observedlist_board_sections
    • First observedlist_boards
    • First observedlist_feeds
    • First observedlist_group_boards
    • First observedlist_pin_spacing_rules
    • First observedlist_pins
    • First observedlist_posts
    • First observedlist_saved_keywords
    • First observedlist_subscriptions
    • First observedlist_timeslots
    • First observedlist_top_pins
    • First observedopen_schedule_calendar
    • First observedpause_publishing
    • First observedpreview_feed
    • First observedpreview_update_posts
    • First observedrebuild_schedule
    • First observedrecord_widget_event
    • First observedregenerate_pin_design
    • First observedreport_issue
    • First observedrequest_capability
    • First observedresume_publishing
    • First observedrevert_pin_design
    • First observedsave_keywords
    • First observedsave_pins_to_board
    • First observedschedule_post
    • First observedselect_pin_design_variation
    • First observedtag_saved_keywords
    • First observedunschedule_post
    • First observeduntag_saved_keywords
    • First observedupdate_board
    • First observedupdate_board_list
    • First observedupdate_board_section
    • First observedupdate_feed
    • First observedupdate_pin_design
    • First observedupdate_post
    • First observedupdate_posts
    • First observedupdate_timeslot

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    A hosted MCP server that lets AI assistants schedule and publish social media posts across Instagram, TikTok, X, LinkedIn, YouTube, Pinterest, Facebook, Telegram, Threads, and Bluesky. It provides tools for managing accounts, posts, media, and analytics, including post previewing before publishing.
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Pendpost MCP server — exposes ~43 tools for posting, scheduling, and managing content via the Pendpost platform.
    43
    642 npm
    15
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server that enables AI agents to schedule and publish posts to 13+ social platforms via PostBolt's API with zero code.
    34 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources