yandex-metrica-mcp
This server exposes 13 MCP tools for the Yandex Metrica Reporting API, Logs API, and counter management — 8 read-only, 5 that modify your account.
List and inspect counters —
yandex_metrica_list_counters(with paging, sort, and filters by type/status/search) andyandex_metrica_get_counterfor one counter's settings, owner, timezone, and site.Inspect conversion goals —
yandex_metrica_list_goalsreturns the goal ids and types configured on a counter.Run aggregated reports —
yandex_metrica_get_reportqueries the Reporting API for visits, users, bounce rate, traffic sources, etc., with dimensions, metrics, filters, sorting, sampling accuracy, attribution, and period comparison viadate1_b/date2_b.Evaluate and create raw exports —
yandex_metrica_evaluate_logs_requestchecks feasibility/quota without creating anything, thenyandex_metrica_create_logs_requeststarts an async export of visits or hits for a date range.Track and download exports —
yandex_metrica_list_logs_requestsandyandex_metrica_get_logs_requestshow request status and parts;yandex_metrica_download_logs_partfetches a part as TSV (50KB preview by default, or full content).Manage export lifecycle —
yandex_metrica_cancel_logs_requeststops a pending request andyandex_metrica_clean_logs_requestdeletes processed files to free quota.Manage counters (write) —
yandex_metrica_create_counteradds a site and returns its id and tracking code;yandex_metrica_delete_counterpermanently removes a counter.
yandex-metrica-mcp
MCP server for the Yandex Metrica Reporting API, Logs API and counter management, designed for use with Claude Code and Codex CLI. Eight of its 13 tools only read; five change your Metrica account — create and delete a counter, and create, cancel and clean a Logs API export. Each tool says which it is in its MCP annotations (readOnlyHint, destructiveHint).
Runs locally over stdio. No web server, no persistent storage, no background daemons.
Why this project exists
Yandex Metrica has two distinct APIs that serve different purposes:
Reporting API (
/stat/v1/data) — aggregated, sampled statistics. Use this to build reports, query traffic sources, behavior metrics, goal conversions, etc.Logs API (
/management/v1/counter/{id}/logrequests) — raw, non-aggregated event export. Use this when you need row-level session or hit data for custom analytics pipelines.
This MCP server exposes both APIs as named tools that an LLM can call directly.
Related MCP server: yandex-mcp
Features
13 MCP tools covering counter management, goals, reporting, and full Logs API lifecycle
Authentication via environment variable only (no interactive OAuth)
Minimal transformation — responses stay close to the Yandex API format
Safe download behavior: logs parts default to 50KB preview + metadata
Strict TypeScript, zod validation, clean error messages
Multi-stage Docker image (node:24-alpine)
Unit + mock integration tests, live test scaffolding
GitHub Actions CI and Docker workflows
Supported MCP Tools
Counter Management
Tool | Description |
| List accessible counters (tags) |
| Get counter details by ID |
| List goals for a counter |
| Create a new counter (add a site) |
| Delete a counter permanently |
Reporting API (aggregated)
Tool | Description |
| Run a Reporting API query |
For period comparison, pass
date1_b/date2_btoyandex_metrica_get_report. The tool automatically routes to/stat/v1/data/comparison;date1/date2become segment A,date1_b/date2_bbecome segment B. Each result row returnsmetrics: { a, b }.
Logs API (raw export)
Tool | Description |
| Check if export is possible |
| Create an async export request |
| List all requests for a counter |
| Poll status of a request |
| Download a processed part (TSV) |
| Cancel a pending request |
| Clean processed files to free quota |
Logs API Workflow
evaluate → create → [poll get until status=processed] → download parts → cleanThe Logs API is asynchronous. After creating a request, poll yandex_metrica_get_logs_request until status = "processed", then download each part listed in log_request.parts (by its part_number).
Download Behavior
Raw log parts can be hundreds of MB. By default yandex_metrica_download_logs_part returns:
{
"mode": "preview",
"truncated": true,
"original_byte_size": 52428800,
"preview_byte_size": 49980,
"content": "ym:s:visitID\tym:s:date\t...\n..."
}Set mode: "full" to get the entire content — only do this for small parts.
Requirements
Node.js 24+
Yandex OAuth token with
metrika:readscope
How to get YANDEX_METRICA_TOKEN
Go to https://oauth.yandex.com/ → Create app
Fill in any name, select For API access
Under Access → enable
metrika:readClick Create app, copy the ClientID
Open in browser (replace
<ClientID>with yours):https://oauth.yandex.com/authorize?response_type=token&client_id=<ClientID>Authorize → copy the
access_tokenfrom the URL fragment (#access_token=...)
How to get YANDEX_METRICA_COUNTER_ID
The counter ID is the numeric ID of your Yandex Metrica tag (счётчик):
Open https://metrika.yandex.ru — the counter ID is shown next to each tag
Or look at the URL:
metrika.yandex.ru/dashboard?id=**12345678**Or use the tool itself: call
yandex_metrica_list_counters— it returns all counters with their IDs
YANDEX_METRICA_COUNTER_IDis only needed for live tests (npm run test:live), not for normal server operation.
Installation
docker run -i --rm -e YANDEX_METRICA_TOKEN ghcr.io/stufently/yandex-metrica-mcp:latestOne path that works today: Docker. Nothing to clone, no Node.js. Every MCP client below starts the server with this same command.
-e YANDEX_METRICA_TOKEN without a value forwards the variable from the client's
environment into the container, so the token lives in the client's env block and never
appears in the docker command line or ps output. The client pulls the image on
first start; docker pull ghcr.io/stufently/yandex-metrica-mcp:latest up front just
makes that first start faster.
Smoke test without a token or network — the server must answer initialize and list
13 tools. The image ships a placeholder YANDEX_METRICA_TOKEN so it starts for
introspection; tool calls with it return a "YANDEX_METRICA_TOKEN is not set" error
instead of reaching Yandex:
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"smoke","version":"0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
| docker run -i --rm --network none ghcr.io/stufently/yandex-metrica-mcp:latestImage tags on GHCR: latest and main (every push to main), sha-<short>, and
X.Y.Z / X.Y / X on version tags. Pin a version tag (:0.2.3) for reproducible setups.
npm (not published yet)
The package is scoped — both unscoped names (yandex-metrica-mcp and the project's
former name mcp-yandex-metrica) belong to unrelated projects on npm — so it ships as
@stufently/yandex-metrica-mcp (command yandex-metrica-mcp). The first npm release
has not been cut, so npx -y @stufently/yandex-metrica-mcp does not work today. Use
Docker.
From source
git clone https://github.com/stufently/yandex-metrica-mcp.git
cd yandex-metrica-mcp
npm install && npm run buildSee Running from a local build for the client config.
Configuration
Copy .env.example to .env and set your token:
cp .env.example .envVariable | Required | Default | Description |
| Yes | — | OAuth token with |
| No |
| Request timeout in ms |
| No |
| Log level: debug, info, warn, error, silent |
| No |
| Custom User-Agent |
| No |
| API base URL (tests only) |
Local Development
# Development with hot reload
YANDEX_METRICA_TOKEN=your_token npm run dev
# Build
npm run build
# Run production build
YANDEX_METRICA_TOKEN=your_token npm start
# Lint
npm run lint
# Type check
npm run typecheck
# Tests (unit + mock integration, no live API calls)
npm test
# Live tests (requires real token and counter ID)
LIVE_TESTS=1 YANDEX_METRICA_TOKEN=your_token YANDEX_METRICA_COUNTER_ID=12345678 npm run test:live
# Format
npm run formatDocker
# Use pre-built image from GHCR (updated on every push to main)
docker run -i --rm \
-e YANDEX_METRICA_TOKEN=your_token \
ghcr.io/stufently/yandex-metrica-mcp:latest
# Or build locally
docker build -t yandex-metrica-mcp:local .
docker run -i --rm \
-e YANDEX_METRICA_TOKEN=your_token \
yandex-metrica-mcp:localDocker Compose
# Create .env with your token first
cp .env.example .env
# Run
docker-compose run --rm yandex-metrica-mcpVerified clients and platforms
Only what has actually been run is listed as verified. Everything else in Client Configuration is a documented config that nobody has checked end to end.
Client / runtime | OS | How it runs | Status | Evidence |
Claude Code 2.1 | Ubuntu 26.04 LTS, x86_64 | Docker image built locally from this repo, stdio | Verified | Daily use on the maintainer's host (counters, reports, goals) |
Node.js 24 | Ubuntu ( |
| Verified in CI |
|
Docker image | Ubuntu ( | Image build on every pull request and push to | Built in CI, not started there |
|
Claude Desktop ( | macOS, Windows | Desktop Extension | Not verified | Bundle is built in CI, never installed in a real Desktop |
Cursor, Windsurf, Codex CLI, Zed | any | Configs below | Not verified | Documented only |
macOS, Windows | — | Any client | Not verified | No CI runner on these systems |
Client Configuration
All configs below are copy-paste ready and use the Docker command from
Installation. Replace your_oauth_token_here with your Yandex OAuth
token and nothing else.
Claude Code
Project file: .mcp.json in the project root.
claude mcp add yandex-metrica \
-e YANDEX_METRICA_TOKEN=your_oauth_token_here \
-- docker run -i --rm -e YANDEX_METRICA_TOKEN ghcr.io/stufently/yandex-metrica-mcp:latestAdd --scope user to make it available in every project, or --scope project to write
.mcp.json. Check with claude mcp list / claude mcp get yandex-metrica.
The same server as JSON in .mcp.json:
{
"mcpServers": {
"yandex-metrica": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"YANDEX_METRICA_TOKEN",
"ghcr.io/stufently/yandex-metrica-mcp:latest"
],
"env": {
"YANDEX_METRICA_TOKEN": "your_oauth_token_here"
}
}
}
}Claude Desktop
Config file claude_desktop_config.json: macOS
~/Library/Application Support/Claude/, Windows %APPDATA%\Claude\, Linux
~/.config/Claude/. Restart the app after saving.
{
"mcpServers": {
"yandex-metrica": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"YANDEX_METRICA_TOKEN",
"ghcr.io/stufently/yandex-metrica-mcp:latest"
],
"env": {
"YANDEX_METRICA_TOKEN": "your_oauth_token_here"
}
}
}
}Claude Desktop can also install this server in one click from a .mcpb file. Releases
up to v0.2.0 do not include one yet; the bundle is attached starting with the next
tagged release at https://github.com/stufently/yandex-metrica-mcp/releases/latest.
Until then, build it locally with bash scripts/build-mcpb.sh (needs Docker) and open
dist-mcpb/yandex-metrica-mcp-<version>.mcpb.
Releases include checksums.txt with the SHA256 checksum of each .mcpb bundle.
Download it alongside the bundle and verify before installing:
sha256sum -c --ignore-missing checksums.txt # run next to the downloaded .mcpbReleases from the next tag on also carry a GitHub build provenance attestation for each
.mcpb, signed in the release workflow. Check that a bundle was built by this
repository's workflow and not swapped afterwards (needs the GitHub CLI):
gh attestation verify <bundle>.mcpb --repo stufently/yandex-metrica-mcpCursor
After installing, put your token in place of your_oauth_token_here in ~/.cursor/mcp.json. Or add the block below by hand.
~/.cursor/mcp.json for every project, or .cursor/mcp.json for one project.
{
"mcpServers": {
"yandex-metrica": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"YANDEX_METRICA_TOKEN",
"ghcr.io/stufently/yandex-metrica-mcp:latest"
],
"env": {
"YANDEX_METRICA_TOKEN": "your_oauth_token_here"
}
}
}
}Windsurf
File mcp_config.json. On macOS and Linux:
~/.config/devin/mcp_config.json (or $XDG_CONFIG_HOME/devin/mcp_config.json). On
Windows: %APPDATA%\devin\mcp_config.json. Older builds used
~/.codeium/windsurf/mcp_config.json.
{
"mcpServers": {
"yandex-metrica": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"YANDEX_METRICA_TOKEN",
"ghcr.io/stufently/yandex-metrica-mcp:latest"
],
"env": {
"YANDEX_METRICA_TOKEN": "your_oauth_token_here"
}
}
}
}Codex CLI
codex mcp add yandex-metrica \
--env YANDEX_METRICA_TOKEN=your_oauth_token_here \
-- docker run -i --rm -e YANDEX_METRICA_TOKEN ghcr.io/stufently/yandex-metrica-mcp:latestOr by hand in ~/.codex/config.toml (shared by the Codex CLI, IDE extension and desktop app):
[mcp_servers.yandex-metrica]
command = "docker"
args = ["run", "-i", "--rm", "-e", "YANDEX_METRICA_TOKEN", "ghcr.io/stufently/yandex-metrica-mcp:latest"]
env = { YANDEX_METRICA_TOKEN = "your_oauth_token_here" }Zed
Zed's settings.json (zed: open settings file), under context_servers:
{
"context_servers": {
"yandex-metrica": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"YANDEX_METRICA_TOKEN",
"ghcr.io/stufently/yandex-metrica-mcp:latest"
],
"env": {
"YANDEX_METRICA_TOKEN": "your_oauth_token_here"
}
}
}
}Running from a local build instead of Docker
Works in any client above — swap command/args for:
{
"mcpServers": {
"yandex-metrica": {
"command": "node",
"args": ["/absolute/path/to/yandex-metrica-mcp/dist/index.js"],
"env": {
"YANDEX_METRICA_TOKEN": "your_oauth_token_here"
}
}
}
}In Claude Code the same thing via CLI:
claude mcp add yandex-metrica \
-e YANDEX_METRICA_TOKEN=your_oauth_token_here \
-- node /absolute/path/to/yandex-metrica-mcp/dist/index.jsExample prompts
Why did my site lose visits last week?
Which traffic sources sent the most visits last month?
What goals are configured on my main counter?
Compare this month's visits with the same month last year.
Export raw visits for the first week of January and show a preview.
Common prompts
Once the server is registered, ask in plain language — the client picks the tool.
List what you have access to → yandex_metrica_list_counters
List all my Yandex Metrica counters with their IDs and site names.Traffic report over a period → yandex_metrica_get_report
Show visits, users and bounce rate for counter 12345678 for the last 7 days,
broken down by date.Top traffic sources → yandex_metrica_get_report
What were the top 10 traffic sources for counter 12345678 last month,
by visits and conversion rate?Compare two periods → yandex_metrica_get_report with date1_b/date2_b
Compare visits and average session duration for counter 12345678
between this month and the same month last year.Goal conversions → yandex_metrica_list_goals + yandex_metrica_get_report
List the goals configured on counter 12345678, then show conversions
for each of them over the last 30 days.Raw event export → the Logs API chain (evaluate → create → get → download_part → clean)
Export raw visits for counter 12345678 from 2024-01-01 to 2024-01-07 with fields
visitID, date, clientID, startURL, trafficSource. Poll until it is ready,
then show me a preview of the first part.Architecture
src/
index.ts Entry point, loads config, connects stdio transport
config/env.ts Zod-based environment config validation
server/
createServer.ts Creates MCP Server instance
registerTools.ts Registers all tools with the server
tools/ One file per MCP tool
client/
http.ts Fetch-based HTTP client with auth, timeout, error handling
management.ts Counters and goals endpoints
reporting.ts Reporting API (/stat/v1/data)
logs.ts Logs API lifecycle endpoints
schemas/ Zod schemas for tool input validation
errors/ YandexApiError + error mapping
types/api.ts TypeScript types for Yandex API responses
utils/
arrays.ts Array → comma-separated conversion
text.ts Text preview/truncation for large downloadsLimitations
Not read-only — 8 tools read; 5 write: counter create/delete and the Logs API export lifecycle (create, cancel, clean)
No comparison report tool — use
yandex_metrica_get_reportwithdate1_b/date2_bparamsNo drilldown/pivot/bytime tools in v1 — planned for v0.2
No caching — every tool call hits the Yandex API
Large log parts — use
mode: "full"carefully; defaults to 50KB previewRetry with exponential backoff is built-in (3 retries, statuses 429/500/502/503/504)
Testing
# Unit + mock integration (CI-safe, no real API calls)
npm test
# Live tests (hit real Yandex API)
LIVE_TESTS=1 \
YANDEX_METRICA_TOKEN=your_token \
YANDEX_METRICA_COUNTER_ID=12345678 \
npm run test:liveCI / Docker Image
GitHub Actions workflows are in .github/workflows/:
ci.yml— lint, typecheck, test, build on every push/PRdocker.yml— build Docker image; push to GHCR on pushes tomainand version tags; on avX.Y.Ztag, also publishserver.jsonto the official MCP Registry asio.github.stufently/yandex-metrica-mcp(GitHub OIDC, no stored secret)mcpb.yml— on avX.Y.Ztag, build the.mcpbDesktop extension and attach it to that GitHub Release. It does not publish to GHCR, npm, PyPI, or the MCP registry.
Image tags produced by docker.yml:
Tag | When |
| every push to |
| every push to |
| every push to |
| pushing a |
REGISTRY and IMAGE_NAME default to ghcr.io and ${{ github.repository }}.
Security
Token is passed via environment variable only — never hardcoded
Token never appears in logs
Counter create/delete requires
metrika:writescope; all other tools use read-only accessDocker image runs as non-root (
nodeuser)
License
MIT — see LICENSE
Available Tools
13 toolsyandex_metrica_cancel_logs_requestADestructiveIdempotent
Cancel a Yandex Metrica Logs API export that is still pending, in status created or awaiting_retry. Use when the user wants to stop an export that has not been processed yet. Do not use this on a processed request; call yandex_metrica_clean_logs_request to delete the prepared files.
| Name | Required | Description | Default |
|---|---|---|---|
| counter_id | Yes | Yandex Metrica counter (tag) ID | |
| request_id | Yes | Logs API request ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, and openWorldHint=true, so the safety profile is covered. The description adds genuine context the annotations lack: the valid state preconditions (created / awaiting_retry) and the consequence of misuse on processed requests. It stops short of describing what happens to already-prepared files or the response shape.
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 front-loaded sentences with zero waste: purpose and precondition first, then positive usage, then the exclusion with the alternative. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-output-schema tool, the description covers purpose, applicability, and routing to a sibling. It would be fully complete with a note on what happens to any partially prepared files, but nothing essential to correct invocation is missing.
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% and both parameters (counter_id, request_id) are documented in the schema itself. The description adds no syntax, format, or ID-source guidance beyond the schema, so the baseline 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?
Names a specific verb (Cancel) and resource (Yandex Metrica Logs API export) and narrows scope to requests in status created or awaiting_retry. It also implicitly distinguishes itself from yandex_metrica_clean_logs_request, which handles processed requests.
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?
Explicitly states when to use it ('user wants to stop an export that has not been processed yet') and when not to ('Do not use this on a processed request'), naming the sibling to use instead. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_metrica_clean_logs_requestADestructiveIdempotent
Delete the prepared files of a processed Yandex Metrica Logs API export and free the export quota. Use when the user has finished downloading and the request status is processed. Do not use this to stop a request that is still pending; call yandex_metrica_cancel_logs_request instead.
| Name | Required | Description | Default |
|---|---|---|---|
| counter_id | Yes | Yandex Metrica counter (tag) ID | |
| request_id | Yes | Logs API request ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=true, readOnly=false, so safety is covered structurally. The description adds genuine value beyond that: what is destroyed (prepared files), that quota is freed, and the precondition that status must be 'processed'. It does not cover auth requirements, but that is a minor omission given the annotation coverage.
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 tightly written sentences with zero waste; the destructive action and its precondition are front-loaded before the routing guidance.
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 destructive two-parameter tool, the annotations carry the safety profile, the schema carries the parameters, and the description carries the when/when-not routing. There are no output-schema concerns since the action is a side-effecting deletion with no meaningful return payload.
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 both counter_id and request_id are fully documented in the schema. The description adds no syntax or format detail beyond the state precondition implied by 'processed', so the baseline 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?
States a specific verb (delete), resource (prepared files of a processed Logs API export), and side effect (free the export quota). It is immediately distinguishable from siblings like cancel_logs_request and download_logs_part.
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?
Explicitly states when to use it ('finished downloading and the request status is processed'), when not to use it ('still pending'), and names the alternative tool by name. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_metrica_create_counterA
Create a new Yandex Metrica counter for a site and return its id and tracking code. Use when the user asks to add a website or start tracking a new property. Do not use this to find a counter that already exists; call yandex_metrica_list_counters or yandex_metrica_get_counter.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Counter name | |
| site | Yes | Site domain (e.g. "example.com") | |
| mirrors | No | Mirror domains | |
| time_zone_name | No | Timezone (e.g. "Europe/Moscow") | |
| gdpr_agreement_accepted | No | GDPR agreement accepted (required for EU sites) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=true), so the safety burden is largely covered. The description adds return-payload behavior (id and tracking code), which is not in the structured fields, but it says nothing about auth/permission requirements or that repeated calls create duplicate counters.
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 tight sentences: the action first, then the trigger, then the exclusion with alternatives. No filler and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create tool with full schema coverage and annotations covering the mutation profile, the description covers purpose, trigger, exclusion, and return shape despite there being no output schema. Only auth/permission prerequisites and duplicate-creation implications are absent.
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% for all five parameters (name, site, mirrors, time_zone_name, gdpr_agreement_accepted), so the schema carries the semantics. The description adds no parameter-level detail beyond that, making the 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?
States a specific verb and resource (create a Yandex Metrica counter for a site) and adds the outcome (returns its id and tracking code). It also names the siblings it is not (list_counters/get_counter), so an agent can distinguish it without opening any schema.
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?
Explicit when-to-use ('user asks to add a website or start tracking a new property') plus an explicit when-not ('to find a counter that already exists') with two named alternatives. This is exactly the routing information an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_metrica_create_logs_requestA
Create an asynchronous Yandex Metrica Logs API export of raw visits or hits for one counter and date range. Use when the user wants row-level data and yandex_metrica_evaluate_logs_request has shown the export is possible. Do not use this only to test feasibility, and do not use it for aggregated totals; call yandex_metrica_get_report for those. Poll yandex_metrica_get_logs_request until the status is processed. date2 cannot be today. Fields use the ym:s: prefix for visits and ym:pv: for hits.
| Name | Required | Description | Default |
|---|---|---|---|
| date1 | Yes | Start date YYYY-MM-DD | |
| date2 | Yes | End date YYYY-MM-DD (cannot be current day) | |
| fields | Yes | Fields to export. See Yandex Metrica Logs API documentation for full field lists. | |
| source | Yes | 'hits' for pageview-level data, 'visits' for session-level data | |
| counter_id | Yes | Yandex Metrica counter (tag) ID | |
| attribution | No | Attribution model for traffic source fields. Default: lastsign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it is a non-read-only, non-idempotent, open-world call, but the description adds the genuinely useful behavioral traits: the operation is asynchronous, must be polled via get_logs_request until status is 'processed', and date2 cannot be today. It does not discuss lifecycle cleanup/cancellation (cancel/clean siblings exist), so it falls just short of a 5.
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?
Five sentences, each carrying distinct information with the purpose front-loaded. It is dense but every sentence (scope, preconditions, exclusions, polling, field prefixes) earns its place, though the length edges toward a wall of 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?
There is no output schema, so the description correctly compensates by describing the async lifecycle and the polling step needed to obtain results. Combined with full parameter coverage, an agent has everything needed to invoke and follow through on the call.
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, but the description adds field-naming syntax not present in the schema: fields must use the ym:s: prefix for visits and ym:pv: for hits. This ties the fields parameter to the source choice, which is meaningful beyond the structured data.
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?
States a specific verb (create) and resource (asynchronous Yandex Metrica Logs API export of raw visits or hits), plus scope (one counter and date range). It explicitly distinguishes itself from yandex_metrica_get_report (aggregated totals), so the agent can route without opening the schema.
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?
Gives explicit when-to-use ('when the user wants row-level data' after evaluate_logs_request confirms feasibility), explicit when-not-to-use ('not to test feasibility', 'not for aggregated totals; call get_report'), and a named follow-up (poll get_logs_request). The alternative and its selection condition are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_metrica_delete_counterADestructiveIdempotent
Delete one Yandex Metrica counter; it stops collecting data and its statistics are no longer available through the API. Use when the user explicitly asks to remove a counter and has confirmed the deletion. Do not use this to inspect a counter; call yandex_metrica_get_counter instead.
| Name | Required | Description | Default |
|---|---|---|---|
| counter_id | Yes | Yandex Metrica counter (tag) ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds real consequence detail beyond that: the counter stops collecting data and its statistics become unavailable via the API, plus a user-confirmation gate. It does not state whether deletion is reversible or what the response returns, so it falls just short of a 5.
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, front-loaded with the action and its consequence, then the precondition, then the sibling exclusion. Every sentence carries distinct, necessary information with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description supplies the action, its irreversible consequence, the confirmation precondition, and the alternative tool. Nothing an agent needs in order to call it correctly is missing.
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?
Only one parameter (counter_id) and schema description coverage is 100%, so the schema already documents it fully. The description adds no syntax or format guidance beyond the schema, making the 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?
States a specific verb and resource ('Delete one Yandex Metrica counter') and immediately names the sibling it must not be confused with ('Do not use this to inspect a counter; call yandex_metrica_get_counter instead'). An agent can distinguish it from get_counter, list_counters, and create_counter without opening any schema.
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?
Gives an explicit precondition ('when the user explicitly asks to remove a counter and has confirmed the deletion') and an explicit exclusion routing to the alternative tool for inspection. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_metrica_download_logs_partARead-onlyIdempotent
Download one processed part of a Yandex Metrica Logs API export as TSV text. Use when the user wants the rows of a request whose status is already processed. Do not use this to check whether the export is ready; call yandex_metrica_get_logs_request first. Preview mode returns about the first 50KB; full mode is only for small parts under 10MB. Part numbers come from the parts list returned by yandex_metrica_get_logs_request and start at 0.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Output mode. 'preview' returns first ~50KB with metadata (safe default). 'full' returns entire content — may be very large for big exports. | preview |
| counter_id | Yes | Yandex Metrica counter (tag) ID | |
| request_id | Yes | Logs API request ID | |
| part_number | Yes | Part number (0-based) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds real behavioral context: preview returns ~50KB, full mode should only be used for parts under 10MB, and the request must already be processed. Some of this overlaps the schema's mode description, but the 10MB constraint and processed-status precondition are unique value.
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?
Five compact sentences, each carrying distinct information (purpose, positive trigger, negative trigger, mode limits, part numbering). The purpose and the routing advice are front-loaded with no 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 read-only download tool with no output schema, the description covers purpose, preconditions, mode behavior, and size limits well enough to invoke correctly. It could say slightly more about what the TSV preview metadata looks like, but nothing critical is missing.
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 is already documented, including the mode enum and its semantics. The description reinforces part_number's 0-based origin from the parts list, but adds no format or syntax detail beyond the schema, so baseline 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 states a specific verb and resource ('Download one processed part of a Yandex Metrica Logs API export as TSV text'), including the return format. It is clearly distinguishable from siblings like yandex_metrica_get_logs_request, which it explicitly names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit positive condition ('when the user wants the rows of a request whose status is already processed'), an explicit exclusion ('Do not use this to check whether the export is ready'), and names the alternative tool to call instead. It also explains where part numbers come from and that they are 0-based.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_metrica_evaluate_logs_requestARead-onlyIdempotent
Check whether a Yandex Metrica Logs API export can be created for the given dates, source, and fields, without creating a request. Use when the user wants to know if a raw export is possible and how many days fit the quota. Do not use this to start the export; call yandex_metrica_create_logs_request after the check succeeds.
| Name | Required | Description | Default |
|---|---|---|---|
| date1 | Yes | Start date YYYY-MM-DD | |
| date2 | Yes | End date YYYY-MM-DD (cannot be current day) | |
| fields | Yes | Fields to export. For visits: ['ym:s:visitID','ym:s:date','ym:s:clientID',...]. For hits: ['ym:pv:watchID','ym:pv:date','ym:pv:URL',...] | |
| source | Yes | 'hits' for pageview-level data, 'visits' for session-level data | |
| counter_id | Yes | Yandex Metrica counter (tag) ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent, non-destructive profile, but the description adds a trait they do not capture: this is a dry-run that performs no request creation. It also hints at output content ('how many days fit the quota'), useful given there is no output schema. It stops short of describing error behavior or quota thresholds, keeping it at 4 rather than 5.
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 tight sentences with zero filler: the dry-run clarification is front-loaded, then the positive trigger, then the explicit exclusion. Every sentence carries routing or behavioral information.
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 no output schema, the description needs to signal what comes back, and it does via 'how many days fit the quota' and the feasibility verdict. Combined with annotations that cover the safety profile and a fully documented schema, the definition is nearly complete; only the precise response shape remains implicit.
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 five parameters, including enum values for source and field formats. The description only restates 'dates, source, and fields' without adding format or constraint detail beyond the schema, so the baseline 3 is appropriate; counter_id is not mentioned at all.
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 gives a specific verb (check/evaluate) and resource (Yandex Metrica Logs API export) plus the exact scope ('given dates, source, and fields, without creating a request'). It explicitly distinguishes itself from the sibling yandex_metrica_create_logs_request, so an agent can route between them without opening either schema.
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 states the positive trigger ('user wants to know if a raw export is possible and how many days fit the quota') and an explicit exclusion ('Do not use this to start the export'), naming the alternative to call instead. Both when-to-use and when-not-to-use are covered with the fallback path spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_metrica_get_counterARead-onlyIdempotent
Get one Yandex Metrica counter by id, including its settings, status, owner, timezone, and site. Use when the user already has a counter id and wants that counter's configuration. Do not use this to discover unknown ids; call yandex_metrica_list_counters instead.
| Name | Required | Description | Default |
|---|---|---|---|
| counter_id | Yes | Yandex Metrica counter (tag) ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds the useful behavioral detail that this returns a configuration snapshot (settings, status, owner, timezone, site) rather than time-series data. It does not mention auth requirements or error behavior for a missing counter, so it stops short of a 5.
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, zero filler, with the purpose and returned fields front-loaded before the routing exclusion. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description compensates by naming what the response contains and by routing ambiguous discovery requests to the correct sibling. Nothing an agent needs to call this correctly is missing.
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% and the single counter_id param is documented in-schema as the Yandex Metrica counter (tag) ID. The description only restates 'by id' without adding format, range, or resolution guidance. Baseline 3 is correct when the schema carries the parameter detail.
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?
States a specific verb and resource ('Get one Yandex Metrica counter by id') and enumerates the returned surface (settings, status, owner, timezone, site). It is immediately distinguishable from the sibling list_counters, which serves a different lookup mode.
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?
Gives an explicit use condition ('when the user already has a counter id and wants that counter's configuration'), an explicit exclusion ('Do not use this to discover unknown ids'), and names the alternative tool (yandex_metrica_list_counters) to use instead. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_metrica_get_logs_requestARead-onlyIdempotent
Get the status and prepared parts of one Yandex Metrica Logs API export request. Use when the user is waiting for a created export to reach processed before downloading it. Do not use this to fetch the TSV rows; call yandex_metrica_download_logs_part once the status is processed. Do not use it to list every request; call yandex_metrica_list_logs_requests.
| Name | Required | Description | Default |
|---|---|---|---|
| counter_id | Yes | Yandex Metrica counter (tag) ID | |
| request_id | Yes | Logs API request ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, open-world, non-destructive, so the safety profile is covered. The description adds the workflow-relevant behavioral fact that this is a polling-style status check that must report 'processed' before download, and discloses the return content (status plus prepared parts), which matters because there is no output schema.
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 that are front-loaded with the primary purpose, then the usage condition, then the two exclusions. No filler and no repetition of the schema or annotations.
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 no output schema, the description helpfully characterizes what comes back (status and prepared parts) and places the tool in the export workflow. It omits how unprocessed/failed states are represented or whether partial part lists change over time, which is a minor gap for a polling endpoint.
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 (counter_id, request_id) already have full schema descriptions at 100% coverage, and the description adds no syntax, format, or constraint detail beyond them. Baseline 3 is appropriate when the schema carries the parameter burden entirely.
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?
States a specific verb and resource ('Get the status and prepared parts of one Yandex Metrica Logs API export request') and scopes it to a single request. This is clearly separable from the sibling tools that create, list, download, or cancel requests.
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?
Explicitly states when to use it (while waiting for a created export to reach 'processed' before downloading) and names two alternatives with conditions: yandex_metrica_download_logs_part for TSV rows and yandex_metrica_list_logs_requests for listing. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_metrica_get_reportARead-onlyIdempotent
Run a Yandex Metrica Reporting API query and return aggregated statistics such as visits, users, bounce rate, and traffic sources. Use when the user wants a summary, a breakdown, or a comparison of two periods via date1_b and date2_b. Do not use this for row-level visits or pageviews; call yandex_metrica_evaluate_logs_request and the other Logs API tools. Metrics use the ym:s: prefix for visits and ym:pv: for hits.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language for dimension value names (default: ru) | |
| sort | No | Sort fields. Prefix with '-' for descending, e.g. ['-ym:s:visits', 'ym:s:date'] | |
| date1 | No | Start date (YYYY-MM-DD or 'today', 'yesterday', '7daysAgo'). Default: 7daysAgo | |
| date2 | No | End date (YYYY-MM-DD or relative). Default: today | |
| limit | No | Rows to return (default 100) | |
| offset | No | Row offset for pagination (1-based) | |
| preset | No | Preset report name (e.g. 'sources_summary'). Overrides metrics/dimensions. | |
| date1_b | No | Comparison segment B start date. When provided with date2_b, uses the comparison endpoint (/stat/v1/data/comparison). date1/date2 become segment A. Each row returns two sets of metrics. | |
| date2_b | No | Comparison segment B end date. Must be provided together with date1_b. | |
| filters | No | Filter expression, e.g. "ym:s:trafficSourceName=='Organic Search'" | |
| metrics | Yes | Metrics to include, e.g. ['ym:s:visits', 'ym:s:pageviews', 'ym:s:bounceRate']. Max 20. | |
| accuracy | No | Sampling accuracy (default: medium) | |
| currency | No | Currency code (ISO 4217), e.g. 'RUB' | |
| filters_a | No | Segmentation filter for segment A only (comparison mode) | |
| filters_b | No | Segmentation filter for segment B only (comparison mode) | |
| dimensions | No | Dimensions for grouping, e.g. ['ym:s:date', 'ym:s:regionCityName'] | |
| attribution | No | Attribution model for traffic source metrics. 'lastsign' = last significant source; 'automatic' = auto-attribution. | |
| counter_ids | Yes | One or more counter IDs to query | |
| include_undefined | No | Include rows with undefined dimension values |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and openWorld. The description adds context beyond them: the switch to the comparison endpoint when date1_b/date2_b are supplied, the returned statistic families, and the ym:s:/ym:pv: prefix convention. It does not mention rate limits or quota behavior, so it is strong but not exhaustive.
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?
Four sentences, purpose front-loaded, followed by usage, exclusion, and a technical prefix note. Mostly waste-free, though the closing prefix sentence feels appended rather than integrated with the flow.
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 19-parameter query tool with no output schema, the description covers domain, usage, exclusions, and metric naming conventions, and it sketches the returned aggregates. An agent has enough to call it correctly, though return shape (row structure, comparison-mode dual metric sets) is only lightly implied.
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 baseline is 3, but the description adds genuine semantic value by explaining the ym:s: vs ym:pv: metric prefix families and the comparison-mode trigger (date1_b/date2_b), which helps construct valid metrics/filters. It does not restate the parameter table.
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?
States a specific verb+resource ('Run a Yandex Metrica Reporting API query and return aggregated statistics') with concrete outputs (visits, users, bounce rate, traffic sources). It explicitly contrasts itself with the Logs API siblings (yandex_metrica_evaluate_logs_request), so an agent can distinguish it without opening any schema.
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?
Gives explicit when-to-use ('summary, breakdown, or comparison of two periods via date1_b and date2_b') and a clear when-not ('Do not use this for row-level visits or pageviews') naming the alternative tools. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_metrica_list_countersARead-onlyIdempotent
List Yandex Metrica counters the configured token can access, with each counter id, name, and site. Use when the user needs a counter id before any other query. Do not use this to read one counter's settings; call yandex_metrica_get_counter once the id is known.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-based) | |
| sort | No | Sort order | |
| type | No | Filter by counter type | |
| search | No | Search by counter name or site URL | |
| status | No | Filter by counter status | |
| per_page | No | Items per page (max 1000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds value beyond them by disclosing the access scope (token-limited visibility) and the shape of each returned item (id, name, site). It stops short of describing paging behavior even though page/per_page exist.
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 tight sentences with zero filler: purpose and scope first, then the triggering condition, then the exclusion and handoff. Every sentence earns its place and the routing information is front-loaded.
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?
There is no output schema, so the description usefully names the returned fields (id, name, site) and the visibility scope. Pagination and total-count behavior are left entirely to the schema, which is a minor gap for a paged list tool but not a blocking one.
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 six fully documented parameters, three carrying enums, so the schema does the heavy lifting. The description mentions only the returned fields and adds no filtering, sorting, or paging semantics beyond the schema; baseline 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?
States a specific verb and resource (list counters) plus the access scope (those the configured token can reach) and the returned fields (id, name, site). It explicitly contrasts with the sibling yandex_metrica_get_counter, so an agent can distinguish the two without opening either schema.
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?
Gives a positive trigger ("use when the user needs a counter id before any other query") and an explicit exclusion with the named alternative ("do not use this to read one counter's settings; call yandex_metrica_get_counter"). When-to-use, when-not-to-use, and the replacement tool are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_metrica_list_goalsARead-onlyIdempotent
List conversion goals configured on one Yandex Metrica counter, including each goal id and type. Use when the user asks which goals exist on a counter before building a report. Do not use this for conversion counts or rates; call yandex_metrica_get_report with the goal metrics.
| Name | Required | Description | Default |
|---|---|---|---|
| counter_id | Yes | Yandex Metrica counter (tag) ID |
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 fully covered. The description usefully adds what the payload contains (goal id and type), but says nothing about pagination, count limits, or permission requirements on the counter.
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, zero filler, with the purpose stated first and the routing constraint second. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only list tool with a complete annotation set and no output schema, the description covers purpose, trigger, exclusion, alternative, and return fields. Nothing needed for correct invocation is missing.
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% and the single counter_id parameter is fully documented in the schema as the 'Yandex Metrica counter (tag) ID'. The description's phrase 'one Yandex Metrica counter' merely confirms the unit of scope rather than adding format or constraint detail, so baseline 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?
States a specific verb (list) and resource (conversion goals on one counter) and even names the returned fields (goal id and type). An agent can distinguish this from yandex_metrica_list_counters or yandex_metrica_get_counter without opening any schema.
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?
Gives both a positive trigger ('when the user asks which goals exist on a counter before building a report') and an explicit exclusion ('Do not use this for conversion counts or rates'), routing the agent to the named alternative yandex_metrica_get_report. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_metrica_list_logs_requestsARead-onlyIdempotent
List every Logs API export request on a Yandex Metrica counter, in any status from created through cleaned. Use when the user wants to see existing exports or find a request id. Do not use this to poll a single request; call yandex_metrica_get_logs_request with that request id.
| Name | Required | Description | Default |
|---|---|---|---|
| counter_id | Yes | Yandex Metrica counter (tag) ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered by structured data. The description adds a genuine scoping detail — that results span every lifecycle status from created to cleaned — but says nothing about pagination, ordering, or result size. Useful incremental context, not rich behavioral disclosure.
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, zero filler, and the purpose plus scope is front-loaded before the routing instruction. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A simple read-only list tool with full annotation coverage, a fully described single parameter, and no output schema to explain. The description covers what it returns conceptually (all export requests across all statuses) and routes the agent to the sibling for single-request polling, leaving no blocking 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?
Only one parameter, and the schema documents counter_id at 100% coverage ('Yandex Metrica counter (tag) ID'). The description's phrase 'on a Yandex Metrica counter' restates the schema without adding format, range, or lookup guidance, so the baseline 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?
States a specific verb and resource ('List every Logs API export request on a Yandex Metrica counter') and adds the scope of statuses covered, from created through cleaned. An agent can distinguish this from yandex_metrica_get_logs_request and the other logs siblings without opening any schema.
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?
Gives an explicit positive trigger ('when the user wants to see existing exports or find a request id') and an explicit exclusion ('Do not use this to poll a single request') that names the correct alternative tool and the key it needs. Nothing about tool selection is left to inference.
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
v0.1.0- First observed
yandex_metrica_cancel_logs_request - First observed
yandex_metrica_clean_logs_request - First observed
yandex_metrica_create_counter - First observed
yandex_metrica_create_logs_request - First observed
yandex_metrica_delete_counter - First observed
yandex_metrica_download_logs_part - First observed
yandex_metrica_evaluate_logs_request - First observed
yandex_metrica_get_counter - First observed
yandex_metrica_get_logs_request - First observed
yandex_metrica_get_report - First observed
yandex_metrica_list_counters - First observed
yandex_metrica_list_goals - First observed
yandex_metrica_list_logs_requests
TDQS
Scored across 13 tools
Each tool has a clearly distinct purpose, with explicit cross-references in descriptions (e.g., 'Do not use this... call X instead') that prevent misselection. The split between aggregated reports, logs export lifecycle, and counter management is unambiguous.
All tools follow a consistent yandex_metrica_ prefix and verb_noun pattern (list_counters, get_counter, create_logs_request, download_logs_part, etc.). No mixing of conventions or styles.
13 tools is well within the ideal 3-15 range and each tool maps to a distinct API operation or step in a workflow. The logs export lifecycle is fully broken out without redundancy.
Core workflows (counter listing/retrieval/creation/deletion, reporting, full logs export lifecycle) are covered. Minor gaps exist, such as no counter update/settings modification and only goal listing without goal management, but these are not critical for typical agent tasks.
Maintenance
Related MCP Connectors
Read-only Yandex Metrika MCP. Query visits, sources, geo, devices and more in plain language.
Yandex Direct, Metrika & Wordstat MCP for Russian digital marketing.
Read and edit GA4, Search Console and Google Tag Manager from any MCP client. 29 tools.
Google Ads MCP server: 16 tools for reporting, campaigns, keywords, assets. Writes preview first.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that provides access to Yandex Metrika analytics data through various tools and functions. This server allows AI assistants and applications to retrieve comprehensive analytics data from Yandex Metrika accounts.1-
- AlicenseNot gradedqualityFmaintenanceMCP 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.58MIT
- AlicenseAqualityCmaintenanceMCP server for Yandex.Metrica API providing 15 tools for managing counters, goals, reports, logs, traffic sources, and top pages with OAuth Bearer token authentication.1582 npm1MIT
- AlicenseAqualityDmaintenanceMCP server for Yandex Metrika API, enabling reporting, counter management, goals, filters, and other operations via natural language.122MIT