Yandex Tracker MCP
The Yandex Tracker MCP Server enables AI assistants to interact with Yandex Tracker APIs for comprehensive project management:
Queue Management: Access queues and their local fields, tags, and versions
User Management: Retrieve user account information and organizational details
Issue Operations: Get detailed issue information, comments, links, worklogs, and attachments
Search Capabilities: Use Yandex Tracker Query Language for advanced filtering and counting
Field Management: Access global fields, statuses, and issue types
Performance Optimization: Optional Redis caching for improved response times
Security Features: Configurable queue access restrictions and secure token handling
Integration Support: Compatible with various AI clients, Yandex Cloud and Yandex 360 organizations
Allows GitHub Copilot to connect to Yandex Tracker via VS Code integration, with support for both workspace and global configurations.
Optional integration with Redis for performance caching, improving response times when retrieving Yandex Tracker data.
Provides comprehensive access to Yandex Tracker APIs, enabling management of issues, queues, comments, worklogs, and search functionality. Supports both Yandex Cloud and Yandex 360 organizations with features for queue management, user information retrieval, issue operations, field management, and advanced query language capabilities.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Yandex Tracker MCP show me open issues in the backend queue"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Yandex Tracker MCP Server
mcp-name: io.github.aikts/yandex-tracker-mcp
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with Yandex Tracker APIs. This server provides secure, authenticated access to Yandex Tracker issues, queues, comments, worklogs, and search functionality with optional Redis caching for improved performance.
Documentation in Russian is available here / Документация на русском языке доступна здесь.
Features
Complete Queue Management: List and access all available Yandex Tracker queues with pagination support, tag retrieval, and detailed metadata
Projects, Portfolios and Goals: Dedicated read and write tools with explicit schemas for each entity type in the Tracker "entities" API (opt-in via
TRACKER_ENTITIES_ENABLED)User Management: Retrieve user account information, including login details, email addresses, license status, and organizational data
Full Issue Lifecycle: Create, read, update, and manage issues with support for custom fields, attachments, and workflow transitions
Status Workflow Management: Execute status transitions, close issues with resolutions, and navigate complex workflows
Field Management: Access global fields, queue-specific local fields, statuses, issue types, priorities, and resolutions
Boards and Sprints: List agile boards and their sprints to find sprint IDs for issue planning
Advanced Query Language: Full Yandex Tracker Query Language support with complex filtering, sorting, and date functions
Performance Caching: Optional Redis caching layer for improved response times
Security Controls: Configurable queue access restrictions and secure token handling
Multiple Transport Options: Support for stdio, SSE (deprecated), and HTTP transports for flexible integration
OAuth 2.0 Authentication: Dynamic token-based authentication with automatic refresh support as an alternative to static API tokens
Organization Support: Compatible with both standard and cloud organization IDs
Organization ID Configuration
Choose one of the following based on your Yandex organization type:
Yandex Cloud Organization: Use
TRACKER_CLOUD_ORG_IDenv var later for Yandex Cloud-managed organizationsYandex 360 Organization: Use
TRACKER_ORG_IDenv var later for Yandex 360 organizations
You can find your organization ID in the Yandex Tracker URL or organization settings.
Related MCP server: YaTracker Connector
MCP Client Configuration
Installing extension in Claude Desktop
Yandex Tracker MCP Server can be one-click installed in Claude Desktop as and extension.
Installation
Download the
*.mcpbfile from GitHub Releases.Double-click the downloaded file to install it in Claude Desktop.

Provide your Yandex Tracker OAuth token when prompted.

Make sure extension is enabled - now you may use this MCP Server.
Manual installation
Prerequisites
uv installed globally
Valid Yandex Tracker API token with appropriate permissions
The following sections show how to configure the MCP server for different AI clients. You can use either uvx yandex-tracker-mcp@latest or the Docker image ghcr.io/aikts/yandex-tracker-mcp:latest. Both require these environment variables:
Authentication (one of the following):
TRACKER_TOKEN- Your Yandex Tracker OAuth tokenTRACKER_IAM_TOKEN- Your IAM tokenTRACKER_SA_KEY_ID,TRACKER_SA_SERVICE_ACCOUNT_ID,TRACKER_SA_PRIVATE_KEY- Service account credentials
Organization - exactly one of the following:
TRACKER_CLOUD_ORG_ID- Your Yandex Cloud organization IDTRACKER_ORG_ID- Your Yandex 360 organization ID
Set one of the two. Setting both makes every Tracker call fail with
Only one of org_id or cloud_org_id should be provided.The examples below useTRACKER_CLOUD_ORG_ID; on Yandex 360, replace that key withTRACKER_ORG_ID.
Configuration file path:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Using uvx:
{
"mcpServers": {
"yandex-tracker": {
"command": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "your_tracker_token_here",
"TRACKER_CLOUD_ORG_ID": "your_cloud_org_id_here"
}
}
}
}Using Docker:
{
"mcpServers": {
"yandex-tracker": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "TRACKER_TOKEN",
"-e", "TRACKER_CLOUD_ORG_ID",
"ghcr.io/aikts/yandex-tracker-mcp:latest"
],
"env": {
"TRACKER_TOKEN": "your_tracker_token_here",
"TRACKER_CLOUD_ORG_ID": "your_cloud_org_id_here"
}
}
}
}Using uvx:
claude mcp add yandex-tracker uvx yandex-tracker-mcp@latest \
-e TRACKER_TOKEN=your_tracker_token_here \
-e TRACKER_CLOUD_ORG_ID=your_cloud_org_id_here \
-e TRANSPORT=stdioUsing Docker:
claude mcp add yandex-tracker docker "run --rm -i -e TRACKER_TOKEN=your_tracker_token_here -e TRACKER_CLOUD_ORG_ID=your_cloud_org_id_here -e TRANSPORT=stdio ghcr.io/aikts/yandex-tracker-mcp:latest"Configuration file path:
Project-specific:
.cursor/mcp.jsonin your project directoryGlobal:
~/.cursor/mcp.json
Using uvx:
{
"mcpServers": {
"yandex-tracker": {
"command": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "your_tracker_token_here",
"TRACKER_CLOUD_ORG_ID": "your_cloud_org_id_here"
}
}
}
}Using Docker:
{
"mcpServers": {
"yandex-tracker": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "TRACKER_TOKEN",
"-e", "TRACKER_CLOUD_ORG_ID",
"ghcr.io/aikts/yandex-tracker-mcp:latest"
],
"env": {
"TRACKER_TOKEN": "your_tracker_token_here",
"TRACKER_CLOUD_ORG_ID": "your_cloud_org_id_here"
}
}
}
}Configuration file path:
~/.codeium/windsurf/mcp_config.json
Access via: Windsurf Settings → Cascade tab → Model Context Protocol (MCP) Servers → "View raw config"
Using uvx:
{
"mcpServers": {
"yandex-tracker": {
"command": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "your_tracker_token_here",
"TRACKER_CLOUD_ORG_ID": "your_cloud_org_id_here"
}
}
}
}Using Docker:
{
"mcpServers": {
"yandex-tracker": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "TRACKER_TOKEN",
"-e", "TRACKER_CLOUD_ORG_ID",
"ghcr.io/aikts/yandex-tracker-mcp:latest"
],
"env": {
"TRACKER_TOKEN": "your_tracker_token_here",
"TRACKER_CLOUD_ORG_ID": "your_cloud_org_id_here"
}
}
}
}Configuration file path:
~/.config/zed/settings.json
Access via: Cmd+, (macOS) or Ctrl+, (Linux/Windows) or command palette: "zed: open settings"
Note: Requires Zed Preview version for MCP support.
Using uvx:
{
"context_servers": {
"yandex-tracker": {
"source": "custom",
"command": {
"path": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "your_tracker_token_here",
"TRACKER_CLOUD_ORG_ID": "your_cloud_org_id_here"
}
}
}
}
}Using Docker:
{
"context_servers": {
"yandex-tracker": {
"source": "custom",
"command": {
"path": "docker",
"args": [
"run", "--rm", "-i",
"-e", "TRACKER_TOKEN",
"-e", "TRACKER_CLOUD_ORG_ID",
"ghcr.io/aikts/yandex-tracker-mcp:latest"
],
"env": {
"TRACKER_TOKEN": "your_tracker_token_here",
"TRACKER_CLOUD_ORG_ID": "your_cloud_org_id_here"
}
}
}
}
}Configuration file path:
Workspace:
.vscode/mcp.jsonin your project directoryGlobal: VS Code
settings.json
Option 1: Workspace Configuration (Recommended for security)
Create .vscode/mcp.json:
Using uvx:
{
"inputs": [
{
"type": "promptString",
"id": "tracker-token",
"description": "Yandex Tracker Token",
"password": true
},
{
"type": "promptString",
"id": "cloud-org-id",
"description": "Yandex Cloud Organization ID"
}
],
"servers": {
"yandex-tracker": {
"type": "stdio",
"command": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "${input:tracker-token}",
"TRACKER_CLOUD_ORG_ID": "${input:cloud-org-id}",
"TRANSPORT": "stdio"
}
}
}
}Using Docker:
{
"inputs": [
{
"type": "promptString",
"id": "tracker-token",
"description": "Yandex Tracker Token",
"password": true
},
{
"type": "promptString",
"id": "cloud-org-id",
"description": "Yandex Cloud Organization ID"
}
],
"servers": {
"yandex-tracker": {
"type": "stdio",
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "TRACKER_TOKEN",
"-e", "TRACKER_CLOUD_ORG_ID",
"ghcr.io/aikts/yandex-tracker-mcp:latest"
],
"env": {
"TRACKER_TOKEN": "${input:tracker-token}",
"TRACKER_CLOUD_ORG_ID": "${input:cloud-org-id}",
"TRANSPORT": "stdio"
}
}
}
}Option 2: Global Configuration
Add to VS Code settings.json:
Using uvx:
{
"github.copilot.chat.mcp.servers": {
"yandex-tracker": {
"type": "stdio",
"command": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "your_tracker_token_here",
"TRACKER_CLOUD_ORG_ID": "your_cloud_org_id_here"
}
}
}
}Using Docker:
{
"github.copilot.chat.mcp.servers": {
"yandex-tracker": {
"type": "stdio",
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "TRACKER_TOKEN",
"-e", "TRACKER_CLOUD_ORG_ID",
"ghcr.io/aikts/yandex-tracker-mcp:latest"
],
"env": {
"TRACKER_TOKEN": "your_tracker_token_here",
"TRACKER_CLOUD_ORG_ID": "your_cloud_org_id_here"
}
}
}
}For other MCP-compatible clients, use the standard MCP server configuration format:
Using uvx:
{
"mcpServers": {
"yandex-tracker": {
"command": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "your_tracker_token_here",
"TRACKER_CLOUD_ORG_ID": "your_cloud_org_id_here"
}
}
}
}Using Docker:
{
"mcpServers": {
"yandex-tracker": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "TRACKER_TOKEN",
"-e", "TRACKER_CLOUD_ORG_ID",
"ghcr.io/aikts/yandex-tracker-mcp:latest"
],
"env": {
"TRACKER_TOKEN": "your_tracker_token_here",
"TRACKER_CLOUD_ORG_ID": "your_cloud_org_id_here"
}
}
}
}Important Notes:
Replace placeholder values with your actual credentials
Restart your AI client after configuration changes
Ensure
uvxis installed and available in your system PATHFor production use, consider using environment variables instead of hardcoding tokens
Available MCP Tools
The server exposes the following tools through the MCP protocol:
Tool | What it does | Key arguments |
| Every queue the token may see; returns |
|
| The tags defined in the queue |
|
| The queue's versions, with dates and status |
|
| The queue's components as full objects, with lead, auto-assign flag and |
|
| Create a version in the queue |
|
| The fields configured on the queue, local ones included; |
|
| Name, description, default type and priority, plus whatever |
|
Read
queue_get_fieldsbeforeissue_create, but it is not the whole registry: system fields such asparentorestimationare settable without appearing there, andget_global_fieldslists every field the organization has.queue_get_metadatawithexpand: ["issueTypesConfig"]is where the resolutions valid for each issue type come from -issue_closeneeds one of them.All of these respect
TRACKER_LIMIT_QUEUES.hits/pagesfromqueues_get_allare reported only for an explicit single page on a server without the allow-list, since the totals count queues the allow-list then hides.
A component is a label grouping a queue's issues by product, process or owner. Its numeric id is what issue_create / issue_update take in components.
Tool | What it does | Key arguments |
| One component with |
|
| Create a component in a queue |
|
| Change name, description, lead or auto-assign flag; omitted fields keep their value, |
|
| Delete a component |
|
TRACKER_LIMIT_QUEUESandTRACKER_READ_ONLY_QUEUESapply through the component's queue:component_updateandcomponent_deleteread the component first to learn it, and a component in a queue outsideTRACKER_LIMIT_QUEUESis reported as not found.
Projects, portfolios and goals are separate Yandex Tracker entities (distinct from queues), exposed through the Tracker "entities" API. Custom (organization-defined) attributes are not modeled and are not returned.
These tools are opt-in. They are registered only when
TRACKER_ENTITIES_ENABLED=true(defaultfalse), because they add a large tool manifest and are not covered by the queue restrictions — see Queue Access Control.
The three entity types share one tool set, so it is listed once - the row says what the tool does, the columns which name to call:
What it does | Projects | Portfolios | Goals |
One entity by id or shortId |
|
|
|
Search by name substring and/or field filters; returns |
|
|
|
A page of comments; returns |
|
|
|
Create, returning the entity |
|
|
|
Change any field creation takes |
|
|
|
Delete it, and with |
|
|
|
Add a comment |
|
|
|
Edit a comment |
|
|
|
Delete a comment |
|
|
|
Append one checklist item |
|
| - |
Edit one checklist item, leaving the fields you omit as they are |
|
| - |
Move a checklist item before another one |
|
| - |
Delete one checklist item |
|
| - |
Edit several existing items by id |
|
| - |
Delete the whole checklist |
|
| - |
Arguments. Reads take
entity_idandfields; the*_findtools takeinput,filter,order_by,order_asc,root_only,page,per_page. Create and update takesummary(required on create),description,lead,team_users,clients,followers,start(goals have none),end,tags,entity_status,parent_entity,team_accessandlinks, and update alsocommentandversion(optimistic locking). Every tool takes the samefieldsselector and returns the entity.linksare added, never replaced, and the API never returns them: an existing link cannot be read back or removed through this server, and a links-only update is rejected rather than reported as a success Tracker silently ignores.Not in the default field set:
checklistItems(the checklist tools return the whole entity, so ask for them to see the result),metricItems, and a goal'skeyResultItems- the last two are read-only. Goals use their ownentityStatusvalues (draft,according_to_plan,at_risk,blocked,achieved,partially_achieved,not_achieved,exceeded,cancelled). Bulk changes are not supported.
Tool | What it does | Key arguments |
| A page of the organization's users; returns |
|
| One user by login or uid |
|
| The user the current token belongs to | - |
| Find users by login, email or real name |
|
users_searchmatches login and email exactly first and falls back to fuzzy name matching (80% similarity, at most the three best matches).The page from
users_get_allis the last one whenpageequalspages.
Tool | What it does | Key arguments |
| Every global field of the organization, with its schema and type | - |
Queue-local fields are not here - queue_get_fields returns them together with the global ones.
Tool | What it does | Key arguments |
| Every issue status the organization defines | - |
| Every issue type, for the | - |
| Every priority, with | - |
| Every resolution, for the | - |
These four are organization-wide. A queue may accept only some of the values they list, and Tracker answers 422 for one it does not accept - queue_get_metadata with expand: ["issueTypesConfig"] says which resolutions each issue type takes.
Tool | What it does | Key arguments |
| The issue templates, with the |
|
| One issue template by id |
|
| The comment templates, with the |
|
| One comment template by id |
|
Templates are read-only helpers. The API cannot create an issue or a comment from a template, so
issue_createandissue_add_commenttake notemplate_id: read the template and pass its values as the write tool's own arguments. Macros such as{{today}}arrive literally.The issue body a template prefills is in
fieldTemplates.description; the template's owndescriptiondescribes the template.queuereturns that queue's templates plus the ones bound to no queue, which are usable everywhere.TRACKER_LIMIT_QUEUESapplies: templates of a restricted queue are omitted from the listings and rejected on direct access, while templates without a queue stay visible.
Tool | What it does | Key arguments |
| The organization's agile boards; returns |
|
| One board with |
|
| The board's columns with the issue statuses that land in each |
|
| The board's sprints with status ( |
|
A board has no queue of its own, so
queueis matched against the board's own filter and misses the boards that filter by something else - a personal board filtering by assignee, for one. To catch those, read a few issues of the queue withissues_findand look at theirboardsfield.Boards belong to the organization, not to a queue, so
TRACKER_LIMIT_QUEUESdoes not filter them: only thequeueargument ofboards_get_allis checked, and what these tools return can name restricted queues.A non-scrum board has no sprints and
board_get_sprintsis rejected for it. The sprintidit returns is whatissue_create/issue_updatetake.
Tool | What it does | Key arguments |
| One issue by key: the full record, the current |
|
| The web URL of an issue |
|
| A page of comments, oldest first; returns |
|
| Add a comment; |
|
| Edit a comment |
|
| Delete a comment |
|
| Links to related, blocking and duplicate issues |
|
| Link two issues |
|
| Remove a link |
|
| The time logged on one or more issues |
|
| Log spent time |
|
| Edit a worklog entry |
|
| Delete a worklog entry |
|
| Attachment metadata |
|
| The checklist, with the item ids the write tools need |
|
| Append items in order, creating the checklist if there is none |
|
| Change one item; the fields you omit keep their value |
|
| Delete one item |
|
| The status transitions available right now, with their ids |
|
| Run a transition, returning the transitions available afterwards |
|
| Find a transition to a done status and run it with a resolution |
|
| Field edits, status transitions, comment changes and fired triggers; returns |
|
| Create an issue, returning it |
|
| Change any of those fields; the ones you omit stay as they are |
|
| Move an issue to another queue, which changes its key ( |
|
versiongoes stale on its own. Queue triggers and automation run right afterissue_createand bump it, so the version it returns is routinely already old. Re-read it withissue_getimmediately beforeissue_update, or omit it to update the latest version unconditionally; a stale one fails with an editing conflict.Reference fields take the same values on create and on update: an object with
idand/orkey, or - fortype,priorityandparent- the bare key or id.componentstake{"id": ...}or{"name": ...}, andcomponents/followersreplace the current list rather than adding to it. Anything without a dedicated argument goes into thefieldsmap, keyed by the fieldidfromqueue_get_fields; an entry there overrides the dedicated argument, and an explicitnullclears the field.Transitions are not guessed.
issue_execute_transitiononly takes ids fromissue_get_transitions, and beforeissue_closeread the issue'stypewithissue_getand the resolutions valid for that type fromqueue_get_metadatawithexpand: ["issueTypesConfig"]- each type has its own set. Where the client supports elicitation,issue_moveasks the user to confirm its flags first, and declining aborts the move.
Every tool here respects TRACKER_LIMIT_QUEUES and TRACKER_READ_ONLY_QUEUES; the ones that write are registered only when TRACKER_READ_ONLY is off.
Tool | What it does | Key arguments |
| Search issues with Yandex Tracker Query Language; returns |
|
| How many issues match a query; returns |
|
fieldsuses Tracker's own spelling (storyPoints, notstory_points) and accepts any field name, a queue's local and the organization's custom fields included - pass the fieldidfromqueue_get_fields. A name Tracker does not know is dropped silently.include_descriptionis ignored whendescriptionis listed infields: naming it there is an explicit request for it.per_pagedefaults to 100 and can be lowered when a page does not fit the context window.
http Transport
The MCP server can also be run in streamable-http mode for web-based integrations or when stdio transport is not suitable.
streamable-http Mode Environment Variables
# Required - Set transport to streamable-http mode
TRANSPORT=streamable-http
# Server Configuration
HOST=0.0.0.0 # Default: 0.0.0.0 (all interfaces)
PORT=8000 # Default: 8000Starting the streamable-http Server
# Basic streamable-http server startup
TRANSPORT=streamable-http uvx yandex-tracker-mcp@latest
# With custom host and port
TRANSPORT=streamable-http \
HOST=localhost \
PORT=9000 \
uvx yandex-tracker-mcp@latest
# With all environment variables
TRANSPORT=streamable-http \
HOST=0.0.0.0 \
PORT=8000 \
TRACKER_TOKEN=your_token \
TRACKER_CLOUD_ORG_ID=your_org_id \
uvx yandex-tracker-mcp@latestYou may skip configuring TRACKER_CLOUD_ORG_ID or TRACKER_ORG_ID if you are using the following format when connecting to MCP Server (example for Claude Code):
claude mcp add --transport http yandex-tracker "http://localhost:8000/mcp/?cloudOrgId=your_cloud_org_id&"or
claude mcp add --transport http yandex-tracker "http://localhost:8000/mcp/?orgId=org_id&"You may also skip configuring global TRACKER_TOKEN environment variable if you choose to use OAuth 2.0 authentication (see below).
OAuth 2.0 Authentication
The Yandex Tracker MCP Server supports OAuth 2.0 authentication as a secure alternative to static API tokens. When configured, the server acts as an OAuth provider, facilitating authentication between your MCP client and Yandex OAuth services.
How OAuth Works
The MCP server implements a standard OAuth 2.0 authorization code flow:
Client Registration: Your MCP client registers with the server to obtain client credentials
Authorization: Users are redirected to Yandex OAuth to authenticate
Token Exchange: The server exchanges authorization codes for access tokens
API Access: Clients use bearer tokens for all API requests
Token Refresh: Expired tokens can be refreshed without re-authentication
MCP Client → MCP Server → Yandex OAuth → User Authentication
↑ ↓
└────────── Access Token ←─────────────────┘OAuth Configuration
To enable OAuth authentication, set the following environment variables:
# Enable OAuth mode
OAUTH_ENABLED=true
# Yandex OAuth Application Credentials (required for OAuth)
OAUTH_CLIENT_ID=your_yandex_oauth_app_id
OAUTH_CLIENT_SECRET=your_yandex_oauth_app_secret
# Public URL of your MCP server (required for OAuth callbacks)
MCP_SERVER_PUBLIC_URL=https://your-mcp-server.example.com
# Optional OAuth settings
OAUTH_SERVER_URL=https://oauth.yandex.ru # Default Yandex OAuth server
# When OAuth is enabled, TRACKER_TOKEN becomes optionalOAuth Scopes
With OAUTH_USE_SCOPES=true (the default) the server requests, advertises and requires the Yandex
Tracker scopes tracker:read and tracker:write - or tracker:read alone when
TRACKER_READ_ONLY=true, so a read-only instance never asks the user for write access. Setting
OAUTH_USE_SCOPES=false drops scopes from the flow entirely, which is what Yandex Cloud federation
requires.
Setting Up Yandex OAuth Application
Go to Yandex OAuth and create a new application
Set the callback URL to:
{MCP_SERVER_PUBLIC_URL}/oauth/yandex/callbackRequest the following permissions:
tracker:read- Read permissions for Trackertracker:write- Write permissions for Tracker
Save your Client ID and Client Secret
OAuth vs Static Token Authentication
Feature | OAuth | Static Token |
Security | Dynamic tokens with expiration | Long-lived static tokens |
User Experience | Interactive login flow | One-time configuration |
Token Management | Automatic refresh | Manual rotation |
Access Control | Per-user authentication | Shared token |
Setup Complexity | Requires OAuth app setup | Simple token configuration |
OAuth Mode Limitations
Currently, the OAuth mode requires the MCP server to be publicly accessible for callback URLs
OAuth mode is best suited for interactive clients that support web-based authentication flows
Using OAuth with MCP Clients
When OAuth is enabled, MCP clients will need to:
Support OAuth 2.0 authorization code flow
Handle token refresh when access tokens expire
Store refresh tokens securely for persistent authentication
Note: Not all MCP clients currently support OAuth authentication. Check your client's documentation for OAuth compatibility.
Example configuration for Claude Code:
claude mcp add --transport http yandex-tracker https://your-mcp-server.example.com/mcp/ -s userOAuth Data Storage
The MCP server supports two different storage backends for OAuth data (client registrations, access tokens, refresh tokens, and authorization states):
InMemory Store (Default)
The in-memory store keeps all OAuth data in server memory. This is the default option and requires no additional configuration.
Characteristics:
Persistence: Data is lost when the server restarts
Performance: Very fast access since data is stored in memory
Scalability: Limited to single server instance
Setup: No additional dependencies required
Best for: Development, testing, or single-instance deployments where losing OAuth sessions on restart is acceptable
Configuration:
OAUTH_STORE=memory # Default value, can be omittedRedis Store
The Redis store provides persistent storage for OAuth data using a Redis database. This ensures OAuth sessions survive server restarts and enables multi-instance deployments.
Characteristics:
Persistence: Data persists across server restarts
Performance: Fast access with network overhead
Scalability: Supports multiple server instances sharing the same Redis database
Setup: Requires Redis server installation and configuration
Best for: Production deployments, high availability setups, or when OAuth sessions must persist
Configuration:
# Enable Redis store for OAuth data
OAUTH_STORE=redis
# Redis connection settings (same as used for tools caching)
REDIS_ENDPOINT=localhost # Default: localhost
REDIS_PORT=6379 # Default: 6379
REDIS_DB=0 # Default: 0
REDIS_PASSWORD=your_redis_password # Optional: Redis password
REDIS_POOL_MAX_SIZE=10 # Default: 10Storage Behavior:
Client Information: Stored persistently
OAuth States: Stored with TTL (time-to-live) for security
Authorization Codes: Stored with TTL and automatically cleaned up after use
Access Tokens: Stored with automatic expiration based on token lifetime
Refresh Tokens: Stored persistently until revoked
Key Namespacing: Uses
oauth:*prefixes to avoid conflicts with other Redis data
Token Encryption (Required for Redis Store)
When using Redis store, you must configure encryption to protect OAuth tokens at rest. Token values are encrypted using Fernet (AES-128) and Redis keys use SHA-256 hashes instead of raw tokens, preventing token exposure if Redis is compromised.
Generate an encryption key:
python3 -c "import base64, os; print(base64.b64encode(os.urandom(32)).decode())"Configuration:
# Single encryption key
OAUTH_ENCRYPTION_KEYS=<base64-encoded-32-byte-key>
# Multiple keys for rotation (first encrypts, all decrypt)
OAUTH_ENCRYPTION_KEYS=<new-key>,<old-key>Key rotation allows seamless key updates: add the new key first, wait for old tokens to expire, then remove the old key.
Important Notes:
Both stores use the same Redis connection settings as the tools caching system
When using Redis store, ensure your Redis instance is properly secured and accessible
The
OAUTH_STOREsetting only affects OAuth data storage; tools caching usesTOOLS_CACHE_ENABLEDRedis store uses JSON serialization for better cross-language compatibility and debugging
Authentication
Yandex Tracker MCP Server supports multiple authentication methods with a clear priority order. The server will use the first available authentication method based on this hierarchy:
Authentication Priority Order
Dynamic OAuth Token (highest priority)
When OAuth is enabled and a user authenticates via OAuth flow
Tokens are dynamically obtained and refreshed per user session
Supports both standard Yandex OAuth and Yandex Cloud federative OAuth
Required env vars:
OAUTH_ENABLED=true,OAUTH_CLIENT_ID,OAUTH_CLIENT_SECRET,MCP_SERVER_PUBLIC_URLAdditional vars for federative OAuth:
OAUTH_SERVER_URL=https://auth.yandex.cloud/oauth,OAUTH_TOKEN_TYPE=Bearer,OAUTH_USE_SCOPES=false
Passthrough Bearer OAuth Token
When MCP OAuth middleware does not provide a token, the server can read a Yandex OAuth token from the incoming
Authorization: Bearer <token>headerUseful behind a trusted reverse proxy or gateway that authenticates users, resolves their stored Yandex OAuth token, and injects it per request
The token from MCP OAuth still has priority when OAuth mode is enabled and active
Static OAuth Token
Traditional OAuth token provided via environment variable
Single token used for all requests
Required env var:
TRACKER_TOKEN(your OAuth token)
Static IAM Token
IAM (Identity and Access Management) token for service-to-service authentication
Suitable for automated systems and CI/CD pipelines
Required env var:
TRACKER_IAM_TOKEN(your IAM token)
Dynamic IAM Token (lowest priority)
Automatically retrieved using service account credentials
Token is fetched and refreshed automatically
Required env vars:
TRACKER_SA_KEY_ID,TRACKER_SA_SERVICE_ACCOUNT_ID,TRACKER_SA_PRIVATE_KEY
Authentication Scenarios
Scenario 1: OAuth with Dynamic Tokens (Recommended for Interactive Use)
# Enable OAuth mode
OAUTH_ENABLED=true
OAUTH_CLIENT_ID=your_oauth_app_id
OAUTH_CLIENT_SECRET=your_oauth_app_secret
MCP_SERVER_PUBLIC_URL=https://your-server.com
# Organization ID (choose one)
TRACKER_CLOUD_ORG_ID=your_cloud_org_id # or TRACKER_ORG_IDScenario 2: Static OAuth Token (Simple Setup)
# OAuth token
TRACKER_TOKEN=your_oauth_token
# Organization ID (choose one)
TRACKER_CLOUD_ORG_ID=your_cloud_org_id # or TRACKER_ORG_IDScenario 3: Passthrough Bearer Token Behind a Reverse Proxy
Use this mode when a trusted gateway handles user authentication, looks up the user's Yandex OAuth token, and forwards the request to the MCP server with that token in the request header:
Authorization: Bearer <user_yandex_oauth_token># Organization ID (choose one)
TRACKER_CLOUD_ORG_ID=your_cloud_org_id # or TRACKER_ORG_IDThis passthrough token is used only when MCP OAuth middleware has not provided an access token for the request. In OAuth-enabled deployments with an active MCP OAuth session, the MCP OAuth token takes priority.
Scenario 4: Static IAM Token
# IAM token
TRACKER_IAM_TOKEN=your_iam_token
# Organization ID (choose one)
TRACKER_CLOUD_ORG_ID=your_cloud_org_id # or TRACKER_ORG_IDScenario 5: Dynamic IAM Token with Service Account
# Service account credentials
TRACKER_SA_KEY_ID=your_key_id
TRACKER_SA_SERVICE_ACCOUNT_ID=your_service_account_id
TRACKER_SA_PRIVATE_KEY=your_private_key
# Organization ID (choose one)
TRACKER_CLOUD_ORG_ID=your_cloud_org_id # or TRACKER_ORG_IDScenario 6: Federative OAuth for OIDC Applications (Advanced)
# Enable OAuth with Yandex Cloud federation
OAUTH_ENABLED=true
OAUTH_SERVER_URL=https://auth.yandex.cloud/oauth
OAUTH_TOKEN_TYPE=Bearer
OAUTH_USE_SCOPES=false
OAUTH_CLIENT_ID=your_oidc_client_id
OAUTH_CLIENT_SECRET=your_oidc_client_secret
MCP_SERVER_PUBLIC_URL=https://your-server.com
# Organization ID (choose one)
TRACKER_CLOUD_ORG_ID=your_cloud_org_id # or TRACKER_ORG_IDThis configuration enables authentication through Yandex Cloud OIDC applications, which is required for federated accounts in Yandex Cloud. Federated users authenticate through their organization's identity provider (IdP) and use this OAuth flow to access Yandex Tracker APIs.
Important Notes
The server checks authentication methods in the order listed above
Only one authentication method will be used at a time
For production use, dynamic tokens (OAuth or IAM) are recommended for better security
IAM tokens have a shorter lifetime than OAuth tokens and may need more frequent renewal
When using service accounts, ensure the account has appropriate permissions for Yandex Tracker
Configuration
Environment Variables
# Authentication (use one of the following methods)
# Method 1: OAuth Token
TRACKER_TOKEN=your_yandex_tracker_oauth_token
# Method 2: IAM Token
TRACKER_IAM_TOKEN=your_iam_token
# Method 3: Service Account (for dynamic IAM token)
TRACKER_SA_KEY_ID=your_key_id # Service account key ID
TRACKER_SA_SERVICE_ACCOUNT_ID=your_sa_id # Service account ID
TRACKER_SA_PRIVATE_KEY=your_private_key # Service account private key
# Organization Configuration (set exactly one - setting both is an error)
TRACKER_CLOUD_ORG_ID=your_cloud_org_id # For Yandex Cloud organizations
TRACKER_ORG_ID=your_org_id # For Yandex 360 organizations
# API Configuration (optional)
TRACKER_API_BASE_URL=https://api.tracker.yandex.net # Default: https://api.tracker.yandex.net
TRACKER_API_TIMEOUT=10 # Default: 10 - Per-request timeout in seconds for Tracker API calls
# Security - Restrict access to specific queues (optional)
TRACKER_LIMIT_QUEUES=PROJ1,PROJ2,DEV # Comma-separated queue keys - allow-list of accessible queues
TRACKER_READ_ONLY_QUEUES=PROJ2 # Comma-separated queue keys - allowed for reads but reject writes (per-queue read-only)
TRACKER_ENTITIES_ENABLED=true # Default: false - Register project/portfolio/goal tools (NOT covered by the queue restrictions above)
# Server Configuration
HOST=0.0.0.0 # Default: 0.0.0.0
PORT=8000 # Default: 8000
TRANSPORT=stdio # Options: stdio, streamable-http, sse
# Redis connection settings (used for caching and OAuth store)
REDIS_ENDPOINT=localhost # Default: localhost
REDIS_PORT=6379 # Default: 6379
REDIS_DB=0 # Default: 0
REDIS_PASSWORD=your_redis_password # Optional: Redis password
REDIS_POOL_MAX_SIZE=10 # Default: 10
# Tools caching configuration (optional)
TOOLS_CACHE_ENABLED=true # Default: false
TOOLS_CACHE_REDIS_TTL=3600 # Default: 3600 seconds (1 hour)
# OAuth 2.0 Authentication (optional)
OAUTH_ENABLED=true # Default: false
OAUTH_STORE=redis # Options: memory, redis (default: memory)
OAUTH_SERVER_URL=https://oauth.yandex.ru # Default: https://oauth.yandex.ru (use https://auth.yandex.cloud/oauth for federation)
OAUTH_TOKEN_TYPE=<Bearer|OAuth|<empty>> # Default: <empty> (required to be Bearer for Yandex Cloud federation)
OAUTH_USE_SCOPES=true # Default: true (set to false for Yandex Cloud federation)
OAUTH_CLIENT_ID=your_oauth_client_id # Required when OAuth enabled
OAUTH_CLIENT_SECRET=your_oauth_secret # Required when OAuth enabled
MCP_SERVER_PUBLIC_URL=https://your.server.com # Required when OAuth enabled
TRACKER_READ_ONLY=true # Default: false - Disable all write tools for the whole instanceQueue Access Control
Access to queues can be scoped at three levels, from coarse to fine-grained:
TRACKER_LIMIT_QUEUES— allow-list of queue keys. Queues outside the list are treated as not found / not allowed for both reads and writes. Keys are matched ignoring case, here and inTRACKER_READ_ONLY_QUEUES, sodevandDEVname the same queue. The one exception is the board tools: a board belongs to the organization rather than to a queue, so they are not filtered and can name a restricted queue in a board's settings.TRACKER_READ_ONLY— whentrue, all write tools are unregistered, so the whole instance is read-only.TRACKER_READ_ONLY_QUEUES— per-queue read-only allow-list. Write tools stay registered, but any mutating call (create/update/move/comment/worklog/link, queue version creation) targeting a listed queue is rejected, while reads keep working. Queues not listed here remain read-write.
Project/portfolio/goal tools are outside this model. A project, portfolio or goal isn't reliably mappable to a single queue, so none of the three settings above constrain them — neither the read tools (
project_get,project_find,*_get_comments, …) nor the write tools (including comment and checklist tools). Enabling them grants org-wide access to those entities for anyone who can reach the server. For this reason they are opt-in: they are registered only whenTRACKER_ENTITIES_ENABLED=true(defaultfalse), which also keeps the tool manifest small for deployments that don't need them.TRACKER_READ_ONLYstill applies: it unregisters entity write tools along with all other write tools.
This lets a single instance be read-write on some queues and read-only on
others at the same time — e.g. TRACKER_LIMIT_QUEUES=DEV,MGMT together with
TRACKER_READ_ONLY_QUEUES=MGMT gives full access to DEV and read-only
visibility into MGMT. This is especially useful for a shared MCP gateway where
end users reach Tracker only through the server and never hold the raw token
themselves.
These checks are in-process guardrails. For clients that hold the raw Tracker token directly, real limits should additionally be enforced on the token itself.
Docker Deployment
Using Pre-built Image (Recommended)
The image defaults to TRANSPORT=stdio, which talks over the container's stdin/stdout and
opens no port. Set TRANSPORT=streamable-http for the examples below, where the server is
reached over HTTP; for a stdio client, run the container with -i and no -p instead (see
the MCP Client Configuration examples).
# Using environment file (it must set TRANSPORT=streamable-http)
docker run --env-file .env -p 8000:8000 ghcr.io/aikts/yandex-tracker-mcp:latest
# With inline environment variables
docker run -e TRACKER_TOKEN=your_token \
-e TRACKER_CLOUD_ORG_ID=your_org_id \
-e TRANSPORT=streamable-http \
-p 8000:8000 \
ghcr.io/aikts/yandex-tracker-mcp:latestBuilding the Image Locally
docker build -t yandex-tracker-mcp .Docker Compose
Using pre-built image:
services:
mcp-tracker:
image: ghcr.io/aikts/yandex-tracker-mcp:latest
ports:
- "8000:8000"
environment:
- TRACKER_TOKEN=${TRACKER_TOKEN}
- TRACKER_CLOUD_ORG_ID=${TRACKER_CLOUD_ORG_ID}
- TRANSPORT=streamable-httpBuilding locally:
services:
mcp-tracker:
build: .
ports:
- "8000:8000"
environment:
- TRACKER_TOKEN=${TRACKER_TOKEN}
- TRACKER_CLOUD_ORG_ID=${TRACKER_CLOUD_ORG_ID}
- TRANSPORT=streamable-httpDevelopment Setup
# Clone and setup
git clone https://github.com/aikts/yandex-tracker-mcp
cd yandex-tracker-mcp
# Install development dependencies
uv sync --dev
# Formatting and static checking
taskLicense
This project is licensed under the terms specified in the LICENSE file.
Support
For issues and questions:
Review Yandex Tracker API documentation
Submit issues at https://github.com/aikts/yandex-tracker-mcp/issues
Available Tools
55 toolsboard_getGet BoardARead-only
Get a single Yandex Tracker agile board (in russian - 'доска') with its settings, columns, the field issues are estimated by and the working calendar. autoFilterSettings is the board's own filter and tells which issues it collects - read it to learn which queue a board is about.
Inputs: board_id (required), fields. Returns: An agile board ("доска задач") of the organization.
board_get_columnsGet Board ColumnsARead-only
Get the columns of a Yandex Tracker agile board with the issue statuses mapped onto each - use it to see which status an issue needs to show up in a given column. Richer than the columns in boards_get_all / board_get, which carry no statuses.
Inputs: board_id (required). Returns: result
board_get_sprintsGet Board SprintsARead-only
Get all sprints (in russian - 'спринты') of a specific Yandex Tracker agile board. The currently running sprint is the one with status 'in_progress'. Use the returned sprint id to put an issue into a sprint with the issue_create or issue_update tools.
Inputs: board_id (required), fields. Returns: result
boards_get_allGet All BoardsARead-only
Get the agile boards (in russian - 'доски') of the organization; pass queue for the boards collecting issues of that queue. Matching is done on the board's own filter, so boards filtering by something else are missed - read a few issues with issues_find and look at their boards field for those.
Inputs: queue, cursor, fields, per_page. Returns: A page of boards plus the cursor to fetch the next one. `GET /v3/boards/_pagina…
comment_template_getGet Comment TemplateARead-only
Get a single Yandex Tracker comment template by its id, including the comment text it inserts. Use comment_templates_get_all first to find the template id.
Inputs: template_id (required). Returns: Comment template configured in Yandex Tracker settings. Adds ``template``, ``su…
comment_templates_get_allGet Comment TemplatesARead-only
Get the comment templates configured in Yandex Tracker - the wording a team reuses when replying, with the users and mailing lists such a comment summons. Read one before adding a comment. Pass queue for the templates of that queue plus those bound to no queue. All pages are fetched by default; pass page for a single one.
Inputs: page, queue, per_page. Returns: hits, pages, values
component_createCreate ComponentA
Create a component (in russian - 'компонент') in a Yandex Tracker queue - a label grouping the queue's issues by product, process or owner; lead is a user login.
Inputs: name (required), queue_id (required), lead, assign_auto, +1 more. Returns: A queue component as the API returns it; `description` and `lead` are absent wh…
component_deleteDelete ComponentADestructive
Delete a Yandex Tracker queue component (in russian - 'компонент') by its numeric id. Cannot be undone.
Inputs: component_id (required). Returns: result
component_getGet ComponentARead-only
Get one Yandex Tracker queue component (in russian - 'компонент') by its numeric id, with queue, lead, assignAuto and the version that component_update takes. Ids come from queue_get_components or an issue's components field.
Inputs: component_id (required). Returns: A queue component as the API returns it; `description` and `lead` are absent wh…
component_updateUpdate ComponentA
Change the name, description, lead or auto-assign flag of a Yandex Tracker queue component (in russian - 'компонент'); omitted fields keep their value, clear_lead removes the lead.
Inputs: component_id (required), lead, name, version, +3 more. Returns: A queue component as the API returns it; `description` and `lead` are absent wh…
get_global_fieldsGet Global FieldsARead-only
Get all global fields available in Yandex Tracker that can be used in issues
Inputs: no named parameters. Returns: result
get_issue_typesGet Issue TypesARead-only
Get all issue types available in Yandex Tracker that can be used when creating or updating issues
Inputs: no named parameters. Returns: result
get_prioritiesGet PrioritiesARead-only
Get the issue priority levels of Yandex Tracker - trivial, minor, normal, critical, blocker and whatever else the organization configured - with the id and key that issue_create and issue_update accept in priority. The list is organization-wide: a queue may still reject a priority it does not use.
Inputs: no named parameters. Returns: result
get_resolutionsGet ResolutionsARead-only
Get all resolutions available in Yandex Tracker that can be used when closing issues
Inputs: no named parameters. Returns: result
get_statusesGet StatusesARead-only
Get all statuses available in Yandex Tracker that can be used in issues
Inputs: no named parameters. Returns: result
issue_add_checklist_itemsAdd Issue Checklist ItemsA
Add one or more items to the checklist of a Yandex Tracker issue. The checklist is created if the issue does not have one yet, and items are appended in the order given. Returns the issue's checklist after the items were added.
Inputs: items (required), issue_id (required). Returns: result
issue_add_commentAdd Issue CommentA
Add a comment to a Yandex Tracker issue. There is no template_id parameter: check comment_templates_get_all (with queue set) first and copy the template's template text into text and its summonees into the parameters below. To mention or call people so they get notified, use summonees - '@login' in the text notifies nobody.
Inputs: text (required), issue_id (required), summonees, markup_type, +2 more. Returns: id, text, longId, textHtml, +7 more
issue_add_linkAdd Issue LinkA
Create a link between a Yandex Tracker issue and another issue. relationship reads from the current issue: 'depends on' means issue_id depends on the linked issue, 'is dependent by' is the reverse, 'relates' is a plain connection.
Inputs: issue (required), issue_id (required), relationship (required). Returns: id, type, object, status, +6 more
issue_add_worklogAdd WorklogA
Add a worklog entry (log spent time) to a Yandex Tracker issue
Inputs: duration (required), issue_id (required), start, comment. Returns: id, issue, start, comment, +5 more
issue_closeClose IssueA
Close a Yandex Tracker issue with a resolution: finds a transition to a 'done' status and executes it. The resolution has to be one the issue's type allows - read the type with issue_get, then call queue_get_metadata with expand=['issueTypesConfig'] for the resolutions of that type. Returns the transitions available in the new (closed) status.
Inputs: issue_id (required), resolution_id (required), fields, comment. Returns: result
issue_createCreate IssueA
Create an issue (in russian - 'задача') in a Yandex Tracker queue. There is no template argument: read a template with issue_templates_get_all and copy its fieldTemplates values into these arguments field by field. The returned version goes stale at once, as queue triggers bump it - re-read it with issue_get.
Inputs: queue (required), summary (required), tags, type, +10 more. Returns: key, epic, tags, type, +22 more
issue_delete_checklist_itemDelete Issue Checklist ItemADestructive
Delete a single item from the checklist of a Yandex Tracker issue. Use issue_get_checklist to get the item IDs. Returns the issue's checklist after the deletion.
Inputs: issue_id (required), checklist_item_id (required). Returns: result
issue_delete_commentDelete Issue CommentA
Delete a comment from a Yandex Tracker issue
Inputs: issue_id (required), comment_id (required). Returns: result
issue_delete_linkDelete Issue LinkA
Delete a link between a Yandex Tracker issue and another issue. Use issue_get_links to retrieve the link IDs for an issue.
Inputs: link_id (required), issue_id (required). Returns: result
issue_delete_worklogDelete WorklogA
Delete a worklog entry (spent time record) from a Yandex Tracker issue
Inputs: issue_id (required), worklog_id (required). Returns: result
issue_execute_transitionExecute Issue TransitionA
Execute a status transition for a Yandex Tracker issue. Call issue_get_transitions first and pass one of the ids it returned - the API rejects anything else. Returns the transitions available in the new status.
Inputs: issue_id (required), transition_id (required), fields, comment. Returns: result
issue_getGet IssueARead-only
Read one Yandex Tracker issue (task, ticket, bug; in russian - 'задача') by its key and return its full record, the current version included. To search instead, use issues_find. Comments, links, attachments, worklogs, checklist, changelog and transitions each have their own issue_get_* tool.
Inputs: issue_id (required), include_description. Returns: key, epic, tags, type, +22 more
issue_get_attachmentsGet Issue AttachmentsARead-only
Get attachments of a Yandex Tracker issue by its id
Inputs: issue_id (required), fields. Returns: result
issue_get_changelogGet Issue ChangelogARead-only
Get the change history (changelog) of a Yandex Tracker issue: status transitions, field edits (who changed what from -> to and when), comment changes and executed triggers. Returns a page of entries plus next_cursor - pass it back as cursor until it is null.
Inputs: issue_id (required), type, field, cursor, +1 more. Returns: A page of issue changelog entries plus the cursor to fetch the next page. `next…
issue_get_checklistGet Issue ChecklistARead-only
Get checklist items of a Yandex Tracker issue by its id
Inputs: issue_id (required). Returns: result
issue_get_commentsGet Issue CommentsARead-only
Get a page of comments of a Yandex Tracker issue by its id. Returns the comments plus next_cursor - pass it back as cursor until it is null.
Inputs: issue_id (required), cursor, fields, per_page. Returns: A page of comments plus the cursor to fetch the next page. `next_cursor` is the…
issue_get_linksGet Issue LinksBRead-only
Get a Yandex Tracker issue related links to other issues by its id
Inputs: issue_id (required). Returns: result
issue_get_transitionsGet Issue TransitionsARead-only
Get possible status transitions for a Yandex Tracker issue. Returns list of available transitions that can be performed on the issue.
Inputs: issue_id (required). Returns: result
issue_get_urlGet Issue URLARead-only
Get a Yandex Tracker issue url by its id
Inputs: issue_id (required). Returns: result
issue_get_worklogsGet Issue WorklogsARead-only
Get worklogs of a Yandex Tracker issue by its id
Inputs: issue_ids (required), fields. Returns: object
issue_moveMove Issue to Another QueueA
Move a Yandex Tracker issue to a different queue. The issue will receive a new key in the target queue (e.g., TASKS-1 → NEWQUEUE-42). Returns the updated issue with its new key and queue.
Inputs: queue (required), issue_id (required), notify, notify_author, +2 more. Returns: key, epic, tags, type, +22 more
issues_countCount IssuesARead-only
Get the count of Yandex Tracker issues matching a query.
Inputs: query (required). Returns: The number of issues matching a query.
issues_findFind IssuesARead-only
Find Yandex Tracker issues matching a Yandex Tracker Query (YQL) - not limited to queue/date, any indexed field can be used (assignee, status, tags, etc., see the query parameter for the full syntax).
Inputs: query (required), page, fields, per_page, +1 more. Returns: hits, pages, values
issue_template_getGet Issue TemplateARead-only
Get a single Yandex Tracker issue template by its id, with the field values it prefills; find the id with issue_templates_get_all. The issue body is in fieldTemplates.description, not the template's own description.
Inputs: template_id (required). Returns: Issue template configured in Yandex Tracker settings. Adds ``fieldTemplates`` t…
issue_templates_get_allGet Issue TemplatesARead-only
Get the issue templates (in russian - 'шаблоны задач') configured in Yandex Tracker, optionally scoped to a queue - read one before issue_create instead of inventing a structure. The issue body is in fieldTemplates.description; the template's own description describes the template.
Inputs: page, queue, per_page. Returns: hits, pages, values
issue_updateUpdate IssueA
Update an existing Yandex Tracker issue. Only the parameters you pass change; the rest stay as they are. Use queue_get_fields to discover the queue's fields. version is optional optimistic locking - pass one read moments earlier with issue_get, never the one issue_create returned, since triggers bump it right after creation.
Inputs: issue_id (required), tags, type, fields, +11 more. Returns: key, epic, tags, type, +22 more
issue_update_checklist_itemUpdate Issue Checklist ItemA
Update one checklist item of a Yandex Tracker issue - to check it off, rename it, or set an assignee or a deadline. Only the fields you pass change, and null leaves a field as it is: use clear_assignee / clear_deadline to remove a value. Item ids come from issue_get_checklist. Returns the whole checklist.
Inputs: issue_id (required), checklist_item_id (required), text, checked, +4 more. Returns: result
issue_update_commentUpdate Issue CommentA
Update an existing comment in a Yandex Tracker issue. To mention or call people, use summonees, not '@login' in the text.
Inputs: text (required), issue_id (required), comment_id (required), summonees, +2 more. Returns: id, text, longId, textHtml, +7 more
issue_update_worklogUpdate WorklogB
Update a worklog entry (spent time record) in a Yandex Tracker issue
Inputs: issue_id (required), worklog_id (required), start, comment, +1 more. Returns: id, issue, start, comment, +5 more
queue_create_versionCreate Queue VersionB
Create a new version in a Yandex Tracker queue.
Inputs: name (required), queue_id (required), due_date, start_date, +1 more. Returns: id, name, dueDate, version, +4 more
queue_get_componentsGet Queue ComponentsARead-only
Get the components (in russian - 'компоненты') of a Yandex Tracker queue with lead, auto-assign flag and version. queue_get_metadata with expand=['components'] names them only (id and name); the id is what issue_create / issue_update take in components.
Inputs: queue_id (required). Returns: result
queue_get_fieldsGet Queue FieldsARead-only
Get the fields configured on a Yandex Tracker queue (in russian - 'поля очереди'), its local ones included; schema.required marks the mandatory ones. Not the whole registry: system fields such as parent or estimation are settable without appearing here, and get_global_fields lists every organization field.
Inputs: queue_id (required), include_local_fields. Returns: result
queue_get_metadataGet Queue MetadataARead-only
Get detailed metadata about a specific Yandex Tracker queue: name, description, default type and priority, plus the sections named in expand (issue types with their resolutions, workflows, team, ...). Use expand=['issueTypesConfig'] for the resolutions issue_close needs.
Inputs: queue_id (required), expand. Returns: id, key, name, defaultType, +3 more
queue_get_tagsGet Queue TagsARead-only
Get all tags for a specific Yandex Tracker queue
Inputs: queue_id (required). Returns: result
queue_get_versionsGet Queue VersionsARead-only
Get all versions for a specific Yandex Tracker queue
Inputs: queue_id (required). Returns: result
queues_get_allGet All QueuesARead-only
Find all Yandex Tracker queues available to the user (a queue is a project in some sense). page defaults to None and fetches ALL pages; pass a page number only when the result does not fit the context window.
Inputs: page, fields, per_page. Returns: hits, pages, values
user_getGet UserARead-only
Get information about a specific user by login or UID
Inputs: user_id (required). Returns: uid, email, login, display, +4 more
user_get_currentGet Current UserARead-only
Get information about the current authenticated user
Inputs: no named parameters. Returns: uid, email, login, display, +4 more
users_get_allGet All UsersCRead-only
Get information about user accounts registered in the organization.
Inputs: page, fields, per_page. Returns: hits, pages, values
users_searchSearch UsersARead-only
Search user based on login, email or real name (first or last name, or both). Returns either single user or multiple users if several match the query or an empty list if no users matched.
Inputs: login_or_email_or_name (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 55 tools
Most tools are clearly separated by resource and action (queues, boards, issues, components, users, templates). Some potential confusion exists between queue_get_components and component_get, or between issue_get and issues_find, but descriptions clarify the distinction well.
The naming mostly follows a consistent resource_action pattern (e.g., issue_get, issue_create, issue_update, queue_get_components). Minor deviations exist: issues_find vs issue_get, issues_count, get_priorities, get_statuses, get_issue_types, get_global_fields, get_resolutions, users_get_all vs user_get, and board_get_sprints vs boards_get_all.
55 tools is on the heavy side, but the server covers a broad domain (queues, boards, issues, components, users, templates, worklogs, checklists, links, transitions). The count is justified by the breadth, though it approaches the upper limit of what an agent can comfortably navigate.
The tool surface is remarkably complete: full CRUD for issues, comments, worklogs, checklist items, components, links, and versions; plus metadata discovery (fields, statuses, resolutions, priorities, templates, transitions). No obvious dead ends—every returned ID has a corresponding tool that consumes it.
Maintenance
Related MCP Connectors
Issues, projects, cycles, and roadmaps via the official Linear hosted MCP server.
Unofficial community ClickUp MCP via personal API token. Not affiliated with ClickUp.
Agile project management over MCP: boards, epics, roadmap, retros, whiteboards, wiki, metrics
Read and write Mission Control state via MCP — projects, tasks, subtasks, templates, status updates.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Yandex.Tracker task management system through MCP protocol. Supports creating and managing issues, searching tasks, handling comments, managing projects and queues, and generating analytics reports.ISC
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Yandex Tracker through its API for managing tasks, comments, and attachments. It supports issue searching, status transitions, and metadata retrieval for automated project management.MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for Yandex Tracker API, enabling AI assistants to search, read, create, and edit issues, as well as manage comments, attachments, and links in Yandex Tracker.77 npm1MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for interacting with YouTrack, enabling issue management, project operations, and search via natural language.42 npm99MIT