Pinterest Ads MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PINTEREST_ADS_HOME | No | Per-user folder for secrets/, logs/ and an optional .env. | ~/.pinterest-ads-mcp |
| PINTEREST_ADS_HOST | No | HTTP bind address. | 127.0.0.1 |
| PINTEREST_ADS_PORT | No | HTTP bind port. | 8000 |
| PINTEREST_ADS_APP_ID | No | Your Pinterest app's ID. | |
| PINTEREST_ADS_DRY_RUN | No | Set to true to preview writes without sending them. | |
| PINTEREST_ADS_MAX_BID | No | Optional bid cap in the account currency (not micro-units). | |
| PINTEREST_ADS_SANDBOX | No | Set to true to use Pinterest's Sandbox (api-sandbox.pinterest.com). | |
| PINTEREST_ADS_TIMEOUT | No | Request timeout in seconds. | 30 |
| PINTEREST_ADS_AUDIT_LOG | No | Audit log path. | ~/.pinterest-ads-mcp/logs/audit.jsonl |
| PINTEREST_ADS_LOG_LEVEL | No | Log level: DEBUG, INFO, WARNING or ERROR. Logs go to stderr. | |
| PINTEREST_ADS_PAGE_SIZE | No | List page size (max 250). | 100 |
| PINTEREST_ADS_READ_ONLY | No | Set to true to register only read-only tools. | |
| PINTEREST_ADS_TRANSPORT | No | Transport: stdio, streamable-http (served at /mcp), or sse (deprecated). | stdio |
| PINTEREST_ADS_APP_SECRET | No | Your Pinterest app's secret key. | |
| PINTEREST_ADS_MAX_BUDGET | No | Optional budget cap in the account currency (not micro-units). | |
| PINTEREST_ADS_TOKEN_FILE | No | Refresh-token file written by the auth command. If you keep the token file somewhere else, set this to its absolute path. | ~/.pinterest-ads-mcp/secrets/pinterest-ads-token.json |
| PINTEREST_ADS_TOOL_GROUPS | No | Comma-separated tool groups: accounts, campaigns, ad_groups, ads, pins, keywords, targeting, conversions, catalogs, analytics, reporting, bulk, request. Unknown names stop the server at startup. Server tools are always on. | |
| PINTEREST_ADS_ACCESS_TOKEN | No | A fixed access token (e.g. a test or Sandbox token) instead of OAuth; it can't be refreshed. | |
| PINTEREST_ADS_ALLOW_REMOTE | No | Set to true (or pass --allow-remote) to allow binding HTTP to a non-local address. There is no sign-in; only use behind your own authenticating proxy. | |
| PINTEREST_ADS_AD_ACCOUNT_ID | No | Default Pinterest ad account ID. | |
| PINTEREST_ADS_REFRESH_TOKEN | No | The refresh token itself, instead of the token file. The token file is better because renewed tokens are saved there. | |
| PINTEREST_ADS_BULK_THRESHOLD | No | Number of items per write before confirm="APPLY" is needed. | 10 |
| PINTEREST_ADS_AUDIT_SNAPSHOTS | No | Set to false to stop keeping the old values of changed fields. | |
| PINTEREST_ADS_MAX_DOWNLOAD_MB | No | Largest report or export file to download, in MB. | 200 |
| PINTEREST_ADS_MAX_INCREASE_PCT | No | Bid or budget rise percentage that needs confirm="APPLY". | 20 |
| PINTEREST_ADS_AUDIT_RETENTION_DAYS | No | Days to keep audit entries, pruned at startup. Set to 0 to keep them. | 30 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Pinterest API v5 (ads): ad accounts, campaigns, ad groups, ads, keywords, audiences, catalogs, analytics, reports. Start with pinterest_ads_describe_server and pinterest_ads_health_check; pick an ad_account_id from pinterest_ads_list_ad_accounts. Writes change live ads and spend. Pinterest requires the user to approve each change: rehearse in dry-run (pinterest_ads_set_dry_run) and show them what will change first. Money fields are micro-units (1.00 = 1000000). New campaigns, ad groups and ads start PAUSED. Archives, deletes, big batches and bid or budget rises need confirm ('ARCHIVE', 'DELETE' or 'APPLY'). Don't combine one Pinterest account's data with another account's or other services' data beyond what this user asked for, and don't make benchmark or competitor claims. Every write is in the audit log (pinterest_ads_audit_tail). Tools can be limited with PINTEREST_ADS_TOOL_GROUPS or PINTEREST_ADS_READ_ONLY=true.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| pinterest_ads_describe_serverA | Show which API host, default ad account and safety settings this server uses. |
| pinterest_ads_health_checkA | Check the setup: refresh the access token, read the signed-in account, then list the ad accounts it can use. Also reports granted scopes and the rate-limit headers. |
| pinterest_ads_audit_lookupA | Look up an audit log entry by ID: the request, response summary and old values of a write. |
| pinterest_ads_audit_tailB | Show the most recent audit log entries (writes and dry-run rehearsals). |
| pinterest_ads_set_dry_runA | Turn dry-run on or off for this session. In dry-run, writes are recorded in the audit log and returned as a preview but NOT sent to Pinterest; reads still work. |
| pinterest_ads_list_ad_accountsA | List the ad accounts this token can use: owned ones and, by default, ones shared through business access (agency and partner access). Each has id, name, currency, country, owner and the user's permissions on it. |
| pinterest_ads_get_ad_accountB | Get one ad account: name, currency, country, time zone, owner and permissions. |
| pinterest_ads_get_user_accountA | Get the Pinterest account behind the token (username, account type, business name). With ad_account_id, returns the account that owns that ad account instead. |
| pinterest_ads_list_businessesA | List the businesses the signed-in user belongs to (Business Manager), with their IDs and a summary of their assets. Needs the biz_access:read scope. |
| pinterest_ads_list_business_assetsA | List a business's assets: ad accounts (default), profiles, catalogs or asset groups, with the permissions the user holds on each. Needs the biz_access:read scope. permissions filters by role, e.g. ['ADMIN', 'CAMPAIGN_MANAGER', 'ANALYST']. |
| pinterest_ads_list_campaignsA | List campaigns in an ad account. Filters: ids (this entity's IDs, up to 250) plus none where supported. statuses defaults to ACTIVE and PAUSED; pass ['ARCHIVED'] or ['ALL'] to widen it (IDs are found in any status). Returns at most max_results items. summary_status shows whether each one is actually delivering. |
| pinterest_ads_create_campaignsA | Create campaigns (up to 500 per call, sent 30 at a time). Changes the live account. items: one object per campaign, sent as-is. Example: {"name": "Spring sale", "objective_type": "SALES", "intended_promotion_type": "STANDARD_AD", "daily_spend_cap": 20000000, "is_campaign_budget_optimization": true}. objective_type is one of AWARENESS, CONSIDERATION, VIDEO_COMPLETION, SALES, LEADS, APP_INSTALL; SALES and CONSIDERATION take intended_promotion_type STANDARD_AD (ads from Pins) or CATALOG (product group promotions). start_time/end_time are Unix seconds. Money fields (daily_spend_cap, lifetime_spend_cap) are micro-units of the account currency (1.00 = 1000000). Items without a status are created PAUSED. Large batches and values over PINTEREST_ADS_MAX_BUDGET/PINTEREST_ADS_MAX_BID need confirm='APPLY'. Rehearse with dry-run first. |
| pinterest_ads_update_campaignsA | Update campaigns (up to 500 per call). Changes the live account. items: objects with id plus only the fields to change. Example: {"id": "626747269410", "daily_spend_cap": 25000000} or {"id": "...", "status": "PAUSED"}. Pinterest rejects daily budget rises smaller than 1.00 USD (or local equivalent). objective_type can only change on draft campaigns. Money fields (daily_spend_cap, lifetime_spend_cap) are micro-units of the account currency (1.00 = 1000000). Current values are read first and their old values kept in the audit log. Bid or budget rises above PINTEREST_ADS_MAX_INCREASE_PCT, and large batches, need confirm='APPLY'; setting status ARCHIVED needs confirm='ARCHIVE'. |
| pinterest_ads_archive_campaignsA | Archive campaigns by ID. Archived campaigns stop serving and Pinterest can't un-archive them, so this needs confirm='ARCHIVE' after the user agrees. To stop them temporarily, use pinterest_ads_set_statuses with PAUSED instead. |
| pinterest_ads_list_ad_groupsA | List ad groups in an ad account. Filters: ids (this entity's IDs, up to 250) plus campaign_ids where supported. statuses defaults to ACTIVE and PAUSED; pass ['ARCHIVED'] or ['ALL'] to widen it (IDs are found in any status). Returns at most max_results items. summary_status shows whether each one is actually delivering. |
| pinterest_ads_create_ad_groupsA | Create ad groups (up to 500 per call, sent 30 at a time). Changes the live account. items: one object per ad group, sent as-is. Example: {"name": "UK women 25-44", "campaign_id": "626747269410", "billable_event": "CLICKTHROUGH", "bid_strategy_type": "AUTOMATIC_BID", "budget_in_micro_currency": 10000000, "budget_type": "DAILY", "targeting_spec": {"LOCATION": ["GB"], "GENDER": ["female"], "AGE_BUCKET": ["25-34", "35-44"]}}. For SALES or LEADS campaigns set "optimization_goal_metadata": {"conversion_tag_v3_goal_metadata": {"conversion_tag_id": "...", "conversion_event": "CHECKOUT"}} (CHECKOUT or ADD_TO_CART for SALES, SIGNUP or LEAD for LEADS). targeting_spec needs LOCATION or GEO. Use pinterest_ads_get_targeting_options for valid codes. Money fields (budget_in_micro_currency, bid_in_micro_currency) are micro-units of the account currency (1.00 = 1000000). Items without a status are created PAUSED. Large batches and values over PINTEREST_ADS_MAX_BUDGET/PINTEREST_ADS_MAX_BID need confirm='APPLY'. Rehearse with dry-run first. |
| pinterest_ads_update_ad_groupsA | Update ad groups (up to 500 per call). Changes the live account. items: objects with id plus only the fields to change. Example: {"id": "2680059592705", "bid_in_micro_currency": 1500000} or {"id": "...", "targeting_spec": {...}}. targeting_spec replaces the whole spec. Money fields (budget_in_micro_currency, bid_in_micro_currency) are micro-units of the account currency (1.00 = 1000000). Current values are read first and their old values kept in the audit log. Bid or budget rises above PINTEREST_ADS_MAX_INCREASE_PCT, and large batches, need confirm='APPLY'; setting status ARCHIVED needs confirm='ARCHIVE'. |
| pinterest_ads_archive_ad_groupsA | Archive ad groups by ID. Archived ad groups stop serving and Pinterest can't un-archive them, so this needs confirm='ARCHIVE' after the user agrees. To stop them temporarily, use pinterest_ads_set_statuses with PAUSED instead. |
| pinterest_ads_get_bid_floorsA | Get the minimum bids Pinterest accepts for ad groups. Changes nothing. bid_floor_specs: e.g. [{"billable_event": "CLICKTHROUGH", "objective_type": "CONSIDERATION", "creative_type": "REGULAR", "countries": ["GB"], "currency": "GBP"}]. targeting_spec is optional, as in ad group create. Values are micro-units (1.00 = 1000000). |
| pinterest_ads_list_adsA | List ads in an ad account. Filters: ids (this entity's IDs, up to 250) plus ad_group_ids, campaign_ids where supported. statuses defaults to ACTIVE and PAUSED; pass ['ARCHIVED'] or ['ALL'] to widen it (IDs are found in any status). Returns at most max_results items. summary_status shows whether each one is actually delivering. |
| pinterest_ads_create_adsA | Create ads (up to 500 per call, sent 30 at a time). Changes the live account. items: one object per ad, sent as-is. Example: {"ad_group_id": "2680059592705", "pin_id": "813744226420795884", "creative_type": "REGULAR", "name": "Red trainers", "destination_url": "https://example.com/red-trainers"}. The Pin must belong to the ad account's profile (find one with pinterest_ads_list_pins or make one with pinterest_ads_create_ad_pin). creative_type follows the Pin: REGULAR (image), VIDEO, MAX_VIDEO, CAROUSEL, IDEA, COLLECTION, SHOPPING, QUIZ. Ads go through Pinterest's review before they serve. Items without a status are created PAUSED. Large batches and values over PINTEREST_ADS_MAX_BUDGET/PINTEREST_ADS_MAX_BID need confirm='APPLY'. Rehearse with dry-run first. |
| pinterest_ads_update_adsA | Update ads (up to 500 per call). Changes the live account. items: objects with id plus only the fields to change. Example: {"id": "687195134316", "status": "PAUSED"} or {"id": "...", "destination_url": "https://example.com/new"}. Current values are read first and their old values kept in the audit log. Bid or budget rises above PINTEREST_ADS_MAX_INCREASE_PCT, and large batches, need confirm='APPLY'; setting status ARCHIVED needs confirm='ARCHIVE'. |
| pinterest_ads_archive_adsA | Archive ads by ID. Archived ads stop serving and Pinterest can't un-archive them, so this needs confirm='ARCHIVE' after the user agrees. To stop them temporarily, use pinterest_ads_set_statuses with PAUSED instead. |
| pinterest_ads_list_product_group_promotionsA | List product group promotions: the catalog product groups an ad group promotes. Filter by ids, ad_group_id and statuses (default ACTIVE and PAUSED; ['ALL'] for every status). |
| pinterest_ads_create_product_group_promotionsA | Promote catalog product groups in an ad group (catalog ads). Changes the live account. items: e.g. [{"catalog_product_group_id": "1231235", "creative_type": "SHOPPING", "bid_in_micro_currency": 1200000}]. Use with SALES or CONSIDERATION campaigns whose intended_promotion_type is CATALOG. Items without a status are created PAUSED. Values over PINTEREST_ADS_MAX_BID and large batches need confirm='APPLY'. |
| pinterest_ads_update_product_group_promotionsA | Update product group promotions in one ad group. Changes the live account. items: objects with id plus the fields to change, e.g. {"id": "...", "status": "PAUSED"} or {"id": "...", "bid_in_micro_currency": 900000}. Bid rises above PINTEREST_ADS_MAX_INCREASE_PCT and large batches need confirm='APPLY'; status ARCHIVED needs confirm='ARCHIVE'. |
| pinterest_ads_list_pinsA | List Pins you could promote. Pass ad_account_id to list the Pins of the profile that owns that ad account (needed when it isn't your own). pin_filter: 'has_been_promoted', 'exclude_repins' or 'exclude_native'. include_protected_pins=true adds ad-only Pins. creative_types e.g. ['REGULAR', 'VIDEO']. |
| pinterest_ads_get_pinA | Get one Pin: title, link, media, board and whether it has been promoted. Pass ad_account_id when the Pin belongs to that ad account's profile. Apps registered on or after 14 September 2026 may get HTTP 403 PINNER_DATA_ACCESS_DENIED here until Pinterest approves Pinner data access; don't retry. |
| pinterest_ads_list_boardsA | List boards (yours, or the ad account owner's with ad_account_id), to find Pins. privacy: ALL, PUBLIC, PROTECTED (ad-only), SECRET or PUBLIC_AND_SECRET. |
| pinterest_ads_list_board_pinsA | List the Pins on a board, e.g. the protected 'Ad-only Pins' board, to pick one for an ad. Apps registered on or after 14 September 2026 may get HTTP 403 PINNER_DATA_ACCESS_DENIED here until Pinterest approves Pinner data access; don't retry. |
| pinterest_ads_create_ad_pinA | Create an ad-only Pin from an image URL, to use as an ad's pin_id. Ad-only Pins sit on a protected 'Ad-only Pins' board: they can't be saved by others or
shown organically. Pass ad_account_id so the Pin belongs to that ad account's profile.
ai_disclosures: ['AI_MODIFIED'] and/or ['SYNTHETIC_PERFORMER'] when the image was made
or changed with AI. Needs the pins:write scope (run |
| pinterest_ads_list_keywordsA | List keywords and negative keywords for an ad group, several ad groups or a campaign. match_types filters, e.g. ['EXACT_NEGATIVE', 'PHRASE_NEGATIVE'] for negatives only. Archived keywords have archived=true. |
| pinterest_ads_create_keywordsA | Add targeting keywords to an ad group. Changes the live account. keywords: strings (use match_type, default BROAD) or objects like {"value": "linen dress", "match_type": "PHRASE"}. Match types: BROAD, PHRASE, EXACT. More than PINTEREST_ADS_BULK_THRESHOLD keywords need confirm='APPLY'. |
| pinterest_ads_create_negative_keywordsA | Add negative keywords so ads don't show on those searches. Changes the live account. parent_id: an ad group ID, a campaign ID (applies to every ad group in it) or the ad account ID (applies to the whole account). match_type: PHRASE_NEGATIVE (default) or EXACT_NEGATIVE. More than PINTEREST_ADS_BULK_THRESHOLD keywords need confirm='APPLY'. |
| pinterest_ads_archive_keywordsA | Archive keywords or negative keywords by ID (find IDs with pinterest_ads_list_keywords). Archived keywords stop applying and can't be restored, so this needs confirm='ARCHIVE' after the user agrees. Up to 1000 IDs per call. |
| pinterest_ads_get_keyword_metricsA | Monthly search volume on Pinterest for keywords in one country (e.g. 'GB', 'US'). Up to 2000 keywords. Aggregated across Pinterest; use it to size keyword ideas. |
| pinterest_ads_suggest_keywordsC | Keyword ideas for a seed term: popular suggested terms and related terms. |
| pinterest_ads_get_targeting_optionsA | Valid values for an ad group targeting_spec field. targeting_type: LOCATION (countries and US metros), GEO (regions, postcodes), INTEREST, AGE_BUCKET, GENDER, LOCALE, APPTYPE, KEYWORD, AUDIENCE_INCLUDE or AUDIENCE_EXCLUDE. search filters the (often long) list, e.g. search='united kingdom'. |
| pinterest_ads_list_targeting_templatesC | List saved targeting templates (reusable targeting for ad groups). |
| pinterest_ads_estimate_audience_sizeB | Estimate how many people an ad group's targeting would reach. Changes nothing. targeting_spec as in ad group create, e.g. {"LOCATION": ["GB"], "AGE_BUCKET": ["25-34"]}. keywords: [{"value": "linen dress", "match_type": "BROAD"}]. |
| pinterest_ads_list_audiencesA | List audiences (customer list, visitor, engagement, actalike and persona audiences). ownership_type: OWNED or RECEIVED (shared with this account). Audiences need at least 100 matched people before they can be used. |
| pinterest_ads_get_audienceC | Get one audience: type, rule, size and status. |
| pinterest_ads_create_audienceA | Create an audience for targeting. Changes the live account. audience_type and rule, for example:
|
| pinterest_ads_update_audienceA | Rename an audience or change its description or rule. Changes the live account. |
| pinterest_ads_delete_audienceA | Remove an audience. Ad groups targeting it lose that targeting, and it can't be undone, so this needs confirm='DELETE' after the user agrees. |
| pinterest_ads_list_customer_listsB | List customer lists (uploaded customer identifiers) with their size and status. Status TOO_SMALL means fewer than 100 matched Pinterest users. |
| pinterest_ads_create_customer_listA | Upload a customer list (emails or mobile ad IDs) for targeting. Changes the account. list_type: EMAIL (default), MAID, IDFA, LR_ID, DLX_ID or HASHED_PINNER_ID. Emails and ad IDs are trimmed, lower-cased and SHA-256 hashed here before sending (unless already hashed). Up to 50,000 identifiers per call. Only upload people who agreed to this use; then turn the list into an audience with pinterest_ads_create_audience. |
| pinterest_ads_update_customer_listA | Add people to, or remove people from, a customer list. Changes the account. operation: ADD or REMOVE. Identifiers are hashed as in pinterest_ads_create_customer_list. Up to 50,000 per call. |
| pinterest_ads_list_conversion_tagsB | List the ad account's conversion tags (Pinterest Tag), with their IDs and status. A SALES or LEADS ad group needs one of these IDs as optimization_goal_metadata.conversion_tag_v3_goal_metadata.conversion_tag_id. |
| pinterest_ads_get_conversion_tagB | Get one conversion tag: name, status, last fired time and configuration. |
| pinterest_ads_list_catalogsC | List catalogs (retail, hotel or creative assets) and their IDs. |
| pinterest_ads_list_catalog_feedsC | List product feeds (data sources): location, format, schedule, status, country. |
| pinterest_ads_list_feed_processing_resultsA | Recent processing runs of a feed: status, item counts, and error and warning totals. Use a result's id with pinterest_ads_list_item_issues to see item-level problems. |
| pinterest_ads_list_item_issuesC | Item-level errors and warnings from one feed processing run. |
| pinterest_ads_get_catalog_itemsC | Look up catalog items by item ID (your feed's id column). Changes nothing. country e.g. 'GB', language e.g. 'en-GB' or 'EN'. Up to 100 item IDs. |
| pinterest_ads_ingest_catalog_feedA | Ask Pinterest to fetch and process a feed now instead of waiting for its schedule. |
| pinterest_ads_batch_catalog_itemsA | Create, update, upsert or delete catalog items in one batch (up to 1000). operation: CREATE, UPDATE (change some attributes), UPSERT (send every attribute) or DELETE. items: [{"item_id": "SKU1", "attributes": {"price": "24.99 GBP", "availability": "in stock"}}]; DELETE needs only item_id. If a feed manages the catalog, Pinterest recommends changing items through the feed. DELETE needs confirm='DELETE'; more than PINTEREST_ADS_BULK_THRESHOLD items need confirm='APPLY'. Returns a batch_id to check with pinterest_ads_get_catalog_items_batch. |
| pinterest_ads_get_catalog_items_batchB | Status of an item batch: whether it finished, and any per-item errors. |
| pinterest_ads_list_product_groupsC | List catalog product groups (the sets of products catalog ads promote). |
| pinterest_ads_create_product_groupB | Create a catalog product group. Changes the account. product_group, for a retail catalog: {"catalog_id": "...", "catalog_type": "RETAIL", "country": "GB", "locale": "en-GB", "name": "Trainers under 50", "filters": {"all_of": [{"PRODUCT_TYPE_0": {"values": ["shoes"]}}, {"MAX_PRICE": {"values": 50, "inclusion": true}}]}}. Feed-based groups use feed_id instead of catalog_id. |
| pinterest_ads_update_product_groupA | Rename a product group or change its description, filters or featured flag. changes: e.g. {"name": "Trainers under 60", "filters": {...}}. For a retail catalog group include "catalog_type": "RETAIL". The old values are kept in the audit log. |
| pinterest_ads_delete_product_groupA | Delete a catalog product group. Ads promoting it stop, and it can't be undone, so this needs confirm='DELETE' after the user agrees. |
| pinterest_ads_get_product_group_product_countsC | How many products a product group contains. |
| pinterest_ads_list_product_group_productsC | List the products (product Pins) in a product group. |
| pinterest_ads_get_analyticsA | Get ads metrics right away (synchronous) for the ad account, or for up to 250 campaigns, ad groups, ads or product groups. Changes nothing. level: account, campaign, ad_group, ad or product_group (ids required except for account). Dates are YYYY-MM-DD. granularity: TOTAL, DAY, WEEK, MONTH or HOUR. targeting_types breaks results down by targeting, e.g. ['LOCATION'], ['KEYWORD'], ['AGE_BUCKET_AND_GENDER'] (not for product groups). Attribution windows default to Pinterest's (30-day click and engagement, 1-day view); conversion_report_time TIME_OF_AD_ACTION (default) or TIME_OF_CONVERSION; reporting_timezone PINTEREST_TIME_ZONE (UTC, default) or AD_ACCOUNT_TIME_ZONE. Common columns: SPEND_IN_DOLLAR (account currency, despite the name), PAID_IMPRESSION, IMPRESSION_1, CLICKTHROUGH_1 (Pin clicks), OUTBOUND_CLICK_1, CTR, OUTBOUND_CTR_1, CPC_IN_MICRO_DOLLAR, CPM_IN_DOLLAR, TOTAL_ENGAGEMENT, TOTAL_CONVERSIONS, TOTAL_CHECKOUT, TOTAL_CHECKOUT_VALUE_IN_MICRO_DOLLAR, CHECKOUT_ROAS, TOTAL_ADD_TO_CART, TOTAL_LEAD, TOTAL_SIGNUP, CAMPAIGN_NAME, CAMPAIGN_ID. _1 metrics are paid, _2 earned (saves of ads). pinterest_ads_list_metrics lists every column with its definition. HOUR granularity no longer includes conversion metrics. |
| pinterest_ads_list_metricsA | Definitions of the metrics (columns) reports can return, with Ads Manager names. search filters by name or definition, e.g. 'checkout'. report_type: SYNC or ASYNC. |
| pinterest_ads_get_metrics_ready_stateB | Whether conversion and other metrics for a date (YYYY-MM-DD) are final yet. |
| pinterest_ads_get_audience_insightsB | Interests and demographics of the account's audience over the last 30 days. audience_insight_type: YOUR_ENGAGED_AUDIENCE (default), YOUR_TOTAL_AUDIENCE or PINTEREST_TOTAL_AUDIENCE. Aggregated data only; don't use it for competitor or platform benchmarking. |
| pinterest_ads_create_reportA | Request an ads report. Pinterest builds it in the background: poll pinterest_ads_get_report with the returned token, then call pinterest_ads_download_report (or use pinterest_ads_run_report to do all three). Changes nothing in the account. level: ADVERTISER, CAMPAIGN, AD_GROUP, PIN_PROMOTION (ads), KEYWORD, PRODUCT_GROUP, PRODUCT_ITEM, or a *_TARGETING level with targeting_types (up to 5, e.g. ['LOCATION']). Dates are YYYY-MM-DD; granularity TOTAL, DAY, WEEK, MONTH or HOUR. filters adds other request fields, e.g. {"campaign_ids": ["..."], "campaign_statuses": ["RUNNING"]} (campaign_objective_types should include SALES and LEADS, not only the retiring CATALOG_SALES and WEB_CONVERSION). report_format JSON (default) or CSV. To re-run a report saved in Ads Manager, pass template_id (see pinterest_ads_list_report_templates) with dates and granularity only. Common columns: SPEND_IN_DOLLAR (account currency, despite the name), PAID_IMPRESSION, IMPRESSION_1, CLICKTHROUGH_1 (Pin clicks), OUTBOUND_CLICK_1, CTR, OUTBOUND_CTR_1, CPC_IN_MICRO_DOLLAR, CPM_IN_DOLLAR, TOTAL_ENGAGEMENT, TOTAL_CONVERSIONS, TOTAL_CHECKOUT, TOTAL_CHECKOUT_VALUE_IN_MICRO_DOLLAR, CHECKOUT_ROAS, TOTAL_ADD_TO_CART, TOTAL_LEAD, TOTAL_SIGNUP, CAMPAIGN_NAME, CAMPAIGN_ID. _1 metrics are paid, _2 earned (saves of ads). pinterest_ads_list_metrics lists every column with its definition. HOUR granularity no longer includes conversion metrics. |
| pinterest_ads_get_reportA | Check a report's status: IN_PROGRESS, FINISHED, FAILED, CANCELLED or EXPIRED. When FINISHED, call pinterest_ads_download_report with the same token. |
| pinterest_ads_download_reportA | Download a FINISHED report and return its rows (up to max_rows), held in memory only. row_count is the full count; truncated says whether rows were cut to max_rows. report_format must match the one the report was requested in. |
| pinterest_ads_run_reportA | Request a report, wait for it with progress updates, and return its rows. Same arguments as pinterest_ads_create_report, plus max_rows (default 1000), timeout_seconds (default 600) and poll_seconds (default 10). If it times out the token is returned so you can check later with pinterest_ads_get_report. Changes nothing in the account. level: ADVERTISER, CAMPAIGN, AD_GROUP, PIN_PROMOTION (ads), KEYWORD, PRODUCT_GROUP, PRODUCT_ITEM, or a *_TARGETING level with targeting_types (up to 5, e.g. ['LOCATION']). Dates are YYYY-MM-DD; granularity TOTAL, DAY, WEEK, MONTH or HOUR. filters adds other request fields, e.g. {"campaign_ids": ["..."], "campaign_statuses": ["RUNNING"]} (campaign_objective_types should include SALES and LEADS, not only the retiring CATALOG_SALES and WEB_CONVERSION). report_format JSON (default) or CSV. To re-run a report saved in Ads Manager, pass template_id (see pinterest_ads_list_report_templates) with dates and granularity only. Common columns: SPEND_IN_DOLLAR (account currency, despite the name), PAID_IMPRESSION, IMPRESSION_1, CLICKTHROUGH_1 (Pin clicks), OUTBOUND_CLICK_1, CTR, OUTBOUND_CTR_1, CPC_IN_MICRO_DOLLAR, CPM_IN_DOLLAR, TOTAL_ENGAGEMENT, TOTAL_CONVERSIONS, TOTAL_CHECKOUT, TOTAL_CHECKOUT_VALUE_IN_MICRO_DOLLAR, CHECKOUT_ROAS, TOTAL_ADD_TO_CART, TOTAL_LEAD, TOTAL_SIGNUP, CAMPAIGN_NAME, CAMPAIGN_ID. _1 metrics are paid, _2 earned (saves of ads). pinterest_ads_list_metrics lists every column with its definition. HOUR granularity no longer includes conversion metrics. |
| pinterest_ads_list_report_templatesB | List custom report templates saved in Ads Manager, to re-run them by template_id. |
| pinterest_ads_set_statusesA | Pause or activate many campaigns, ad groups or ads at once, with progress. entity: 'campaigns', 'ad_groups' or 'ads'. status: 'PAUSED' or 'ACTIVE' (to archive, use the matching archive tool). ACTIVE starts spending as soon as the parents are active too. More than PINTEREST_ADS_BULK_THRESHOLD items need confirm='APPLY'. Current statuses are kept in the audit log. |
| pinterest_ads_adjust_ad_group_bidsA | Change many ad group bids at once, with progress. Pass change_pct (e.g. -10 lowers each bid by 10%) or set_bid (one value for all, in the account currency, e.g. 0.85). New bids stay between min_bid and max_bid (currency units). Ad groups on automatic bidding have no bid and are skipped. Current bids are read first; the result lists old and new values. Needs confirm='APPLY' for more than PINTEREST_ADS_BULK_THRESHOLD ad groups or any rise above PINTEREST_ADS_MAX_INCREASE_PCT. Run in dry-run first and show the user the table. |
| pinterest_ads_adjust_budgetsA | Change many campaign or ad group budgets at once, with progress. entity: 'campaigns' (budget 'daily' -> daily_spend_cap, 'lifetime' -> lifetime_spend_cap) or 'ad_groups' (budget_in_micro_currency). Pass change_pct (e.g. 15 raises by 15%) or set_budget in the account currency (e.g. 40). Pinterest rejects daily rises smaller than 1.00 USD (or local equivalent). Needs confirm='APPLY' for more than PINTEREST_ADS_BULK_THRESHOLD items, any rise above PINTEREST_ADS_MAX_INCREASE_PCT, or a value over PINTEREST_ADS_MAX_BUDGET. |
| pinterest_ads_bulk_upsertA | Create and/or update many ad entities in one asynchronous Pinterest bulk job. create / update: objects with lists under campaigns, ad_groups, ads, product_groups (product group promotions: {"ad_group_id", "product_group_promotion"}), keywords ({"parent_id", "keywords"}), catalog_product_groups, labels or schedules. Each entry uses the same fields as the matching create or update tool (updates need id). Campaign create entries without a status are sent PAUSED. Pinterest applies the job in the background and this server can't check every change, so it always needs confirm='APPLY' (confirm='ARCHIVE' if anything is set to ARCHIVED). Returns a request_id to follow with pinterest_ads_get_bulk_request. |
| pinterest_ads_get_bulk_requestB | Status of a bulk upsert or bulk export: RUNNING, SUCCEEDED or FAILED. With download=true and status SUCCEEDED, fetches the result file and returns its rows (up to max_rows), held in memory only. |
| pinterest_ads_bulk_exportA | Export ad entities in bulk (one background job), wait with progress, return rows. entity_types: up to 6 of CAMPAIGN, AD_GROUP, PRODUCT_GROUP, AD, KEYWORD, LABEL, SCHEDULE. Pinterest exports active entities only. campaign_filter e.g. {"campaign_status": ["RUNNING"], "objective_type": ["SALES"]}. updated_since is a timestamp string to export only recent changes. Changes nothing in the account. |
| pinterest_ads_read_requestA | Read from any Pinterest API v5 endpoint the other tools don't cover. Only GET, and POSTs that just read (report and export requests, audience sizing, bid floors, delivery estimates, catalog item lookups), are allowed; use pinterest_ads_request for writes. path is relative to the v5 base, e.g. '/ad_accounts/123/ads/targeting_analytics'. List values in query are sent as repeated parameters; join them with commas yourself where the API wants that. |
| pinterest_ads_requestA | Call any Pinterest API v5 endpoint the other tools don't cover (e.g. lead forms, ad previews, labels, schedules, conversion events, asynchronous customer list uploads). path is relative to the v5 base and starts with '/', e.g. '/ad_accounts/123/labels'. GET and read-only POSTs are reads. Every other call is a write: it is audited, follows dry-run, and needs confirm='APPLY' because this tool can't check what it changes. OAuth endpoints are blocked. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 81 tools
The bulk of the surface is cleanly partitioned by resource (campaigns, ad_groups, ads, keywords, audiences, catalogs, product_groups) with matching list/create/update/archive verbs, so misselection is unlikely. The main overlaps are the metrics path (get_analytics vs. the create/get/download/run_report family) and run_report as a wrapper around create_report, which the descriptions do address but still leave two ways to accomplish the same read.
Nearly all tools follow a consistent pinterest_ads_ verb_noun pattern (list_, get_, create_, update_, archive_, delete_, set_, adjust_, estimate_, suggest_). Minor deviations exist in pinterest_ads_request / pinterest_ads_read_request (no verb_noun) and the bulk/batch utilities (bulk_upsert, bulk_export, batch_catalog_items), but overall it is predictable.
81 tools is far past the point where an agent can scan the set comfortably, and several tools are thin wrappers or conveniences (run_report vs create_report, read_request vs request). The domain is genuinely broad, but the surface is heavy enough that batching/consolidation would materially help.
CRUD/lifecycle coverage is strong across campaigns, ad groups, ads, keywords, audiences, customer lists, catalogs and product groups, plus reporting and escape-hatch raw endpoints. Minor gaps remain, e.g. targeting templates are list-only and conversion tags are read-only, but these are workable via the generic request tools.