@kadam-net/mcp-server
OfficialMCP server for the Kadam ad network that lets AI agents manage advertiser campaigns, creatives, audiences, bids, and analytics — and, with a publisher key, sites, ad units, and mediation.
Campaigns — list/get with filters, create (with
dryRunvalidation), update, copy (including push ↔ in-page push and pricing-model switch), move between groups, bulk status changes, and confirmed deletionCampaign groups (folders) — list, create, rename/update budgets, and bulk activate/pause/archive/restore with their campaigns
Bidding — change a campaign bid per country, bulk-update bids across campaigns, block/resume sites (zones), set per-site bids or multipliers, and forecast traffic for a bid and targeting set
Bid Optimization — drill into per-slice stats, list/set/remove per-slice bids, reset all overrides, inspect bid restrictions and autorule slices
Creatives — create image/HTML5/iframe/video/VAST push-notification, native, banner, and popunder creatives, update, bulk status changes, async bulk image staging and batch creation, copy/move between campaigns, per-country bids, test-conversion links, and deletion
Audiences — create pixel, statistical, or S2S audiences, update, read/set hardcoded tracking parameters, and delete
Autorules — create/update/enable/disable/delete CPC automation rules (area, campaign, creative, bid-change actions)
Finance & account — transaction history, available payment systems and deposit terms, account profile, balance, and the account-wide daily spending limit
Statistics — custom report builder, per-site breakdowns, and conversion logs with human-readable dimension/metric names, plus pagination and sorting
Reference data — dictionaries for campaign types, browsers, platforms, devices, connections, categories, ISPs, conversion templates, countries, regions, and cities
Publisher tools — manage sites (sources), ad units, publisher stats and balance, and Kadam Smart Mediation network connections, accounts, and status
Agent aids — 9 static reference resources, 4 workflow prompts, tool annotations (read-only/destructive/idempotent), and a role-shaped catalog that hides manager-only tools for client tokens
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@kadam-net/mcp-server list my active campaigns"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@kadam-net/mcp-server
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-serverThen 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-serverDocker
docker run -i --rm \
-e KADAM_ADV_API_KEY=your-key \
kadam/mcp-server:latestnpm global
npm install -g @kadam-net/mcp-server
KADAM_ADV_API_KEY=your-key kadam-mcp-serverRelated MCP server: Meta Ads MCP Server
Configuration
Variable | Required | Description |
| One of two | Advertiser API key from partners.kadam.net -> Profile -> API |
| One of two | Publisher API key from pub.kadam.net -> Profile -> API |
| No | Advertiser API URL (default: |
| No | Publisher API URL (default: |
| No | Log level: |
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 |
| Catalog |
Advertiser API key, or a cabinet JWT with |
| 75 tools; |
Cabinet JWT with |
| 80 tools (adds the five marked "manager-only" below); campaign writes accept |
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 |
| No |
|
| No | HTTP port (default: |
| No | Bind address (default: |
| No | Advertiser domain for PRM (default: |
| No | Publisher domain for PRM (default: |
docker run -d --name kadam-mcp \
-e MCP_TRANSPORT=http \
-p 8080:8080 \
kadam/mcp-server:latestConnecting 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 |
| Reference dictionary: campaign types, browsers, platforms, devices, connections, categories, isps, conversion templates, countries, regions, cities | readOnly |
Campaigns
Tool | Description | Annotations |
| List campaigns with filters (folder, status, type, date, search) and pagination | readOnly |
| Get full campaign configuration by ID: landing page URL, bids per country, budgets, targeting, frequency caps, schedule, conversion settings | readOnly |
| Create campaign with full targeting (countries, devices, OS, browsers, age, gender, audiences); | — |
| Update any campaign fields by ID | — |
| Bulk status change (active/paused/archived/restored) for comma-separated IDs; reports per-ID result | idempotent |
| Bulk delete of archived campaigns by comma-separated IDs; requires | destructive |
| Move campaigns to a campaign group by comma-separated campaign IDs and target group ID | idempotent |
| 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 | — |
| Find and replace a landing-URL fragment across campaigns and their creatives. Manager-only (impersonation sessions); supports | destructive |
| Point a native campaign at an RSS feed to import creatives, or stop the import with an empty link | idempotent |
| Turn Easy Start (curated site set) on or off for a campaign. Manager-only (impersonation sessions) | idempotent |
| Traffic sources rejecting a campaign, split into category blocks and moderation-tag blocks. Manager-only (impersonation sessions) | readOnly |
| 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 |
| Update bid for a single campaign (lightweight, no full payload). Falls back to current countries if omitted | idempotent |
| Update bids for multiple campaigns at once (all must share the same pricing model) | idempotent |
| Stop or resume buying sites (zones) in campaigns | — |
| Set per-site (zone) bids: static ( | idempotent |
Campaign Folders
Tool | Description | Annotations |
| List folders with campaign counts and budgets | readOnly |
| Get a single folder: name, archived state, budgets | readOnly |
| Create a new folder (name 1-50 chars) | — |
| Partial update: rename and/or change budgets and distribution | — |
| 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 |
| List creatives by campaign, status, or search query | readOnly |
| Create creative for a campaign: image, HTML5 archive, iframe, HTML tag, video file or VAST tag (goes through moderation) | — |
| Update creative fields | — |
| Bulk status change for creatives: active/paused/archived/restored; returns per-creative result | idempotent |
| Signed links to test a creative's conversion tracking (test click + frame preview) | — |
| Stage images for a bulk creative batch (async, returns a job) | — |
| Turn staged images into creatives in several campaigns at once (async, returns a job) | — |
| State of a bulk batch: staged images, refusals, per-row outcome | — |
| Copy creatives into other campaigns (creatives × targets copies), originals untouched | — |
| Move creatives to another campaign of the same format and pricing model; they lose per-geo bids and return to moderation | — |
| Traffic sources that reject one creative, split by category and moderation tag. Manager-only (impersonation sessions) | — |
| Replace the creatives' own per-country bids; countries left out fall back to the campaign bid | — |
| Bulk delete of archived creatives by comma-separated IDs; requires | destructive |
Audiences
Tool | Description | Annotations |
| List audiences with search and sorting | readOnly |
| Get detailed audience info by ID | readOnly |
| Create audience (pixel, code, fingerprint, or S2S) | — |
| Update audience settings | — |
| Audiences usable as sources of a filtered audience. Manager-only (impersonation sessions) | — |
| Hardcoded parameters a pixel/S2S audience substitutes into its code | — |
| Replace the hardcoded parameters of a pixel/S2S audience | — |
| Delete audience permanently (requires | destructive |
Finance & Statistics
Tool | Description | Annotations |
| Transaction history (deposits, charges, refunds) | readOnly |
| Unified statistics — 3 report types via | readOnly |
Publisher Tools (17)
Requires KADAM_PUB_API_KEY.
Sites (Sources)
Tool | Description | Annotations |
| List publisher sites with stats | readOnly |
| Add a new site (starts verification flow) | — |
| Get detailed site info | readOnly |
| Update site name | — |
| Change site status (active/paused/archived/unarchived) | idempotent |
Ad Units
Tool | Description | Annotations |
| List ad units for a site, filter by format (native/banner/push/popunder/inpagepush) | readOnly |
| Change ad unit status (active/paused/archived/restored) | idempotent |
User & Statistics
Tool | Description | Annotations |
| Get publisher account info and balance | readOnly |
| 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 |
| Catalog of networks, which have an account, and what an ad unit already runs | readOnly |
| Attach a network to an ad unit (resolves account and placement itself) | — |
| Change geo, unique cap, proxy policy, tag template, placement or account | — |
| active / paused for a connection | idempotent |
| Restart the forced test share (1-50%); starts a new measurement epoch | — |
| Remove a connection (requires | destructive |
| Rotate the network API key, rename or disable the account | — |
| Remove a network account (requires | destructive |
Resources (9)
Static reference data the agent can read before calling tools:
URI | Description |
| All ad format types with IDs, features, pricing, and creative specs |
| CPC, CPM, CPV, CPA Target with IDs and descriptions |
| Creative requirements per campaign type |
| Publisher ad unit formats with IDs |
| Publisher site lifecycle states |
| Outside ad networks: accounts, placements, connections, test share, income split |
| Available dimensions and metrics for statistics tools |
| General Kadam API capabilities overview |
Prompts (4)
Pre-built workflow templates that guide the agent through multi-step operations:
Prompt | Description | Arguments |
| Step-by-step campaign creation (check types -> create folder -> create campaign -> add creatives) |
|
| Campaign performance analysis with optimization recommendations |
|
| Analyze site performance and suggest blacklist/whitelist changes |
|
| 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 promptsKey Design Decisions
ToolWrapper middleware — centralized auth validation, error formatting, and logging for all 80 tools
Lazy singleton API clients — one
HttpClientinstance per product, created on first useOutput truncation — hard 50KB limit per response with
maxResults(default 25, max 100) to prevent LLM context overflowHuman-readable output — formatted tables, aligned entities, pagination metadata instead of raw JSON
Tool annotations —
readOnlyHint,destructiveHint,idempotentHintto guide agent behaviorServer 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 declarerequires: "impersonation"andToolWrapperskips them for client sessions;campaigns.tsadds 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/accessis 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 keysCommands
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 inspectDeployment
Docker
docker build -t kadam-mcp-server .
docker run -i --rm -e KADAM_ADV_API_KEY=... kadam-mcp-serverCI/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 toolskadam_adv_block_sitesAIdempotent
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_bidsAIdempotent
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_audienceADestructive
Permanently delete an audience. Requires confirm=true for safety.
Inputs: id (required), confirm (required).
kadam_adv_delete_autoruleADestructive
Permanently delete an autorule. Requires confirm=true.
Inputs: id (required), confirm (required).
kadam_adv_delete_campaignsADestructive
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_creativesADestructive
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_accountARead-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_audienceARead-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_paramsARead-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_balanceARead-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_jobARead-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_campaignARead-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_slicesARead-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_restrictionsARead-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_folderARead-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_conversionARead-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_limitARead-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_dictionaryARead-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_statsARead-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_statsBRead-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_forecastARead-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_audiencesARead-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_autorulesARead-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_foldersARead-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_campaignsARead-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_creativesBRead-only
List advertiser creatives with pagination. Filter by campaign, status, or search query.
Inputs: page, status, perPage, campaignId, +1 more.
kadam_adv_list_extended_bidsARead-only
List the per-slice bid overrides currently set on campaign(s) (Bid Optimization). Paginated.
Inputs: campaignIds (required), page, perPage.
kadam_adv_list_finance_operationsARead-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_systemsARead-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_campaignsAIdempotent
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_bidsADestructive
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_statusBIdempotent
Enable or disable an autorule without deleting it.
Inputs: id (required), isActive (required).
kadam_adv_set_campaign_folder_statusAIdempotent
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_rssAIdempotent
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_statusAIdempotent
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_statusAIdempotent
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_limitAIdempotent
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_bidAIdempotent
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_bidsBIdempotent
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
Scored across 58 tools
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.
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.
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.
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
Related MCP Connectors
Meta Ads MCP server: run Facebook and Instagram campaigns, ad sets, ads and reports from AI.
Google Ads MCP server: run Search, Display, Demand Gen and PMax campaigns from AI.
MCP-native ad server. Monetize AI chatbots and agents with conversational ads.
Google Ads MCP server — manage campaigns, keywords, and metrics.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server for AI agents to manage ad campaigns across Google, Meta, LinkedIn, Microsoft, Reddit, TikTok, and more21618 npm21MIT
- AlicenseNot gradedqualityDmaintenanceAn 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 npm4MIT
- AlicenseNot gradedqualityDmaintenanceMCP 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
- FlicenseNot gradedqualityDmaintenanceMCP server that enables AI agents (Claude Code) to manage Criteo campaigns, ad sets, creatives, audiences, and reports via natural language.-