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_accounts
Section titled “list_accounts”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.
Example Usage
Section titled “Example Usage”“List my Pinterest accounts”
Response
Section titled “Response”Returns each account’s ID, username, display name, domain-verification status, and Pinterest-token status.
get_account
Section titled “get_account”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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
accountId |
string | Yes | Numeric Tailwind account ID returned by list_accounts |
Example Usage
Section titled “Example Usage”“What’s the connection status of account 123456?”
Response
Section titled “Response”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_boards
Section titled “list_boards”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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
accountId |
string | Yes | Numeric Tailwind account ID returned by list_accounts |
Example Usage
Section titled “Example Usage”“Which boards do I have on account 123456?”
Response
Section titled “Response”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_board_lists
Section titled “list_board_lists”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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
accountId |
string | Yes | Numeric Tailwind account ID returned by list_accounts |
Example Usage
Section titled “Example Usage”“How are the boards on account 123456 organized?”
Response
Section titled “Response”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_board
Section titled “create_board”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“Create a board called Weeknight dinners on account 123456”
Response
Section titled “Response”Returns the new board’s ID, name, description, privacy and pin count.
update_board
Section titled “update_board”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“Rename board 1106196864631757445 to Quick weeknight meals”
Response
Section titled “Response”Returns the updated board’s ID, name, description, privacy and pin count.
delete_board
Section titled “delete_board”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“Delete board 1106196864631757445 — yes, I’m sure”
Response
Section titled “Response”Returns the deleted board’s ID, name and the number of Pins deleted with it.
list_board_sections
Section titled “list_board_sections”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“What sections does board 1106196864631757445 have?”
Response
Section titled “Response”Returns each section’s ID and name.
get_board_keyword_relevance
Section titled “get_board_keyword_relevance”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“How well does board 1106196864631757445 cover coastal decor?”
Response
Section titled “Response”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.
get_recommended_pins
Section titled “get_recommended_pins”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.
Parameters
Section titled “Parameters”| 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. |
Example Usage
Section titled “Example Usage”“What Pins should I add to board 1106196864631757445 for coastal decor?”
Response
Section titled “Response”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.
Limits
Section titled “Limits”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_board_section
Section titled “create_board_section”Create a named section on a Pinterest board. Creating a section does not consume Pin credits.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“Add a Pasta section to board 1106196864631757445”
Response
Section titled “Response”Returns the new section’s ID and name.
update_board_section
Section titled “update_board_section”Rename a section on a Pinterest board.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“Rename the Pasta section on board 1106196864631757445 to Fresh pasta”
Response
Section titled “Response”Returns the section’s ID and its new name.
delete_board_section
Section titled “delete_board_section”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“Delete the Pasta section from board 1106196864631757445”
Response
Section titled “Response”Confirms the section was deleted and names the section ID that was removed.
list_group_boards
Section titled “list_group_boards”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“What group boards exist for home decor?”
Response
Section titled “Response”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_timeslots
Section titled “list_timeslots”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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
accountId |
string | Yes | Numeric Tailwind account ID returned by list_accounts |
Example Usage
Section titled “Example Usage”“What does my posting schedule look like on account 123456?”
Response
Section titled “Response”Returns each timeslot’s ID, day of week, time of day (24-hour HH:MM), timezone, and how it was added to the schedule.
get_schedule
Section titled “get_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.
Parameters
Section titled “Parameters”| 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. |
Example Usage
Section titled “Example Usage”“What’s on my Pinterest schedule for account 123456 this week?”
“When is my next free posting slot on account 123456?”
Response
Section titled “Response”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.
create_timeslot
Section titled “create_timeslot”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.
Parameters
Section titled “Parameters”| 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. |
Example Usage
Section titled “Example Usage”“Add a Monday 9am posting time to account 123456.”
“My schedule is all evenings — add slots at 8am and noon on weekdays.”
Response
Section titled “Response”Returns the created timeslot, including its id for later edits, plus time as HH:MM and the timezone it was stored in.
update_timeslot
Section titled “update_timeslot”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“Move my Tuesday 10:32pm slot on account 123456 to 8am.”
“Shift every evening slot on account 123456 into the morning.”
Response
Section titled “Response”Returns the updated timeslot. Any edit marks the slot manual, matching what the dashboard does when someone moves a time by hand.
delete_timeslot
Section titled “delete_timeslot”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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
accountId |
string | Yes | Numeric Tailwind account ID returned by list_accounts |
timeslotId |
string | Yes | Timeslot ID returned by list_timeslots |
Example Usage
Section titled “Example Usage”“Remove the 2am posting slot from account 123456.”
Response
Section titled “Response”Returns the deleted timeslot as it was, so the caller can report exactly what was removed.
rebuild_schedule
Section titled “rebuild_schedule”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.
Parameters
Section titled “Parameters”| 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. |
Example Usage
Section titled “Example Usage”“Regenerate my whole posting schedule for account 123456 with 3 times a day.”
Response
Section titled “Response”Returns rebuilt, the slotsPerDay used, the resulting timeslotCount, and timezoneSource — fallback means the account has no timezone set and America/New_York was used, which is worth surfacing to the user.
list_subscriptions
Section titled “list_subscriptions”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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
accountId |
string | Yes | Numeric Tailwind account ID returned by list_accounts |
Example Usage
Section titled “Example Usage”“Does account 123456 have an active subscription?”
Response
Section titled “Response”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_post
Section titled “create_post”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.
Parameters
Section titled “Parameters”| 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. |
Example Usage
Section titled “Example Usage”“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”
Response
Section titled “Response”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_post
Section titled “schedule_post”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.
Parameters
Section titled “Parameters”| 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. |
Example Usage
Section titled “Example Usage”“Schedule post post_abc123 on account 123456 for tomorrow at 9am”
Response
Section titled “Response”Returns the updated post with:
- Post ID
- New status (queued)
- Scheduled time
update_post
Section titled “update_post”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.
Parameters
Section titled “Parameters”| 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. |
Example Usage
Section titled “Example Usage”“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”
Response
Section titled “Response”Returns the updated Pin in the same shape get_post serves.
delete_post
Section titled “delete_post”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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
accountId |
string | Yes | Numeric Tailwind account ID returned by list_accounts |
postId |
string | Yes | Post ID to delete |
Example Usage
Section titled “Example Usage”“Delete post post_abc123 from account 123456”
Response
Section titled “Response”Confirms the post was deleted with the post ID.
list_posts
Section titled “list_posts”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.
Parameters
Section titled “Parameters”| 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. |
Example Usage
Section titled “Example Usage”“Show me all draft posts on account 123456”
“List the last 10 sent posts from January 2024”
Response
Section titled “Response”Returns a list of posts with:
- Post ID
- Status
- Scheduled/sent time
- Title (if set)
- Pagination cursor for next page
get_post
Section titled “get_post”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“What’s the status of post post_abc123 on account 123456?”
“Show me the board and scheduled time for post post_abc123”
Response
Section titled “Response”Returns the single post, in the same shape list_posts returns for each entry.
get_account_analytics
Section titled “get_account_analytics”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.
Parameters
Section titled “Parameters”| 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. |
Example Usage
Section titled “Example Usage”“How did my Pinterest account 123456 do last month?”
“Are my impressions trending up on account 123456?”
Response
Section titled “Response”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.
list_top_pins
Section titled “list_top_pins”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.
Parameters
Section titled “Parameters”| 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. |
Example Usage
Section titled “Example Usage”“Which of my Pins performed best on account 123456 this month?”
“Show me my most-saved Pins on account 123456.”
Response
Section titled “Response”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.
get_pin_analytics
Section titled “get_pin_analytics”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.
Parameters
Section titled “Parameters”| 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. |
Example Usage
Section titled “Example Usage”“How is Pin 987654321012345678 doing on account 123456?”
“Show me the daily impressions for my top Pin on account 123456.”
Response
Section titled “Response”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.
generate_pins_from_url
Section titled “generate_pins_from_url”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“Generate some Pins from my latest blog post https://example.com/blog/summer-recipes on account 123456”
Response
Section titled “Response”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
get_generation_status
Section titled “get_generation_status”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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
generationId |
string | Yes | Generation ID returned by generate_pins_from_url |
Example Usage
Section titled “Example Usage”“Is my Pin generation done yet?”
Response
Section titled “Response”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.
generate_pin_copy
Section titled “generate_pin_copy”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“Write me some Pin titles and descriptions for my autumn table settings post”
Response
Section titled “Response”Returns the generation with:
- Generation ID (poll it with
get_copy_generation_status) - Status (
processing) - The credits the generation cost
get_copy_generation_status
Section titled “get_copy_generation_status”Poll a Pin copy generation started by generate_pin_copy. It usually completes in under a minute: poll every ~5 seconds.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
jobId |
string | Yes | Copy generation ID returned by generate_pin_copy |
Example Usage
Section titled “Example Usage”“Is my Pin copy ready?”
Response
Section titled “Response”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.
create_media_upload
Section titled “create_media_upload”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:
- Call this tool with the file’s extension to get an
uploadUrl, acontentType, and anuploadId. - PUT the raw file bytes to
uploadUrlwith aContent-Typeheader exactly matching the returnedcontentType. The URL’s signature covers that header, so any other value is rejected. - Call
create_postwith thatuploadIdinstead ofmediaUrl.
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.
Parameters
Section titled “Parameters”| 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. |
Example Usage
Section titled “Example Usage”“Pin this photo from my desktop to my Recipes board”
Response
Section titled “Response”Returns the upload slot with:
uploadId— pass it tocreate_postin place ofmediaUrluploadUrl— PUT the raw bytes here (already spent when the call carried afile)contentType— the exactContent-Typeheader the PUT must sendmediaType(imageorvideo), derived from the extensionuploadUrlExpiresAtandexpiresAt— the PUT deadline and the attach deadline, as Unix timestamps
list_saved_keywords
Section titled “list_saved_keywords”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“What keywords do I have saved?”
Response
Section titled “Response”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.
save_keywords
Section titled “save_keywords”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.
Parameters
Section titled “Parameters”| 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) |
Example Usage
Section titled “Example Usage”“Save ‘winter home decor’ and ‘cozy living room’ to my keywords”
Response
Section titled “Response”Returns the saved state of every term sent, whether newly created or already present.
delete_saved_keyword
Section titled “delete_saved_keyword”Remove one keyword from your Saved Keywords list, by the id from list_saved_keywords — not the keyword text.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
keywordId |
string | Yes | The id of a keyword returned by list_saved_keywords |
Example Usage
Section titled “Example Usage”“Remove ‘winter home decor’ from my saved keywords”
Response
Section titled “Response”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.
delete_saved_keywords
Section titled “delete_saved_keywords”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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
keywordIds |
array | Yes | Up to 100 keyword ids returned by list_saved_keywords |
Example Usage
Section titled “Example Usage”“Clear out the five keywords I saved yesterday”
Response
Section titled “Response”Confirms how many keywords were removed.
preview_feed
Section titled “preview_feed”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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
url |
string | Yes | A website URL or a feed URL, using http or https |
Example Usage
Section titled “Example Usage”“What would Tailwind pick up from myblog.com?”
Response
Section titled “Response”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_feeds
Section titled “list_feeds”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“Which blogs are connected to Tailwind?”
Response
Section titled “Response”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.
connect_feed
Section titled “connect_feed”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“Connect my blog’s RSS feed so new posts become Pins on my main account”
Response
Section titled “Response”Returns the new feed subscription, including the id to use with get_feed, update_feed and delete_feed.
get_feed
Section titled “get_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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
feedId |
string | Yes | The id of a feed returned by list_feeds, connect_feed or get_feed |
Example Usage
Section titled “Example Usage”“Is my blog feed still working?”
Response
Section titled “Response”Returns the feed. A feed that is not your organization’s, or has been removed, returns a not-found error.
update_feed
Section titled “update_feed”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“Pause my blog feed until after the holidays”
Response
Section titled “Response”Returns the updated feed. When pausing or resuming, the text explains the catch-up behaviour so the assistant can pass it on.
delete_feed
Section titled “delete_feed”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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
feedId |
string | Yes | The id of a feed returned by list_feeds, connect_feed or get_feed |
Example Usage
Section titled “Example Usage”“Disconnect the old recipes blog from Tailwind”
Response
Section titled “Response”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.
request_capability
Section titled “request_capability”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.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
description |
string | Yes | What you were trying to do and what was missing, up to 1000 characters |
Example Usage
Section titled “Example Usage”“There’s no way to change a scheduled Pin’s board — let Tailwind know that’s missing”
Response
Section titled “Response”Confirms the request was passed along. Sending the same request twice reports it twice; nothing deduplicates them.
report_issue
Section titled “report_issue”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.
Parameters
Section titled “Parameters”| 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 |
Example Usage
Section titled “Example Usage”“That board count doesn’t match what you told me a minute ago — flag that to Tailwind”
Response
Section titled “Response”Confirms the report was passed along. Reporting the same issue twice reports it twice; nothing deduplicates them.
Tool Availability
Section titled “Tool Availability”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.
Error Handling
Section titled “Error Handling”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 |
Best Practices
Section titled “Best Practices”- Always verify account IDs first - Use
list_accountsto get valid IDs - Provide complete information - Include title, description, and URL for best results
- Use clear scheduling language - Say “January 20th at 2pm EST” rather than “next week”
- Review before publishing - Create drafts first if you want to review before scheduling
