MCP server for the VK Ads (VK Реклама) API — manage ad plans, ad groups, banners and pull statistics from AI agents.
18 tools with mostly complete schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. Tool names follow verb_noun convention well (start_login, create_ad_plan, list_banners). Descriptions average ~120 chars, meeting baseline minimums but lacking LLM-optimized guidance on WHEN to use each tool vs alternatives. Critical issue: output schemas are not documented, LLMs cannot infer what fields to expect from responses, breaking downstream tool chaining. Parameters like 'statuses' (array), 'metrics' (array), and 'fields' (string) lack enum constraints, inviting hallucinated values. Error handling is minimal, no recovery guidance or actionable error messages visible in code. raw_request tool is high-risk (IRREVERSIBLE) but lacks dry-run or confirmation pattern beyond confirmWrite boolean.
Returns the current authentication status: whether a token is configured, its source (environment or stored), expiration time, and refresh capability.
Creates a new ad group within a campaign in VK Ads with targeting and bidding parameters.
Creates a new ad campaign (ad_plan) in VK Ads with specified parameters like name, budget, objective, and targeting.
Creates a new banner (ad) within an ad group in VK Ads with creative and targeting details.
Completes the OAuth login flow by exchanging client_id and client_secret for an access token. Stores credentials locally for future API calls.
Retrieves detailed account information from VK Ads including user ID, username, account type, and currency settings.
Output schemas not documented. Tools like get_account_info, list_ad_plans, get_statistics return data but LLMs cannot infer response structure. This breaks tool chaining, agents cannot extract IDs for downstream calls without guessing field names.
Array parameters lack enum constraints. 'statuses' (list_ad_plans, list_ad_groups, list_banners) and 'metrics' (get_statistics) accept arrays but do not enumerate valid values. LLMs will hallucinate invalid status names like 'pending' or 'archived' instead of the actual API values.
raw_request tool is IRREVERSIBLE but lacks dry-run or multi-step confirmation. confirmWrite boolean is insufficient for destructive operations. No guidance on recovery if a DELETE or POST fails mid-execution.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 50 | 2026-07-28+ | v2 |
Fetches the current account balance and currency from VK Ads. Returns wallet information including available funds.
Retrieves performance statistics from VK Ads for ad plans, groups, or banners over a date range with specified metrics.
Retrieves current API throttling information from VK Ads, including rate limits and remaining quota.
Lists ad groups within a campaign from VK Ads with optional filtering and pagination.
Lists ad campaigns (ad_plans) from VK Ads with optional filtering by status, pagination, and field selection.
Lists banners (ads) within an ad group from VK Ads with optional filtering and pagination.
Clears the stored VK Ads credentials from the local configuration file. Does not affect environment-variable tokens.
Sends a raw HTTP request to the VK Ads API. Accepts relative paths with API version (e.g., 'v2/ad_plans.json'). Requires explicit confirmation for write operations.
Initiates the OAuth login flow for VK Ads. Returns a URL and instructions for the user to create an API application in their VK Ads cabinet.
Updates an existing ad group in VK Ads. Modifies one object per request.
Updates an existing ad campaign (ad_plan) in VK Ads. Modifies one object per request; partial failures are reported by ID.
Updates an existing banner (ad) in VK Ads. Modifies one object per request.
No error recovery guidance. Descriptions do not explain what to do if a call fails (e.g., 'If you get 429, call get_throttling first'). Error responses are not visible in code, LLMs will have no actionable next steps on failure.
Pagination parameters (offset, limit) present but no total_count or next_cursor documented in output. LLMs cannot determine if more results exist or how to fetch them efficiently.