Skip to main content
Glama
seer22

io.github.seer22/shturman-direct-mcp

by seer22

Shturman Direct MCP

CI License: MIT Python 3.11+ Zero dependencies

An MCP server for Yandex.Direct that knows the platform's rules — field limits, the price of a call in API units, and the places where the API answers success and does something else.

Русская версия — README.ru.md. Where the project stands — docs/SOSTOYANIE.md (Russian).


Why another one

There are already two dozen MCP servers for Yandex.Direct. Nearly all of them are one-to-one wrappers: one tool per API method. This one is built around three things those wrappers do not have.

It knows the traps. 36 recorded cases where Direct returns success and does something else. Counted honestly from the file: 13 are laid out as fields — looks like / danger / the correct way — and 8 of them carry verbatim quotes of the official documentation or live measurements recorded as data; the rest are kept as prose and marked structured: false, because laying them out from memory would mean inventing detail. The limits are held to a stricter bar: every one of the 54 limits carries a verbatim quote. Example: updating a modern combinatorial ad through the legacy TextAd field silently collapses it to a single headline. Six of seven headlines disappear, and the API reports success.

It counts before it spends. An erroneous API call costs 20 units; a blind retry loop burns the daily limit in minutes. The cost is known before the call, not read from a header afterwards.

It cannot start your ads. Starting ad serving, resuming, unarchiving and deleting campaigns are absent — not behind a flag, not behind an environment variable, not at all. The one moderation capability that exists is honest and narrow: ads.moderate sends a draft ad to moderation, because a draft has no manual path whatsoever — State: OFF is a consequence of Status: DRAFT, the interface has no start button for it, and this API method is its only exit (decision R23, 2026-08-25). Starting the campaign remains a person's hand, forever. The full list is the red line below.

That last one is not caution for its own sake. Google's own official Ads MCP server ships no write operations whatsoever; Meta's creates campaigns paused and puts spending behind a separate tool.


Related MCP server: Yandex MCP Server

The red line

Eleven methods this server does not implement, and will not:

campaigns.moderate · campaigns.resume · campaigns.unarchive · campaigns.delete · adgroups.resume · adgroups.unarchive · adgroups.delete · ads.resume · ads.unarchive · keywords.resume · keywords.unarchive

Why absence rather than a flag, in one paragraph: the protocol's own blog says of guards built from settings that "they aren't enforcement", and a client is required to treat server annotations as untrusted. A setting can be flipped, a prompt can be argued with; a capability that is not there cannot be invoked. Most of these methods start money moving or make it able to move; the deletions are on the list for a different reason — they destroy statistics an automatic strategy learned from, and nothing can recreate them. The list itself ships as data (knowledge://red-line), with the reasoning recorded next to each entry.


What it does not do

  • It does not decide what to advertise. Keywords, ad copy, budgets and strategy belong to a separate agent that installs alongside and depends on this server.

  • It does not delete campaigns. A wrong deletion in an account with history is irreversible and erases the statistics an automated strategy learns from.

  • It does not send your token anywhere. The server talks to Yandex and to nothing else. Your OAuth token stays on your machine — this is a property of how it is built, verifiable in the code, not a promise.


Design

  • Zero dependencies. Python standard library only. An OAuth token for an advertising account passes through this process; every transitive package would be a leak channel. The CI file has no install step at all — if one ever appears, the claim is dead and it shows up in the diff.

  • Two-phase writes. plan returns a description and an id. apply accepts only the id and re-reads the plan from disk. The model cannot hand it a request body, because there is no parameter for one.

  • Read-back after every write. A successful response proves nothing here.

  • Reference data as MCP resources, not tools. Tool-selection accuracy degrades past 30–50 tools; neighbours in this niche ship 111 to 155.

  • Knowledge is verifiable without credentials. The official documentation corpus downloads anonymously, so anyone can prove the limits still match Yandex's docs without an account or a key.

Full reasoning: docs/RESHENIYA.md (Russian). Architecture map: docs/ARCHITECTURE.md (Russian).


What it offers

Twelve tools, deliberately few — selection accuracy in a model degrades past 30–50, and servers in this niche ship between 111 and 155:

Tool

direct_status

what is configured, what is known, what will not be done — call it first

direct_read

any reading method, with the cost in units checked before the call

direct_plan

describe a change, get an identifier. Nothing is sent

direct_apply

carry out a plan by identifier only, with a confirmation phrase

direct_report

statistics for a period; dates outside the three-year window are refused, not silently trimmed

direct_audit

the mechanical checklist of the official Direct audit, run locally — 14 read-only settings checks, each naming its source, plus what it deliberately does not check

direct_media_attach

put an image or a video on an existing ad — the whole chain, not one call

direct_wordstat

search demand as a number — the Wordstat API of Yandex Cloud. Spends rubles, not units; tree is free, start with it

direct_metrika

read Metrika: counters, goals, one statistics slice. accuracy=full is sewn in; the current day lags ~2 hours — end the window yesterday

direct_metrika_goals

create the missing goals of a counter, idempotently — goals must exist before the first ad click, retroactive credit does not exist

direct_audience

read Yandex Audience: the login's segments with owner and status, one segment's reach — totals lives in /stat, not in the segment object

direct_audience_segments

create a geo segment from circles — radius in meters, preview first; Direct sees it only after processed and under a different number

What the Metrika half does and does not do: it reads — counters, goals, one statistics slice — and it creates missing goals, idempotently; existing goals are never changed and never deleted, there is no code path that could. Which goals a launch needs and what value each carries is strategy, and strategy deliberately lives outside this server.

Reference data is offered as resources rather than tools, so it costs neither a slot nor a call — fourteen of them:

knowledge://limits · knowledge://traps · knowledge://errors · knowledge://units · knowledge://red-line · knowledge://defaults · knowledge://transitions · knowledge://irreversibles · knowledge://money · knowledge://maintenance · knowledge://feeds · knowledge://wordstat · knowledge://metrika · knowledge://audience


Writing to a live account

🔴 Every write is real. Yandex discontinued the Direct sandbox in July 2026 — the client service answered so in writing, and the entry for error 513 in knowledge://errors records that answer. There is no test account to point this server at: the first write goes to an account with real money.

That is why a write takes two phases and a spoken sentence:

  1. direct_plan turns the intended calls into a stored plan and returns its identifier. Nothing is sent. A plan that writes must also carry verify — reading calls to run afterwards, because in this API a green response does not prove the outcome.

  2. direct_apply takes the identifier and the confirmation phrase, verbatim: carry out plan <id>. To be honest about what holds what here: the real human barrier is the client's own confirmation dialog, because the tool is marked as writing (readOnlyHint: false) and the client asks the person before the call. The phrase is a measure against the model's reflex, not a gate: a model used to setting true without thinking has to produce a sentence instead. The main weight is carried by the mandatory verify — a plan that writes is not stored without read-back calls — and by the plan's one-hour life.

A plan lives one hour. It describes a state of the account that was true when it was built; an hour later it may not be, so a stale plan is refused and a new one is made.


Cassettes: what is written to disk

Exchanges with the API are recorded by default: JSONL, one line per call, one file per day, under var/kassety in the working directory (SHTURMAN_KASSETY_DIR overrides the location). An incident then already has its evidence — the recorder makes material a by-product of work.

What a line holds: service, method, request params, the answer, the Units header, timing, and the author label from SHTURMAN_KASSETA_AVTOR. What it can never hold: HTTP headers are not recorded at all, and the credential exists only in the Authorization header — the same rule the logs follow, where redaction.py strips credential-shaped strings when a record is built, not when it is printed. Long base64 fields (*Data — image and video uploads) are replaced with a length marker. A recording failure never breaks the live call.

Note that the cassette is account data at rest on your disk: campaign structures and report rows land in those files. They stay in the advertiser's working directory and are never sent anywhere. To not record at all, set SHTURMAN_BEZ_KASSET=1.


Environment variables

All twelve, in one place. The environment overrides the token file: when a token variable is set, the file is not read at all.

Variable

Meaning

SHTURMAN_DIRECT_TOKEN

OAuth token for Direct. Takes precedence over the stored token file

SHTURMAN_METRIKA_TOKEN

OAuth token for Metrika. Same precedence

SHTURMAN_AUDIENCE_TOKEN

OAuth token for Yandex Audience. Same precedence

SHTURMAN_SEARCHAPI_TOKEN

Api-Key of a Yandex Cloud service account, for Wordstat. Same precedence

SHTURMAN_SEARCHAPI_FOLDER_ID

id of the Yandex Cloud folder every Wordstat call bills to — an address rather than a secret, but required

SHTURMAN_DIRECT_CLIENT_ID

client id of your own registered OAuth application for Direct — login needs it; registration steps in docs/TOKENY.ru.md

SHTURMAN_METRIKA_CLIENT_ID

the same for Metrika

SHTURMAN_AUDIENCE_CLIENT_ID

the same for Audience — its application needs only the two Audience checkboxes, and no access request exists for this API

SHTURMAN_PLANS_DIR

where write plans are stored (default: var/plans in the installation tree — set it for installed copies)

SHTURMAN_KASSETY_DIR

where cassettes are written (default: var/kassety under the working directory)

SHTURMAN_KASSETA_AVTOR

author label recorded in each cassette line — tells the agent's calls from the operator's

SHTURMAN_BEZ_KASSET

1 turns cassette recording off

Separately: the standard OS variables XDG_CONFIG_HOME (macOS, Linux) and LOCALAPPDATA (Windows) move the directory where the token file lives — they are not this server's variables, but they change where it looks.

OAuth applications. CLIENT_IDS in the source are empty by design and stay that way (decision R30): the publisher registers no applications and takes part in no access contour — the server is fully self-hosted. login takes SHTURMAN_DIRECT_CLIENT_ID / SHTURMAN_METRIKA_CLIENT_ID / SHTURMAN_AUDIENCE_CLIENT_ID, the client id of an application you registered at oauth.yandex.ru yourself. A client id is public by construction; there is no client secret anywhere — the PKCE flow needs none.


Install

Nothing to build and nothing to install: the server is Python standard library only, so a clone is a working copy.

git clone https://github.com/seer22/shturman-direct-mcp.git
cd shturman-direct-mcp
python3 -m unittest discover -s tests -t .     # optional, a few seconds

1. Get the documentation it checks itself against — no account needed:

python3 -m shturman_direct docs --fetch
python3 -m shturman_direct docs
# 54 limits, 254 citations across 9 knowledge files, 92 pages — all present and consistent.

Hit a 429 or a network error — wait and re-run the same command; without the downloaded corpus the citation checks are honestly marked as skipped, which is not a breakage.

2. Store a credential for your Direct account. The browser login flow has one prerequisite: the client id of your own OAuth application. Register it first, then run the command.

Registering your own OAuth application — one form, once. This is the product's model, not a stopgap: the server is fully self-hosted, and no publisher application will ever ship (decision R30):

  1. Open oauth.yandex.ruCreate application.

  2. Type — "for API access". The type cannot be changed later: a mistake means registering again.

  3. Permissions: for Direct — direct:api and passport:business; for Metrika — a separate application with metrika:write; for Audience — a third separate application with exactly the two Audience checkboxes. Separate for a reason: changing an application's scopes revokes every token it has ever issued, so no two services may share one.

  4. Redirect URI — https://oauth.yandex.ru/verification_code: Yandex's own page that shows the confirmation code, which is what makes a console login possible.

  5. The ClientID from the application page goes into SHTURMAN_DIRECT_CLIENT_ID (for Metrika — SHTURMAN_METRIKA_CLIENT_ID). The application secret is needed nowhere: the PKCE flow does without one.

Now the login itself:

export SHTURMAN_DIRECT_CLIENT_ID="<ClientID from the application page>"
python3 -m shturman_direct login direct

It prints a URL, you press Allow, Yandex shows a short code, you paste it back. The token is stored under your user configuration directory, readable by you only. It is never passed through a conversation and never leaves the machine. Already holding a token — a debug one, or one issued for another tool? Then:

python3 -m shturman_direct login direct --paste

takes it directly: hidden input, nothing on screen and nothing in the shell history — an equal path, not a workaround, and the one that needs no client id at all. The same command with metrika, audience and searchapi stores the other three contours (searchapi is always the paste path — an Api-Key has no OAuth flow). Every variable in one place: Environment variables.

What is needed from you, per contour — the full walkthrough, every rake named, is docs/TOKENY.ru.md (Russian):

  • Direct — your own OAuth application, and your own access request to the Direct API, filed in the account's API settings for that application — a ready-to-paste template lives in docs/TOKENY.ru.md; review takes 1–7 working days, and API error 58 means "not approved yet", not "broken". Plus an active account with at least one campaign in it (without one, Yandex does not even open the API settings page), and the API user agreement accepted on that page, by hand.

  • Metrika — your own separate application with metrika:write (no access request exists for Metrika at all). Reading needs any view access to the counter; creating goals needs a role of editor or higher on the counter itself. The application's metrika:write scope and the counter role are different things: a write token under a viewer role gets 403.

  • Audience — a third separate application with exactly the two Audience checkboxes, nothing else; no access request exists here either — the token works at once. Issue it under the login that owns the Direct account: segments bind to the login, and one made under another login never appears in Direct at all.

  • Cloud (Wordstat) — a separate Yandex ID, a billing account with a card attached at creation, an Api-Key with the yc.search-api.execute scope, and the folder id from the console address bar. These calls spend rubles, not units; the checklist with the reason behind every step is in the same document.

3. Point your client at it. The client starts from anywhere, not from the clone, so the path to the clone goes straight into the connect command — a PYTHONPATH buried lower in a config is the single most common way this install fails.

Claude Code — one line, run from the clone directory:

claude mcp add shturman-direct -e PYTHONPATH="$PWD" -- python3 -m shturman_direct.mcp.server

or .mcp.json in your project (the path is absolute, to your clone):

{
  "mcpServers": {
    "shturman-direct": {
      "type": "stdio",
      "command": "python3",
      "args": ["-m", "shturman_direct.mcp.server"],
      "env": {"PYTHONPATH": "/absolute/path/to/shturman-direct-mcp"}
    }
  }
}

Claude Desktop — claude_desktop_config.json:

{
  "mcpServers": {
    "shturman-direct": {
      "command": "python3",
      "args": ["-m", "shturman_direct.mcp.server"],
      "env": {"PYTHONPATH": "/absolute/path/to/shturman-direct-mcp"}
    }
  }
}

Codex — ~/.codex/config.toml or .codex/config.toml:

[mcp_servers.shturman-direct]
command = "python3"
args = ["-m", "shturman_direct.mcp.server"]
env = { PYTHONPATH = "/absolute/path/to/shturman-direct-mcp" }

🔴 The env block carries PYTHONPATH and never a token. Putting a token in a client config is how credentials leak in this ecosystem — tens of thousands have been found in MCP configuration files on public GitHub. This server reads its own file.

4. Check it answers, without a client:

python3 -m shturman_direct.mcp.server --list

Security

The server runs locally with your permissions and holds a credential for an account that spends money. Please read SECURITY.md before installing.

License

MIT — see LICENSE.

Available Tools

11 tools
direct_applyCarry out a planA

Perform the calls of a plan made earlier. Takes the plan identifier and a confirmation phrase — and nothing else.

This changes a live advertising account: Direct's sandbox is off unless switched on in the account, so a first write is real. There is no transaction, so a failure halfway leaves a partial state, and the tool says so.

It cannot start ads or unarchive: those methods are absent from this server.

ParametersJSON Schema
NameRequiredDescriptionDefault
plan_idYesidentifier returned by direct_plan
confirmationNothe exact phrase the refusal asks for

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavioral context beyond the annotations: changes a live advertising account, sandbox is off by default, no transactionality, and partial-state failures are reported. Also discloses absent capabilities. No contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by critical side effects and limitations. Each sentence earns its place; minor redundancy like 'the tool says so' is acceptable but not maximally crisp.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, inputs, real-world mutating effects, failure behavior, and unsupported operations. It does not describe the response format, but for an action-oriented tool with no output schema the missing return-value detail is a relatively minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both parameters already described in the input schema. The description reinforces that only the plan ID and confirmation phrase are accepted, but it does not add meaningful semantic detail beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states a specific verb and resource: 'Perform the calls of a plan made earlier.' It is easily differentiated from siblings like direct_plan (which creates the plan) and read-only tools like direct_read or direct_status, and it explicitly notes what it cannot do (start ads or unarchive).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool should be used after a plan has been made earlier and clarifies its limited scope ('and nothing else'). It also states exclusions (cannot start ads or unarchive), though it does not name specific alternative sibling tools for those actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

direct_audienceRead Yandex Audience: segments and reachA
Read-onlyIdempotent

The Yandex Audience API, reading only. Two actions: 'segments' lists the segments of the token's login — each with its owner and status (is_processed while counting, processed when ready); 'stat' answers one segment's reach and affinity — totals lives HERE, not in the segment object, and no_data=true means the segment is still counting, so its zero measures nothing.

🔴 Direct sees ONLY processed segments, and under a DIFFERENT number than the Audience id — a retargeting condition is verified by reading retargetinglists, never by computing (knowledge://audience).

Needs its own credential — a token of your own application with the two Audience checkboxes; no access request exists for this API: python -m shturman_direct login audience. Creating segments is a write and lives in direct_audience_segments.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYessegments: what the login holds; stat: one segment's reach (totals) and affinity
segment_idNonumeric Audience segment id. Required for stat

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint, but the description goes well beyond by explaining that only processed segments are visible, that IDs differ from Audience ids, that no_data=true means counting is incomplete, and that totals live in the stat response rather than the segment object. These are non-obvious behaviors an agent needs to interpret results correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence carries essential information: action semantics, tricky data-status behavior, ID mismatch warning, credential requirements, and sibling routing. It is front-loaded with the core purpose and reads in a logical flow without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description sufficiently explains the return semantics for both actions, including status values, no_data behavior, and where totals live. It also covers prerequisites, credentialing, and the alternative tool for writes, making the definition complete for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100% with enum and descriptions for both parameters, so the baseline responsibility is already met. The description adds meaningful context by clarifying what each action does with the parameters and explaining that stat requires segment_id and that totals appear in the stat response, not the segment object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly names the API, states it is read-only, and enumerates two actions with specific verbs: 'segments' lists segments and 'stat' answers reach/affinity. It also distinguishes itself from the write sibling direct_audience_segments, so an agent can immediately tell what this tool is and is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states when to use the tool: for reading audience segments and stat data. It explicitly routes the write case to direct_audience_segments, warns that retargeting conditions should be verified via retargetinglists rather than computation, and provides the required credential setup command.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

direct_audience_segmentsCreate a geo segment from circlesA

Create ONE geo segment in Yandex Audience from CIRCLES — the one create path measured live. Polygons are recorded as knowledge only (knowledge://audience) and deliberately not implemented: their shape was never probed against the live service.

Radius is METERS, 500..10000 — the unit is proven by a two-sided probe; kilometers here would draw 500 km circles. A segment holds up to 1000 points, a 'condition' segment up to 100 (a limit bought by a live refusal), and 'condition' requires both period_length and times_quantity. Everything checkable is checked BEFORE the network, because the service's wrapper refusal masks every other complaint.

Called without a confirmation it answers a preview. After creating, the list is read back with the status — Direct sees the segment only after processed, and under a DIFFERENT number: verify by reading retargetinglists.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesthe segment's name — it appears in the confirmation phrase and on the card
pointsYescircle centers: objects with latitude, longitude and an optional description. At most 1000; for geo_segment_type='condition' at most 100
radiusYescircle radius in METERS, 500..10000 — one radius for the whole segment
confirmationNothe exact phrase the preview asks for
period_lengthNodays, 1..90. condition only, required there
times_quantityNodays the person was inside, <= period_length. condition only, required there
geo_segment_typeYesmeasured list — no page names it. regular: regularly visits, lives or works (45 days); condition: was there N days over a period; last: is there now; work and home are legacy

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses substantial behavior beyond the annotations: radius units are 'proven by a two-sided probe', limits are 'bought by a live refual', and the service's wrapper refual 'masks every other complaint'. It also explains preview behavior without confirmation and that the segment appears under a DIFFERENT number after processing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and every paragraph covers a distinct concern: scope, limits/validation, and post-create verification. It is longer than minimal but the density of operationally valuable detail justifies the length, though some provenance details like 'two-sided probe' could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description explains what to expect: a preview without confirmation, a confirmation phrase, and a post-create readback with status and a different number. It also covers point limits, radius bounds, and condition requirements, leaving no critical gap for invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description reinforces radius units in METERS and that condition requires both period_length and times_quantity, but does not add significant meaning beyond the schema's own parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Create ONE geo segment in Yandex Audience from CIRCLES'. It explicitly distnguishes the tool from polygons by stating they are 'deliberately not implemented', making the tool's scope unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for when to use the tool: the live measured create path from circles, not polygons, and when 'condition' segments require extra parameters. It also advises verification after creation via reading retargetinglists, but does not explicitly name sibling tools as alternatives, so it falls just short of full 1.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

direct_media_attachPut an image or a video on an adA

Attach local images or videos to an existing ad, doing the whole chain rather than one call.

A video takes three steps: uploading it puts it in the media library and nothing else, a creative has to be made from it, and only then can it go on the ad. Every step reports success on its own, which is why this is one tool.

Updating an ad also means resending its headlines and texts unchanged — the account requires them even when only a video changes, although the documentation does not say so. This tool reads the ad first and does that for you, and it never sends the legacy field that would collapse the ad to a single headline.

It reads the ad back afterwards and shows the headline count.

ParametersJSON Schema
NameRequiredDescriptionDefault
ad_idYesthe ad to attach to
imagesNoobjects with path, and optionally type (REGULAR, WIDE, FIXED_IMAGE, AUTO) and name
videosNoobjects with path, and optionally name
confirmationNothe exact phrase the refusal asks for

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral context beyond the annotations: the three-step video flow, the fact that every step reports success independently, the undocumented requirement to resend headlines/texts when updating an ad, the tool's behavior of reading the ad first, its avoidance of a legacy collapsing field, and its post-operation readback. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then uses each subsequent paragraph to explain non-obvious behavior that materially affects how an agent invokes the tool. The length is justified by the complexity of the operation, and there is no filler or repetition that weakens it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-step mutation with no output schema, the description covers the workflow, hidden API requirements, safety around the legacy field, and the final headline-count readback. The main gap is that the 'confirmation' parameter is not explained in context—an agent still does not know when a refusal occurs or when confirmation must be supplied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds minimal per-parameter detail: it clarifies that images and videos are local path-based files, but it does not explain when 'confirmation' would be needed or what triggers the refusal. The schema already carries most of the parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Attach local images or videos to an existing ad'. It also distinguishes the tool by saying it does 'the whole chain rather than one call', so an agent can tell this is a high-level composite operation rather than a single upload/update call.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is clear from the opening sentence: use this tool when attaching local media to an existing ad. It explains that videos require a three-step chain and that this tool handles it in one call, which implicitly guides an agent away from doing separate upload/create/attach calls. It does not name explicit alternative tools or exclusions, 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_metrikaRead Metrika: counters, goals, statisticsA
Read-onlyIdempotent

The Yandex Metrika API, reading only. Three actions: 'counters' lists the counters this token can see; 'goals' lists one counter's goals; 'stat' answers one statistics slice — dimensions and metrics travel to the API as the ym:* names you write, and accuracy=full is sewn in because the service default is SAMPLING, on which a rare conversion rounds to zero while the report looks ordinary.

🔴 Data arrives with a lag of about 2 hours: the current day is underfilled, and judging it has produced wrong conclusions twice in a row. End the window yesterday.

Needs its own credential, not the Direct one: python -m shturman_direct login metrika. Creating goals is a write and lives in direct_metrika_goals.

ParametersJSON Schema
NameRequiredDescriptionDefault
date1NoYYYY-MM-DD. stat only, required there — explicit on purpose
date2NoYYYY-MM-DD. stat only, required there. Make it yesterday: the current day is underfilled by about 2 hours
limitNorows to return, default 200
actionYescounters: what the token sees; goals: one counter's goals; stat: one statistics slice
counterNonumeric counter id. Required for goals and stat
filtersNoMetrika filter expression, optional
metricsNoym:* metric names, passed through as written, e.g. ym:s:visits. Required for stat
dimensionsNoym:* dimension names, passed through as written, e.g. ym:s:trafficSource

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses non-obvious behavioral traps: accuracy=full is forced because the service default is SAMPLING, data lags about 2 hours and the current day is underfilled, and the tool needs its own Metrika credential rather than the Direct one. This is exactly the context annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and each section earns its place with practical warnings. It is slightly redundant with the schema's date2 and action descriptions, but the critical caveats justify most of the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-action API with 8 parameters and no output schema, the description provides the essential surrounding context: authentication, read-only scope, sampling behavior, data lag, and the write alternative. Combined with the detailed schema, an agent has enough to select the right action and call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The main description mostly restates what the schema already says, such as action meanings, ym:* names passed through as written, and the date window advice. The accuracy=full detail is valuable but functions more as behavioral context than a parameter-semantics addition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title and first sentence define the tool as 'The Yandex Metrika API, reading only' with three explicit actions. It clearly distinguishes the read scope from the write sibling direct_metrika_goals, so an agent can tell this tool apart immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete per-action guidance, warns to end date windows yesterday because of the 2-hour data lag, and explicitly says creating goals is a write that belongs in direct_metrika_goals. It also explains the separate credential requirement, leaving little ambiguity about when and how to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

direct_metrika_goalsCreate the missing goals of a counterA
Idempotent

Create JavaScript-event goals in one Metrika counter, idempotently: what the counter already has is checked by the event identifier first, only the missing goals are created, and the existing ones are never changed and never deleted. After creating, the counter is read back — a goal the read-back does not show is an error, not a footnote.

🔴 Goals must exist BEFORE the first ad click: retroactive credit does not exist in Metrika, and a duplicate goal is worse than a missing one — an autostrategy learns on doubled counts.

Called without a confirmation it answers a preview: ✓ already exists / + will be created. The confirmation phrase names the counter, so a write aimed at the wrong counter is caught at the moment of confirming.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalsYesobjects with event (the identifier the site sends, verbatim) and name (what the goal is called in Metrika)
counterYesnumeric counter id — it appears in the confirmation phrase
confirmationNothe exact phrase the preview asks for

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses the idempotency check by event identifier, the read-back validation with explicit error semantics, the preview behavior, and the confirmation phrase safety mechanism. These are meaningful behavioral details that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core operation and every subsequent sentence adds distinct value: idempotency behavior, read-back validation, timing warning, preview behavior, and confirmation safety. No sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description clearly explains both preview output and error semantics after read-back. Combined with full schema coverage and annotations, an agent has enough to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 useful semantics for confirmation (preview without it, and it names the counter) and for counter (numeric id), which improves parameter understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: "Create JavaScript-event goals in one Metrika counter." It further distinguishes itself from siblings by emphasizing idempotent creation of only missing goals, which is unique among the direct_* family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational context: goals must exist before the first ad click, and calling without confirmation yields a preview. It does not explicitly name alternatives or when-not-to-use, but it supplies enough context for an agent to recognize when this tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

direct_planDescribe a change without making itA
Read-only

Turn a list of intended API calls into a plan and return its identifier. Nothing is sent. The plan lists what would run and what it would cost in units.

Use this for every change. direct_apply accepts only an identifier and has no parameter for a request body, so the change that was read is the change that runs.

A plan that writes must also carry 'verify' — reading calls to run afterwards. This API reports success and sometimes does something else; without a read-back the outcome is unknown.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNowhy this change
callsYesobjects with service, method and params
verifyNoreading calls to run after the change, same shape as 'calls'. Required when the plan writes: a successful response does not prove the outcome in this API.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint: true, but the description adds substantial behavioral context beyond that: 'Nothing is sent,' the plan costs units, and a write plan must include read-back verification because 'a successful response does not prove the outcome in this API.' This goes far beyond what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then gives usage direction, then addresses a critical verification caveat. Every sentence contributes meaningful guidance without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a tool with no output schema and only three parameters. It explains the returned identifier, the planning-only behavior, the cost disclosure, and the verify requirement, so an agent has enough context to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description reinforces the purpose of 'calls' and emphasizes the 'verify' requirement, but it does not add significant parameter-level details beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Turn a list of intended API calls into a plan and return its identifier.' It clearly states the tool's non-executing nature with 'Nothing is sent,' and contrasts itself with direct_apply, making sibling differentiation explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this for every change' and explains why direct_apply cannot be used for raw requests because it 'accepts only an identifier and has no parameter for a request body.' It also gives conditional usage guidance: plans that write must carry 'verify' calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

direct_readRead from the accountA
Read-onlyIdempotent

Call any reading method of the Direct API v501 — campaigns.get, ads.get, keywords.get and so on — and get the result. Refuses anything that changes state: those go through direct_plan and direct_apply.

Cost in API units is checked before the call, not read from a header afterwards. Read knowledge://traps first: several read methods return an empty-looking answer unless the right field names are asked for, which looks like 'nothing was saved'.

Easy to miss: keywordsresearch.hassearchvolume answers whether a phrase has search demand (a boolean, not a figure), and dictionaries.get returns the reference books — regions and minimum bids among them.

ParametersJSON Schema
NameRequiredDescriptionDefault
methodYesa reading method, usually 'get'
paramsNothe params object of the API call
serviceYescampaigns, ads, adgroups, keywords, …
client_loginNoRead an account this login represents rather than its own. Reading only: the tools that change something have no such parameter, so a write cannot be aimed at another account by passing a string.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and idempotentHint annotations, the description discloses that cost is checked before the call, that state-changing calls are refused, and that some read methods return misleadingly empty-looking results without the right field names. It also flags return-type quirks for specific methods.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: the core call pattern and write exclusion come first, followed by cost semantics and known traps. It is dense but well organized, with no repetition of schema fields or annotation details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an open-world read wrapper with no output schema, the description covers invocation, refusal behavior, cost semantics, and the most common empty-result traps. It also tells the agent to read knowledge://traps first, which is the right pre-flight step for this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers all four parameters at 100%, so the baseline is 3. The description adds value by giving dotted method examples such as keywordsresearch.hassearchvolume, extra service names like dictionaries, and clarifying the meaning or shape of results for those calls.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool calls any reading method of Direct API v501, gives concrete examples like campaigns.get, ads.get, and keywords.get, and distinguishes itself by refusing state-changing operations. It clearly separates this tool from write-capable siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear when-to-use rule: call it for any reading method. It also gives an explicit when-not-to-use rule: state changes go through direct_plan and direct_apply. The pointer to knowledge://traps before use is additional concrete guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

direct_reportStatistics for a periodA
Read-onlyIdempotent

Ask for a report and get its rows. Reports cost no API units, which makes them always cheaper than rebuilding the same numbers from object calls.

🔴 The period is checked before the request. Yandex keeps about three years of statistics and the boundary slides forward on the first of every month — and a request reaching past it does NOT fail. It returns the part that still exists, labelled with the dates you asked for, and nothing says it was cut. This tool refuses instead, and names the boundary.

Dates are explicit rather than relative, so the same request means the same thing tomorrow.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
goalsNogoal ids; at most ten per report
fieldsYescolumns, e.g. CampaignName, Clicks, Cost
date_toYesYYYY-MM-DD
filtersNo
date_fromYesYYYY-MM-DD
include_vatNo
report_typeNoe.g. CAMPAIGN_PERFORMANCE_REPORT, SEARCH_QUERY_PERFORMANCE_REPORT
client_loginNoReport on an account this login represents rather than its own. Reading only, like direct_read.

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, and idempotent. To that the description adds effective non-annotation behavioral context: reports cost no API units, the tool checks the requested period and refuses requests past the rolling three-year boundary instead of returning a silently cut subset, and dates are explicit so the same request remains stable. No contradiction with annotations; this goes well beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is reasonably concise and front-loads the core purpose in the first sentence. The second paragraph is longer but earns its place by warning about the exact boundary behavior, which is critical for correct invocation. It could be slightly tighter, but every part contributes meaningfully.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the most important behavioral caveat and the cost advantage, and the schema covers several parameters. However, there is no output schema and the description does not describe what the returned rows look like, nor does it clarify several parameters such as filters, name, or include_vat. For a tool with 9 parameters, this is functional but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, so the schema already handles many parameters such as date formats, fields examples, report_type examples, and client_login behavior. The description adds general date semantics ('Dates are explicit rather than relative') and the period-boundary rule, but it does not explain underdocumented parameters like name, filters, or include_vat. This is adequate but not a strong compensation for the remaining gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the verb and resource: 'Ask for a report and get its rows.' It identifies the tool as a report-generation operation and distinguishes it at a high level from object calls by emphasizing that reports return prebuilt rows and cost no API units. It does not explicitly name a sibling tool, but the purpose is still specific and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: when you need report rows rather than rebuilding numbers from object calls, since reports are cheaper. It also explains the date boundary behavior, telling the agent that requests reaching past available statistics will be refused rather than silently truncated. It does not explicitly enumerate alternatives or exclusion conditions, 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_statusState of this installationA
Read-onlyIdempotent

Where things stand: which credentials are configured, what this server knows and when it was measured, and what it will not do. Call this first in a session — it says what is possible before anything is attempted.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly and idempotent annotations, the description adds that the tool exposes limitations ('what it will not do') and reports how fresh the information is ('when it was measured'). This is useful behavioral context and does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences front-load the core meaning ('Where things stand') and then enumerate the report's scope. There is no filler, redundancy, or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only status tool, the description is complete: it says why to call it, what it covers, and what limits it will communicate. The annotations already cover safety, so no additional behavioral detail is required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero properties, so there are no parameter semantics to explain. The description appropriately focuses on what information the tool returns rather than parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool reports: configured credentials, what the server knows, when it was measured, and what it will not do. This distinguishes it from the action-oriented sibling tools such as direct_read and direct_apply.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs the agent to call this first in a session, before anything is attempted. It establishes a clear usage context, though it does not name alternative tools or specify when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

direct_wordstatSearch demand as a numberA
Read-onlyIdempotent

Frequency of search phrases from the Wordstat API (Yandex Search API v2, Yandex Cloud — not the Direct API). Methods: 'top' — a phrase's frequency plus phrases containing it; 'dynamics' — demand over time; 'regions' — distribution across the world; 'tree' — the region code tree.

🔴 A call spends REAL MONEY from the cloud folder, not Direct API units: top and dynamics ~0.02 rubles each, regions ~0.05. 'tree' is FREE — start with it, both to take region codes from and to prove the credential works at no cost. The real bottleneck is the quota of 100 calls per sliding hour; it is seized locally BEFORE the network, and an exhausted quota is refused with the wait named.

Needs its own credential — a Yandex Cloud Api-Key and folder id: python -m shturman_direct login searchapi.

ParametersJSON Schema
NameRequiredDescriptionDefault
methodYestop: frequency + containing phrases; dynamics: demand over time; regions: worldwide distribution (2.5x the price); tree: region codes, free
periodNodynamics granularity, default PERIOD_MONTHLY. Weekly and monthly boundaries must land on Monday/Sunday or the first/last day of the month — checked locally, before paying
phraseNothe mask. Required for every method except tree. Search operators (quotes, !, +, -, [], (), |) work and give the EXACT frequency in the same call
devicesNodevice filter, at most 3 entries
regionsNoregion codes as STRINGS, not numbers: ["1"], never [1]. ⚠️ The codes in the documentation are CITIES, not federal subjects — take codes from method=tree and check each by name. top and dynamics only
to_dateNoYYYY-MM-DD. dynamics only
from_dateNoYYYY-MM-DD. dynamics only, required there
num_phrasesNohow many containing phrases 'top' returns, 1..2000 (default 50). More phrases deepen the same mask — they do not widen coverage

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/openWorld/idempotent annotations, the description adds critical behavior: each call spends real money from the cloud folder, exact costs per method, tree is free, quota is 100 calls per sliding hour, quota is reserved locally before the network call, and exhaustion returns a named wait. This is genuinely valuable transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: source and methods, cost and quota warning, and credential setup. No filler; the most important operational warnings are front-loaded and bolded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an expensive, quota-limited, 8-parameter tool with no output schema, this description is complete enough: it explains method-specific return concepts, costs, quota behavior, credential prerequisites, and a safe free first call. Combined with the rich schema, an agent has what it needs to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 prose repeats method outcomes that the schema already describes and does not add parameter-level meaning beyond what the schema provides. The schema already documents region codes as strings, date formats, device limits, and num_phrases bounds.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the Wordstat API (Yandex Search API v2, Yandex Cloud) and explicitly distinguishes it from the Direct API. It lists four concrete methods with different purposes, so an agent knows exactly what the tool does and how it differs from the direct_* siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It says when to use the tool (search demand), which method to start with (tree, free and safe), warns about real-money costs, and explains the separate credential requirement. It also explicitly states this is not the Direct API, giving a clear exclusion versus sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4.4/5.0
Disambiguation5/5

Each tool targets a distinct operation or API: status, Wordstat, Direct read/plan/apply/report, media attach, and separate Metrika and Audience read/write pairs. The two-phase plan/apply design and explicit credential separation make misselection unlikely.

Naming Consistency4/5

All tools share the direct_ prefix and snake_case, which gives the set a recognizable family resemblance. However, the second part mixes nouns, verbs, and domain suffixes—read/plan/apply versus status/wordstat/metrika_goals—so it is not a strict verb_noun pattern.

Tool Count5/5

11 tools is well within the appropriate range for a server spanning Direct, Wordstat, Metrika, and Audience. Each tool covers a broad surface—direct_read alone handles all reading methods—so none feels redundant or superfluous.

Completeness3/5

The set provides read, write, report, and media paths across several APIs, and the direct_plan/direct_apply pattern covers arbitrary Direct writes. However, starting ads and unarchiving are explicitly absent, and Audience/Metrika writes are limited to one goal type and one geo-segment path, leaving notable lifecycle gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP 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.
    59
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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
  • A
    license
    B
    quality
    D
    maintenance
    MCP server for the Meta Marketing API with 118 typed tools across ads, insights, pixels/CAPI, pages, Instagram, WhatsApp, catalogs, audiences, leads, and billing, featuring secure token storage and a confirmation gate on destructive calls.
    100
    1
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    An MCP server for Yandex Direct advertising API, providing ~80 tools to view and modify campaigns, keywords, budgets, and stats with safe write access.
    80
    20
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/seer22/shturman-direct-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server