Skip to content

MCP Tools Reference

Tools are actions that AI assistants can perform on your behalf. The Tailwind MCP Server provides tools for finding accounts, boards, and recommended posting times, for checking an account’s subscription/plan status, for creating, scheduling, listing, reading, or deleting Pinterest Pins, for generating Pin drafts from a URL with Tailwind’s AI, for uploading your own file bytes when the media has no public URL, for reading and editing your Saved Keywords list, and for connecting RSS feeds that automatically draft SmartPins from new posts.

List all Pinterest accounts connected to your Tailwind organization. Call this first because every account-scoped tool requires an accountId returned by this tool. The feed tools are the exception: feeds belong to the organization, so only connect_feed (which assigns a feed’s Pins to one account) needs an accountId.

This tool has no parameters.

“List my Pinterest accounts”

Returns each account’s ID, username, display name, domain-verification status, and Pinterest-token status.


Get one account’s details when you already have its accountId — username, display name, connection status, and claimed domain — without listing every account. Prefer list_accounts when you don’t have an accountId yet.

A 404 means the account is not yours, or is one of your own accounts that is no longer connected to Tailwind; the message says which.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts

“What’s the connection status of account 123456?”

Returns the account’s ID, username, display name, avatar, domain-verification status, claimed domain (absent when none is set), Pinterest-token status, and connection date.


List the Pinterest boards on an account, with each board’s numeric ID and name. Use this to find a boardId for create_post or schedule_post — board IDs are numeric, never board names or URLs.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts

“Which boards do I have on account 123456?”

Returns each board’s ID, name, Pin count, and whether it is secret or a collaborator board. The Pin count comes from a cached snapshot and can lag behind Pinterest — treat it as a lower bound, not an exact figure.


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

To publish to a list, read its boards here and pass them as create_post’s intervalBoards, keeping this order. The list ID is not itself a publishing target: a list is a saved grouping that can change, so what gets published to is the boards it holds at the time of the call.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts

“How are the boards on account 123456 organized?”

Returns each board list’s ID, name (absent when the list is unnamed), and its boards in publishing order. An account with no board lists is a valid setup, not an error.


Create a Pinterest board on the account and get back its numeric boardId, ready to pass to create_post or schedule_post. Creating a board does not consume Pin credits.

Use the boardId returned here 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.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
name string Yes Board name, up to 180 characters
description string No Board description, up to 500 characters
privacy string No public (default) or secret. A secret board is visible only to the account owner and its collaborators

“Create a board called Weeknight dinners on account 123456”

Returns the new board’s ID, name, description, privacy and pin count.


Rename a Pinterest board or change its description. Supply at least one of name or description; anything omitted is left as it is.

A board’s privacy cannot be changed through this tool — flipping a public board to secret would hide every Pin on it from everyone but the owner.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
boardId string Yes Numeric Pinterest board ID returned by list_boards — never a board name or URL
name string No New board name, up to 180 characters
description string No New board description, up to 500 characters

“Rename board 1106196864631757445 to Quick weeknight meals”

Returns the updated board’s ID, name, description, privacy and pin count.


Permanently delete a Pinterest board 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. The board’s Pin count from list_boards is a cached figure and the board may hold more Pins than it reports, so quote it as approximate rather than exact.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
boardId string Yes Numeric Pinterest board ID returned by list_boards — never a board name or URL

“Delete board 1106196864631757445 — yes, I’m sure”

Returns the deleted board’s ID, name and the number of Pins deleted with it.


List the sections on a Pinterest board. Sections are subdivisions within a single board. An empty list means the board has no sections, which is normal.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
boardId string Yes Numeric Pinterest board ID returned by list_boards — never a board name or URL

“What sections does board 1106196864631757445 have?”

Returns each section’s ID and name.


Score how well one of your boards covers a keyword, and get back the Pins that earned the score. This reads the board’s real Pins from Pinterest — not just what Tailwind scheduled to it — so it covers Pins you added outside Tailwind too.

Metered: each scored call spends one plan credit. Score a board once and reuse the result rather than re-calling per question.

A response with state: "absent" means the board yielded no readable Pins — it is empty, or the Pinterest connection needs reconnecting. That is unknown coverage, not poor coverage, and it is not charged. Large boards are scored from a capped sample; when truncated is true the score covers part of the board rather than all of it.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
boardId string Yes Numeric Pinterest board ID returned by list_boards — never a board name or URL
keyword string Yes The keyword or topic to score the board against, up to 255 characters

“How well does board 1106196864631757445 cover coastal decor?”

Returns the board’s relevance tier (excellent, very-good, good, fair or poor), how many of the scored Pins cover the keyword, whether the board was sampled, and the on-topic Pins — strongest first — each with its own relevance tier.


Find Pins from across Pinterest worth adding to one of your boards for a given keyword. Pairs with get_board_keyword_relevance: score a board to find a keyword it covers weakly, then call this to fix the gap. This is the “performance tier” companion to the Board Organization Audit skill.

Free — this spends no plan credits, unlike get_board_keyword_relevance.

Results exclude Pins the board already has, promoted/ad content, and anything that does not clear the relevance threshold. relevance is therefore never poor, and an empty list means nothing on-topic was found for that keyword — not that the board is bad.

These are public Pins from across Pinterest, not your own content. Treat them as suggestions to review; adding one to a board still means creating a Pin with create_post.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
boardId string Yes Numeric Pinterest board ID returned by list_boards — never a board name or URL
keyword string Yes The keyword or topic to find Pins for, up to 255 characters
limit number No How many recommendations to return, 1–25. Defaults to 10. Bounds the response only — every candidate is scored, so the top result is the best of the whole candidate set.

“What Pins should I add to board 1106196864631757445 for coastal decor?”

Returns the recommended Pins, strongest first. Each carries its Pinterest Pin ID, title, description, link, thumbnail URL, and its own relevance tier (excellent, very-good, good or fair) as the reason it fits.

Repeating the same keyword is served from a short-lived cache. Requesting many different keywords in quick succession can return 429 — that is Tailwind’s own limit protecting the upstream Pinterest search, not Pinterest refusing. A board too large to read completely within one request returns 504; the board has to be read in full, because a partial read would recommend Pins it already holds.


Create a named section on a Pinterest board. Creating a section does not consume Pin credits.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
boardId string Yes Numeric Pinterest board ID returned by list_boards — never a board name or URL
name string Yes Section name, up to 180 characters

“Add a Pasta section to board 1106196864631757445”

Returns the new section’s ID and name.


Rename a section on a Pinterest board.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
boardId string Yes Numeric Pinterest board ID returned by list_boards — never a board name or URL
sectionId string Yes Board section ID returned by list_board_sections
name string Yes New section name, up to 180 characters

“Rename the Pasta section on board 1106196864631757445 to Fresh pasta”

Returns the section’s ID and its new name.


Remove a section from a Pinterest board. 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.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
boardId string Yes Numeric Pinterest board ID returned by list_boards — never a board name or URL
sectionId string Yes Board section ID returned by list_board_sections

“Delete the Pasta section from board 1106196864631757445”

Confirms the section was deleted and names the section ID that was removed.


Find public Pinterest group boards for a keyword, from Tailwind’s Group Board Finder. These are other people’s public boards — benchmark context for how boards in a niche are named and sized, not the user’s own boards, 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 the user should check back rather than being told there are no results, and unavailable means the search failed and no benchmark data can be given for that keyword.

Parameter Type Required Description
keyword string Yes Topic to search for, e.g. “home decor”. Trimmed, whitespace-collapsed and lowercased before lookup; 100 characters maximum

“What group boards exist for home decor?”

Returns the normalized keyword, the search status, and the matching public boards — each with its Pinterest board ID, name, description, URL, owner username, cover image, pin count, owner follower count, and whether it is collaborative or joinable.


List the account’s smart schedule timeslots — Tailwind’s recommended posting times. Each slot is a recurring weekly time (day of week + time of day + timezone), not a concrete date, and this read carries no occupancy information: it does not say which upcoming occurrences are already taken.

This is a read for showing or explaining the schedule, 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, which resolves the next genuinely open slot and applies the account’s Pin Spacing rules. Computing an occurrence from this list and passing it as sendAt ignores both, so Pins stack on the same slot and land off-schedule.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts

“What does my posting schedule look like on account 123456?”

Returns each timeslot’s ID, day of week, time of day (24-hour HH:MM), timezone, and how it was added to the schedule.


The account’s schedule over a date window, as concrete dated entries: which smart schedule slots are open, and what occupies the rest. This is the companion to list_timeslots, which returns the recurring weekly rules and no occupancy.

Entries come back earliest first. open marks an unused smart schedule slot; scheduled, publishing and published each name the Pin holding that time. timeslotId is absent on a Pin that sits on no slot at all — scheduled at an arbitrary time, or left behind by a slot that has since moved.

Read it to answer questions and to reason about the queue. It is not a placement primitive: a slot that reads as open can be taken before a later write lands. To put a Pin on the schedule, pass useNextOpenSlot: true to create_post or schedule_post — do not copy a time from this response into sendAt.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
from string No Start of the window (ISO 8601). Defaults to now.
to string No End of the window (ISO 8601). Defaults to 14 days after the start, and cannot be more than 60 days after it.

“What’s on my Pinterest schedule for account 123456 this week?”

“When is my next free posting slot on account 123456?”

Returns schedule — each entry’s sendAt (Unix seconds), state, optional timeslotId, and the post holding it when the entry is not open — alongside the window actually read.

A 503 means building the schedule timed out; retry, or ask for a shorter window.


Adds one recurring weekly posting time to the account’s smart schedule. Free: managing the schedule costs no credits, here or in the dashboard.

This changes when future Pins publish; it does not schedule a Pin. To place a specific Pin, use create_post or schedule_post with useNextOpenSlot.

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 an existing schedule. Each call adds exactly one slot, so spreading a clustered schedule across mornings takes one call per slot.

Omit timezone to use the account’s own, which is almost always what the user means. An account with no timezone set returns a 400 asking for one explicitly.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
dayPreference number Yes Day of week: 0 = Sunday through 6 = Saturday
time string Yes Time of day as 24-hour HH:MM, zero-padded (e.g. 09:30)
timezone string No IANA timezone the time is expressed in. Defaults to the account’s own.

“Add a Monday 9am posting time to account 123456.”

“My schedule is all evenings — add slots at 8am and noon on weekdays.”

Returns the created timeslot, including its id for later edits, plus time as HH:MM and the timezone it was stored in.


Moves an existing posting time to another day, time or timezone. Pass the timeslotId from list_timeslots and 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 clustered slots rather than regenerating everything with rebuild_schedule, which discards the whole schedule.

Pins already scheduled onto the slot keep the times they were given. Moving a slot changes where future Pins land, so Pins may still publish at the old time until they clear.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
timeslotId string Yes Timeslot ID returned by list_timeslots
dayPreference number No New day of week: 0 = Sunday through 6 = Saturday
time string No New time of day as 24-hour HH:MM
timezone string No New IANA timezone for the slot

“Move my Tuesday 10:32pm slot on account 123456 to 8am.”

“Shift every evening slot on account 123456 into the morning.”

Returns the updated timeslot. Any edit marks the slot manual, matching what the dashboard does when someone moves a time by hand.


Removes a single recurring posting time by timeslotId. Free. Confirm with the user first and say which day and time is going away.

Pins already scheduled onto the slot are not unscheduled and not deleted — they keep their 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, deleting the specific slots they dislike is safer than rebuild_schedule, which discards every slot and regenerates the lot.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
timeslotId string Yes Timeslot ID returned by list_timeslots

“Remove the 2am posting slot from account 123456.”

Returns the deleted timeslot as it was, so the caller can report exactly what was removed.


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 user’s existing times are gone, including any set by hand. Evergreen (SmartLoop) slots are the one exception and survive untouched.

Use it only when the user has explicitly asked to regenerate the whole schedule. To spread a clustered schedule or change specific times, use update_timeslot, delete_timeslot and create_timeslot, which leave the rest alone.

There is no day-part preference: the generator spreads slots across the whole 5am–11pm window, so it cannot satisfy “mornings only”.

Rebuilds are serialized per account. A second rebuild arriving while one is still running is refused with a 409 rather than racing it, so a client that retries after a timeout cannot end up with a doubled schedule.

If a rebuild fails outright, read list_timeslots before deciding what to do. The delete and the insert are separate writes, so a failure between them can leave the account with no posting times, and re-running the rebuild is what restores them.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
slotsPerDay number Yes Posting times to generate per day, 1 to 50. The total is this times 7. The dashboard’s own default is 5.

“Regenerate my whole posting schedule for account 123456 with 3 times a day.”

Returns rebuilt, the slotsPerDay used, the resulting timeslotCount, and timezoneSourcefallback means the account has no timezone set and America/New_York was used, which is worth surfacing to the user.


Check whether a Pinterest account has active, paying access — useful before relying on it for a paid capability, or when someone asks what plan they are on. Works the same whether the organization is on Tailwind’s legacy or modular billing; the caller never needs to know which. An account with no paying access is a normal answer, not an error.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts

“Does account 123456 have an active subscription?”

Returns entitled — a single boolean answering whether the account can use paid features right now — alongside billingSystem and a subscriptions list explaining what is backing that access.

An account on legacy billing always reports exactly one entry describing its organization-wide plan. An account on modular billing reports one entry per current entitlement, which may be several (for example, separate Publishing and SEO entitlements) or none. Each entry names its source — the organization’s plan, a paid subscription, or a Tailwind-issued grant — plus its billing state, whether a cancellation is pending, when the paid period ends (when known), and, for modular entitlements, the product and billing cycle.

Only current entitlements are listed: subscriptions that have ended and grants that have expired are omitted rather than returned as inactive.


Create a new Pinterest Pin from an image or video. With neither useNextOpenSlot nor sendAt it is saved as a draft; with either one it is scheduled to publish, which also requires title, description, url, and boardId. There is no update or edit tool — to change a Pin, delete it with delete_post and create a new one; to schedule an existing draft, use schedule_post.

useNextOpenSlot: true places the Pin in the account’s next genuinely open smart schedule slot, honoring the account’s Pin Spacing rules for the Pin’s destination url — the same calculation the Pin Scheduler runs. Prefer it whenever the user has not named a specific time; reserve sendAt for a time they actually asked for. Computing an occurrence from list_timeslots and passing it as sendAt is not equivalent: it ignores which slots are already taken and ignores Pin Spacing.

The media comes from exactly one of two sources: mediaUrl for anything with a publicly accessible URL, or uploadId for the user’s own file bytes, staged first with create_media_upload. Providing both, or neither, is rejected.

To create a carousel Pin (two to five images), pass carouselItems: the cover image stays in mediaUrl/uploadId, and carouselItems carries one to four further images, each with its own mediaUrl or uploadId. Carousels are images only — a video is rejected, as are product tags — and every image, cover included, must share the same width-to-height ratio.

To publish one Pin across several Boards spaced out over time — Tailwind’s interval Pinning, and what a saved Board list describes — pass intervalBoards in place of boardId, along with intervalType. Read a Board list’s boards with list_board_lists and pass them in that order; the list itself is not a target you can pass, because a list is a mutable grouping and what you publish to is the Boards it holds at the time of the call.

Each Board becomes its own Pin, 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. The whole fan-out is atomic: if any Board fails, the Pins already written are deleted and the call fails, so a retry cannot duplicate them. The Pins carry no link back to each other — the create response’s intervalPosts is the only place the grouping appears, so keep those IDs if the set may need editing later.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
mediaUrl string Conditional Publicly accessible URL of the image or video to pin. Exactly one of mediaUrl or uploadId is required; must be omitted when uploadId is provided.
uploadId string Conditional An upload from create_media_upload whose bytes have already been PUT to its uploadUrl. 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.
mediaType string No Type of media: image (default) or video. Ignored when uploadId is provided — the upload’s own extension already determined its type.
carouselItems array No One to four further images to make this a carousel Pin, each an object with mediaUrl or uploadId. Combined with the cover, a carousel holds two to five images total — images only, no product tags, and every image must share the same width-to-height ratio.
title string Conditional Pin title (max 100 characters). Required when scheduling.
description string Conditional Pin description (max 500 characters). Required when scheduling.
url string Conditional Destination URL when the pin is clicked. Required when scheduling — it is also what Pin Spacing rules are keyed on.
boardId string Conditional Target Pinterest board ID — the numeric board ID from list_boards, not a board name or URL. Required when scheduling to a single Board; use intervalBoards instead to publish across several.
boardSectionId string No Section of boardId to publish into, from list_board_sections. Requires boardId, and is rejected if it is not a section of that board. Omit to publish to the board root.
intervalBoards array No Two to twenty Boards to publish this Pin across, in publishing order — each an object with boardId and optional boardSectionId. The first Board is the one the Pin itself lands on; the rest follow one interval apart. Requires intervalType and either sendAt or useNextOpenSlot. Cannot be combined with boardId, and cannot be used on a draft.
intervalType string Conditional Spacing between Boards: daily, 2_days, 3_days, 4_days, 5_days, 6_days, weekly, or monthly. Required with intervalBoards, and rejected without it.
intervalDays integer No Exact number of days between Boards (1–365), overriding intervalType’s preset — e.g. weekly with intervalDays: 14 for a fortnight. Only valid with intervalBoards.
intervalMode string No How each Board’s time is chosen: slots (default) lands every Board on a real smart schedule slot, so the gap may stretch when slots are full; exact lands each Board exactly the interval after the previous one, keeping the first Pin’s time of day and ignoring the schedule.
altText string No Alt text for accessibility (max 500 characters)
isSimplifiedPin boolean No Whether to create a simplified pin (default: true). Set to false for a standard pin.
sendAt string No Explicit publish time (ISO 8601), in the future. Use only when the user named a specific time. Cannot be combined with useNextOpenSlot; omit both for a draft. Requires title, description, url, and a Board.
useNextOpenSlot boolean No Schedule into the account’s next open smart schedule slot, honoring its Pin Spacing rules for this Pin’s url. Cannot be combined with sendAt; omit both for a draft. Requires title, description, url, and a Board.
productTagPinIds array No Pinterest product-catalog pin IDs to tag on the pin (business accounts only; max 24). Providing any forces a simplified pin.

“Create a pin on account 123456 with this image https://example.com/photo.jpg, title it ‘Summer Recipes’, and schedule it for January 20th at 2pm UTC”

“Pin this image to every board in my Home Decor board list, a week apart”

The tool returns a confirmation with:

  • Post ID
  • Status (draft or queued)
  • Scheduled time (if applicable)
  • Board information

For an intervalBoards create it instead lists every Pin produced — one per Board, with its own post ID, Board and send time — under intervalPosts.


Schedule or reschedule an existing draft or queued Pin, by postId (from create_post or list_posts), passing exactly one of useNextOpenSlot or sendAt. The Pin must already have title, description, and url set; a draft without a board also needs boardId. Does not work on published Pins. To create and schedule a new Pin in one step, use create_post instead.

useNextOpenSlot: true resolves the account’s next open smart schedule slot and applies its Pin Spacing rules for the Pin’s destination url. Prefer it whenever the user has not named a specific time.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
postId string Yes Post ID to schedule
sendAt string Conditional Explicit publish time (ISO 8601), in the future. Exactly one of sendAt or useNextOpenSlot is required.
useNextOpenSlot boolean Conditional Schedule into the account’s next open smart schedule slot, honoring its Pin Spacing rules for the Pin’s url. Exactly one of sendAt or useNextOpenSlot is required.
boardId string Conditional Target Pinterest board ID — the numeric board ID from list_boards, not a board name or URL. Required when scheduling a draft that doesn’t already have a board.
boardSectionId string No Section 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.

“Schedule post post_abc123 on account 123456 for tomorrow at 9am”

Returns the updated post with:

  • Post ID
  • New status (queued)
  • Scheduled time

Edit an existing Pin’s copy — title, description, destination link, board, alt text, or product tags — on a draft or a scheduled (queued) Pin. Only the fields you send are changed; everything else is left as it is. Editing is free and does not consume a credit.

This does not schedule or reschedule — use schedule_post for that. A Pin’s image cannot be changed at all; that needs delete_post plus a fresh create_post. A Pin already published to Pinterest cannot be edited through Tailwind.

title and description cannot be set to empty. Moving a Pin to a different board clears any board section it was in, because a section belongs to one board. productTagPinIds is the way to tag catalog products on a Pin that was created without them, change which products it tags, or remove its tags — there is no need to delete and recreate the Pin for any of that.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
postId string Yes Post ID of the draft or scheduled Pin to edit, from create_post or list_posts
title string No New Pin title, up to 100 characters
description string No New Pin description, up to 500 characters
url string No New destination URL for the Pin
boardId string No Move the Pin to this board. Numeric Pinterest board ID from list_boards — never a board name or URL
boardSectionId string No Move 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.
altText string No New accessibility alt text, up to 500 characters
productTagPinIds array No Pinterest 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, and tags are refused on a carousel Pin — though an empty array is still accepted on one, so tags can be cleared off it.

“Change the description on that draft to mention the recipe takes 20 minutes”

“Tag the blue mug from my catalog on those three scheduled Pins”

Returns the updated Pin in the same shape get_post serves.


Permanently delete a Pin that has not been published to Pinterest. Published Pins cannot be deleted through Tailwind. To change a Pin’s title, description, link or board, use update_post rather than deleting it — only a change of image needs a delete and a fresh create_post.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
postId string Yes Post ID to delete

“Delete post post_abc123 from account 123456”

Confirms the post was deleted with the post ID.


List an account’s Pins — drafts, scheduled (queued), or published (sent) — with optional filtering by status. Returns each Pin’s postId for use with get_post, schedule_post and delete_post.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
status string No Filter by status: draft, queued, sent, or uploading. Default: queued
limit number No Number of posts to return (1-100). Default: 50
cursor string No Pagination cursor from previous response
startDate string No Filter posts after this date (ISO 8601). Required for sent/uploading status.
endDate string No Filter posts before this date (ISO 8601). Required for sent/uploading status.

“Show me all draft posts on account 123456”

“List the last 10 sent posts from January 2024”

Returns a list of posts with:

  • Post ID
  • Status
  • Scheduled/sent time
  • Title (if set)
  • Pagination cursor for next page

Read one Pin by its postId — status, media, title, description, destination URL, board, and scheduled or published time. Use this to confirm a single Pin’s current state instead of paging list_posts to find it.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
postId string Yes Post ID of the Pin to read, from create_post or list_posts

“What’s the status of post post_abc123 on account 123456?”

“Show me the board and scheduled time for post post_abc123”

Returns the single post, in the same shape list_posts returns for each entry.


How the whole Pinterest account is performing: impressions, engagement, saves and clicks as totals, plus a per-day series for trends. Covers claimed and unclaimed content alike — the same numbers Pinterest Insights shows inside Tailwind.

This is the account-wide rollup. For the best-performing Pins use list_top_pins; for one Pin use get_pin_analytics.

Omit both dates for the last 30 days. Supply both to choose a window — supplying one is an error, because the two plausible completions return materially different data. Pinterest reports at most 90 days back and at most a 90-day span. Reading analytics is free and consumes no credits.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
startDate string No First day of the window, UTC YYYY-MM-DD. Requires endDate. Omit both for 30 days.
endDate string No Last day of the window (inclusive), UTC YYYY-MM-DD. Requires startDate.

“How did my Pinterest account 123456 do last month?”

“Are my impressions trending up on account 123456?”

Returns summaryMetrics and dailyMetrics alongside the startDate and endDate actually used — always report that period, since it may be the server-resolved default rather than one you asked for.

A metric value of null means Pinterest has not finished computing it for that day; the day’s dataStatus says why. Do not read a null as a zero — a PROCESSING day is not a drop in performance.


The account’s best-performing Pins over a window, in Pinterest’s own ranked order.

Ranks by ENGAGEMENT unless sortBy says otherwise, and the response echoes the metric used — say which one when reporting results, since “top” means nothing without it. Only five metrics rank: ENGAGEMENT, SAVE, IMPRESSION, OUTBOUND_CLICK and PIN_CLICK.

Keep the order returned; it is the ranking. This is also the usual way to obtain a Pinterest pinId for get_pin_analytics. Reading analytics is free and consumes no credits.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
sortBy string No Metric to rank by: ENGAGEMENT (default), SAVE, IMPRESSION, OUTBOUND_CLICK or PIN_CLICK
startDate string No First day of the window, UTC YYYY-MM-DD. Requires endDate. Omit both for 30 days.
endDate string No Last day of the window (inclusive), UTC YYYY-MM-DD. Requires startDate.

“Which of my Pins performed best on account 123456 this month?”

“Show me my most-saved Pins on account 123456.”

Returns pins — each with its Pinterest pinId, title, description, destination and Pinterest URLs, image URL and metrics — alongside the resolved startDate, endDate and the sortBy actually applied.

An empty pins array is a real answer: either nothing was published in the window, or Pinterest has not reported on it yet. A wider window may help, up to the 90-day limit.


One Pin’s performance: totals over a window, a per-day series, and lifetime totals that ignore the window entirely.

pinId is the Pinterest Pin id — not the Tailwind postId that list_posts and get_post return as id. Get one from list_top_pins, or from a published Pin’s Pinterest id. Passing a Tailwind postId returns a 404.

Only a Pin this account owns can be read. Pinterest itself would also report on Pins sitting on group boards this account collaborates on; this tool deliberately does not, because holding the account is not evidence of owning the Pin and the read does not verify board collaboration. Anything else returns the same 404 — missing, someone else’s, on a shared board, or unreadable. A 403 means Pinterest permanently forbids analytics for that Pin — it will never report, so do not retry. Reading analytics is free and consumes no credits.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
pinId string Yes The Pinterest Pin id (a numeric string), from list_top_pins or a published Pin. NOT the Tailwind postId.
startDate string No First day of the window, UTC YYYY-MM-DD. Requires endDate. Omit both for 30 days.
endDate string No Last day of the window (inclusive), UTC YYYY-MM-DD. Requires startDate.

“How is Pin 987654321012345678 doing on account 123456?”

“Show me the daily impressions for my top Pin on account 123456.”

Returns summaryMetrics for the window, dailyMetrics per day, and lifetimeMetrics covering the Pin’s whole life — report the two totals distinctly, since they cover different periods and otherwise read as contradictory.


Have Tailwind’s AI generate Pinterest Pin drafts from a web page — a blog post, product page, or article URL. Asynchronous and metered: each generation spends plan credits by design tier (approximately 3 for basic, 7 for premium, 1 for no-template — resolved server-side) and typically completes in 1–3 minutes. Returns a generation ID to poll with get_generation_status; the finished 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. Repeating the call after it completes starts — and charges — a new generation, so poll before retrying. If the URL already has a SmartPin on this account, that record is reused as-is (its stored design configuration applies and tier parameters are ignored); a SmartPin for the URL on a different account is a conflict.

Parameter Type Required Description
accountId string Yes Numeric Tailwind account ID returned by list_accounts
url string Yes The 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.
title string No Display name for this generation source in the Tailwind dashboard (max 256 characters). Defaults to the URL.
designTier string No basic (default), premium, or no-template. Determines the credit cost.
premiumStyle string Conditional Visual style for premium designs: image-highlight, text-highlight, minimalist, artistic, professional, or natural. Required when designTier is premium; must be omitted otherwise.
keywords array No Up to 10 keywords to guide the generated Pin copy

“Generate some Pins from my latest blog post https://example.com/blog/summer-recipes on account 123456”

Returns the generation with:

  • Generation ID (poll it with get_generation_status)
  • Status (processing)
  • Design tier and nominal credit cost
  • Whether an existing SmartPin was reused, and whether the call deduplicated onto an in-flight generation

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 — a hung generation can stay processing for ~25 minutes before the terminal generation-request-timed-out status appears. A “not found” response within ~10 seconds of starting the generation is a transient indexing artifact — retry it.

Parameter Type Required Description
generationId string Yes Generation ID returned by generate_pins_from_url

“Is my Pin generation done yet?”

Returns the generation’s status (processing, success, or failed), the source URL, timestamps, and — on failure — a stable failureCode (for example scrape-failed, no-images-on-page, not-enough-credits, or generation-request-timed-out). On success, list the account’s draft posts and filter by the matching generationId to find the generated Pins.


Have Tailwind’s Ghostwriter write Pinterest Pin titles and descriptions against the organization’s saved brand context — the tone, style and audience captured from the account’s own content — and file the result in the account’s Ghostwriter history. Asynchronous and metered: each call spends a plan credit and usually completes in under a minute. Returns a generation ID to poll with get_copy_generation_status.

Org-scoped: no accountId is needed. Every call generates and charges again — there is no in-flight deduplication, so poll the ID you already have rather than repeating the call. This tool writes Pinterest Pin copy only; Tailwind’s other Ghostwriter generators are not exposed through MCP.

Parameter Type Required Description
contentType string Yes The angle the copy should take: lifestyle_content, featured_product, seasonal_promotion, behind_the_scenes, or education_content.
topic string Yes What the Pin is about — the product, post, or idea, in the user’s own words (max 500 characters).
keywords array No Up to 10 keywords to work into the copy
cta string No Call to action to end each Pin with (max 200 characters)
priorOutputs array No Up to 10 { title, description } pairs the user already has, so this generation varies from them instead of repeating them

“Write me some Pin titles and descriptions for my autumn table settings post”

Returns the generation with:

  • Generation ID (poll it with get_copy_generation_status)
  • Status (processing)
  • The credits the generation cost

Poll a Pin copy generation started by generate_pin_copy. It usually completes in under a minute: poll every ~5 seconds.

Parameter Type Required Description
jobId string Yes Copy generation ID returned by generate_pin_copy

“Is my Pin copy ready?”

Returns the generation’s status (processing, success, or failed) and timestamps. On success, result.pins holds the generated title and description pairs — pass one to create_post, or offer them to the user to choose from.


Stage your own file bytes for a Pin — a Canva export, a photo or a video on disk, anything that has no publicly accessible URL.

There are two ways to use it.

Attached file (ChatGPT). When the user attaches a file in the composer, ChatGPT passes it as file and the server fetches the bytes and uploads them itself. The returned uploadId is ready immediately — call create_post with it instead of mediaUrl. No PUT is needed, and the assistant never handles the bytes. Files up to 100 MB are relayed this way.

Signed URL (everyone else). Called without file, the tool returns a short-lived, write-only uploadUrl. The bytes go straight to storage and never pass through the API:

  1. Call this tool with the file’s extension to get an uploadUrl, a contentType, and an uploadId.
  2. PUT the raw file bytes to uploadUrl with a Content-Type header exactly matching the returned contentType. The URL’s signature covers that header, so any other value is rejected.
  3. Call create_post with that uploadId instead of mediaUrl.

uploadUrl expires much sooner than uploadId does — both deadlines come back on the response, so PUT the bytes promptly. The uploadId itself is single-use: it can be attached to exactly one Pin, so a second Pin needs a second upload. Staging bytes is free; only scheduling a Pin is billed.

Parameter Type Required Description
extension string Yes The 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.
file object No A file attached in the ChatGPT composer, supplied by the ChatGPT platform rather than by the assistant. Carries download_url and file_id (always) plus mime_type and file_name (optional). When present, the server fetches the file and uploads it, and no PUT is required.

“Pin this photo from my desktop to my Recipes board”

Returns the upload slot with:

  • uploadId — pass it to create_post in place of mediaUrl
  • uploadUrl — PUT the raw bytes here (already spent when the call carried a file)
  • contentType — the exact Content-Type header the PUT must send
  • mediaType (image or video), derived from the extension
  • uploadUrlExpiresAt and expiresAt — the PUT deadline and the attach deadline, as Unix timestamps

Read your Saved Keywords list — the terms you have already chosen to track in Tailwind. This is not keyword research: it reads back your own list rather than discovering new keywords or reporting how a term is trending. Results are newest-first and paginated.

Parameter Type Required Description
search string No Only return saved keywords containing this text
limit number No Keywords per page, 1–100. Defaults to 50
cursor string No nextCursor from a previous call, to read the next page

“What keywords do I have saved?”

Returns each keyword’s ID, term, when it was saved, any associated URLs and tags, and its estimated monthly Pinterest search volume. Commercial-intent score and detected language are included when Tailwind has data for the term and omitted when it does not — an omitted score means unknown, not zero.


Add keywords to your Saved Keywords list. Matching is case-insensitive, so re-sending a term already on the list returns the stored one instead of creating a duplicate. Saving keywords does not consume credits.

Parameter Type Required Description
keywords array Yes Up to 50 keywords, each with a term (255 characters max) and optional urls (up to 25 of your own URLs to associate with it)

“Save ‘winter home decor’ and ‘cozy living room’ to my keywords”

Returns the saved state of every term sent, whether newly created or already present.


Remove one keyword from your Saved Keywords list, by the id from list_saved_keywords — not the keyword text.

Parameter Type Required Description
keywordId string Yes The id of a keyword returned by list_saved_keywords

“Remove ‘winter home decor’ from my saved keywords”

Confirms the keyword was removed. An id that is not on your list returns a not-found error rather than a silent success, so a successful response always means the keyword really was deleted.


Remove several keywords from your Saved Keywords list at once, by their ids from list_saved_keywords.

This is all-or-nothing: if any id is not on your list, nothing is deleted and the error names the unknown ids. Re-sending a batch that already succeeded therefore returns a not-found error, not a second success.

Parameter Type Required Description
keywordIds array Yes Up to 100 keyword ids returned by list_saved_keywords

“Clear out the five keywords I saved yesterday”

Confirms how many keywords were removed.


Resolve a website or feed URL and report what would be subscribed to, before connecting it. Given a plain site URL, this discovers its feed. Returns kind: "feed" with the resolved feed URL and a sample of its newest entries when there is one answer, or kind: "candidates" when the site exposes several feeds — pick one and pass its feedUrl to connect_feed. Nothing is saved and no credits are spent. Feeds belong to your organization, so no accountId is needed.

Parameter Type Required Description
url string Yes A website URL or a feed URL, using http or https

“What would Tailwind pick up from myblog.com?”

Returns either the resolved feed (its URL, host, title, entry and section counts, and up to 10 of the newest entries) or the list of candidate feeds the site exposes.


List the RSS feeds connected to your Tailwind organization, newest first, with the Pinterest account each one’s Pins go to, its status, and how many SmartPins it has generated. Feeds are org-scoped rather than per-account: omit accountId to see every feed, or pass one to see only the feeds assigning Pins to that account. Results are paginated.

Parameter Type Required Description
accountId string No Only feeds whose Pins are assigned to this account, from list_accounts. Omit for every feed in the organization
limit number No Feeds per page, 1–100. Defaults to 50
cursor string No nextCursor from a previous call, to read the next page

“Which blogs are connected to Tailwind?”

Returns each feed’s ID, URL, title, assigned account, status (active or paused), generation defaults, when it was last checked and why that failed if it did, and its SmartPin count. An empty page reports which of these it means: the organization has no feeds, none are assigned to the given account, or the cursor is past the last one.


Subscribe to an RSS feed so Tailwind automatically creates Pins from it. 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. The feed’s current posts are snapshotted as the baseline, so only posts published after connecting generate Pins.

feedUrl must be an actual feed URL — use preview_feed first when you only have a site URL. accountId must be a currently connected Pinterest account, since a feed assigned to a disconnected one would be skipped every day without any error. A feed URL that is already connected returns a conflict rather than a duplicate. Connecting itself spends no credits.

Parameter Type Required Description
feedUrl string Yes The RSS feed URL to watch, using http or https
accountId string Yes Numeric Tailwind account ID from list_accounts. Generated Pins are assigned to this account and it cannot be changed later
keywords array No Keywords applied to every Pin this feed generates, up to 50
designTier string No basic (default), premium or no-template. Sets what each generated Pin costs in credits; premium requires premiumStyle
premiumStyle string or null No One of image-highlight, text-highlight, minimalist, artistic, professional or natural. Required on the premium tier and must be null or absent otherwise
generationFrequency string No every-3-days, weekly, every-2-weeks or monthly: how often each generated Pin is redesigned when autoRegenerate is on. Not how often the feed is checked — that is daily
autoRegenerate boolean No Whether each generated Pin keeps being periodically redesigned, each redesign a generation of its own

“Connect my blog’s RSS feed so new posts become Pins on my main account”

Returns the new feed subscription, including the id to use with get_feed, update_feed and delete_feed.


Read one feed subscription by its id from list_feeds or connect_feed: whether it is active or paused, when it was last checked, why that failed if it did, and how many SmartPins it has generated. No accountId is needed.

Parameter Type Required Description
feedId string Yes The id of a feed returned by list_feeds, connect_feed or get_feed

“Is my blog feed still working?”

Returns the feed. A feed that is not your organization’s, or has been removed, returns a not-found error.


Pause or resume a feed, or change the defaults applied to the Pins it generates. Send only the fields to change, and at least one.

Pausing (status: "paused") 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. To stop generation for good without that catch-up, use delete_feed instead. Resuming (status: "active") 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.

Parameter Type Required Description
feedId string Yes The id of a feed returned by list_feeds, connect_feed or get_feed
status string No paused to stop the daily check, active to resume it
keywords array No Keywords applied to every Pin this feed generates, up to 50
designTier string No basic, premium or no-template; premium requires premiumStyle. Omitting this keeps the feed’s current tier rather than resetting it to basic
premiumStyle string or null No Required on the premium tier; send null when moving off it so the stored style is cleared
generationFrequency string No every-3-days, weekly, every-2-weeks or monthly
autoRegenerate boolean No Whether generated Pins are periodically redesigned

“Pause my blog feed until after the holidays”

Returns the updated feed. When pausing or resuming, the text explains the catch-up behaviour so the assistant can pass it on.


Stop watching a feed for good. The daily check stops and no further Pins are generated from it; SmartPins it already generated are left alone. To stop generation temporarily instead, pause it with update_feed.

Parameter Type Required Description
feedId string Yes The id of a feed returned by list_feeds, connect_feed or get_feed

“Disconnect the old recipes blog from Tailwind”

Confirms the subscription was removed. A feed that is not your organization’s returns a not-found error rather than a silent success, so a successful response always means it really was removed.


Tell Tailwind about something the MCP server cannot do yet — a tool you expected and could not find, a missing field or filter, or a step you had to work around.

Requests go to Tailwind’s product team, who use them to decide what to build next. Your description is recorded in Tailwind’s internal analytics and posted to an internal Tailwind channel for staff to read, so send only what you would be comfortable sharing with Tailwind — don’t include credentials or personal data. No request resource is created: there is nothing to read back, no ticket to follow up on, and no timeline, so the response is only an acknowledgement. This is not for reporting errors — a rejected argument, an expired connection, or an out-of-credits message are not missing capabilities.

Parameter Type Required Description
description string Yes What you were trying to do and what was missing, up to 1000 characters

“There’s no way to change a scheduled Pin’s board — let Tailwind know that’s missing”

Confirms the request was passed along. Sending the same request twice reports it twice; nothing deduplicates them.


Tell Tailwind that a tool gave you a wrong answer rather than an error — a result that contradicts another result, a result you had to work around, or an output the user says is wrong.

Reports go to the people who maintain these tools, who read them to find what is broken. Your description and tool are recorded in Tailwind’s internal analytics and posted to an internal Tailwind channel for staff to read, so send only what you would be comfortable sharing with Tailwind — describe the problem rather than quoting the user’s content, and don’t include credentials or personal data. No report resource is created: there is nothing to read back and no ticket to follow up on, so the response is only an acknowledgement, and nothing about the result that prompted it changes. This is not for reporting errors — a rejected argument, an expired connection, or an out-of-credits message are errors to handle, not wrong answers. If Tailwind has no tool for what you need at all, use request_capability instead.

Parameter Type Required Description
description string Yes What you asked for, what came back, and why it is wrong, up to 1000 characters
tool string No The tool you believe returned the wrong result. Recorded as your claim and never checked against the tool list

“That board count doesn’t match what you told me a minute ago — flag that to Tailwind”

Confirms the report was passed along. Reporting the same issue twice reports it twice; nothing deduplicates them.


All tools require an authenticated Tailwind connection, using OAuth or an API key. Tools are automatically available to the AI assistant once the server is connected.

When a tool encounters an error, the AI assistant will explain what went wrong. Common errors include:

Error Description Solution
Account not found The account ID doesn’t exist Verify the account ID with list_accounts
Post not found The post ID doesn’t exist Check the post ID is correct
Cannot delete sent post Post has already been published Only posts not yet published can be deleted
Invalid sendAt Schedule time is in the past Use a future date/time
  1. Always verify account IDs first - Use list_accounts to get valid IDs
  2. Provide complete information - Include title, description, and URL for best results
  3. Use clear scheduling language - Say “January 20th at 2pm EST” rather than “next week”
  4. Review before publishing - Create drafts first if you want to review before scheduling