Yandex MCP server for AI agents

Live

OAUTH 2.0

FILES AND ANALYTICS

Files & Documents

Yandex gives your agent Yandex Disk files and Yandex Metrica analytics: browse, upload, move, and publish files on Disk, read Metrica reports, and manage counters, goals, filters, and segments.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Yandex
agent · Acme Q3
Run
How many visits did acme.com get last week?
S
yandex_metrika_get_report_table
137ms
Analytics agent
acme.com had 18,420 visits last week. Organic search drove 41% of them.
Sources: 1 Metrica counter
yandex
1 report
18:29
Message Claude...

Tools your analytics agent reaches for on Yandex, scoped per user.

CALL ANY TOOL
62 tools for files and analytics in Yandex: browse, upload, copy, move, publish, and restore files on Yandex Disk, read Yandex Metrica reports and raw logs, and manage counters, goals, filters, segments, and chart notes.
yandex_disk_copy_resource
Disk copy resource
Copy a file or folder to another location on Yandex Disk. Returns a link to the new item (201), or an operation link (202) when a large folder is processed in the background. Use Get Operation Status to follow a 202. Use Create Folder first if the destination folder does not exist. Requires cloud_api:disk.write.
Parameters
Name
Type
Required
Description
from
string
Required
Path of the file or folder to copy, starting at the Disk root. Example: /Documents/report.pdf.
path
string
Required
Destination path including the new name, starting at the Disk root. Example: /Archive/report.pdf.
fields
string
Optional
Comma-separated list of response properties to keep; embedded keys use dots. Omit to return the full response. Example: name,_embedded.items.path.
overwrite
boolean
Optional
When true, replaces an existing item at the destination. Yandex Disk fails the request when omitted (false) and the destination exists. Example: false. Default: `false`.
yandex_disk_create_folder
Disk create folder
yandex_disk_delete_from_trash
Disk delete from trash
yandex_disk_get_download_link
Disk get download link
yandex_disk_get_operation_status
Disk get operation status
yandex_disk_get_public_resource
Disk get public resource
yandex_disk_get_upload_link
Disk get upload link
yandex_disk_list_all_files
Disk list all files
yandex_disk_list_recent_uploads
Disk list recent uploads
yandex_disk_publish_resource
Disk publish resource
yandex_disk_restore_from_trash
Disk restore from trash
yandex_disk_unpublish_resource
Disk unpublish resource
yandex_disk_update_resource_properties
Disk update resource properties
yandex_disk_upload_from_url
Disk upload from url
yandex_metrika_cancel_log_request
Metrika cancel log request
yandex_metrika_create_counter
Metrika create counter
yandex_metrika_create_goal
Metrika create goal
yandex_metrika_create_log_request
Metrika create log request
yandex_metrika_delete_annotation
Metrika delete annotation
yandex_metrika_delete_filter
Metrika delete filter
yandex_metrika_delete_label
Metrika delete label
yandex_metrika_get_counter
Metrika get counter
yandex_metrika_get_log_request
Metrika get log request
yandex_metrika_get_report_by_time
Metrika get report by time
yandex_metrika_list_counters
Metrika list counters
yandex_metrika_list_goals
Metrika list goals
yandex_metrika_list_labels
Metrika list labels
yandex_metrika_list_operations
Metrika list operations
yandex_metrika_update_counter
Metrika update counter
yandex_metrika_update_goal
Metrika update goal

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Yandex tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["yandex"], toolNames: [
    "yandex_metrika_list_counters",
    "yandex_metrika_get_report_table",
    "yandex_disk_list_recent_uploads"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Show visits by traffic source for acme.com last month" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["yandex"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Show visits by traffic source for acme.com last month" }],
  tools,
});

// Execute the tool call with the user's vaulted Yandex OAuth token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["yandex"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Show visits by traffic source for acme.com last month" }],
  tools,
});

// Tool call runs with the user's vaulted Yandex OAuth token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["yandex"] }, pageSize: 100,
});

const agent = new Agent({
  name: "analytics_agent",
  model: "gemini-2.5-pro",
  instruction: "Yandex tools scoped to this user",
  tools,
});

await agent.run("Show visits by traffic source for acme.com last month");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Yandex tool. Click to copy, paste into your agent, done.
Yandex Disk
Copy the prompt
Copied
How much free space is left on my Yandex Disk?
Copy the prompt
Copied
List files uploaded to my Disk this week.
Copy the prompt
Copied
Publish the Q3 report folder and give me the public link.
Metrica reports
Copy the prompt
Copied
Show visits by traffic source for acme.com last month.
Copy the prompt
Copied
Chart daily visits for the last 30 days.
Copy the prompt
Copied
Export raw session logs for September.
Metrica setup
Copy the prompt
Copied
Create a goal for visits to /thank-you.
Copy the prompt
Copied
Add a filter to exclude traffic from our office IP.
Copy the prompt
Copied
Add a chart note for the October 20 release.
SEE HOW AUTH WORKS
Each user signs in to Yandex once, and Scalekit stores and refreshes their tokens. Credentials stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Yandex
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Yandex
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Yandex
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Yandex
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other files and analytics connectors.
GTM and RevOps Teams
Competitive intelligence briefing agent
Scans Gong calls for competitor mentions, matches each one to its Notion battlecard, and DMs every affected rep a single Slack digest per cycle. Every call runs as the PMM who owns the briefing, never a shared bot.
Test other agents
See the same per-user auth pattern across other files and analytics connectors.
GTM
Competitive intelligence briefing agent
Scan Gong calls for competitor mentions, match each one to its Notion battlecard, and DM every affected rep a single Slack digest.
ENGINEERING
Slack workflow agent (LangGraph)
LangGraph agent that drives multi-step Slack workflows: triggers, approvals, and follow-up actions per user identity.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Yandex token looks fine in a demo. In production every file move and goal change looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Yandex today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Yandex as the user or through a shared service account?
As the user. Each user signs in to Yandex once, and Scalekit stores and refreshes their tokens. File moves, published links, and Metrica changes the agent makes are attributed to that user in your audit trail, not a shared service account.
Where is the Yandex OAuth token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Yandex?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example Disk and report read tools without yandex_disk_delete_from_trash, which permanently deletes a file, and yandex_metrika_delete_counter. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Yandex access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Which Yandex services does the connector cover?
Yandex Disk, Yandex Metrica, and the Yandex ID profile. Disk tools work with the signed-in user's files and public links, Metrica tools work with the counters that user can access, and yandex_id_get_user_info returns their login and profile.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""yandex"": {
""url"": ""https://mcp.scalekit.com/yandex"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.yandex]
url = ""https://mcp.scalekit.com/yandex""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""yandex"": {
""url"": ""https://mcp.scalekit.com/yandex"",
""type"": ""http""
}
}
}