yandex-direct-mcp
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., "@yandex-direct-mcplist my campaigns and their daily budgets"
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.
yandex-direct-mcp
MCP-сервер и командная строка к API Яндекс Директа v5. Покрыты все 113 методов, порождённые из машиночитаемой схемы; по умолчанию объявляются девять — те, которыми читают. Остальное включается одной переменной, изменение выключено.
mcp-name: io.github.artgas1/yandex-direct-api-mcp
Работает и как MCP-сервер для Claude Code, Cursor, Codex и других клиентов, и как обычная команда — если MCP не нужен.
Что это даёт — за пять секунд
Обе колонки настоящие: левая — тело ответа, разобранное обычным JSON.parse, то есть так, как его получил бы любой клиент; правая — то, что вернул сервер по JSON-RPC. Строка с идентификатором самодоказательна: слева он испорчен не потому, что так нарисовано, а потому что его действительно портит разбор. Ни токена, ни сети: запросы уводятся на локальную заглушку, поэтому прогон повторяется где угодно, включая CI. Повторить у себя — npm run demo, переснять — npm run demo:record (нужен vhs).
npx -y yandex-direct-api-mcpRelated MCP server: yandex-mcp
Покрытие
что покрыто | служб | методов | из них в | примеры инструментов |
Кампании и объявления | 9 | 37 | 3 |
|
Таргетинг | 9 | 45 | 1 |
|
Ставки и стратегии | 4 | 15 | 2 |
|
Отчёты и справочники | 6 | 9 | 2 |
|
Клиенты и агентства | 2 | 7 | 1 |
|
всего | 30 | 113 | 9 | плюс четыре служебных: |
Таблица считается из спеки (npm run coverage), а не пишется руками: числа в
прозе расходятся со схемой молча, и неправда выглядит ровно как правда.
Быстрый старт
Нужен OAuth-токен Яндекса со scope direct:api — https://oauth.yandex.ru/
(приложению требуется одобренная заявка на доступ к API Директа).
MCP:
{
"mcpServers": {
"yandex-direct": {
"command": "npx",
"args": ["-y", "yandex-direct-api-mcp"],
"env": { "YANDEX_DIRECT_TOKEN": "ваш-токен" }
}
}
}Командная строка:
export YANDEX_DIRECT_TOKEN="ваш-токен"
yandex-direct-mcp catalog --service campaigns
yandex-direct-mcp describe campaigns.get
yandex-direct-mcp call campaigns.get --FieldNames Id --FieldNames NameЧто этот сервер делает за вас
Не удобства. Каждый пункт — место, где прямой запрос к Директу ошибается молча: ответ выглядит нормальным, ошибки нет, а число или вывод неверны. Всё перечисленное снято прогоном живого API, а не прочитано в документации.
Суммы приходят умноженными на миллион — всегда
DailyBudget.Amount = 1000000000 ← это 1000 единиц валюты счёта
Cost = 1234500000 ← это 1234,50 единицы валюты счётаОшибка ровно в миллион раз, и она не выглядит ошибкой: число правдоподобное,
его можно сложить, поделить и построить по нему график. Заголовок
returnMoneyInMicros, который выключает микро-единицы в отчётах, на обычные
службы не действует — проверено на campaigns, значение не изменилось.
Сервер приводит суммы к валюте счёта и перечисляет в ответе, какие именно поля пересчитал:
"_мета": { "суммы_переведены_из_микроединиц": ["Amount", "Refund", "Spend"] }Идентификаторы объявлений не помещаются в число JavaScript
Типичный Id объявления: 1234567890123456789 — девятнадцать цифр.
JSON.parse держит пятнадцать и превращает его в 1234567890123456800.
И это не единичный курьёз: девятнадцатизначные идентификаторы встретились в
каждом проверенном кабинете, а не в одном экземпляре. Схема Яндекса объявляет
358 полей типом xsd:long — то есть диапазон до 19 цифр нормален по контракту.
Опасен не сдвиг, а то, как он выходит наружу: испорченный идентификатор Директ
принимает и отвечает HTTP 200 с телом {"result":{}}. То есть отказа нет —
есть сообщение «такого объявления нет». Пустота как доказательство отсутствия.
Сервер разбирает тело так, что длинные целые остаются точными. Отдельно проверено, что API принимает идентификатор строкой, поэтому точность держится на всём пути — и на чтении, и на записи.
Успех определяется телом, а не кодом ответа
что спросили | код | что в теле |
неверный | 200 |
|
неизвестный метод | 202 |
|
ошибка в отчёте | 400 |
|
отчёт поставлен в очередь | 201 | пусто, |
отчёт считается | 202 | пусто, |
Один и тот же код 202 означает отказ у campaigns и «ещё считается» у
reports. Проверка res.ok пропускает первые три строки таблицы: отказ уходит
модели как удачный ответ.
Отчёт приходит не сразу
201 → 202 → 200. Замер: до готовности потребовалось три запроса. Повтор идёт с тем же
ReportName — имя и есть ключ поставленной задачи. Сервер ждёт сам.
Версия пути меняет данные
Один и тот же запрос:
/json/v5/campaigns → N кампаний, у всех Type = TEXT_CAMPAIGN
/json/v501/campaigns → те же N, у всех Type = UNIFIED_CAMPAIGNЭто разные представления с разными наборами глубоких полей, и несовпадение отнимает их без всякого признака:
путь | набор полей | глубокие поля |
|
| приходят |
|
| пусто, ошибки нет |
|
| пусто, ошибки нет |
|
| приходят |
Стратегия, настройки, счётчики просто отсутствуют — читается как «у кампании
ничего не настроено». Умолчание v501 (документация называет адресом только
его), переключается DIRECT_API_VERSION=v5, выбранная версия печатается в
каждом ответе, а несовпадающий набор полей вызывает предупреждение.
Список кампаний неполон
Кампании Мастера кампаний не отдаются методом campaigns.get вовсе — ни
списком, ни по явному Ids; ответ пустой и без ошибки. Ни v5, ни v501 этого
не меняют.
Поэтому состав кабинета собирает отдельный инструмент direct_inventory:
он склеивает список кампаний и отчёт и помечает каждую строку источником.
Предупреждения в описании тут мало — оно требует, чтобы читатель помнил про него
в момент вывода, а вывод делается по данным, которые выглядят нормально.
Прогон на живом кабинете: объединение оказалось на кампанию длиннее списка, и
эта строка была видна только отчёту. Невидимая для campaigns.get кампания при
этом откручивается и может нести основную долю показов — по списку кампаний
этого не заметить.
ВНИМАНИЕ: 1 кампаний откручивались, но методом campaigns.get НЕ отдаются
(10000017). Управлять ими через API нельзя — только в интерфейсе.Предупреждение — это применено, а не отклонено
В ответе на add/update каждому входному элементу отвечает выходной.
Различать надо по Errors; Warnings означает «применено с замечанием».
Счёт по наличию любого содержимого даёт «отклонено всё» там, где применилось
всё. Сервер приводит итог отдельной строкой:
UpdateResults: применено 2, отклонено 1, с предупреждениями 1Форму списка задаёт тип, а не направление
RegionIds (maxOccurs=unbounded) → [225, 977]
RestrictedRegionIds (тип ArrayOfLong) → {"Items": [225]}Обе формы одинаковы и на чтении, и на записи. Сервер снимает и ставит обёртку по графу типов, а не по виду значения, поэтому круг «прочитал → поправил → записал» не рвётся. Вам обе формы видны как обычные массивы.
Кабинет называется в каждом ответе
Client-Login переключает кабинет по-настоящему, и ошибиться в нём можно молча.
Несуществующий логин отбивается кодом 8800 — это видно сразу. А существующий,
но не тот, отдаёт полные и правильные данные, просто из другого кабинета:
по виду ответа это неотличимо.
Поэтому сервер спрашивает у API, кто отвечает, и пишет ответ в каждый конверт:
"_мета": { "кабинет": "example-login (ClientId 1234567)", "версия_api": "v501" }Спрашивается один раз за запуск и кешируется — clients.get стоит 10 баллов.
Поверхность
Описания всех объявленных инструментов лежат в контексте модели на каждом ходу, вызываете вы их или нет. Поэтому по умолчанию объявляется не всё, что умеет API, а то, чем пользуются.
Замер tools/list на собранном сервере (npm run surface):
профиль | инструментов | байт | ≈ токенов |
| 13 | 27 028 | 12 455 |
| 37 | 61 158 | 28 183 |
| 117 | 143 706 | 66 224 |
Умолчание в 5,3 раза легче полного набора. Главный рычаг — вложенные типы не
разворачиваются в схему: транзитивно campaigns.add это 1083 поля и 54 КБ на
один инструмент. Вместо разворачивания состав типа назван словами в описании,
а точная схема выдаётся инструментом direct_schema по запросу.
Чего не видно — расскажет сам сервер: инструмент direct_catalog перечисляет
все 113 методов и говорит, какие скрыты и как их включить.
Изменение выключено по умолчанию
Из 113 методов 80 меняют данные, 16 удаляют. У Директа нет подтверждающего
шага: suspend останавливает показы в момент вызова, archive убирает кампанию
из работы, delete необратим, а на другом конце — деньги.
Меняющие инструменты не объявляются вовсе, пока не задан
DIRECT_ALLOW_WRITES=1. Объявлять их и отказывать на вызове — худший вариант:
контекст за них платится полностью, а позвать всё равно нельзя.
Неизвестное имя профиля — отказ на старте, а не откат к полной поверхности: неверная настройка ограничения не должна превращаться в отсутствие ограничения.
Есть песочница: DIRECT_SANDBOX=1 (нужны отдельная регистрация и отдельный
токен). Факт включения печатается при старте и в каждом ответе.
Настройки
переменная | по умолчанию | что делает |
| — | OAuth-токен, scope |
| — | логин кабинета (не почта). Переключает кабинет по-настоящему: под одним токеном отдаёт другой аккаунт со своей квотой. Фактический кабинет сервер называет в каждом ответе |
|
|
|
| — | явный список служб или инструментов, побеждает профиль |
| выкл. | объявить меняющие данные инструменты |
|
|
|
| выкл. | песочница вместо боевого кабинета |
|
| потолок ответа; усечение называется вслух |
Откуда берутся инструменты
Ни один метод не описан руками.
источник | что даёт | почему нужен |
WSDL 29 служб + 3 общие XSD | состав, типы, обязательность, массивность, перечисления | единственный полный: в индексе документации нет |
страницы документации | человекочитаемые описания | в WSDL нет ни одного |
описано явно | служба | WSDL для неё Директ не отдаёт (404) |
Итог: 30 служб, 113 методов, 609 типов, 240 перечислений.
npm run spec:fetch # скачать WSDL и документацию в .cache/
npm run spec:build # собрать spec/direct-api.json⚠️ Перечисления из схемы отстают от живого API и поэтому не становятся
жёстким фильтром, а идут подсказкой в описание. Сверка с живым API: campaigns
принимает CreateTime, keywords — AutotargetingBrief,
AutotargetingBriefSuggests, AutotargetingMode, которых в схеме нет. Фильтр
по отстающему списку запретил бы то, что API умеет, и отказ выглядел бы как
отсутствие возможности. Право решать остаётся за API.
Проверки
npm test # 70 тестов, включая отрицательные контроли
npm run surface # замер поверхности по профилям
npm run coverage # таблица покрытия для README
npm run graphic # пересобрать графику поверхности (SVG и GIF)
npm run smoke # прогон собранного сервера против живого API (нужен токен)Тесты содержат отрицательные контроли на каждый инвариант — то есть могут
упасть на том дефекте, ради которого написаны: на порче идентификатора, на
ошибке с кодом 202, на пустой схеме get, на пропаже службы и на чтении
предупреждений как отказов.
Скилл — работа без MCP
Для агентов, которым MCP не нужен или недоступен:
npx skills add artgas1/yandex-direct-mcpСтавит один канонический экземпляр в .agents/skills/yandex-direct/ и
связывает его с каталогами агентов. Скилл — тонкая надстройка над той же
командой: своей логики у него нет, поэтому расходиться с сервером ему нечем.
Если выбираете между серверами
Серверов к Директу написано много. Полезные вопросы к любому из них — те же,
что перечислены выше: приводит ли суммы из микро-единиц; переживают ли
девятнадцатизначные идентификаторы разбор; считается ли HTTP 200 с телом
error успехом; ждёт ли он отчёт после 201; отличает ли Warnings от
Errors; что делает при опечатке в имени профиля. Ответы стоят одного вызова.
Лицензия
MIT.
Available Tools
13 toolsdirect_adgroups_getadgroups.getARead-onlyIdempotent
Возвращает параметры групп, отвечающих заданным критериям.
Служба adgroups, метод get (чтение). Документация: https://yandex.ru/dev/direct/doc/ru/adgroups/get
| Name | Required | Description | Default |
|---|---|---|---|
| Page | No | объект LimitOffset: Limit, Offset (точная схема: direct_schema с type=LimitOffset) | |
| FieldNames | Yes | 12 значений (Id, CampaignId, Status, Name, …) — полный список: direct_fields | |
| SelectionCriteria | Yes | объект AdGroupsSelectionCriteria: CampaignIds, Ids, Types, Statuses, TagIds, Tags, AppIconStatuses, ServingStatuses, NegativeKeywordSharedSetIds (точная схема: direct_schema с type=AdGroupsSelectionCriteria) | |
| SmartAdGroupFieldNames | No | одно из: FeedId, AdTitleSource, AdBodySource | |
| UnifiedAdGroupFieldNames | No | одно из: OfferRetargeting | |
| MobileAppAdGroupFieldNames | No | одно из: StoreUrl, TargetDeviceType, TargetCarrier, TargetOperatingSystemVersion, AppIconModeration, AppAvailabilityStatus, AppOperatingSystemType | |
| DynamicTextAdGroupFieldNames | No | одно из: AutotargetingCategories, AutotargetingSettings, DomainUrl, DomainUrlProcessingStatus | |
| TextAdGroupFeedParamsFieldNames | No | одно из: FeedId, FeedCategoryIds | |
| DynamicTextFeedAdGroupFieldNames | No | одно из: AutotargetingCategories, AutotargetingSettings, Source, FeedId, SourceType, SourceProcessingStatus | |
| AutotargetingSettingsCategoriesFieldNames | No | одно из: Exact, Narrow, Alternative, Accessory, Broader | |
| AutotargetingSettingsBrandOptionsFieldNames | No | одно из: WithoutBrands, WithAdvertiserBrand, WithCompetitorsBrand |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds little beyond restating that this is a read operation and that results are filtered by criteria; it does not disclose pagination behavior, response shape, or any API-specific quirks.
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 compact and front-loaded with the key purpose. The second sentence restates what the title already conveys, but the documentation link provides useful reference value, so it is not wasted.
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?
This is a fairly complex tool with 11 parameters, nested objects, and no output schema. The rich schema covers parameter semantics well, but the description omits contextual guidance such as pagination usage, the relationship between FieldNames and type-specific field arrays, or what the returned group objects look like.
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 schema already has 100% parameter description coverage, including detailed meaning for SelectionCriteria, FieldNames, Page, and each type-specific field-name array. The description does not need to add parameter detail, so the baseline score of 3 is appropriate.
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 a specific action — returning parameters of ad groups that match given criteria — and identifies the exact API service and method ('Служба adgroups, метод get (чтение)'). This clearly differentiates it from sibling tools for other resources like ads, campaigns, and keywords.
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?
Usage context is implied: an agent can infer this tool should be used when ad group parameters matching selection criteria need to be retrieved. However, there is no explicit guidance about when not to use it or which sibling tool might be better for related operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_ads_getads.getBRead-onlyIdempotent
Служба ads, метод get (чтение). Документация: https://yandex.ru/dev/direct/doc/ru/ads/get
| Name | Required | Description | Default |
|---|---|---|---|
| Page | No | объект LimitOffset: Limit, Offset (точная схема: direct_schema с type=LimitOffset) | |
| FieldNames | Yes | 10 значений (AdCategories, AgeLabel, AdGroupId, CampaignId, …) — полный список: direct_fields | |
| TextAdFieldNames | No | 23 значений (AdImageHash, DisplayDomain, FinalUrl, Href, …) — полный список: direct_fields | |
| SelectionCriteria | Yes | объект AdsSelectionCriteria: Ids, States, Statuses, CampaignIds, AdGroupIds, Types, Mobile, VCardIds, SitelinkSetIds, AdImageHashes, VCardModerationStatuses, SitelinksModerationStatuses, AdImageModerationStatuses, AdExtensionIds (точная схема: direct_schema с type=AdsSelectionCriteria) | |
| ListingAdFieldNames | No | 10 значений (SitelinkSetId, SitelinksModeration, AdExtensions, BusinessId, …) — полный список: direct_fields | |
| ShoppingAdFieldNames | No | 10 значений (SitelinkSetId, SitelinksModeration, AdExtensions, BusinessId, …) — полный список: direct_fields | |
| MobileAppAdFieldNames | No | 10 значений (AdImageHash, Title, Text, Features, …) — полный список: direct_fields | |
| TextImageAdFieldNames | No | одно из: AdImageHash, FinalUrl, Href, TurboPageId, TurboPageModeration, ErirAdDescription, AutogeneratedErirAdDescription | |
| ResponsiveAdFieldNames | No | 14 значений (AdImages, DisplayDomain, Href, SitelinkSetId, …) — полный список: direct_fields | |
| DynamicTextAdFieldNames | No | одно из: AdImageHash, SitelinkSetId, Text, VCardId, AdImageModeration, SitelinksModeration, VCardModeration, AdExtensions | |
| TextAdBuilderAdFieldNames | No | одно из: Creative, FinalUrl, Href, TurboPageId, TurboPageModeration, ErirAdDescription, AutogeneratedErirAdDescription | |
| MobileAppImageAdFieldNames | No | одно из: AdImageHash, TrackingUrl, ErirAdDescription, AutogeneratedErirAdDescription | |
| SmartAdBuilderAdFieldNames | No | одно из: Creative | |
| CpcVideoAdBuilderAdFieldNames | No | одно из: Creative, Href, TurboPageId, TurboPageModeration, ErirAdDescription, AutogeneratedErirAdDescription | |
| CpmVideoAdBuilderAdFieldNames | No | одно из: Creative, Href, TrackingPixels, TurboPageId, TurboPageModeration, ErirAdDescription, AutogeneratedErirAdDescription | |
| CpmBannerAdBuilderAdFieldNames | No | одно из: Creative, Href, TrackingPixels, TurboPageId, TurboPageModeration, ErirAdDescription, AutogeneratedErirAdDescription | |
| MobileAppAdBuilderAdFieldNames | No | одно из: Creative, TrackingUrl, ErirAdDescription, AutogeneratedErirAdDescription | |
| TextAdPriceExtensionFieldNames | No | одно из: Price, OldPrice, PriceCurrency, PriceQualifier | |
| MobileAppCpcVideoAdBuilderAdFieldNames | No | одно из: Creative, TrackingUrl, ErirAdDescription, AutogeneratedErirAdDescription |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description's 'reading' note is consistent with the annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false) but adds nothing beyond them. Annotations already cover the safety profile, so there is no contradiction, but the description provides no extra behavioral context such as pagination, rate limits, or response expectations.
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 visible description is short and front-loaded: one clear sentence plus a documentation link. The leading HTML source comment is irrelevant noise for an agent, which prevents a 5, but there is no other wasted text.
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?
This is a complex 19-parameter tool with nested objects, and there is no output schema to document return values. The description does not mention response shape, how SelectionCriteria interacts with the various type-specific FieldNames arrays, or pagination behavior. The rich schema and annotations prevent a 1, but the description is far from complete on its own.
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 description itself contributes no parameter-level meaning. However, schema description coverage is 100%, with each parameter having an inline description and references to direct_fields/direct_schema, so the schema already carries the parameter semantics. Per the baseline rule, this warrants a 3 rather than a higher score.
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 that this is the ads service's 'get' method for reading, which identifies the verb and resource clearly. It does not explicitly differentiate it from sibling get methods like direct_adgroups_get, but the resource name 'ads' makes the target entity unambiguous.
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 gives no guidance about when to use this tool versus alternatives. It only says it is a read method, which is implied by the annotations and tool name, but it does not mention exclusions, prerequisites, or how it differs from direct_campaigns_get or direct_adgroups_get.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_bidmodifiers_getbidmodifiers.getBRead-onlyIdempotent
Возвращает параметры корректировок, отвечающих заданным критериям.
Служба bidmodifiers, метод get (чтение). Документация: https://yandex.ru/dev/direct/doc/ru/bidmodifiers/get
| Name | Required | Description | Default |
|---|---|---|---|
| Page | No | объект LimitOffset: Limit, Offset (точная схема: direct_schema с type=LimitOffset) | |
| FieldNames | Yes | одно из: Id, CampaignId, AdGroupId, Level, Type | |
| SelectionCriteria | Yes | объект BidModifiersSelectionCriteria: CampaignIds, AdGroupIds, Ids, Types, Levels (точная схема: direct_schema с type=BidModifiersSelectionCriteria) | |
| VideoAdjustmentFieldNames | No | одно из: BidModifier | |
| MobileAdjustmentFieldNames | No | одно из: BidModifier, OperatingSystemType | |
| TabletAdjustmentFieldNames | No | одно из: BidModifier, OperatingSystemType | |
| AdGroupAdjustmentFieldNames | No | одно из: BidModifier | |
| DesktopAdjustmentFieldNames | No | одно из: BidModifier | |
| SmartAdAdjustmentFieldNames | No | одно из: BidModifier | |
| SmartTvAdjustmentFieldNames | No | одно из: BidModifier | |
| RegionalAdjustmentFieldNames | No | одно из: RegionId, BidModifier, Enabled | |
| SerpLayoutAdjustmentFieldNames | No | одно из: SerpLayout, BidModifier, Enabled | |
| DesktopOnlyAdjustmentFieldNames | No | одно из: BidModifier | |
| IncomeGradeAdjustmentFieldNames | No | одно из: Grade, BidModifier, Enabled | |
| RetargetingAdjustmentFieldNames | No | одно из: RetargetingConditionId, BidModifier, Accessible, Enabled | |
| DemographicsAdjustmentFieldNames | No | одно из: Gender, Age, BidModifier, Enabled |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds 'метод get (чтение)' which aligns with readOnlyHint and provides a documentation link, but no additional behavioral traits like pagination or result limits. Given annotation coverage, this is adequate but not rich.
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 two concise sentences plus a documentation link. The main action is front-loaded, with no filler or redundancy. It is appropriately sized for its content.
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 16 parameters, nested objects, and no output schema, the description is too minimal. It does not explain the variety of adjustment types (regional, demographic, etc.) or how criteria interact. An agent would struggle to correctly construct a request without external documentation. The description relies heavily on schema and annotations.
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 description coverage is 100%, so every parameter has at least a terse description (e.g., FieldNames lists possible values). The tool description itself adds no parameter semantics, but the schema carries the load. This meets the baseline for high coverage.
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 tool returns adjustment parameters matching criteria, which is a clear verb+resource. It identifies the service and method (bidmodifiers.get), and the resource is evident from the name. However, it does not explicitly differentiate from sibling getters, though the resource is distinct.
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?
No guidance on when to use this tool versus the other direct_*_get tools. It does not mention alternatives, exclusions, or prerequisites. An agent would need to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_campaigns_getcampaigns.getBRead-onlyIdempotent
Возвращает параметры кампаний, отвечающих заданным критериям.
Служба campaigns, метод get (чтение). Документация: https://yandex.ru/dev/direct/doc/ru/campaigns/get
| Name | Required | Description | Default |
|---|---|---|---|
| Page | No | объект LimitOffset: Limit, Offset (точная схема: direct_schema с type=LimitOffset) | |
| FieldNames | Yes | 22 значений (BlockedIps, ExcludedSites, Currency, DailyBudget, …) — полный список: direct_fields | |
| SelectionCriteria | No | объект CampaignsSelectionCriteria: Ids, Types, States, Statuses, StatusesPayment (точная схема: direct_schema с type=CampaignsSelectionCriteria) | |
| TextCampaignFieldNames | No | 11 значений (CounterIds, RelevantKeywords, Settings, BiddingStrategy, …) — полный список: direct_fields | |
| SmartCampaignFieldNames | No | одно из: CounterId, Settings, BiddingStrategy, PriorityGoals, TrackingParams, AttributionModel, PackageBiddingStrategy, CanBeUsedAsPackageBiddingStrategySource | |
| UnifiedCampaignFieldNames | No | 10 значений (CounterIds, Settings, BiddingStrategy, PriorityGoals, …) — полный список: direct_fields | |
| CpmBannerCampaignFieldNames | No | одно из: CounterIds, FrequencyCap, VideoTarget, Settings, BiddingStrategy | |
| MobileAppCampaignFieldNames | No | одно из: Settings, BiddingStrategy, PackageBiddingStrategy, CanBeUsedAsPackageBiddingStrategySource, NegativeKeywordSharedSetIds, WeeklyBudgetRollover | |
| DynamicTextCampaignFieldNames | No | 10 значений (PlacementTypes, CounterIds, Settings, BiddingStrategy, …) — полный список: direct_fields | |
| TextCampaignSearchStrategyPlacementTypesFieldNames | No | одно из: SearchResults, ProductGallery, DynamicPlaces | |
| UnifiedCampaignSearchStrategyPlacementTypesFieldNames | No | одно из: SearchResults, ProductGallery, DynamicPlaces, Maps, SearchOrganizationList | |
| UnifiedCampaignPackageBiddingStrategyPlatformsFieldNames | No | одно из: SearchResult, ProductGallery, Maps, SearchOrganizationList, Network, DynamicPlaces | |
| DynamicTextCampaignSearchStrategyPlacementTypesFieldNames | No | одно из: SearchResults, ProductGallery, DynamicPlaces |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds 'чтение' (read), which is redundant but consistent. No additional behavioral context (e.g., pagination, auth, rate limits) is provided, but the annotation coverage warrants a baseline score.
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 extremely concise: two sentences with the primary action front-loaded, plus a documentation link. There is no filler or redundant information beyond the necessary context.
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?
With 13 parameters, nested objects, and no output schema, the description is inadequate. It does not explain the overall request/response flow, that FieldNames is required to select fields, or how pagination via the Page object works. While the schema descriptions provide per-parameter detail, the high-level description leaves out essential usage context for an agent to call this tool correctly.
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 description coverage is 100%—every parameter has a detailed description listing allowed values and references to direct_fields. The tool description itself adds no parameter-specific information beyond the general purpose, so it does not exceed the baseline.
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 clearly states it returns campaign parameters matching criteria, with the verb 'Возвращает' (returns) and resource 'кампаний' (campaigns). The resource is unambiguous and distinct from sibling tools like direct_ads_get or direct_adgroups_get, though it doesn't explicitly name alternatives.
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?
There is no guidance on when to use this tool versus alternatives such as direct_ads_get or direct_keywords_get. The description only states what it does, not the context or prerequisites. The documentation link is a resource but not inline guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_catalogЧто ещё умеет серверARead-onlyIdempotent
Перечисляет ВСЕ методы API Директа и показывает, какие из них объявлены сейчас, а какие скрыты и как их включить. Зовите, когда нужного инструмента не видно среди доступных: скорее всего он существует, но не объявлен ради экономии контекста.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is clear. The description adds that it lists both declared and hidden methods and shows how to enable them, which is useful behavioral context beyond the annotations. It doesn't contradict anything.
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 two sentences, front-loaded with the core action ('Lists ALL API methods') and then adds usage guidance and rationale. Every word earns its place; no fluff.
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 tool has no parameters and no output schema. The description tells the agent what it does and when to use it, but doesn't describe the output format. Given the tool's simplicity, this is adequate but could mention the structure of the returned list. Slight gap.
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 coverage is 100% (empty object). Per the rubric, the baseline is 4 for zero-parameter tools. The description doesn't need to add parameter info since there are none, and it doesn't.
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 explicitly states the tool lists ALL API methods of Direct, shows which are declared vs hidden, and how to enable them. It clearly distinguishes from sibling get methods by being the catalog of all methods, not a specific data retriever.
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 gives an explicit trigger condition: 'call when the needed tool is not visible among available ones' and explains that the tool likely exists but is hidden to save context. This tells the agent exactly when to use it, and implicitly when not (when the tool is already visible).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_clients_getclients.getARead-onlyIdempotent
Возвращает параметры рекламодателя и настройки пользователя — представителя рекламодателя либо параметры агентства и настройки пользователя — представителя агентства.
Служба clients, метод get (чтение). Документация: https://yandex.ru/dev/direct/doc/ru/clients/get
| Name | Required | Description | Default |
|---|---|---|---|
| FieldNames | Yes | 21 значений (AccountQuality, Archived, ClientId, ClientInfo, …) — полный список: direct_fields | |
| TinInfoFieldNames | No | одно из: TinType, Tin | |
| ContractFieldNames | No | одно из: Number, Date, Price, Type, ActionType, SubjectType, IsAgencyPayment | |
| ContragentFieldNames | No | одно из: Name, Phone, EpayNumber, RegNumber, OksmNumber | |
| OrganizationFieldNames | No | одно из: Name, EpayNumber, RegNumber, OksmNumber, OkvedCode | |
| ContragentTinInfoFieldNames | No | одно из: TinType, Tin |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds modest context about what data is returned, but does not disclose auth requirements, rate limits, or any behavioral edge cases. No contradiction with annotations.
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 short and front-loaded: the first sentence gives the core purpose. The service/method sentence is partly redundant with the title but adds a read cue, and the documentation link is useful. No unnecessary padding.
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 read-only getter with six well-documented parameter arrays and a pointer to the full field list via direct_fields, the description gives adequate orientation about the intended data. There is no output schema, but the response is essentially the requested fields, so the main gap is more explicit guidance on choosing FieldNames values.
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 description coverage is 100%, with each parameter property documented and allowed values listed. The tool description itself adds no parameter-level meaning beyond the overall return content, so the baseline of 3 applies.
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 uses a specific verb 'Возвращает' (returns), names the resource (advertiser/agency parameters and user settings for the representative), and explicitly labels it as clients.get (read). This is enough for an agent to distinguish it from the sibling *_get tools by resource.
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 implies this tool is for reading client/agency parameters and user settings, and labels it as a read method. However, it does not explicitly say when to prefer it over sibling tools, does not name alternatives like direct_fields for expanding field lists, and gives no exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_dictionaries_getdictionaries.getBRead-onlyIdempotent
Возвращает справочные данные: регионы, часовые пояса, курсы валют, список станций метрополитена, ограничения на значения параметров, внешние сети (SSP), сегменты Крипты для нацеливания по профилю пользователя и др.
Служба dictionaries, метод get (чтение). Документация: https://yandex.ru/dev/direct/doc/ru/dictionaries/get
| Name | Required | Description | Default |
|---|---|---|---|
| DictionaryNames | Yes | 15 значений (Currencies, MetroStations, GeoRegions, GeoRegionNames, …) — полный список: direct_fields |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that it's a read operation ('чтение') and lists the types of data returned, which is useful context. However, it doesn't disclose behavior like pagination, response size, or that DictionaryNames accepts a limited set of values (though the schema mentions 15 values). No contradiction with annotations.
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 concise: two sentences plus a documentation link. The first sentence front-loads the purpose with a clear list of examples. The second sentence identifies the service/method and provides a link. No wasted words, though the list is somewhat long.
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 simple read-only tool with one parameter and full schema coverage, the description is mostly adequate. It explains what data is returned and provides a documentation link. However, it doesn't mention that DictionaryNames values are limited to a specific set (the schema says 'полный список: direct_fields' but doesn't link it), and there's no output schema, so the return structure is not described. The description could be more complete by enumerating valid dictionary names or pointing to the direct_fields tool.
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 description coverage is 100%, so the schema already documents the single parameter DictionaryNames. The description adds context by listing example dictionary names (Currencies, MetroStations, GeoRegions, GeoRegionNames) and mentions '15 значений', but it doesn't fully enumerate the valid values or explain the format. The description adds some value but the schema carries the main burden.
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 clearly states the tool's purpose: it returns reference data (dictionaries) from the Yandex Direct API, listing concrete examples like regions, time zones, currencies, metro stations, parameter restrictions, external networks (SSP), and Crypta segments. It identifies the service and method (dictionaries, get) and provides a documentation link. It doesn't explicitly differentiate from siblings, but the resource (dictionaries) is distinct from the other get_* 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 description implies usage: it's a read-only method for retrieving reference data. It doesn't explicitly state when to use this tool versus alternatives, but the resource name 'dictionaries' and the list of data types make it clear it's for reference data, not for ads, campaigns, or reports. The documentation link provides additional context, but no explicit when/when-not guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_fieldsДопустимые значенияARead-onlyIdempotent
Перечисляет допустимые значения перечисления: колонки отчётов, наборы FieldNames, типы кампаний. Нужен потому, что полные списки в описания инструментов не помещаются. ВАЖНО: список порождён из схемы, а схема отстаёт от живого API — он принимает и то, чего здесь нет. Значение вне списка не считайте недопустимым: право решать за API.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | имя перечисления, например CampaignFieldEnum | |
| search | No | поиск по имени перечисления |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses a critical behavioral caveat: the list is generated from a schema that lags behind the live API, so it may be incomplete, and a value absent from the list must not be treated as invalid. This materially affects agent behavior and is more than the annotations alone provide.
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 short sentences deliver purpose, rationale, and an essential caveat without redundancy. The 'ВАЖНО' marker effectively highlights the one warning the agent must not miss.
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 simple, read-only, idempotent lookup with two optional parameters fully documented in the schema, the description covers what the tool returns, why it exists, and the most important edge case. No output schema is provided, but the nature of the output ('list of valid values') is stated clearly.
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 value by showing what kinds of enumerations can be requested (report columns, FieldNames sets, campaign types), which helps the agent form a valid value for the 'name' parameter beyond the schema's example.
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 opens with a specific verb and resource: 'Перечисляет допустимые значения перечисления' (lists valid values of an enumeration), and names the concrete domains ('колонки отчётов, наборы FieldNames, типы кампаний'). This makes the helper's role clear and separates it from the sibling CRUD/dictionary tools, even without explicitly naming alternatives.
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 'Нужен потому, что полные списки в описания инструментов не помещаются' gives a clear use case: consult this tool when a parameter accepts enumeration values that are too long to be documented inline. It does not name explicit alternatives or when-not-to-use conditions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_inventoryСостав кабинетаARead-onlyIdempotent
Полный состав кабинета: кампании из списка И кампании из отчёта, склеенные в одну таблицу с пометкой источника у каждой строки.
Зовите его вместо campaigns.get, когда нужен ответ на вопрос «что сейчас крутится». Метод campaigns.get не отдаёт кампании Мастера кампаний вовсе — ни списком, ни по явному Ids, и ответ при этом успешный и пустой, то есть отличить «нет такой» от «не показывается» нечем. При этом такая кампания может нести основную долю показов кабинета.
Строки с пометкой «только отчёт» — это как раз они: кампания откручивается, но списком не отдаётся, и управлять ею через API нельзя.
| Name | Required | Description | Default |
|---|---|---|---|
| DateTo | No | YYYY-MM-DD; по умолчанию вчера | |
| DateFrom | No | YYYY-MM-DD; по умолчанию 30 суток назад |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive. The description adds behavioral nuance: it reveals that report-only rows represent campaigns that are running but not listed via API and cannot be managed, which is crucial for an agent to understand the tool's output semantics.
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 moderately long but each paragraph serves a distinct purpose: purpose, usage guidance, and caveat about report-only rows. It is front-loaded with the core function and structured logically, though it could be trimmed slightly without losing value.
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 there's no output schema, the description adequately explains what the tool returns (merged table with source labels) and the key nuance of report-only rows. It also justifies why this tool exists relative to a sibling, providing enough context for correct invocation.
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?
Both parameters are fully documented in the schema with descriptions (DateFrom/DateTo with formats and defaults), so schema coverage is 100%. The description adds no extra parameter information, but the baseline of 3 applies since the schema carries the load.
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 clearly states the tool returns the full cabinet composition by merging campaigns from the list and report, with source labels per row. It explicitly contrasts itself with the sibling campaigns.get, making the purpose and differentiation unambiguous.
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 explicitly instructs to call this tool instead of campaigns.get when needing 'what is currently running', and explains why campaigns.get is inadequate (doesn't return Master Campaigns). This gives clear when-to-use guidance and names the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_keywordbids_getkeywordbids.getBRead-onlyIdempotent
Возвращает ставки для ключевых фраз и автотаргетингов, отвечающих заданным критериям, а также данные торгов: ставки и списываемые цены для различных объемов трафика на поиске и ставки для охвата различных долей аудитории в сетях.
Служба keywordbids, метод get (чтение). Документация: https://yandex.ru/dev/direct/doc/ru/keywordbids/get
| Name | Required | Description | Default |
|---|---|---|---|
| Page | No | объект LimitOffset: Limit, Offset (точная схема: direct_schema с type=LimitOffset) | |
| FieldNames | Yes | одно из: KeywordId, AdGroupId, CampaignId, ServingStatus, StrategyPriority | |
| SearchFieldNames | No | одно из: Bid, AutotargetingSearchBidIsAuto, AuctionBids | |
| NetworkFieldNames | No | одно из: Bid, Coverage | |
| SelectionCriteria | Yes | объект KeywordBidsSelectionCriteria: CampaignIds, AdGroupIds, KeywordIds, ServingStatuses (точная схема: direct_schema с type=KeywordBidsSelectionCriteria) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description only repeats 'чтение' and adds no behavioral details beyond that, such as pagination behavior, rate limits, data freshness, or consequences of omitted parameters.
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 first sentence is dense but informative, covering the core purpose and return data. The second sentence is mostly redundant with the title and annotations, though it adds a documentation link. Overall it is compact and front-loaded, with little wasted wording.
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 captures the tool's core function and high-level return values, which matters because there is no output schema. However, it omits details like pagination/Page behavior, exact output shape for the requested fields, and any error or permission context, leaving a moderately complex 5-parameter tool only minimally complete.
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 description coverage is 100%, so the schema already documents all parameters and their allowed values. The description adds high-level context about returned bid data but does not elaborate on SelectionCriteria, Page, or the field groups beyond what the schema provides, matching the baseline for fully described schemas.
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 starts with a specific verb and resource: 'Возвращает ставки для ключевых фраз и автотаргетингов' (returns bids for keywords and autotargetings), making the tool's function clear. It is distinguishable from sibling tools like direct_keywords_get by the 'keywordbids' resource and the concept of 'ставки', though it does not explicitly name or contrast a sibling.
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 implies when to use the tool: when keyword/autotargeting bids or auction data are needed, and it explicitly labels the method as 'get (чтение)'. However, it gives no exclusions, no prerequisites, and no comparison with alternatives such as direct_keywords_get or direct_bidmodifiers_get.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_keywords_getkeywords.getBRead-onlyIdempotent
Возвращает параметры ключевых фраз или автотаргетингов, отвечающих заданным критериям: значения подстановочных переменных, статус и состояние, статистику показов и кликов и ставки.
Служба keywords, метод get (чтение). Документация: https://yandex.ru/dev/direct/doc/ru/keywords/get
| Name | Required | Description | Default |
|---|---|---|---|
| Page | No | объект LimitOffset: Limit, Offset (точная схема: direct_schema с type=LimitOffset) | |
| FieldNames | Yes | 18 значений (Id, Keyword, State, Status, …) — полный список: direct_fields | |
| SelectionCriteria | Yes | объект KeywordsSelectionCriteria: Ids, AdGroupIds, CampaignIds, States, Statuses, ModifiedSince, ServingStatuses (точная схема: direct_schema с type=KeywordsSelectionCriteria) | |
| AutotargetingSettingsCategoriesFieldNames | No | одно из: Exact, Narrow, Alternative, Accessory, Broader | |
| AutotargetingSettingsBrandOptionsFieldNames | No | одно из: WithoutBrands, WithAdvertiserBrand, WithCompetitorsBrand |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that this is the keywords.get read operation and enumerates the kinds of returned data, but it does not disclose pagination behavior, response envelope, or status-value semantics. No contradiction with annotations.
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 main sentence is front-loaded and efficient, and the documentation link provides practical follow-up. The second sentence 'Служба keywords, метод get (чтение)' is mildly redundant with the tool name and title, but it is short and does not introduce meaningful bloat.
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 read-only getter with 100% schema coverage and strong annotations, the description covers the selection-criteria concept and the main returned fields, while the schema fully documents the nested parameters. It lacks an explicit return-shape description, but that is partly a structural limitation since no output schema is provided.
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 description coverage is 100%, so the schema already documents Page, FieldNames, SelectionCriteria, and autotargeting settings in detail. The description only loosely maps returned content to field values and adds no additional parameter-level formatting or usage detail, which matches the baseline for full schema coverage.
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 clearly states the operation ('Возвращает'), the resource ('ключевых фраз или автотаргетингов'), and the returned data categories (substitution values, status/state, stats, bids). However, it does not explicitly distinguish this from sibling direct_keywordbids_get, which also involves bids, so it is clear but not fully sibling-differentiating.
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?
There is no guidance on when to use this tool versus alternatives such as direct_keywordbids_get or other read tools. The sentence 'Служба keywords, метод get (чтение)' restates the read-only nature but does not provide selection criteria, prerequisites, or explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_reports_getreports.getARead-onlyIdempotent
Статистика: показы, клики, расход, конверсии по кампаниям, группам, объявлениям и запросам. Это основной инструмент счёта.
ВАЖНО о составе кабинета: список кампаний из campaigns.get неполон — кампании Мастера кампаний в него не попадают вовсе, без ошибки и без признака. Отчёт видит всё, что откручивалось, поэтому состав кабинета определяется отсюда, а не из списка кампаний.
Суммы приходят в валюте счёта: сервер запрашивает их у API в рублях, а не в микро-единицах. Документация по полям: https://yandex.ru/dev/direct/doc/ru/reports/fields-list
| Name | Required | Description | Default |
|---|---|---|---|
| Goals | No | идентификаторы целей Метрики | |
| Limit | No | сколько строк вернуть | |
| DateTo | No | YYYY-MM-DD; нужен при DateRangeType=CUSTOM_DATE | |
| Filter | No | условия отбора; всегда массив, даже для одного условия | |
| DateFrom | No | YYYY-MM-DD; нужен при DateRangeType=CUSTOM_DATE | |
| FieldNames | Yes | колонки отчёта; список — direct_fields с service=reports | |
| IncludeVAT | No | YES или NO | |
| ReportType | Yes | одно из: ACCOUNT_PERFORMANCE_REPORT, ADGROUP_PERFORMANCE_REPORT, AD_PERFORMANCE_REPORT, CAMPAIGN_PERFORMANCE_REPORT, CRITERIA_PERFORMANCE_REPORT, CUSTOM_REPORT, REACH_AND_FREQUENCY_PERFORMANCE_REPORT, SEARCH_QUERY_PERFORMANCE_REPORT | |
| DateRangeType | No | одно из: ALL_TIME, AUTO, CUSTOM_DATE, LAST_14_DAYS, LAST_30_DAYS, LAST_365_DAYS, LAST_3_DAYS, LAST_5_DAYS, LAST_7_DAYS, LAST_90_DAYS, … | |
| AttributionModels | No | модели атрибуции; допустимы ТОЛЬКО вместе с Goals, иначе API откажет |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey read-only, idempotent, and non-destructive behavior. The description adds non-obvious behavioral context beyond annotations: Master Campaign campaigns are absent from campaigns.get with no error or marker, the report sees everything that was served, and monetary amounts are returned in account currency (rubles), not micro-units.
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 compact and front-loaded with the core purpose, followed by high-value caveats and a documentation link. Each paragraph earns its place, though the account-composition caveat is somewhat long.
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 tool with ten parameters and no output schema, the description covers the essential context: report scope, account composition caveat, currency behavior, and a link to field documentation. It does not describe response structure or potential async behavior, but the schema and docs link cover most invocation needs.
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 description coverage is 100%, so all ten parameters are already documented in the schema. The description adds useful context about currency for amount fields but does not explain individual parameters; the schema carries the burden, making baseline 3 appropriate.
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 clearly identifies the tool as a statistics report covering impressions, clicks, cost, and conversions across campaigns, ad groups, ads, and queries. It also distinguishes it from campaigns.get by explicitly stating that the report sees the full account composition, while campaigns.get omits Master Campaigns.
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 explicit routing guidance against a named alternative: account composition must be determined from this report, not from campaigns.get, because campaigns.get silently omits Master Campaigns. It also labels the tool as the primary accounting instrument. It does not address every sibling tool, but the key alternative is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
direct_schemaСхема типаARead-onlyIdempotent
Возвращает точный состав типа Директа — какие поля, какие обязательны, какие списки. Нужен перед созданием и изменением объектов: вложенные типы в схемы инструментов не разворачиваются, потому что один только CampaignAddItem это больше тысячи полей.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | имя типа, например CampaignAddItem или KeywordUpdateItem | |
| depth | No | глубина разворачивания, по умолчанию 1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds useful behavioral context: nested types are not expanded in other tool schemas and types can be enormous, which explains why this schema lookup exists. It does not disclose additional runtime behavior such as output shape or limits, so a 3 is appropriate.
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, each earning its place: the first states what the tool returnsconcisely, and the second explains when and why it is needed. No redundant wording or filler.
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 simple, read-only introspection tool with full parameter schema coverage and annotations declaring safety, the description is complete enough to guide correct invocation. It could mention the output format or relationship to direct_fields, but that is not essential for making the call correctly.
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 description coverage is 100%: the 'type' parameter is described with examples and 'depth' is described with a default value. The description adds no parameter-level meaning beyond the schema, so the baseline of 3 applies.
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 uses a specific verb ('Возвращает') and a clear resource ('точный состав типа Директа'), and elaborates on what the result includes: fields, required fields, and lists. It does not explicitly differentiate itself from siblings like direct_fields or direct_catalog, so it stops short of a 5.
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 explicitly states when the tool is needed: 'перед созданием и изменением объектов', and explains the reason — nested types in tool schemas are not expanded because types like CampaignAddItem are very large. It provides clear context but does not give exclusions or name alternative tools.
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.
13 tool updates
v1.1.1- First observed
direct_adgroups_get - First observed
direct_ads_get - First observed
direct_bidmodifiers_get - First observed
direct_campaigns_get - First observed
direct_catalog - First observed
direct_clients_get - First observed
direct_dictionaries_get - First observed
direct_fields - First observed
direct_inventory - First observed
direct_keywordbids_get - First observed
direct_keywords_get - First observed
direct_reports_get - First observed
direct_schema
TDQS
Scored across 13 tools
Each tool targets a specific Direct service (adgroups, ads, campaigns, etc.) with clear descriptions. The only potential overlap is campaigns_get vs direct_inventory, but inventory explicitly explains when to use it instead, so no confusion.
All tools share the direct_ prefix and snake_case. Most use the _get suffix for read operations, but inventory, fields, schema, and catalog deviate from this pattern. Still, the naming is consistent in style and readable.
13 tools is well within the optimal range. Each tool serves a distinct purpose, and the meta tools (schema, fields, catalog) add value without bloat.
The set covers read operations for all major entities and reports, plus meta tools for discovery. However, it lacks create/update/delete operations, making it incomplete for full lifecycle management. The catalog tool hints that other methods exist but are hidden, so the current surface is read-only.
Maintenance
Related MCP Connectors
MCP for Yandex Direct: manage ad campaigns & analytics from Claude or ChatGPT
Google Ads MCP server — manage campaigns, keywords, and metrics.
Read-only Yandex Metrika MCP. Query visits, sources, geo, devices and more in plain language.
Your whole business as one MCP server: analytics, CRM, SEO, ads, revenue. Scoped per data class.
Related MCP Servers
- AlicenseBqualityAmaintenanceEnables managing Yandex Direct PPC campaigns, ad groups, ads, and keywords, plus pulling performance statistics via the Yandex Direct API v5.44118 npm1MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for Yandex Direct, Metrika, Wordstat, and Webmaster APIs, providing 132 tools to manage advertising campaigns, analytics, keyword research, and reporting through any MCP-compatible client.59MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to manage Yandex Direct advertising campaigns, ads, keywords, and reports via natural language using the Yandex Direct API v5.21MIT
- AlicenseAqualityAmaintenanceMCP server that enables natural-language interaction with the Avito Ads advertising API, including campaign, ad group, and creative management, statistics retrieval, fund transfers, and ORD paperwork filing.2573 npmMIT