Skip to main content
Glama
Yandex Tracker MCP Server

Yandex Tracker MCP Server

by DChuhin

Yandex Tracker MCP Server

Local Model Context Protocol server (Node.js + TypeScript) that exposes the Yandex Tracker REST API v3 as tools for LLM clients. Transport is stdio only (the host spawns the process; there is no HTTP port).

Prerequisites

  • Node.js 18+

  • A Tracker OAuth token and organisation ID (see below)

Related MCP server: Yandex Tracker MCP

Install and run

npm install
npm run build    # compile to dist/
npm run start    # run compiled server (used by MCP hosts)

Other scripts:

Script

Purpose

npm run clean

Remove the dist/ directory

npm run dev

Run src/index.ts with tsx (handy for quick local checks; MCP hosts normally use start)

After clean, run build again before start.

Configuration

  1. Copy .env.example to .env and fill in values (do not commit .env).

  2. Required variables:

    Optional:

    • TRACKER_ORG_HEADER — X-Org-ID (Yandex 360, default) or X-Cloud-Org-ID (Yandex Cloud)

    • TRACKER_BASE_URL — default https://api.tracker.yandex.net/v3; change for self-hosted

    • TRACKER_AUTH_SCHEME — OAuth (default) or Bearer (e.g. IAM)

Getting a Tracker OAuth token

  1. Create an OAuth app at https://oauth.yandex.ru/ (choose API access / debugging, add scopes tracker:read and tracker:write, note the Client ID).

  2. Authorize in the browser (implicit flow). Open (replace YOUR_CLIENT_ID):

    https://oauth.yandex.com/authorize?response_type=token&client_id=YOUR_CLIENT_ID

  3. After you approve access, the redirect URL will contain access_token=.... Copy that value into TRACKER_TOKEN.

  4. Smoke test (optional):

    curl -sS 'https://api.tracker.yandex.net/v3/myself' \
      -H 'Authorization: OAuth YOUR_TOKEN' \
      -H 'X-Org-ID: YOUR_ORG_ID'

    401 usually means a bad token; 403 often means a wrong org header or ID.

Using with Cursor

  1. Build the project and note the absolute path to dist/index.js.

  2. Edit your MCP config (e.g. ~/.cursor/mcp.json) and add a server entry. Example:

    {
      "mcpServers": {
        "tracker-custom": {
          "command": "node",
          "args": ["/absolute/path/to/tracker-mcp-server/dist/index.js"],
          "env": {
            "TRACKER_TOKEN": "your_oauth_token",
            "TRACKER_ORG_ID": "your_org_id",
            "TRACKER_ORG_HEADER": "X-Org-ID",
            "TRACKER_BASE_URL": "https://api.tracker.yandex.net/v3",
            "TRACKER_AUTH_SCHEME": "OAuth"
          }
        }
      }
    }

    You can rely on a .env file only if your host loads it; many setups pass env explicitly as above.

  3. Restart Cursor. In chat, try: use the Tracker MCP to call get_myself to verify auth.

Using with Claude Desktop

  1. Build the project and note the absolute path to dist/index.js.

  2. Edit the Claude Desktop config file:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

  3. Under mcpServers, add the same shape as in the Cursor example (command, args, env).

  4. Fully quit and reopen Claude Desktop, then use a task that invokes Tracker tools (e.g. get_myself).

Project layout (high level)

  • src/index.ts — MCP entry, registers tools, stdio transport

  • src/tracker-client.ts — HTTP client for Tracker API

  • src/tools/*.ts — tool implementations (read, write, validate, checklist, sync)

  • convention.json — validation rules for validate_issue / audit_queue

  • sync-map.json — optional Tracker ↔ Miro id map for agent-driven sync

License

Private / use as you prefer unless you add a formal license file.

Available Tools

21 tools
add_checklist_itemA

Adds one checklist row to an issue. Only text is required; optional checked, assignee (login or id), and deadline (date ISO string + deadlineType, default date).

Inputs: issue_key (required), text (required), checked, assignee, +2 more.

add_commentB

Adds a comment to an issue. When posting on behalf of the agent, always begin the comment with '[AI Agent]:' so assignees know it is automated.

Inputs: issue_key (required), text (required), mention.

audit_queueA

Validates all open issues in a queue against convention.json and returns a violation report. Always run as dry_run=true first and show the user the results before posting any comments. Only set post_comments=true after the user explicitly confirms. Comment posts are throttled (~200ms between each, plus an extra ~200ms after every 10 posts) to reduce rate-limit risk.

Inputs: queue (required), sprint, post_comments, dry_run.

clear_issue_checklistA

Deletes the entire checklist on an issue (all items at once). Destructive — confirm with the user before calling.

Inputs: issue_key (required).

create_issueA

Creates a new Tracker issue. Always confirm queue and summary before creating. Returns the new issue key so the user can reference it immediately.

Inputs: queue (required), summary (required), type, description, +8 more.

delete_checklist_itemB

Removes a single checklist item from an issue. Requires the checklist item id from list_checklist_items.

Inputs: issue_key (required), item_id (required).

get_epic_treeA

Returns the full child hierarchy under an epic: stories, tasks, and subtasks nested under their parents. Use when the user wants to see the full breakdown of a feature or initiative.

Inputs: epic_key (required), include_closed.

get_issueA

Gets full details of a single issue by key (e.g. BACK-42). Use when you need the complete picture: all fields, description, checklist, linked issues. Use list_issues first if you do not have the exact key.

Inputs: issue_key (required), include_comments, include_checklist.

get_miro_sync_mapA

Returns the Tracker↔Miro sync map from sync-map.json (board item IDs paired with issue keys). Use before two-way sync: find which issues already map to Miro widgets, or resolve a Miro item ID to a Tracker key. Combine with the Miro MCP server to read/update board content. Optional filters narrow the result.

Inputs: board_id, tracker_key.

get_myselfA

Verifies API credentials and returns the current authenticated user's login, display name, and email. Call this first in any new session to confirm the connection is working before calling other tools.

Inputs: no named parameters.

list_checklist_itemsA

Lists all checklist items on an issue. Use get_issue with include_checklist or this tool to obtain item ids before update_checklist_item or delete_checklist_item.

Inputs: issue_key (required).

list_componentsA

Lists all components in a queue. Use this to validate component names before creating or updating issues. Component names must match exactly.

Inputs: queue.

list_issuesB

Lists Tracker issues with optional filters. Use this when the user asks to show, find, list, or check issues. Returns key, summary, status, assignee, priority, components, sprint, storyPoints. Always call this before update_issue or add_comment if you only have a description and not an issue key.

Inputs: queue, status, assignee, component, +3 more.

list_queue_sprintsA

Lists all sprints for a queue ordered by start date, with status (active/upcoming/closed). Use this to find the current sprint ID or to resolve a sprint name the user mentioned.

Inputs: queue (required).

search_issuesA

Searches issues using a raw Yandex Tracker Query Language (YQL) string. Use for complex filters that list_issues cannot express. Example query: 'Queue: BACK AND Status: Open AND Tags: backend'. Prefer list_issues for simple cases.

Inputs: query (required), limit.

search_issues_scrollA

Scrollable issue search for very large result sets (10k+ matches). First call: pass query (YQL) and optional per_scroll (max 1000), scroll_type (sorted|unsorted), scroll_ttl_millis. Returns issues plus next_scroll_id — pass that id back with the SAME query on the next call until next_scroll_id is null. Do not use queue-only search body here; use a query or filter-style search per Tracker API scroll rules.

Inputs: query (required), scroll_id, per_scroll, scroll_type, +1 more.

update_checklist_itemA

Updates one checklist item by its id (from list_checklist_items). The Tracker API requires the item text on each edit — if you omit text, the current text is loaded automatically. Pass checked/assignee/deadline only when changing them.

Inputs: issue_key (required), item_id (required), text, checked, +3 more.

update_issueA

Updates fields on an existing issue. Only changed fields need to be provided. Pass assignee as an empty string to clear assignee (sends null); some Cloud orgs or queues reject this and require an assignee. For status changes, use the transition flow: first GET /issues/{key}/transitions, then POST /issues/{key}/transitions/{id}/_execute. Do not attempt to set status directly as a field — it will fail silently.

Inputs: issue_key (required), summary, description, assignee, +5 more.

update_miro_sync_mapA

Updates sync-map.json with new or changed Tracker↔Miro pairs after creating or matching board items. Writes are serialized so parallel tool calls cannot corrupt the file. Use mode 'upsert' (default) to merge by board_id + tracker_key; use 'replace_all' to set the full mapping list for one board (pass only entries for that board plus other boards' entries you want to keep — safer to read first with get_miro_sync_map). Prefer upsert when adding one pair at a time.

Inputs: entries (required), mode, board_id_for_replace.

validate_issueA

Checks whether one issue satisfies the team's ticket convention defined in convention.json. Returns a list of missing fields and violations. Does NOT post a comment automatically — use add_comment separately after showing the user the violations first.

Inputs: issue_key (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 21 tools

    Disambiguation5/5

    Each tool serves a clearly distinct purpose. Checklist operations are separated into add, list, update, delete, and clear. Issue operations are similarly granular. Even similar tools like search_issues and search_issues_scroll are differentiated by scroll capability, leaving no ambiguity.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern using snake_case (e.g., add_checklist_item, list_components, update_issue). The naming is predictable and uniform across the entire set.

    Tool Count5/5

    With 21 tools, the server covers the typical lifecycle of an issue tracker: CRUD for issues and checklists, search, linking, comments, sprints, components, validation, and Miro sync. The count is well-scoped for the domain without being too sparse or excessive.

    Completeness4/5

    The tool surface covers most essential operations: issue creation, retrieval, update, checklist management, linking, commenting, validation, and sprint/component listing. Minor gaps exist, such as no tool for deleting an issue or removing a link, but these are not critical dead ends.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers