Skip to main content
Glama
@kadam-net/mcp-server

@kadam-net/mcp-server

Official

@kadam-net/mcp-server

npm version npm downloads license node MCP Registry

MCP server for Kadam ad network — manage campaigns, creatives, audiences, sites, and analytics via AI agents.

Built on the Model Context Protocol (MCP), the open standard for connecting LLMs to external tools and data.

Install (one click)

Cursor

Or add manually to .cursor/mcp.json:

{
  "mcpServers": {
    "kadam": {
      "command": "npx",
      "args": ["-y", "@kadam-net/mcp-server"],
      "env": {
        "KADAM_ADV_API_KEY": "your-advertiser-api-key",
        "KADAM_PUB_API_KEY": "your-publisher-api-key"
      }
    }
  }
}

Claude Code

claude mcp add kadam -- npx -y @kadam-net/mcp-server

Then set the env var: export KADAM_ADV_API_KEY=your-key

Claude Desktop

Download → double-click → Install. Or add manually to claude_desktop_config.json (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "kadam": {
      "command": "npx",
      "args": ["-y", "@kadam-net/mcp-server"],
      "env": {
        "KADAM_ADV_API_KEY": "your-advertiser-api-key",
        "KADAM_PUB_API_KEY": "your-publisher-api-key"
      }
    }
  }
}

Any MCP client (universal one-liner)

npx add-mcp @kadam-net/mcp-server

Docker

docker run -i --rm \
  -e KADAM_ADV_API_KEY=your-key \
  kadam/mcp-server:latest

npm global

npm install -g @kadam-net/mcp-server
KADAM_ADV_API_KEY=your-key kadam-mcp-server

Related MCP server: Meta Ads MCP Server

Configuration

Variable

Required

Description

KADAM_ADV_API_KEY

One of two

Advertiser API key from partners.kadam.net -> Profile -> API

KADAM_PUB_API_KEY

One of two

Publisher API key from pub.kadam.net -> Profile -> API

KADAM_ADV_API_BASE

No

Advertiser API URL (default: https://partners.kadam.net/api/v1)

KADAM_PUB_API_BASE

No

Publisher API URL (default: https://pub.kadam.net/api)

LOG_LEVEL

No

Log level: trace, debug, info, warn, error, fatal (default: info)

At least one API key must be provided in stdio mode. In HTTP mode, tokens are passed per-request via Bearer authentication.

Role-based catalog

The tool catalog matches the role of the bearer. Once per session (and once per process in stdio mode) the server calls GET /api/v1/access on the advertiser API, which answers { impersonation: bool }:

Bearer

impersonation

Catalog

Advertiser API key, or a cabinet JWT with sub only

false

75 tools; create_campaign / update_campaign have no manager-only fields

Cabinet JWT with act.sub (a Kadam manager acting for the client)

true

80 tools (adds the five marked "manager-only" below); campaign writes accept hasCorrectPostback, isDirectTrafficPriority, allowMultiAds

Publisher API key

n/a

17 publisher tools; the publisher API has no impersonation

This is a catalog hint, not a gate: the Kadam API enforces the same rule on every call (403 / 422 for a client token). If /access cannot be reached, the session gets the client catalog — the smaller one is always safe to show.

HTTP Transport (multi-tenant deployment)

For server-side deployment serving multiple users:

Variable

Required

Description

MCP_TRANSPORT

No

"stdio" (default) or "http"

MCP_HTTP_PORT

No

HTTP port (default: 8080)

MCP_HTTP_HOST

No

Bind address (default: 0.0.0.0)

KADAM_ADV_DOMAIN

No

Advertiser domain for PRM (default: https://partners.kadam.net)

KADAM_PUB_DOMAIN

No

Publisher domain for PRM (default: https://pub.kadam.net)

docker run -d --name kadam-mcp \
  -e MCP_TRANSPORT=http \
  -p 8080:8080 \
  kadam/mcp-server:latest

Connecting via HTTP (Cursor / Claude)

{
  "mcpServers": {
    "kadam-adv": {
      "url": "https://partners.kadam.net/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_ADV_API_KEY"
      }
    }
  }
}

Connecting via OAuth (ChatGPT)

Add https://partners.kadam.net/mcp (advertiser) or https://pub.kadam.net/mcp (publisher) as Server URL in ChatGPT settings. OAuth discovery, registration, and login happen automatically.

Tools (80)

Advertiser Tools (63)

Requires KADAM_ADV_API_KEY.

Dictionaries

Tool

Description

Annotations

kadam_adv_get_dictionary

Reference dictionary: campaign types, browsers, platforms, devices, connections, categories, isps, conversion templates, countries, regions, cities

readOnly

Campaigns

Tool

Description

Annotations

kadam_adv_list_campaigns

List campaigns with filters (folder, status, type, date, search) and pagination

readOnly

kadam_adv_get_campaign

Get full campaign configuration by ID: landing page URL, bids per country, budgets, targeting, frequency caps, schedule, conversion settings

readOnly

kadam_adv_create_campaign

Create campaign with full targeting (countries, devices, OS, browsers, age, gender, audiences); dryRun: true validates only

—

kadam_adv_update_campaign

Update any campaign fields by ID

—

kadam_adv_set_campaign_status

Bulk status change (active/paused/archived/restored) for comma-separated IDs; reports per-ID result

idempotent

kadam_adv_delete_campaigns

Bulk delete of archived campaigns by comma-separated IDs; requires confirm: true, reports per-ID result

destructive

kadam_adv_move_campaigns

Move campaigns to a campaign group by comma-separated campaign IDs and target group ID

idempotent

kadam_adv_copy_campaign

Copy a campaign into a campaign group: settings and bids are cloned, the copy starts paused and re-enters moderation. Optional pricing-model switch, push <-> in-page push cross-format copy, autorules and per-site bids

—

kadam_adv_bulk_replace_urls

Find and replace a landing-URL fragment across campaigns and their creatives. Manager-only (impersonation sessions); supports dryRun

destructive

kadam_adv_set_campaign_rss

Point a native campaign at an RSS feed to import creatives, or stop the import with an empty link

idempotent

kadam_adv_set_easy_start

Turn Easy Start (curated site set) on or off for a campaign. Manager-only (impersonation sessions)

idempotent

kadam_adv_get_blocked_traffic_sources

Traffic sources rejecting a campaign, split into category blocks and moderation-tag blocks. Manager-only (impersonation sessions)

readOnly

kadam_adv_get_traffic_forecast

Bid-to-traffic curve for a targeting set from yesterday's auction. An empty curve means the forecast could not be built, not that traffic is zero

readOnly

Bid Management

Tool

Description

Annotations

kadam_adv_update_campaign_bid

Update bid for a single campaign (lightweight, no full payload). Falls back to current countries if omitted

idempotent

kadam_adv_bulk_update_bids

Update bids for multiple campaigns at once (all must share the same pricing model)

idempotent

kadam_adv_block_sites

Stop or resume buying sites (zones) in campaigns

—

kadam_adv_update_site_bids

Set per-site (zone) bids: static (0.05), multiplier (x1.5), or remove (0)

idempotent

Campaign Folders

Tool

Description

Annotations

kadam_adv_list_campaign_folders

List folders with campaign counts and budgets

readOnly

kadam_adv_get_campaign_folder

Get a single folder: name, archived state, budgets

readOnly

kadam_adv_create_campaign_folder

Create a new folder (name 1-50 chars)

—

kadam_adv_update_campaign_folder

Partial update: rename and/or change budgets and distribution

—

kadam_adv_set_campaign_folder_status

Bulk action for comma-separated IDs: activate/pause campaigns, archive or restore folders with their campaigns; returns per-folder result

idempotent

Creatives

Tool

Description

Annotations

kadam_adv_list_creatives

List creatives by campaign, status, or search query

readOnly

kadam_adv_create_creative

Create creative for a campaign: image, HTML5 archive, iframe, HTML tag, video file or VAST tag (goes through moderation)

—

kadam_adv_update_creative

Update creative fields

—

kadam_adv_set_creative_status

Bulk status change for creatives: active/paused/archived/restored; returns per-creative result

idempotent

kadam_adv_get_creative_test_conversion

Signed links to test a creative's conversion tracking (test click + frame preview)

—

kadam_adv_upload_bulk_images

Stage images for a bulk creative batch (async, returns a job)

—

kadam_adv_create_bulk_creatives

Turn staged images into creatives in several campaigns at once (async, returns a job)

—

kadam_adv_get_bulk_job

State of a bulk batch: staged images, refusals, per-row outcome

—

kadam_adv_copy_creatives

Copy creatives into other campaigns (creatives × targets copies), originals untouched

—

kadam_adv_move_creatives

Move creatives to another campaign of the same format and pricing model; they lose per-geo bids and return to moderation

—

kadam_adv_get_creative_blocked_sources

Traffic sources that reject one creative, split by category and moderation tag. Manager-only (impersonation sessions)

—

kadam_adv_set_creative_bids

Replace the creatives' own per-country bids; countries left out fall back to the campaign bid

—

kadam_adv_delete_creatives

Bulk delete of archived creatives by comma-separated IDs; requires confirm: true, reports per-ID result

destructive

Audiences

Tool

Description

Annotations

kadam_adv_list_audiences

List audiences with search and sorting

readOnly

kadam_adv_get_audience

Get detailed audience info by ID

readOnly

kadam_adv_create_audience

Create audience (pixel, code, fingerprint, or S2S)

—

kadam_adv_update_audience

Update audience settings

—

kadam_adv_get_filtered_audience_sources

Audiences usable as sources of a filtered audience. Manager-only (impersonation sessions)

—

kadam_adv_get_audience_params

Hardcoded parameters a pixel/S2S audience substitutes into its code

—

kadam_adv_set_audience_params

Replace the hardcoded parameters of a pixel/S2S audience

—

kadam_adv_delete_audience

Delete audience permanently (requires confirm: true)

destructive

Finance & Statistics

Tool

Description

Annotations

kadam_adv_list_finance_operations

Transaction history (deposits, charges, refunds)

readOnly

kadam_adv_get_stats

Unified statistics — 3 report types via reportType param: custom (report builder with dimension/metric mapping), sites (per-site breakdown), postbacks (conversion logs)

readOnly

Publisher Tools (17)

Requires KADAM_PUB_API_KEY.

Sites (Sources)

Tool

Description

Annotations

kadam_pub_list_sources

List publisher sites with stats

readOnly

kadam_pub_create_source

Add a new site (starts verification flow)

—

kadam_pub_get_source

Get detailed site info

readOnly

kadam_pub_update_source

Update site name

—

kadam_pub_set_source_status

Change site status (active/paused/archived/unarchived)

idempotent

Ad Units

Tool

Description

Annotations

kadam_pub_list_ad_units

List ad units for a site, filter by format (native/banner/push/popunder/inpagepush)

readOnly

kadam_pub_set_ad_unit_status

Change ad unit status (active/paused/archived/restored)

idempotent

User & Statistics

Tool

Description

Annotations

kadam_pub_get_user_info

Get publisher account info and balance

readOnly

kadam_pub_get_stats

Publisher statistics with human-readable dimension/metric mapping

readOnly

Kadam Smart Mediation

Selling an ad unit's traffic through outside ad networks alongside Kadam demand. The API, the code and the report dimensions call it plain mediation. Read kadam://reference/mediation first; split the income in kadam_pub_get_stats with groupBy=network and the kadam_revenue / mediation_revenue metrics.

Tool

Description

Annotations

kadam_pub_list_mediation_networks

Catalog of networks, which have an account, and what an ad unit already runs

readOnly

kadam_pub_connect_mediation_network

Attach a network to an ad unit (resolves account and placement itself)

—

kadam_pub_update_mediation_network

Change geo, unique cap, proxy policy, tag template, placement or account

—

kadam_pub_set_mediation_network_status

active / paused for a connection

idempotent

kadam_pub_retest_mediation_network

Restart the forced test share (1-50%); starts a new measurement epoch

—

kadam_pub_disconnect_mediation_network

Remove a connection (requires confirm)

destructive

kadam_pub_update_mediation_network_account

Rotate the network API key, rename or disable the account

—

kadam_pub_delete_mediation_network_account

Remove a network account (requires confirm)

destructive

Resources (9)

Static reference data the agent can read before calling tools:

URI

Description

kadam://reference/campaign-types

All ad format types with IDs, features, pricing, and creative specs

kadam://reference/pricing-models

CPC, CPM, CPV, CPA Target with IDs and descriptions

kadam://reference/creative-formats

Creative requirements per campaign type

kadam://reference/ad-unit-types

Publisher ad unit formats with IDs

kadam://reference/site-states

Publisher site lifecycle states

kadam://reference/mediation

Outside ad networks: accounts, placements, connections, test share, income split

kadam://reference/report-dimensions

Available dimensions and metrics for statistics tools

kadam://reference/api-overview

General Kadam API capabilities overview

Prompts (4)

Pre-built workflow templates that guide the agent through multi-step operations:

Prompt

Description

Arguments

kadam_launch_campaign

Step-by-step campaign creation (check types -> create folder -> create campaign -> add creatives)

type, name, url, budget

kadam_campaign_performance

Campaign performance analysis with optimization recommendations

campaignId, period

kadam_optimize_sites

Analyze site performance and suggest blacklist/whitelist changes

campaignId, minClicks, maxCPA

kadam_account_overview

Full account overview — campaigns, spend, top performers

—

Architecture

src/
├── index.ts                  # Entry point, server instructions, transport
├── config.ts                 # Zod-validated env config with cache
├── errors.ts                 # AuthError class
├── logger.ts                 # Pino structured logging (stderr)
├── output-formatter.ts       # Text formatting + 50KB truncation
├── middleware/
│   └── tool-wrapper.ts       # Auth, error handling, logging middleware
├── api/
│   ├── http-client.ts        # Generic HTTP client with retry/429/timeout
│   ├── partners-client.ts    # Advertiser API (lazy singleton)
│   └── pub-client.ts         # Publisher API (lazy singleton)
├── utils/
│   ├── pagination.ts         # Shared pagination extraction
│   ├── cache-once.ts         # Generic async cache-once utility
│   └── dimension-mapper.ts   # Stats dimension name→ID resolution
├── types/
│   ├── common.ts             # Shared types (ApiListResponse, ReportConfig)
│   ├── advertiser.ts         # Campaign, Creative, Audience types + maps
│   ├── publisher.ts          # Source, AdUnit, PubUser types + maps
│   └── tool-module.ts        # ToolModule interface
├── tools/
│   ├── advertiser/           # 63 tools across 14 modules
│   └── publisher/            # 17 tools across 6 modules
├── resources/                # 9 reference resources
└── prompts/                  # 4 workflow prompts

Key Design Decisions

  • ToolWrapper middleware — centralized auth validation, error formatting, and logging for all 80 tools

  • Lazy singleton API clients — one HttpClient instance per product, created on first use

  • Output truncation — hard 50KB limit per response with maxResults (default 25, max 100) to prevent LLM context overflow

  • Human-readable output — formatted tables, aligned entities, pagination metadata instead of raw JSON

  • Tool annotations — readOnlyHint, destructiveHint, idempotentHint to guide agent behavior

  • Server instructions — usage patterns and constraints sent to the LLM on connection

  • Dimension mapping — stats tools accept human-readable names ("clicks", "spend") and resolve them to API IDs internally

  • Role-shaped catalog — the bearer is forwarded untouched, and its role is read once per session from GET /access (see "Role-based catalog"). Tools declare requires: "impersonation" and ToolWrapper skips them for client sessions; campaigns.ts adds the manager-only campaign fields to its schemas only under impersonation. Nothing is enforced here — the API still answers 403 / 422 to a client token — so the catalog can never be wider than the key's real rights, only narrower when /access is unreachable

Development

Prerequisites

  • Node.js >= 18

  • npm

Setup

git clone https://github.com/kadam-official/mcp-server.git
cd mcp-server
npm install
cp .env.example .env  # Fill in your API keys

Commands

npm run dev             # Watch mode with tsx
npm run build           # Production build with Vite
npm run start           # Run built server
npm run typecheck       # TypeScript check
npm run lint            # ESLint
npm run format          # Prettier
npm test                # Run 82 tests
npm run test:coverage   # Tests with V8 coverage
npm run inspect         # MCP Inspector (visual debugger)

Testing

202 tests across 23 files using Vitest + MCP SDK InMemoryTransport:

  • Unit tests — output formatter, config, HTTP client (mocked fetch)

  • Middleware tests — ToolWrapper auth, error formatting, logging

  • Integration tests — full server with all 72 tools, 8 resources, 4 prompts via in-memory MCP client

  • Tool handler tests — each tool module with mocked API clients

npm test
# Test Files  23 passed (23)
#      Tests  202 passed (202)

MCP Inspector

The MCP Inspector provides a visual interface for testing:

npm run build
npm run inspect

Deployment

Docker

docker build -t kadam-mcp-server .
docker run -i --rm -e KADAM_ADV_API_KEY=... kadam-mcp-server

CI/CD

The .gitlab-ci.yml pipeline includes:

  • lint — ESLint + TypeScript check

  • test — Vitest with coverage

  • build — Vite production build

  • publish — npm publish + Docker push (manual trigger)

License

MIT

Available Tools

58 tools
kadam_adv_block_sitesA
Idempotent

Stop or resume buying traffic from sites (zones) in the given campaigns. Zone IDs come from the sites report (macrosId). Blocking is per campaign: a site blocked in one campaign keeps running in the others, so list every campaign it should be stopped in. Repeating the call changes nothing, and a campaign that does not belong to the account refuses the whole request.

Inputs: zones (required), blocked (required), campaignIds (required).

kadam_adv_bulk_update_bidsA
Idempotent

Set the same bid on multiple campaigns at once. All campaigns in the batch must share one pricing model (mixing CPC/CPA errors out). Countries are required (backend rejects an empty list).

Inputs: bid (required), countries (required), campaignIds (required), pricingModel (required).

kadam_adv_copy_campaignA

Copy a campaign. Targeting, limits and bids are cloned into a new campaign; statistics and spend are not. The copy always starts paused and goes through moderation again, so it does not spend until activated. Creatives are copied too (all of them by default) and are moderated as new ones.

Inputs: id (required), name (required), folderId (required), bid, +7 more.

kadam_adv_copy_creativesA

Copy creatives into other campaigns. Every creative is copied into every target campaign, so 2 creatives and 2 targets produce 4 copies. Target campaigns must have the same ad format as the source, and each landing URL must stay on its target campaign's domain. Originals are untouched; copies start paused and go through moderation.

Inputs: targets (required), creativeIds (required), pauseAfterModeration.

kadam_adv_create_audienceA

Create an audience. Required fields by type: • audience_code (pixel) — name, expireDays; optional createFingerprint. • audience (stat) — name, expireDays, campaignIds, plus >=1 of hasClicks/hasConversions/hasHolds/hasRejects. • s2s — name, expireDays, linkedAudienceIds (pixel/fingerprint IDs). • fingerprint — not created directly; set createFingerprint=true on a pixel/stat audience. Set dryRun=true to check the payload without creating anything — useful while assembling a campaign and its audience together.

Inputs: name (required), type (required), expireDays (required), dryRun, +7 more.

kadam_adv_create_autoruleA

Create an autorule on a CPC campaign (autorules are CPC-only). Campaigns usually carry several rules (a strategy); call once per rule. bidChange rules require slices + bidRate + bidMax and a spend/clicks condition. A client token holds at most 5 rules per campaign and 300 per account — going over either is refused, so delete a rule before adding one. A token issued to Kadam staff for this account is not bound by those two limits.

Inputs: type (required), action (required), period (required), campaignId (required), +8 more.

kadam_adv_create_bulk_creativesA

Second step of a bulk creative batch: turn staged images into creatives. Every item is created in every listed campaign, so the batch size is items × campaigns. Each item needs a stagedId from kadam_adv_upload_bulk_images. Creation is asynchronous — this call queues the work and returns a job; read the per-row result from kadam_adv_get_bulk_job. Sending the same payload again returns the same job instead of creating the creatives twice.

Inputs: items (required), campaignIds (required), pauseAfterModeration.

kadam_adv_create_campaignA

Create a new advertiser campaign. Required: type, name, url, folderId (campaign group ID), pricingModel, bid, dailyBudget. Pass dryRun: true to only check the payload — nothing is created and the same field errors are reported, which is the cheap way to find out whether bids, targeting and limits are acceptable before committing.

Inputs: bid (required), url (required), name (required), type (required), +42 more.

kadam_adv_create_campaign_folderA

Create a new campaign group (called 'campaign group' / 'Группа кампаний' in the Kadam UI; API term: folder).

Inputs: name (required).

kadam_adv_create_creativeA

Create a creative. Accepts image/video as a URL or local file path. Required fields by type:

  • Push / In-Page Push: title, text, url, imageUrl (icon), mainImageUrl

  • Native: title, url, imageUrl (icon), mainImageUrl

  • Banner: url, imageUrl, sizeId

  • Banner as an HTML5 archive: url, html5ArchiveUrl (.zip), sizeId — needs the HTML5 grant

  • Video: title, url, videoUrl (MP4) — uploading a video file is an internal grant; advertisers deliver video as a VAST tag

  • Video as a VAST tag: title, vastTagUrl (https) in a video campaign — needs the VAST grant, nothing is uploaded

  • Popunder: none (campaign URL is the ad) See kadam://reference/creative-formats for sizes and exact dimensions.

Inputs: url (required), campaignId (required), bid, text, +11 more.

kadam_adv_delete_audienceA
Destructive

Permanently delete an audience. Requires confirm=true for safety.

Inputs: id (required), confirm (required).

kadam_adv_delete_autoruleA
Destructive

Permanently delete an autorule. Requires confirm=true.

Inputs: id (required), confirm (required).

kadam_adv_delete_campaignsA
Destructive

Permanently delete campaigns together with their creatives. Requires confirm=true. A campaign must be archived first (use set_campaign_status with status=archived), otherwise the whole call is rejected. Retrying a call that already deleted the campaigns is rejected too, since deleted campaigns are no longer addressable.

Inputs: ids (required), confirm (required).

kadam_adv_delete_creativesA
Destructive

Permanently delete creatives. Requires confirm=true. A creative must be archived first (use set_creative_status with status=archived), otherwise the whole call is rejected. Retrying a call that already deleted the creatives is rejected too, since deleted creatives are no longer addressable.

Inputs: ids (required), confirm (required).

kadam_adv_get_accountA
Read-only

Gets the current advertiser account profile: id, balance, currency, registration date, and timezone offset in hours from UTC (-12 to 12). Does not return email or name.

Inputs: no named parameters.

kadam_adv_get_audienceA
Read-only

Get a single audience by ID. Returns type-specific details: tracking code for pixel/s2s, campaign links for stat, linked audiences for s2s.

Inputs: id (required).

kadam_adv_get_audience_paramsA
Read-only

Hardcoded parameter values a pixel or S2S audience substitutes into its tracking code. Only these two audience kinds have them, and only their owner can read them — an audience shared with the account answers as not found. Slots that were never set come back as null, which means the code keeps the {placeholder} as is.

Inputs: id (required).

kadam_adv_get_balanceA
Read-only

Lightweight current advertiser balance and currency. Use for alerts and balance checks; prefer this over kadam_adv_get_account or finance operations when you only need the balance.

Inputs: no named parameters.

kadam_adv_get_bulk_jobA
Read-only

State of a bulk creative batch, for both steps: staged images and what staging refused for an upload job, the per-row outcome for a creation job. Status done only means the worker finished — individual rows can still have failed, so read the counters before reporting success.

Inputs: jobId (required).

kadam_adv_get_campaignA
Read-only

Get full campaign configuration by ID, including landing page URL, bids per country, budgets, targeting (devices, OS, browsers, languages, sites, SSPs, audiences), frequency caps, schedule, and conversion settings. Use after kadam_adv_list_campaigns to inspect one campaign in detail.

Inputs: id (required).

kadam_adv_get_campaign_autorule_slicesA
Read-only

Slices the campaign's bid autorules act on, one entry per rule. Use it to tell apart a bid you set by hand from one an autorule keeps rewriting.

Inputs: campaignId (required).

kadam_adv_get_campaign_bid_restrictionsA
Read-only

Bid limits of a campaign: the cap a fixed bid must stay under, the largest allowed multiplier, and the campaign bid the multiplier applies to (null when the geo bids differ). Read it before writing bids to know what will pass.

Inputs: campaignId (required).

kadam_adv_get_campaign_folderA
Read-only

Get a single campaign group by ID: name, archived state, budgets and distribution (campaign group = the UI term for a folder).

Inputs: id (required).

kadam_adv_get_creative_test_conversionA
Read-only

Links for checking that a creative's conversion tracking works. The go link makes a real test click when opened — it writes a click id, resolves the macros and redirects to the landing exactly as a served ad does, so the advertiser's postback can be verified end to end. This tool only hands the links over; nothing is registered until someone opens one. HTML-tag creatives have no single landing link and come back without a go link; the formats rendered in a frame also carry a preview link.

Inputs: creativeId (required).

kadam_adv_get_day_money_limitA
Read-only

Gets the daily spending limit of the WHOLE ACCOUNT, not of a single campaign (for a campaign budget use kadam_adv_get_campaign). A limit of 0 means no cap. When the reported minimum is null the account currency does not support changing the limit.

Inputs: no named parameters.

kadam_adv_get_dictionaryA
Read-only

Gets one reference dictionary used to build campaign targeting: campaign-types, browsers, platforms (OS), devices, connection-types, categories, isps, conversion-templates, countries, regions or cities. Call this instead of guessing IDs — every targeting field expects the numeric ids returned here. campaign-types only lists the types this account may actually create. categories requires campaignType because the allowed set differs per type. isps, regions and cities require countryId, and are paginated and searchable because a single country can hold tens of thousands of entries. countries is the entry point of the geo chain: its ids are what a campaign stores in countries and what countryId expects here, while regions and cities give the ids a campaign stores in cities. cities can be narrowed to one region with regionId. platforms, devices and categories are trees: children are nested under their parent. conversion-templates entries carry the approved/hold/reject postback status strings, which are what a campaign's conversion field needs.

Inputs: type (required), page, search, perPage, +3 more.

kadam_adv_get_extended_statsA
Read-only

Bid Optimization: per-slice stats grid for drilling down and setting bids (requires Bid Optimization access on the account). Drill by appending a sliceId to pathIds; reuse each row's pathIds to set bids via kadam_adv_update_extended_bids. Use ONE campaign to see per-row bids.

Inputs: campaignIds (required), page, dateTo, period, +7 more.

kadam_adv_get_statsB
Read-only

Advertiser statistics. reportType: 'custom' (default, report builder), 'sites' (per-site), or 'conversions' (event log). For custom reports use names like 'spend,clicks,ctr' (metrics) and 'day,campaign,country' (groupBy).

Inputs: page, view, dateTo, period, +15 more.

kadam_adv_get_traffic_forecastA
Read-only

Forecast how much traffic a bid can buy for a targeting set, based on yesterday's auction. Use it before creating a campaign or raising a bid. Targeting with too little traffic yesterday comes back with an empty curve — that means the forecast could not be built, not that the traffic is zero.

Inputs: pricingModel (required), os, type, devices, +3 more.

kadam_adv_list_audiencesA
Read-only

List advertiser audiences with pagination. Filter by search query, sort by field and order.

Inputs: page, perPage, sortField, sortOrder, +1 more.

kadam_adv_list_autorulesA
Read-only

List autorules (campaign automation). Omit campaignId for all rules of active campaigns, or pass it for one campaign. Returns full rule definitions.

Inputs: campaignId.

kadam_adv_list_campaign_foldersA
Read-only

List advertiser campaign groups with pagination. Optional search by name. A campaign group (called 'campaign group' / 'Группа кампаний' in the Kadam UI) is the same entity the API/tool calls a folder.

Inputs: page, perPage, searchQuery.

kadam_adv_list_campaignsA
Read-only

List advertiser campaigns with pagination. Filter by campaign group (folderId), status, type, date range, or search query.

Inputs: page, type, dateTo, status, +6 more.

kadam_adv_list_creativesB
Read-only

List advertiser creatives with pagination. Filter by campaign, status, or search query.

Inputs: page, status, perPage, campaignId, +1 more.

kadam_adv_list_extended_bidsA
Read-only

List the per-slice bid overrides currently set on campaign(s) (Bid Optimization). Paginated.

Inputs: campaignIds (required), page, perPage.

kadam_adv_list_finance_operationsA
Read-only

Lists financial operations (deposits, charges, refunds). Use to check account balance, recent transactions, and spending history.

Inputs: page, dateTo, perPage, dateFrom, +1 more.

kadam_adv_list_payment_systemsA
Read-only

Lists the payment systems the account may deposit through, with per-currency deposit conditions: commission, minimum and maximum amount, and the exchange rate to the account currency. Use before advising on a deposit. Systems reserved for administrators are not returned.

Inputs: no named parameters.

kadam_adv_move_campaignsA
Idempotent

Move one or more campaigns to a campaign group. Pass comma-separated campaign IDs and the target campaign group ID. Validation errors reject the whole request; a successful response means every requested campaign was moved.

Inputs: ids (required), folderId (required).

kadam_adv_move_creativesA

Move creatives to another campaign of the same ad format and the same pricing model. This is not a silent reparenting: the moved creatives lose their creative-level geo bids, are paused and go back to moderation. If any creative or the target campaign fails the checks, nothing moves. To keep the originals in place, copy instead.

Inputs: url (required), campaignId (required), creativeIds (required).

kadam_adv_reset_extended_bidsA
Destructive

Drop every per-slice bid of the listed campaigns at once, returning them to the campaign-level bid. Blacklisted slices (action=off) are dropped too, so those slices start being bought again. Requires confirm=true: the dropped bids are not recoverable. To remove a single slice use kadam_adv_update_extended_bids with action=remove.

Inputs: confirm (required), campaignIds (required).

kadam_adv_set_audience_paramsA

Set the hardcoded parameters of a pixel or S2S audience. This replaces the whole set: a slot you do not send is cleared, so send every value you want to keep. Read the current ones with kadam_adv_get_audience_params first. Values that look like a {placeholder} are refused — they would stand in for the template's own placeholders.

Inputs: id (required), event, paramInt, paramStr, +2 more.

kadam_adv_set_autorule_statusB
Idempotent

Enable or disable an autorule without deleting it.

Inputs: id (required), isActive (required).

kadam_adv_set_campaign_folder_statusA
Idempotent

Bulk action on campaign groups (comma-separated IDs): activate/pause all campaigns in the groups, archive the groups together with their campaigns, or restore archived groups and their campaigns (campaign group = the UI term for a folder). archive and restore are each other's inverse: restore accepts ONLY archived group IDs and rejects the whole call if a live ID is passed.

Inputs: ids (required), action (required).

kadam_adv_set_campaign_rssA
Idempotent

Point a native campaign at an RSS feed so creatives are imported from it, or stop the import by sending an empty link. Native campaigns only — other formats are rejected. The import runs on a schedule, so a success here means the feed was saved, not that creatives exist yet.

Inputs: link (required), campaignId (required), keepRemovedCreatives, pauseAfterModeration.

kadam_adv_set_campaign_statusA
Idempotent

Set status for multiple campaigns. Pass comma-separated IDs and status: active, paused, archived, or restored (take out of the archive). The API answers per campaign, so some IDs can be refused while others succeed.

Inputs: ids (required), status (required).

kadam_adv_set_creative_bidsA

Set per-country bids on creatives. The list replaces the creatives' own bids entirely, so a country left out of it falls back to the campaign bid — send every country you want priced, not just the one you are changing. All creatives must belong to one campaign, every country must be targeted by that campaign, and a country may appear only once across the whole list. CPA campaigns are rejected: their bid is system-managed.

Inputs: bids (required), creativeIds (required).

kadam_adv_set_creative_statusA
Idempotent

Set status for multiple creatives. Pass comma-separated IDs and status: active, paused, archived, or restored (take out of the archive). The API answers per creative, so some IDs can be refused while others succeed. restored is rejected for the whole call if the creative's campaign is itself archived — restore the campaign first.

Inputs: ids (required), status (required).

kadam_adv_set_day_money_limitA
Idempotent

Sets the daily spending limit of the WHOLE ACCOUNT, not of a single campaign (for a campaign budget use kadam_adv_update_campaign). Pass 0 to remove the limit, otherwise the amount must be at least the minimum reported by kadam_adv_get_day_money_limit. Only accounts in the supported currency may change it. Raising or removing the limit resumes campaigns that it had stopped.

Inputs: limit (required).

kadam_adv_toggle_autorule_slice_blockA

Exclude a slice from the campaign's bid autorules, or let them back in. This does not stop buying the slice — that is action=off in kadam_adv_update_extended_bids; it only keeps the autorules from rewriting the bid you set by hand. The call toggles, and the answer says which state the slice ended in, so read kadam_adv_get_campaign_autorule_slices first if you need a specific state.

Inputs: pathIds (required), campaignId (required).

kadam_adv_update_audienceA

Update an existing audience (read-modify-write). Fetches current state, merges your changes, sends full payload. Type cannot be changed. Pass only the fields you want to change.

Inputs: id (required), name, hasHolds, hasClicks, +5 more.

kadam_adv_update_autoruleA

Update an autorule (read-modify-write). Pass only the fields to change; full payload is rebuilt from current state.

Inputs: id (required), type, action, bidMax, +8 more.

kadam_adv_update_campaignA

Update a campaign (read-modify-write): pass only the fields to change, same names as create. Handles all targeting/budget/bid/schedule/conversion edits. For status changes use set_campaign_status.

Inputs: id (required), os, bid, url, +42 more.

kadam_adv_update_campaign_bidA
Idempotent

Change ONLY the bid for countries the campaign ALREADY targets (does NOT change geo). To add or change countries use kadam_adv_update_campaign. Unknown countries error out; omit countries to re-bid all current ones.

Inputs: id (required), bid (required), countries.

kadam_adv_update_campaign_folderB

Partially update a campaign group: rename and/or change budgets and distribution. Only the provided fields are changed (campaign group = the UI term for a folder).

Inputs: id (required), name, dailyBudget, totalBudget, +2 more.

kadam_adv_update_creativeA

Update an existing creative (read-modify-write). Fetches current state, merges your changes, sends full payload. Pass only the fields you want to change. For image changes, create a new creative instead.

Inputs: creativeId (required), bid, url, text, +5 more.

kadam_adv_update_extended_bidsA

Set / multiply / blacklist / remove per-slice bids (Bid Optimization). Bulk: every bid op applies to all listed campaigns. action: set (needs mode+bid), off (blacklist), on (un-blacklist), remove (delete). Get pathIds from kadam_adv_get_extended_stats.

Inputs: bids (required), campaignIds (required).

kadam_adv_update_site_bidsB
Idempotent

Set per-site (zone) bids for campaigns. Bid is a number ('0.05'), a multiplier ('x1.5'), or '0' to remove.

Inputs: bid (required), zones (required), campaignIds (required).

kadam_adv_upload_bulk_imagesA

First step of a bulk creative batch: stage images so they can be turned into creatives. Each image is checked against the formats of the target campaigns, which must be compatible with each other. Staging is asynchronous — this call only queues the work and returns a job; read the stagedId values from kadam_adv_get_bulk_job once it is done. Staged images count against the account's daily creative limit, and a batch that would exceed it is rejected.

Inputs: images (required), campaignIds (required), idempotencyKey.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 58 tools

    Disambiguation4/5

    Tools are mostly differentiated by resource and action, and descriptions explicitly resolve several overlaps (e.g. get_balance vs get_account, update_campaign_bid vs bulk_update_bids). Some clusters around finance, bid optimization, and bulk campaign/creative operations still require careful reading, but boundaries are documented.

    Naming Consistency5/5

    All 58 tools use a consistent kadam_adv_ prefix and snake_case verb_noun naming. Verbs like get, list, create, update, delete, set, move, copy, and reset are used predictably with no mixed conventions.

    Tool Count2/5

    58 tools is far above the typical 3–15 range and makes agent navigation heavy. While many tools map to distinct API operations, the surface could be consolidated across finance, bid optimization, and folder/creative bulk actions.

    Completeness4/5

    Core lifecycle coverage is strong across campaigns, creatives, audiences, autorules, bid optimization, finance, and dictionaries. Minor gaps exist (e.g. account profile updates, deposit creation, some reporting consolidation), but agents can work around them.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server for programmatic management of Meta (Facebook/Instagram) advertising campaigns through AI assistants. It enables campaign creation, ad set management, creative upload, analytics, audience management, and conversion tracking.
      344 npm
      4
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server for managing ad campaigns across Google Ads, Meta, and more. Enables deploying campaigns, checking performance, and managing budgets from terminal or AI assistants.
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      MCP server that enables AI agents (Claude Code) to manage Criteo campaigns, ad sets, creatives, audiences, and reports via natural language.
      -