CtrlK
BlogDocsLog inGet started
Tessl Logo
PluginPublic

kuudoai/kuudo-skills

22 Agent Skills for Amazon sellers and advertisers: Sponsored Products and Brands audits, search-term mining, budget pacing, DSP and Amazon Marketing Cloud, reporting, listing optimization and compliance, product images, repricing, FBA inbound, stockout, refunds, buyer messaging, and profitability. Built for Kuudo's hosted Amazon Ads and Selling Partner MCP servers; price, budget, listing, and shipment writes are previewed and wait for explicit approval.

68

1.65x
Quality

93%

Does it follow best practices?

Impact

66%

1.65x

Average score across 22 eval scenarios

SecuritybySnyk

Medium

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

step2_create_campaign.mdskills/amazon-ads-create-dsp-campaign/references/

Step 2: Create DSP Campaign

Tool: allv1_CreateCampaign

Creates the DSP campaign in PAUSED state. We deliberately do not create in ENABLED — the campaign must exist before conversion tracking and ad groups can attach, and we don't want it to start spending until everything downstream succeeds. Activation happens in Step 7, after a second yes at Gate 2.

PAUSED stops spend, but the create is still a write to the advertiser's account. Call it only after the user's explicit yes to the Gate 1 plan, which shows the advertiser, name, flight dates, budget, goal KPI, inventory types, and ASINs that go into this payload.

Required tool arguments

ArgumentWhereSourceValue
Amazon-Ads-AccountIdheader (top-level tool arg)Step 1dspAdvertiserId from alternateIds[]
campaigns[]body (top-level tool arg)composedSingle campaign object — see below

The hosted MCP shape nests these under body.accessRequestedAccount + body.campaigns. This repo's allv1_CreateCampaign does not — Amazon-Ads-AccountId is a header parameter the OpenAPI spec declares directly, and the body is flattened to campaigns[] at top level.

Campaign object fields

FieldSourceValue
adProductFIXED"AMAZON_DSP"
nameDEFAULTDSP|PB|Campaign yyyy-MM-dd_HH-mm-ss
countriesINPUT["<marketplace>"]
stateFIXED"PAUSED"
flights[0].startDateTimeINPUTISO 8601 with Z suffix (e.g. 2026-10-01T00:00:00Z)
flights[0].endDateTimeINPUTISO 8601 with Z suffix
flights[0].budget.budgetTypeFIXED"MONETARY"
flights[0].budget.budgetValue.monetaryBudgetValue.monetaryBudget.valueINPUTcampaign budget
optimizations.bidSettings.bidStrategyDEFAULT"SPEND_BUDGET_IN_FULL"
optimizations.goalSettings.kpiINPUT/DEFAULTgoal KPI (default ROAS)
optimizations.primaryInventoryTypesINPUTfrom user, e.g. ["DISPLAY"]
fees, frequencies, tags, purchaseOrderNumberOPTIONALinclude only if the user provided them

There is no campaign-level budget field — budget is flight-level only. The skill maps the user's single budget/start/end inputs to a single flight; if the user later wants multiple flights, that's a separate update operation.

Payload

{
  "Amazon-Ads-AccountId": "<dspAdvertiserId>",
  "campaigns": [
    {
      "adProduct": "AMAZON_DSP",
      "name": "<campaign_name>",
      "countries": ["<marketplace>"],
      "state": "PAUSED",
      "flights": [
        {
          "startDateTime": "<campaign_start_date>",
          "endDateTime": "<campaign_end_date>",
          "budget": {
            "budgetType": "MONETARY",
            "budgetValue": {
              "monetaryBudgetValue": {
                "monetaryBudget": {
                  "value": "<campaign_budget>"
                }
              }
            }
          }
        }
      ],
      "optimizations": {
        "bidSettings": {
          "bidStrategy": "<bid_strategy>"
        },
        "goalSettings": {
          "kpi": "<goal_kpi>"
        },
        "primaryInventoryTypes": ["<primaryInventoryTypes>"]
      }
    }
  ]
}

All datetime values must include the Z UTC suffix — the API rejects naive datetimes.

Response → extract

  • campaignId — used in every later step (conversion tracking, ad group create, activation).
  • ineligibleAutomatedTargetingTactics — surfaced here as a first signal, but the authoritative read happens in Step 4 after conversion tracking is configured.

Verification (read-after-write)

After the create call returns, wait 100ms then call:

allv1_QueryCampaign
  Amazon-Ads-AccountId: <dspAdvertiserId>
  body: {
    "adProductFilter": {"include": ["AMAZON_DSP"]},
    "campaignIdFilter": {"include": ["<campaignId>"]}
  }

Retry up to 3 times with 1-second delays if the campaign isn't found. Do not proceed to Step 3 until verification succeeds — Step 3 requires the campaign to exist server-side, and the API's eventual consistency means it may take a moment.

On any failure: stop and report. A failed Step 2 means the workflow has no campaign to attach anything to.

skills

LICENSE.md

README.md

tile.json