yandex-direct-mcp
yandex-direct-mcp
Servidor MCP para Yandex Direct API v5. Conecta una cuenta publicitaria a un agente de IA (Claude Code, Cursor y cualquier otro cliente MCP): la tarea se plantea en texto normal, el agente reúne las llamadas API necesarias y analiza la respuesta.
Ты: посмотри, куда за август ушёл бюджет и что откручивается без конверсий
Агент: [direct_report] → 12 кампаний, 340 фраз
Расход 214 800 ₽. Кампания «Поиск / Бренд» — 38%, CPA 610 ₽.
17 фраз потратили 31 400 ₽ при нуле конверсий — вот они, отключаем?Sin dependencias: un solo archivo en Node.js, transporte stdio, solicitudes mediante fetch integrado.
El token se almacena localmente en un archivo con permisos 600 y no sale a ningún sitio excepto
api.direct.yandex.com.Los cambios requieren confirmación. El cliente MCP pide permiso para cada llamada; además hay un modo de «solo lectura» que bloquea los métodos de modificación a nivel de servidor.
API completo, no un subconjunto. La herramienta universal
direct_callcubre todos los servicios v5, desdecampaignshastakeywordsresearch.
Qué se puede hacer
Analítica. Informes por cualquier segmento y período: campañas, grupos, anuncios, frases clave, consultas de búsqueda, geo, dispositivos, hora del día, sexo y edad. Gasto, clics, CTR, CPC, conversiones, CPA, comparación de períodos. Análisis de consultas de búsqueda para detectar basura, búsqueda de frases con gasto sin conversiones.
Gestión. Creación y edición de campañas, grupos, anuncios, frases clave. Pujas y presupuestos diarios, incluso en lote, según una regla («CPA superior a 2000 ₽ → reducir la puja en un 20%»). Palabras negativas, activación y pausa, envío a moderación, ajustes de puja por geo, dispositivos y audiencias, retargeting.
Semántica. Comprobación de frecuencia de frases (keywordsresearch), directorios de regiones y zonas horarias (dictionaries).
Tareas periódicas. Resumen matutino del gasto de ayer, análisis semanal de consultas de búsqueda, alerta de sobrecosto, si el cliente MCP admite programación.
Escenarios detallados con ejemplos de solicitudes: docs/usage.md.
Related MCP server: Yandex MCP Server
Requisitos
Node.js 18 o superior (se necesita
fetchintegrado).Cuenta de Yandex Direct.
Aplicación registrada en oauth.yandex.ru con solicitud aprobada para acceso a la API. Esta es la principal barrera y tarda de una hora a tres días; empieza por ahí: docs/registration.md.
Instalación
git clone https://github.com/iarbor04/yandex-direct-mcp.git
cd yandex-direct-mcpNo hay dependencias, no se necesita npm install.
Claude Code:
claude mcp add yandex-direct --scope user -- node "$PWD/server.js"Cursor, Windsurf y otros clientes con configuración JSON:
{
"mcpServers": {
"yandex-direct": {
"command": "node",
"args": ["/абсолютный/путь/yandex-direct-mcp/server.js"]
}
}
}Las herramientas aparecen al iniciar el cliente: después de añadir el servidor, reinicia la sesión.
Autorización
El orden es importante. Si no se hace en este orden, obtendrás el error 58 y perderás tiempo; nosotros lo perdimos.
1. Solicitud de acceso a la API
Registras la aplicación en oauth.yandex.ru y presentas la solicitud en la interfaz de Direct: «Mis solicitudes». La revisión se realiza en días laborables de la Federación Rusa de 10:00 a 19:00, de una hora a tres días, en períodos pico hasta siete días.
Qué escribir en el formulario (textos listos para todos los campos, incluida la descripción del esquema de interacción y el diagrama) — docs/registration.md.
Sin una solicitud aprobada, ni siquiera el sandbox funciona. Comprobado: api-sandbox.direct.yandex.com devuelve el mismo error 58 que la API de producción. No se puede depurar «con datos de prueba».
2. Token
./save-token.sh <CLIENT_ID>El script mostrará el enlace de autorización, esperará a que pegues la barra de direcciones después de la redirección (la entrada está oculta: ni la URL ni el token aparecen en el historial del shell), extraerá access_token, lo guardará en ~/.config/yandex-direct/token con permisos 600 y ejecutará inmediatamente una comprobación de acceso.
<CLIENT_ID> — el identificador de la aplicación para la que se aprobó la solicitud. El script lo recordará en config.json; a partir de entonces se puede ejecutar sin argumento.
Manualmente, lo mismo: abrir https://oauth.yandex.ru/authorize?response_type=token&client_id=<CLIENT_ID>, tomar el token de la barra de direcciones después de #access_token= (hasta &) y guardarlo en el archivo.
3. Comprobación
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{}}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"direct_status","arguments":{}}}' \
| node server.jsO simplemente pregunta al agente: «comprueba el acceso a Direct». Una respuesta exitosa muestra el inicio de sesión, la moneda de la cuenta y el saldo de puntos.
Escollos con los que nos topamos
Síntoma | Causa | Qué hacer |
| El token se obtuvo con otra aplicación, no con la que se aprobó la solicitud. Es fácil caer en esto si hay varias aplicaciones | Abre la solicitud aprobada, verifica el Client ID, obtén el token con esa aplicación |
| El sandbox también requiere una solicitud aprobada | Esperar la aprobación, no hay alternativa |
La reautorización devuelve el mismo token | Yandex devuelve el token ya emitido mientras no se revoque el acceso a la aplicación | Revocar el acceso en id.yandex.ru/personal/data-access y luego autorizar de nuevo |
| El token fue revocado, caducó o se copió truncado | Obtenerlo de nuevo mediante |
| El token se emitió con un inicio de sesión que no tiene campañas | Obtener el token con el inicio de sesión correcto. No se necesita una nueva solicitud: está aprobada para la aplicación, no para el usuario |
Es necesario volver a presentar la solicitud después de recrear la aplicación | La aprobación está vinculada al Client ID, no a la cuenta | No eliminar la aplicación aprobada. Si la eliminaste, presenta una nueva solicitud y menciona el Client ID anterior en la descripción |
Por separado: no se debe pegar el token en el chat del agente, ya que quedará en el historial de la conversación. Para eso está save-token.sh con entrada oculta. Si aun así lo pegaste, revoca el acceso en id.yandex.ru/personal/data-access y obtén uno nuevo.
Herramientas
Herramienta | Función |
| Si hay token, qué entorno, si el acceso está activo (prueba |
| Chuleta: servicios, métodos, ejemplos de |
| Llamada universal |
| API de informes: envía ReportDefinition, espera a que esté listo (códigos 201/202), devuelve TSV |
Configuración
~/.config/yandex-direct/config.json:
{
"token": "",
"client_id": "…",
"client_login": "",
"sandbox": false
}El token se lee en cada llamada; después de reemplazarlo no es necesario reiniciar el servidor.
Variable de entorno | Significado |
| Token directamente, tiene prioridad sobre los archivos |
| Inicio de sesión del cliente para cuenta de agencia (cabecera |
| Trabajar con el sandbox |
| Bloquear |
| Otro directorio de configuración |
Orden de búsqueda del token: YANDEX_DIRECT_TOKEN → config.json → ~/.config/yandex-direct/token.
Límites y coste
Cada llamada consume puntos (Units); el saldo llega en la cabecera de la respuesta y se imprime en el encabezado del resultado. Un get normal cuesta unos 10 puntos; los informes son más caros. El límite diario depende de la cuenta (en un cliente normal, alrededor de 160 000, suficiente para trabajar en vivo con margen).
El método get devuelve como máximo 10 000 objetos a la vez; después, paginación mediante LimitOffset. Las pujas se especifican en microunidades: 30000000 = 30 ₽. El ReportName del informe debe ser único; de lo contrario, Direct devolverá un informe generado anteriormente.
Esquema de interacción

Fuente: docs/scheme.html — útil si necesitas tu propia versión de la imagen para la solicitud.
Licencia
MIT — ver LICENSE.
Available Tools
4 toolsdirect_callA
Универсальный вызов Яндекс Директ API v5: POST на /json/v5/{service} с телом {method, params}. Покрывает всё управление: кампании, группы, объявления, ключевые фразы, ставки, ретаргетинг, справочники. Сначала загляни в direct_reference за именами сервисов, методов и формой params.
| Name | Required | Description | Default |
|---|---|---|---|
| method | Yes | Метод сервиса: get, add, update, delete, suspend, resume, archive, moderate, set, setAuto. | |
| params | No | Объект params запроса (SelectionCriteria, FieldNames, массивы объектов и т.д.). | |
| sandbox | No | true — бить в песочницу, false — в боевой API. По умолчанию из конфига. | |
| service | Yes | Сервис API v5, например campaigns, adgroups, ads, keywords, bids, dictionaries. | |
| client_login | No | Логин клиента для агентского аккаунта (заголовок Client-Login). По умолчанию берётся из конфига. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden, but it only states the HTTP mechanics and broad scope. It does not warn that this universal call can mutate or destroy production data (delete, archive, suspend are possible), nor mention sandboxing, auth needs, or side effects. 'Покрывает всё управление' hints at writes but does not disclose consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler. The first sentence front-loads the core call pattern, the second scopes what it covers, and the third gives a direct pointer to the reference tool. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is serviceable for a generic wrapper: it names the endpoint shape, scope, and prerequisite reference. But with no annotations or output schema, it omits auth context, sandbox behavior, and any statement about the raw response shape; those are left to schema fields, which is a noticeable gap for a tool that can perform destructive operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real semantic value by showing how parameters map to the request structure: service goes into the URL path and method/params form the JSON body. It also tells the agent where to find valid service/method names, though sandbox and client_login are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is explicit: 'Универсальный вызов Яндекс Директ API v5' followed by the exact HTTP action 'POST на /json/v5/{service} с телом {method, params}'. It lists the covered resource domains (campaigns, adgroups, ads, keywords, bids, retargeting, dictionaries), which clarifies scope and distinguishes it from the more specialized sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Сначала загляни в direct_reference за именами сервисов, методов и формой params' gives a concrete prerequisite and points to an alternative tool. It clearly establishes direct_call as the universal management entry point, though it does not explicitly state when to prefer direct_status or direct_report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_referenceA
Шпаргалка по API v5: список сервисов, методов, примеры params, типы отчётов, единицы ставок и лимиты. Вызывай перед первым direct_call, чтобы не гадать с полями.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the burden of behavioral disclosure. It does this well by listing the informational content and framing the tool as a read-only reference/cheat sheet. It does not explicitly state that it has no side effects or describe the return format, but the reference framing makes the behavior sufficiently clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words: the first front-loads what the tool provides, and the second gives the actionable trigger. Every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter reference tool, this is complete: it specifies the domain (API v5), the exact reference content, and when to call it. The lack of an output schema is mitigated by the explicit enumeration of what the cheat sheet covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is empty with zero parameters, so the baseline is 4. The description does not discuss this tool's parameters, but it uses the word 'params' only in the context of examples for direct_call, avoiding confusion. No additional parameter explanation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the tool as a 'cheat sheet' for API v5 and enumerates its contents: services, methods, params examples, report types, rate units, and limits. This clearly distinguishes it from sibling execution tools like direct_call and direct_report, so an agent knows exactly what this reference operation is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use instruction: call this before the first direct_call to avoid guessing fields. This is clear context, but it does not mention when not to use it or contrast it with direct_status/direct_report, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_reportA
Статистика через сервис Reports API v5. Принимает ReportDefinition в params, сам дожидается готовности отчёта (коды 201/202 с повторами) и возвращает TSV.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | ReportDefinition: SelectionCriteria, FieldNames, ReportName (уникальное), ReportType, DateRangeType, Format: TSV, IncludeVAT, IncludeDiscount. | |
| sandbox | No | Песочница вместо боевого API. | |
| client_login | No | Логин клиента для агентского аккаунта. | |
| wait_seconds | No | Сколько секунд ждать готовности отчёта, по умолчанию 180. | |
| processing_mode | No | Режим формирования отчёта, по умолчанию auto. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden and discloses important behavior: it waits for report readiness, handles 201/202 retry codes, and returns TSV. It stops short of describing authentication, error conditions, or whether report generation has side effects or costs, but the main operational surprise is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that front-loads the service and key behavior. It avoids repeating schema details and contains no filler, making it appropriately sized and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema coverage and the absence of an output schema, the description covers the non-obvious long-running behavior and the output format. It is mostly complete for invocation purposes, with minor gaps around error handling and explicit sibling-tool relationships.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full descriptions for all parameters, including the nested ReportDefinition fields and defaults. The description adds only the high-level 'ReportDefinition' concept and TSV return format, which the schema already covers, so it contributes little beyond the structured definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource ('Reports API v5') and clarifies the operation: it accepts a ReportDefinition, waits for report readiness, and returns TSV. It is clear enough to identify the tool as a report/statistics retrieval tool, though it lacks an explicit action verb and does not directly contrast with sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The opening phrase 'Статистика через сервис Reports API v5' provides clear context for when to use the tool: to obtain statistics via Reports API v5. It states the self-waiting behavior, distinguishing it from a manual status-checking tool, but it does not explicitly list alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_statusA
Проверить подключение к Яндекс Директу: найден ли токен, какая среда (боевая/песочница), доступен ли API (пробный clients.get) и сколько осталось баллов. Токен не раскрывается.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It is transparent that the tool runs a probe API call ('пробный clients.get'), checks the token/environment/points, and explicitly states that the token is not disclosed. This covers the key behavioral facts an agent needs to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single Russian sentence front-loads the purpose and then provides a compact enumeration of checks. Every clause carries information, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool with no output schema, the description gives enough context to call it correctly: it defines what is tested and what is not exposed. It does not spell out the exact return format, but this is not critical given the enumerated status categories.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema has full coverage, so there is nothing for the description to add about parameter meaning. The description's focus on connection state is consistent with requiring no input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete action ('Проверить подключение' – check connection) and a specific resource (Yandex Direct), and enumerates the exact diagnostics performed: token presence, environment, API availability via a trial clients.get, and remaining points. This clearly sets it apart from sibling tools like direct_call or direct_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes it clear this is a diagnostic/health-check tool by framing the action as checking connection and listing status checks. However, it does not explicitly say 'use this when verifying setup before direct_call' or name alternatives/exclusions, so the guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
direct_call - First observed
direct_reference - First observed
direct_report - First observed
direct_status
TDQS
Scored across 4 tools
Each tool has a clearly distinct role: status check, generic API call, report retrieval, and API reference. There is slight overlap because direct_call could theoretically hit report services or reference data, but the descriptions clearly separate async reports and reference lookups, so an agent can reliably choose the right tool.
All tools share the 'direct_' prefix followed by a single concise word, creating a highly predictable and consistent naming scheme. The pattern is uniform and avoids mixed conventions or vague generic names.
With 4 tools, the server is intentionally compact: a generic API call handles the long tail of operations, while status, report, and reference tools cover cross-cutting concerns. This is a well-scoped count for a broad but unified API surface.
The generic direct_call provides full coverage of all Yandex Direct API services and methods, so no CRUD operations are missing. direct_report adds proper handling of async report generation, and direct_reference closes the discoverability gap. The set is complete for its stated purpose.
Maintenance
Related MCP Connectors
MCP for Yandex Direct: manage ad campaigns & analytics from Claude or ChatGPT
Open-source ad agent for LinkedIn Ads and Google Ads. Drafts campaigns, audiences and reports.
Build, edit and sync Google, Microsoft, Reddit and Meta ad campaigns from your assistant.
AI marketing agent for paid ads: run campaigns on 11 ad networks and read your web analytics.
Related MCP Servers
- AlicenseBqualityAmaintenanceEnables managing Yandex Direct PPC campaigns, ad groups, ads, and keywords, plus pulling performance statistics via the Yandex Direct API v5.462,199 npm4MIT
- AlicenseNot gradedqualityBmaintenanceEnables interaction with Yandex advertising and analytics APIs (Direct, Metrika, Audience, Webmaster, AdMetrica) through MCP tools, resources, and prompts for campaign management and data retrieval.MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that gives AI agents direct access to the Yandex Direct API to manage campaigns, groups, ads, keywords, bids, and reports via natural language.117 npm6Apache 2.0
- AlicenseAqualityDmaintenanceEnables AI assistants to manage Yandex Direct advertising campaigns, ads, keywords, and reports via natural language using the Yandex Direct API v5.21MIT