yandex-direct-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| YANDEX_DIRECT_TOKEN | Yes | Your Yandex Direct API token | |
| YANDEX_DIRECT_CLIENT_LOGIN | No | Client login for agency access |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| direct_list_campaignsA | List campaigns with project (from projects.json), state, daily/weekly budget ₽, negatives count, excluded sites count. READ-ONLY. |
| direct_get_campaignA | Get one campaign by Yandex Id (detail + strategy + excluded sites + negatives sample). READ-ONLY. |
| direct_get_negativesA | List campaign-level negative keywords. READ-ONLY. Group-level negatives are separate. |
| direct_list_adgroupsA | List ad groups for campaign_ids or project. Includes RegionIds. READ-ONLY. |
| direct_list_keywordsB | List keywords for campaign_ids / adgroup_ids / project. READ-ONLY. |
| direct_list_adsB | List ads for campaign_ids / adgroup_ids / project. READ-ONLY. UNIFIED: ACCEPTED OFF may be pool, not ban. |
| direct_reportA | Campaign performance (cost, clicks, impressions, CTR, CPC) for date range. Conversions=soft Metrika. READ-ONLY. May poll ~1 min. |
| direct_project_mapA | Show campaign→project mapping rules (projects.json) + live non-archived list. READ-ONLY. |
| direct_account_summaryA | Short cabinet summary: counts by project/state + optional last-N-days cost. READ-ONLY. |
| direct_get_excluded_sitesB | List ExcludedSites for campaign(s). READ-ONLY. |
| direct_list_bidmodifiersA | List campaign-level bid modifiers (mobile/tablet/desktop/demographics). READ-ONLY. |
| direct_search_geo_regionsA | Search Yandex Direct GeoRegions dictionary by name substring. READ-ONLY. Use Federation subject IDs for RegionIds excludes (negative). |
| direct_report_breakdownB | READ: performance report with breakdown dimension (Placement|AdGroupId|Criterion|Device|AdId|Date|…). Soft Conversions. For RSYA junk use Placement. Polls offline report. |
| direct_get_adA | READ: full ad detail (titles, text, href, image, state). ad_id may be int64 string. |
| direct_client_infoA | READ: clients.get — login, currency, VAT, shared account flags, restrictions snapshot. |
| direct_list_campaign_fundsC | READ: campaign funds / shared account spend fields (where available on get). |
| direct_pingA | READ: health check — token present, units remaining, campaign count by project. |
| direct_report_search_queriesA | READ: SEARCH_QUERY_PERFORMANCE_REPORT — real user queries (not just Criterion keys). Cost/clicks/CTR/CPC + soft Conversions. Offline report may poll ~1 min. Top by cost. |
| direct_get_keyword_bidsA | READ: keywordbids.get — SearchBid/ContextBid/AuctionBids for keywords. Pass keyword_ids and/or campaign_ids/project. |
| direct_get_autotargetingB | READ: ---autotargeting keyword rows + AutotargetingCategories + Bid. project/campaign_ids. |
| direct_get_strategyA | READ: full BiddingStrategy + PriorityGoals + counters for one campaign (Text/Unified). |
| direct_list_sitelinksA | READ: sitelinks.get — by sitelink_set_ids, or discover Ids from ads in project/campaign_ids (API requires Ids). |
| direct_list_adextensionsB | READ: adextensions.get — callouts library (ids + text). |
| direct_check_changesA | READ: changes.checkCampaigns — which campaigns changed since Timestamp (ISO or API format). |
| direct_account_balanceB | READ: clients.get financial flags + sample campaign Funds/SharedAccountFunds (cabinet balance snapshot). |
| direct_list_retargeting_listsC | READ: retargetinglists.get — Metrika audience lists in cabinet. |
| direct_list_audience_targetsB | READ: audiencetargets.get for campaign/adgroup (retarget conditions on groups). |
| direct_list_feedsA | READ: feeds.get — API requires ids. Pass feed ids from create/add or UI. |
| direct_list_advideosA | READ: advideos.get by ids (API requires Ids). Use after upload_advideo. |
| direct_get_group_negativesA | READ: ad group NegativeKeywords (separate from campaign-level). |
| direct_get_time_targetingC | READ: campaign TimeTargeting schedule. |
| direct_product_attributionB | OPTIONAL READ: your product DB via custom SQL (not soft Metrika Conversions). Enable PRODUCT_ATTRIBUTION_ENABLED=true and set PRODUCT_ATTRIBUTION_SQL or use built-in only if you customized it. Default: disabled with setup hints. |
| direct_list_dictionariesA | READ: dictionaries.get — supply DictionaryNames e.g. SupplySidePlatforms, AudienceCriteriaTypes, Currencies, MetroStations, TimeZones, Interests. |
| direct_suspend_campaignsA | WRITE: suspend campaigns (State→SUSPENDED). Requires allow_write=true + project or campaign_ids. Stops spend. |
| direct_resume_campaignsA | WRITE: resume suspended campaigns. Requires allow_write=true + project/campaign_ids. Do NOT auto-resume killed Chat/Skazki without owner intent. |
| direct_set_excluded_sitesA | WRITE: set campaign ExcludedSites (RSYA junk packages/DSP). mode=merge (default) or replace. allow_write=true required. Never auto-exclude dsp.yandex.ru unless sites list includes it. |
| direct_set_region_excludesA | WRITE: add negative RegionIds on all ad groups of campaigns (exclude subjects under Russia 225). Pass positive region ids (e.g. 11010 Дагестан) — tool stores negatives. Preserves existing positives (225 etc). allow_write=true. |
| direct_set_device_bid_modifiersA | WRITE: campaign device bid mods. ONE field per API call (Mobile/Tablet/Desktop). BidModifier 0=off, 100=default, 50=−50%, 130=+30%. allow_write=true. Desktop may 6000-conflict if Mobile=0. |
| direct_set_network_weekly_budgetA | WRITE: Network WB_MAXIMUM_CLICKS WeeklySpendLimit (+ optional BidCeiling) for RSYA-style campaigns. Search left as-is. ₽ → micros. allow_write=true. Does not touch DailyBudget in same call. |
| direct_set_keyword_bidsA | WRITE: set keyword search bids (₽) via keywordbids.set. keyword_ids required. allow_write=true. |
| direct_set_keyword_statesA | WRITE: suspend or resume keywords by id. allow_write=true + project scope. |
| direct_set_search_weekly_budgetA | WRITE: Search HIGHEST_POSITION + WeeklySpendLimit ₽, Network SERVING_OFF (JTBD-style). Does not change DailyBudget. allow_write=true. Aborts if live strategy is unexpected unless force=true. |
| direct_set_daily_budgetA | WRITE: campaign DailyBudget ₽ (Amount micros). Mode STANDARD|DISTRIBUTED. Do NOT send in same update as WeeklySpendLimit (API 4004). allow_write=true. |
| direct_set_priority_goalsB | WRITE: PriorityGoals SET (no REMOVE in API). goals=[{goal_id, value_rub}]. Weights in ₽. allow_write=true. Prefer payment-heavy; avoid max-conv on form alone. |
| direct_set_negativesB | WRITE: campaign NegativeKeywords. mode=merge|replace. Phrases as Direct expects (morphology; avoid bare +). allow_write=true. |
| direct_ads_set_stateA | WRITE: ads suspend | resume | moderate. Pass ad_ids (int64 as number or string ok). project scope via parent campaigns. allow_write=true. |
| direct_update_ad_hrefA | WRITE: update TextAd Href (landing/UTM) for ads. ad_hrefs=[{ad_id, href}]. allow_write=true. May need moderate after. |
| direct_add_keywordsA | WRITE: add keywords to ad group. keywords=[{keyword, bid_rub?}]. bid optional (micros). allow_write=true. Does not auto-enable AT. |
| direct_set_demographics_bid_modifierA | WRITE: campaign demographics bid mod (age and/or gender). BidModifier 0=exclude. Age e.g. AGE_0_17, AGE_18_24, AGE_55. allow_write=true. |
| direct_update_adgroup_regionsA | WRITE: set absolute RegionIds on specific ad groups (positives + negatives). Example [225,-11010]. allow_write=true. |
| direct_update_ad_textC | WRITE: ads.update TextAd Title/Title2/Text/Href/DisplayUrlPath/AdImageHash/SitelinkSetId. No ₽·— VPN. optional moderate_after. allow_write=true. |
| direct_set_max_convB | WRITE: Search WB_MAXIMUM_CONVERSION_RATE + GoalId + WeeklySpendLimit ₽, Network SERVING_OFF (default). Unified/Text auto. allow_write=true. Prefer payment goals over form alone. |
| direct_set_strategyB | WRITE: set Search strategy preset: highest_position | max_conv | max_clicks_network | serving_off_search. weekly_rub/goal_id/bid_ceiling as needed. allow_write=true. |
| direct_set_autotargetingA | WRITE: keywords.update AutotargetingCategories for AT rows. categories=[{category,value YES|NO}] e.g. EXACT,ALTERNATIVE,COMPETITOR,BROADER,ACCESSORY. Prefer plain array (API gotcha). Optional bid_rub via keywordbids. allow_write=true. |
| direct_set_group_negativesC | WRITE: adgroups.update NegativeKeywords. mode=merge|replace. allow_write=true + project. |
| direct_unarchive_campaignsA | WRITE: campaigns.unarchive. allow_write=true + project scope. Prefer resume if only SUSPENDED. |
| direct_attach_calloutsA | WRITE: ads.update TextAd CalloutSetting AdExtensionIds. Pass ad_ids + extension_ids (from add_callouts/list). allow_write=true. May re-moderate. |
| direct_set_bidmodifiersB | WRITE: bidmodifiers.set — [{id, bid_modifier}] where bid_modifier 0–1300 (0=exclude). allow_write=true. |
| direct_delete_bidmodifiersB | WRITE: bidmodifiers.delete by ids. allow_write=true. |
| direct_set_retargeting_bid_modifierA | WRITE: bidmodifiers.add RetargetingAdjustment on campaign (RetargetingConditionId + BidModifier 0–1300). allow_write=true. Used e.g. exclude visitors list. |
| direct_add_audience_targetsC | WRITE: audiencetargets.add — [{adgroup_id, retargeting_list_id, context_bid_rub?}]. allow_write=true. |
| direct_audience_targets_stateB | WRITE: audiencetargets suspend|resume|delete by ids. allow_write=true. |
| direct_set_time_targetingA | WRITE: campaigns.update TimeTargeting. schedule_items=7 strings "day,h0,h1..h23" pct 0–100, day 1=Mon…7=Sun. Or weekend_pct for quick 100wd/weekend pattern. allow_write=true. |
| direct_upload_advideoA | WRITE: advideos.add from file_path or base64. Returns video Id; poll status with list_advideos. allow_write=true. |
| direct_attach_video_extensionC | WRITE: creatives.add VideoExtensionCreative(video_id) then ads.update TextAd.VideoExtension.CreativeId. Optional moderate. allow_write=true. |
| direct_add_feedB | WRITE: feeds.add — name + url (HTTP feed) or file_path (upload). business_type RETAIL|… source URL|FILE. allow_write=true. |
| direct_delete_feedsB | WRITE: feeds.delete by ids. allow_write=true. |
| direct_update_keywordsA | WRITE: keywords.update user_param / strategy priority. items=[{keyword_id, user_param1?, user_param2?, strategy_priority?}]. For AT use set_autotargeting. allow_write=true. |
| direct_create_campaignA | WRITE: campaigns.add from zero. channel=search (HP, Network OFF) | rsya (Network max-clicks, Search OFF). Optional daily_rub, weekly_rub, bid_ceiling_rub, negatives, counter_id, utm TrackingParams, timezone. After add use add_adgroups/keywords/ads or direct_launch_pack. allow_write=true. |
| direct_add_adgroupsA | WRITE: adgroups.add. groups=[{name, region_ids?}]. Default region_ids=[225]. allow_write=true + project scope. |
| direct_add_adsA | WRITE: ads.add TextAd. ads=[{adgroup_id, title, title2?, text, href, display_url_path?, image_hash?, sitelink_set_id?, mobile?}]. Max 3 ads/group on UNIFIED. Title ≤56, Title2 ≤30, Text ≤81. No ₽·— VPN in copy. allow_write=true. |
| direct_upload_adimageA | WRITE: adimages.add from local file path (server FS) or raw base64. Returns AdImageHash for TextAd.AdImageHash. allow_write=true. |
| direct_add_sitelinksA | WRITE: sitelinks.add set. sitelinks=[{title, href, description?}]. Title≤30, Desc≤60. Returns SitelinkSetId for ads. allow_write=true. |
| direct_add_calloutsC | WRITE: adextensions callouts (≤25 chars each). Attach via UI/EPK may be limited. allow_write=true. |
| direct_register_project_campaignA | WRITE local: pin campaign_id into projects.json under project key. No Direct API. allow_write=true (or dry_run). |
| direct_archive_campaignsA | WRITE: archive campaigns (remove from active UI). Prefer suspend for reversible stop. allow_write=true. |
| direct_launch_packA | WRITE FULL LAUNCH from zero in one call: create campaign → excluded sites → adgroups → keywords (phrase+"[exact]") → optional images → ads → moderate → optional age0-17 ban → optional resume → pin projects.json. channel=search|rsya. groups: [{name, phrases[], ads:[{title,title2?,text,content}], image_path?}]. content used in utm_content. Max 3 ads/group. allow_write=true. Prefer dry_run first. |
| direct_delete_keywordsA | WRITE: keywords.delete by ids. Irreversible. allow_write=true + project scope. |
| direct_rpcA | Escape hatch: call any Direct API service.method with params JSON. Prefer typed tools. Methods add/update/delete/suspend/resume/set/moderate require allow_write=true. service e.g. campaigns, keywords, ads, adgroups, bidmodifiers, keywordbids, clients, dictionaries. |
| direct_report_rawA | READ: raw Reports API — pass full report spec (SelectionCriteria, FieldNames, ReportType…). Advanced; prefer direct_report / direct_report_breakdown. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/gmen1057/yandex-direct-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server