
Yandex Tracker Mcp
io.github.APonkratovPublished by GitHub account APonkratovv0.8.2Updated Oct 24, 2026
MCP server for Yandex Tracker API.
Overview
Local MCP server for Yandex Tracker that lets an assistant browse queues, manage issues and versions, and work with projects, portfolios and goals.
- What you can do
- List queues with pagination and field selection, and read queue tags, versions, fields and metadata; create versions in a queue. Create, read, update and close issues, including custom fields, attachments and status transitions, with query-language filtering and sorting. Get, search, create, update and delete projects, portfolios and goals, and read their event history. Look up user account details such as login, email and license status.
- When to use it
- Useful when a team tracks work in Yandex Tracker and wants an assistant to look up queues and issues, draft or update tickets, move them through workflow statuses, or manage projects and goals without switching to the web UI.
- Requirements
- Runs locally via uvx or the published Docker image, or as a streamable-http server. Needs a Yandex organization ID in TRACKER_CLOUD_ORG_ID or TRACKER_ORG_ID, plus one authentication method: TRACKER_TOKEN, TRACKER_IAM_TOKEN, service account credentials (TRACKER_SA_KEY_ID, TRACKER_SA_SERVICE_ACCOUNT_ID, TRACKER_SA_PRIVATE_KEY), or OAuth settings. Optional Redis for caching and OAuth storage.
Installation
In SourceWeft
- Open Yandex Tracker Mcp in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Yandex Tracker MCP Server
[PyPI - Version] [Test Workflow] [Release Workflow]
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.
[Image]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
- 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
- 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 organizations - Yandex 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.
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. [img.png]
- Provide your Yandex Tracker OAuth token when prompted. [img.png]
- 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
TRACKER_CLOUD_ORG_IDorTRACKER_ORG_ID- Your Yandex Cloud (or Yandex 360) organization ID
Claude Desktop
Configuration file path:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Using uvx:
Using Docker:
Claude Code
Using uvx:
Using Docker:
Cursor
Configuration file path:
- Project-specific:
.cursor/mcp.jsonin your project directory - Global:
~/.cursor/mcp.json
Using uvx:
Using Docker:
Windsurf
Configuration file path:
~/.codeium/windsurf/mcp_config.json
Access via: Windsurf Settings → Cascade tab → Model Context Protocol (MCP) Servers → "View raw config"
Using uvx:
Using Docker:
Zed
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:
Using Docker:
GitHub Copilot (VS Code)
Configuration file path:
- Workspace:
.vscode/mcp.jsonin your project directory - Global: VS Code
settings.json
Option 1: Workspace Configuration (Recommended for security)
Create .vscode/mcp.json:
Using uvx:
Using Docker:
Option 2: Global Configuration
Add to VS Code settings.json:
Using uvx:
Using Docker:
Other MCP-Compatible Clients
For other MCP-compatible clients, use the standard MCP server configuration format:
Using uvx:
Using Docker:
Important Notes:
- Replace placeholder values with your actual credentials
- Restart your AI client after configuration changes
- Ensure
uvxis installed and available in your system PATH - For production use, consider using environment variables instead of hardcoding tokens
Available MCP Tools
The server exposes the following tools through the MCP protocol:
Queue Management
-
queues_get_all: List all available Yandex Tracker queues- Parameters:
fields(optional): Fields to include in the response (e.g., ["key", "name"]). Helps optimize context window usage by selecting only needed fields. If not specified, returns all available fields.page(optional): Page number to return. If not specified, retrieves all pages automatically.per_page(optional): Number of items per page (default: 100)
- Returns paginated queue information with selective field inclusion
- Respects
TRACKER_LIMIT_QUEUESrestrictions
- Parameters:
-
queue_get_tags: Get all tags for a specific queue- Parameters:
queue_id(string, queue key like "SOMEPROJECT") - Returns list of available tags in the specified queue
- Respects
TRACKER_LIMIT_QUEUESrestrictions
- Parameters:
-
queue_get_versions: Get all versions for a specific queue- Parameters:
queue_id(string, queue key like "SOMEPROJECT") - Returns list of available versions in the specified queue with details like name, description, dates, and status
- Respects
TRACKER_LIMIT_QUEUESrestrictions
- Parameters:
-
queue_create_version: Create a new version in a specific queue- Parameters:
queue_id(string, required): Queue key like "SOMEPROJECT"name(string, required): Version namedescription(string, optional): Version descriptionstart_date(date, optional): Version start date inYYYY-MM-DDformatdue_date(date, optional): Version due date inYYYY-MM-DDformat
- Returns the created version with details like name, description, dates, and status
- Respects
TRACKER_LIMIT_QUEUESrestrictions
- Parameters:
-
queue_get_fields: Get fields for a specific queue- Parameters:
queue_id(string, required): Queue key like "SOMEPROJECT"include_local_fields(boolean, optional, default: true): Whether to include queue-specific local fields
- Returns list of global fields and optionally local (queue-specific) fields
- Makes parallel requests to fetch both field types when
include_local_fieldsis true - The
schema.requiredproperty indicates whether a field is mandatory - Use this to find available and required fields before creating an issue with
issue_createtool - Respects
TRACKER_LIMIT_QUEUESrestrictions
- Parameters:
-
queue_get_metadata: Get detailed metadata about a specific queue- Parameters:
queue_id(string, required): Queue key like "SOMEPROJECT"expand(array of strings, optional): Fields to expand in the response. Available options:all,projects,components,versions,types,team,workflows,fields,issueTypesConfig
- Returns queue information including name, description, default type/priority, and optionally expanded data
- Use
expand: ["issueTypesConfig"]to get available resolutions for each issue type (needed forissue_closetool) - Respects
TRACKER_LIMIT_QUEUESrestrictions
- Parameters:
Projects, Portfolios, and Goals
These tools use the unified Yandex Tracker Entities API. The entity_type parameter accepts project, portfolio, or goal.
entity_get: Get an entity byidor numericshortId; optionally request additionalfieldsor expandattachmentsentities_search: Search entities by name substring or arbitrary field filters, with field selection, sorting, root-only filtering, and page-based paginationentity_get_events: Get entity event history with relative cursor navigation (from_idorselected)entity_create: Create an entity;fields.summaryis required, and links can be created in the same requestentity_update: Update entity fields, links, and add an explanatory comment; collection fields support Tracker operators such asset,add, andremoveentity_delete: Delete an entity and optionally its associated boardentities_bulk_update: Start one bulk update for multiple entities of the same type
Common field keys include summary, description, lead, teamUsers, clients, followers, start, end, tags, parentEntity, entityStatus, and teamAccess. Dates must use the format expected by the Tracker API.
Write tools are unavailable when TRACKER_READ_ONLY=true.
Boards and Sprints
boards_list: List all boards available to the current userboard_get: Get board columns and automatic filter settings by board IDboard_get_sprints: List all sprints associated with a boardsprint_get: Get one sprint with status, archive flag, and planned/actual dates
These tools are read-only. Use the returned sprint ID in issues_find to retrieve the sprint's issues.
Saved Filters
filter_get: Get a saved issue filter by numeric IDfilter_find_issues: Execute a saved filter with page/per-page and response-field controlsfilter_create: Create a saved filter from either a Tracker query or field-value conditionsfilter_update: Update a saved filter's name, conditions, displayed fields, sorts, grouping, or folder
filter_create and filter_update are unavailable when TRACKER_READ_ONLY=true. issues_find and issues_count also accept filter_id as an alternative to query.
User Management
-
users_get_all: Get information about user accounts registered in the organization- Parameters:
per_page(optional): Number of users per page (default: 50)page(optional): Page number to return (default: 1)
- Returns paginated list of users with login, email, license status, and organizational details
- Includes user metadata such as external status, dismissal status, and notification preferences
- Parameters:
-
user_get: Get information about a specific user by login or UID- Parameters:
user_id(string, user login like "john.doe" or UID like "12345") - Returns detailed user information including login, email, license status, and organizational details
- Supports both user login names and numeric user IDs for flexible identification
- Parameters:
-
user_get_current: Get information about the current authenticated user- No parameters required
- Returns detailed information about the user associated with the current authentication token
- Includes login, email, display name, and organizational details for the authenticated user
-
users_search: Search user based on login, email or real name (first or last name, or both)- Parameters:
login_or_email_or_name(string, user login, email or real name to search for) - Returns either single user or multiple users if several match the query or an empty list if no users matched
- Uses fuzzy matching for real names with a similarity threshold of 80%
- Prioritizes exact matches for login and email over fuzzy name matches
- Parameters:
Field Management
get_global_fields: Get all global fields available in Yandex Tracker- Returns complete list of global fields that can be used in issues
- Includes field schema, type information, and configuration
Status and Type Management
-
get_statuses: Get all available issue statuses- Returns complete list of issue statuses that can be assigned
- Includes status IDs, names, and type information
-
get_issue_types: Get all available issue types- Returns complete list of issue types for creating/updating issues
- Includes type IDs, names, and configuration details
-
get_priorities: Get all available issue priorities- Returns complete list of priorities that can be assigned to issues
- Includes priority keys, names, and order information
-
get_resolutions: Get all available issue resolutions- Returns complete list of resolutions that can be used when closing issues
- Includes resolution keys, names, descriptions, and order information
Issue Operations
-
issue_get: Retrieve detailed issue information by ID- Parameters:
issue_id(string, format: "QUEUE-123")include_description(boolean, optional, default: true): Whether to include issue description in the result. Can be large, so use only when needed.
- Returns complete issue data including status, assignee, description, etc.
- Parameters:
-
issue_get_url: Generate web URL for an issue- Parameters:
issue_id(string) - Returns:
https://tracker.yandex.ru/{issue_id}
- Parameters:
-
issue_get_comments: Fetch all comments for an issue- Parameters:
issue_id(string) - Returns chronological list of comments with metadata
- Parameters:
-
issue_add_comment: Add a comment to an issue- Parameters:
issue_id(string, required, format: "QUEUE-123")text(string, required): Comment text (markdown supported by Tracker)summonees(array of strings, optional): Users to summon (logins or IDs). This is the API way to mention/call users (notifications are triggered by this field, not by@loginin text).maillist_summonees(array of strings, optional): Mailing lists to summon (emails)markup_type(string, optional): Usemdfor YFM (markdown)is_add_to_followers(boolean, optional, default: true): Add comment author to followers
- Returns created comment object
- Parameters:
-
issue_update_comment: Update an existing comment in an issue- Parameters:
issue_id(string, required, format: "QUEUE-123")comment_id(int, required): Comment IDtext(string, required): New comment text (markdown supported by Tracker)summonees(array of strings, optional): Users to summon (logins or IDs)maillist_summonees(array of strings, optional): Mailing lists to summon (emails)markup_type(string, optional): Usemdfor YFM (markdown)
- Returns updated comment object
- Parameters:
-
issue_delete_comment: Delete a comment from an issue- Parameters:
issue_id(string, required, format: "QUEUE-123")comment_id(int, required): Comment ID
- Returns:
null(success)
- Parameters:
-
issue_add_link: Create a link between an issue and another issue- Parameters:
issue_id(string, required, format: "QUEUE-123"): The current issuerelationship(string, required): Link type describing howissue_idrelates to the linked issue. One of:relates,is dependent by,depends on,is subtask for,is parent task for,duplicates,is duplicated by,is epic of,has epicissue(string, required): ID or key of the issue to link to (e.g. "TEST-123")
- Returns created link object
- Parameters:
-
issue_delete_link: Delete a link between an issue and another issue- Parameters:
issue_id(string, required, format: "QUEUE-123")link_id(int, required): Link ID (as returned byissue_get_links)
- Returns:
null(success)
- Parameters:
-
issue_get_links: Get related issue links- Parameters:
issue_id(string) - Returns links to related, blocked, or duplicate issues
- Parameters:
-
issue_get_worklogs: Retrieve worklog entries- Parameters:
issue_ids(array of strings, required)start_date_from(date, optional): Inclusive lower bound for the work start date (YYYY-MM-DD)start_date_to(date, optional): Inclusive upper bound for the work start date (YYYY-MM-DD)timezone(string, optional, defaultUTC): IANA time zone used when comparingstartdates (for example,Europe/Moscow)
- Retrieves every relative-pagination page for each issue and filters by the worklog
startfield, not bycreatedAt - Returns ISO 8601 durations exactly as supplied by Tracker. Week-based values must keep Tracker semantics:
P6Wis 30 working days, not 42 calendar days
- Parameters:
-
issue_add_worklog: Add a worklog entry (log spent time) to an issue- Parameters:
issue_id(string, required, format: "QUEUE-123")duration(string, required): ISO-8601 duration (e.g.PT1H30M)comment(string, optional): Worklog commentstart(datetime, optional): Work start datetime (UTC assumed if timezone is not provided)
- Returns created worklog entry
- Parameters:
-
issue_update_worklog: Update a worklog entry (spent time record) in an issue- Parameters:
issue_id(string, required, format: "QUEUE-123")worklog_id(int, required): Worklog entry IDduration(string, optional): ISO-8601 duration (e.g.PT1H30M)comment(string, optional): Worklog commentstart(datetime, optional): Work start datetime (UTC assumed if timezone is not provided)
- Returns updated worklog entry
- Parameters:
-
issue_delete_worklog: Delete a worklog entry (spent time record) from an issue- Parameters:
issue_id(string, required, format: "QUEUE-123")worklog_id(int, required): Worklog entry ID
- Returns:
null(success)
- Parameters:
-
issue_get_attachments: Get attachments for an issue- Parameters:
issue_id(string, format: "QUEUE-123") - Returns list of attachments with metadata for the specified issue
- Parameters:
-
issue_download_attachment: Download an attachment as an MCP embedded binary resource- Parameters:
issue_id,attachment_id, andfile_namereturned byissue_get_attachments - Enforces the
TRACKER_MAX_ATTACHMENT_BYTEStransfer limit
- Parameters:
-
issue_upload_attachment: Upload base64-encoded content as an issue attachment- Parameters:
issue_id,file_name,content_base64, and optionalmime_type - Unavailable when
TRACKER_READ_ONLY=true
- Parameters:
-
issue_delete_attachment: Delete an issue attachment by ID- Unavailable when
TRACKER_READ_ONLY=true
- Unavailable when
-
issue_get_checklist: Get checklist items of an issue- Parameters:
issue_id(string, format: "QUEUE-123") - Returns list of checklist items including text, status, assignee, and deadline information
- Parameters:
-
issue_get_transitions: Get possible status transitions for an issue- Parameters:
issue_id(string, format: "QUEUE-123") - Returns list of available transitions that can be performed on the issue
- Each transition includes an ID, display name, and target status information
- Parameters:
-
issue_get_changelog: Get the change history (changelog) of an issue- Parameters:
issue_id(string, required, format: "QUEUE-123"): The issue keyper_page(integer, optional, default: 50): Number of entries per pagecursor(string, optional): Thenext_cursorvalue returned by the previous call; pass it to fetch the next page (cursor pagination)field(string, optional): Filter the changelog by a field key (e.g.status)type(string, optional): Filter by change type (e.g.IssueWorkflowfor status transitions)
- Returns an object with
entries(status transitions and field edits — including who changed whatfrom→toand when — plus comment changes and executed triggers) andnext_cursor(pass it back ascursorfor the next page;nullwhen there are no more pages)
- Parameters:
-
issue_execute_transition: Execute a status transition for an issue- Parameters:
issue_id(string, required, format: "QUEUE-123"): The issue keytransition_id(string, required): The transition ID to execute. IMPORTANT: Must be one of the IDs returned byissue_get_transitionstoolcomment(string, optional): Optional comment to add when executing the transitionfields(object, optional): Dictionary of additional fields to set during the transition. Common fields includeresolution(e.g., 'fixed', 'wontFix') for closing issues,assigneefor reassigning, etc.
- Returns list of available transitions for the new status after the transition is executed
- Usage note: You MUST first call
issue_get_transitionsto retrieve available transitions, then pass one of the returned transition IDs. Do NOT use arbitrary transition IDs.
- Parameters:
-
issue_close: Close an issue with a resolution (convenience tool)- Parameters:
issue_id(string, required, format: "QUEUE-123"): The issue keyresolution_id(string, required): The resolution ID to set when closing (e.g., 'fixed', 'wontFix', 'duplicate')comment(string, optional): Optional comment to add when closing the issue
- Automatically finds a transition to a 'done' status and executes it with the specified resolution
- Returns list of available transitions for the new (closed) status
- Usage note: Before closing, you MUST:
- Call
issue_getto retrieve the issue'stypefield - Call
get_queue_metadatawithexpand: ["issueTypesConfig"]to get available resolutions - Choose a resolution from the
issueTypesConfigentry matching the issue's type - each issue type has its own set of valid resolutions
- Call
- Parameters:
-
issue_create: Create a new issue in a queue- Parameters:
queue(string, required): Queue key where to create the issue (e.g., 'MYQUEUE')summary(string, required): Issue title/summarytype(int, optional): Issue type ID (fromget_issue_typestool)description(string, optional): Issue descriptionassignee(string or int, optional): Assignee login or UIDpriority(string, optional): Priority key (fromget_prioritiestool)fields(object, optional): Additional fields to set during issue creation. IMPORTANT: Before creating an issue, you MUST callqueue_get_fieldsto get available fields (it returns both global and local fields by default). Fields withschema.required=trueare mandatory. Use the field'sidproperty as the key in this map (e.g.,{"fieldId": "value"})
- Returns the newly created issue object with all standard issue fields
- Respects
TRACKER_LIMIT_QUEUESrestrictions
- Parameters:
-
issue_update: Update an existing issue- Parameters:
issue_id(string, required, format: "QUEUE-123"): The issue key to updatesummary(string, optional): New issue title/summarydescription(string, optional): New issue descriptionmarkup_type(string, optional): Markup type for description text (use 'md' for YFM markup)parent(IssueUpdateParent, optional): Parent issue reference withid(string) and/orkey(string, e.g., 'QUEUE-123')sprint(array of IssueUpdateSprint, optional): Sprint assignments - array of objects withid(int) fieldtype(IssueUpdateType, optional): Issue type withid(string) and/orkey(string, e.g., 'bug', 'task')priority(IssueUpdatePriority, optional): Priority withid(string) and/orkey(string, e.g., 'critical', 'normal')followers(array of IssueUpdateFollower, optional): Followers - array of objects withid(string, user ID or login)project(IssueUpdateProject, optional): Project withprimary(int, main project shortId) and optionalsecondary(array of ints)tags(array of strings, optional): Issue tagsversion(int, optional): Issue version for optimistic locking - changes only made to current versionfields(object, optional): Additional fields to update. Usequeue_get_fieldsto discover available fields.
- Returns the updated issue object with all standard issue fields
- Only provided fields are updated; omitted fields remain unchanged
- Respects
TRACKER_LIMIT_QUEUESrestrictions
- Parameters:
-
issue_move: Move an issue to a different queue- Parameters:
issue_id(string, required, format: "QUEUE-123"): The issue key to movequeue(string, required): Target queue key (e.g., 'MYQUEUE')notify(boolean, optional, defaulttrue): Notify users referenced in the issue's fieldsnotify_author(boolean, optional, defaultfalse): Notify the issue authormove_all_fields(boolean, optional, defaultfalse): Carry over versions, components and projects when matching ones exist in the target queue; otherwise they are clearedinitial_status(boolean, optional, defaultfalse): Reset the issue status to the initial value (use when the target queue has a different workflow)
- Returns the updated issue object with its new key in the target queue (e.g.,
TASKS-1→NEWQUEUE-42) - When the MCP client supports elicitation, the user is prompted to confirm the boolean flags before the move is performed; declining or cancelling aborts the move. Clients without elicitation support proceed with the passed-in values
- Respects
TRACKER_LIMIT_QUEUESrestrictions
- Parameters:
Search and Discovery
-
issues_find: Search issues using Yandex Tracker Query Language- Parameters:
query(optional): Query string using Yandex Tracker Query Language syntaxfilter_id(optional): Saved filter ID; mutually exclusive withqueryinclude_description(boolean, optional, default: false): Whether to include issue description in the issues result. Can be large, so use only when needed.fields(list of strings, optional): Fields to include in the response. Helps optimize context window usage by selecting only needed fields. If not specified, returns all available fields.page(optional): Page number for pagination (default: 1)per_page(optional): Number of items per page (default: 100). May be decreased if results exceed context window.
- Returns up to specified number of issues per page
- Parameters:
-
issues_count: Count issues matching a query using Yandex Tracker Query Language- Parameters:
query(optional): Query string using Yandex Tracker Query Language syntaxfilter_id(optional): Saved filter ID; mutually exclusive withquery
- Returns the total count of issues matching the specified criteria
- Supports all query language features: field filtering, date functions, logical operators, and complex expressions
- Useful for analytics, reporting, and understanding issue distribution without retrieving full issue data
- Parameters:
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
Starting the streamable-http Server
You 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):
or
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
OAuth Configuration
To enable OAuth authentication, set the following environment variables:
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/callback - Request 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
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:
OAuth 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:
Redis 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:
Storage 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:
Configuration:
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_ENABLED - Redis 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_URL - Additional 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>header - Useful 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
- When MCP OAuth middleware does not provide a token, the server can read a Yandex OAuth token from the incoming
-
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)
Scenario 2: Static OAuth Token (Simple Setup)
Scenario 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:
This 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
Scenario 5: Dynamic IAM Token with Service Account
Scenario 6: Federative OAuth for OIDC Applications (Advanced)
This 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
Docker Deployment
Using Pre-built Image (Recommended)
Building the Image Locally
Docker Compose
Using pre-built image:
Building locally:
Development Setup
License
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
Source: README.md at commit eade4be
Tools
0Version history
1- v0.8.2LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts