mcp-name: io.github.aikts/yandex-tracker-mcp
Комплексный MCP (Model Context Protocol) сервер, который позволяет ИИ-ассистентам взаимодействовать с API Яндекс.Трекера. Этот сервер обеспечивает безопасный, аутентифицированный доступ к задачам, очередям, комментариям, трудозатратам и функциям поиска Яндекс.Трекера с опциональным Redis-кешированием для улучшения производительности.
- Полное управление очередями: Список и доступ ко всем доступным очередям Яндекс.Трекера с поддержкой пагинации, получением тегов и подробными метаданными
- Проекты, портфели и цели: Отдельные инструменты чтения и записи с явными схемами для каждого типа сущности API "entities" Трекера (включаются через
TRACKER_ENTITIES_ENABLED) - Управление пользователями: Получение информации об учетных записях пользователей, включая данные для входа, адреса электронной почты, статус лицензии и данные организации
- Полный жизненный цикл задач: Создание, чтение, обновление и управление задачами с поддержкой пользовательских полей, вложений и переходов по рабочему процессу
- Управление рабочим процессом: Выполнение переходов статусов, закрытие задач с резолюциями и навигация по сложным рабочим процессам
- Управление полями: Доступ к глобальным полям, локальным полям очереди, статусам, типам задач, приоритетам и резолюциям
- Доски и спринты: Получение списка Agile-досок и их спринтов для поиска идентификаторов спринтов при планировании задач
- Расширенный язык запросов: Полная поддержка языка запросов Яндекс.Трекера со сложной фильтрацией, сортировкой
- Кеширование производительности: Опциональный слой кеширования Redis для улучшения времени отклика
- Контроль безопасности: Настраиваемые ограничения доступа к очередям и безопасная обработка токенов
- Несколько вариантов транспорта: Поддержка stdio, SSE (устаревший) и HTTP транспортов для гибкой интеграции
- OAuth 2.0 аутентификация: Динамическая аутентификация на основе токенов с автоматическим обновлением в качестве альтернативы статическим API-токенам
- Поддержка организаций: Совместимость как со стандартными, так и с облачными идентификаторами организаций
Выберите один из следующих вариантов в зависимости от типа вашей организации Яндекса:
- Организация Yandex Cloud: Используйте переменную окружения
TRACKER_CLOUD_ORG_IDдля организаций, управляемых Yandex Cloud - Организация Яндекс 360: Используйте переменную окружения
TRACKER_ORG_IDдля организаций Яндекс 360
Вы можете найти идентификатор вашей организации в URL Яндекс.Трекера или в настройках организации.
Yandex Tracker MCP Server можно установить в один клик в Claude Desktop как расширение.
- Скачайте файл
*.mcpbиз GitHub Releases. - Откройте скачанный файл, чтобы установить его в Claude Desktop.

- Введите ваш OAuth токен Яндекс.Трекера при запросе.

- Убедитесь, что расширение включено - теперь вы можете использовать этот MCP сервер.
- uv установлен глобально
- Действительный API токен Яндекс.Трекера с соответствующими разрешениями
Следующие разделы показывают, как настроить MCP сервер для различных MCP-клиентов. Вы можете использовать либо uvx yandex-tracker-mcp@latest, либо Docker-образ ghcr.io/aikts/yandex-tracker-mcp:latest. Оба требуют следующие переменные окружения:
- Аутентификация (один из следующих):
TRACKER_TOKEN- Ваш OAuth токен Яндекс.ТрекераTRACKER_IAM_TOKEN- Ваш IAM токенTRACKER_SA_KEY_ID,TRACKER_SA_SERVICE_ACCOUNT_ID,TRACKER_SA_PRIVATE_KEY- Учетные данные сервисного аккаунта
- Организация - ровно одна из следующих переменных:
TRACKER_CLOUD_ORG_ID- Идентификатор вашей организации Yandex CloudTRACKER_ORG_ID- Идентификатор вашей организации Яндекс 360
Задавайте одну из двух. Если заданы обе, любой вызов Трекера завершится ошибкой
Only one of org_id or cloud_org_id should be provided.В примерах ниже используетсяTRACKER_CLOUD_ORG_ID; для Яндекс 360 замените этот ключ наTRACKER_ORG_ID.
Claude Desktop
Путь к файлу конфигурации:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Используя uvx:
{
"mcpServers": {
"yandex-tracker": {
"command": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "ваш_токен_трекера",
"TRACKER_CLOUD_ORG_ID": "ваш_cloud_org_id"
}
}
}
}Используя 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": "ваш_токен_трекера",
"TRACKER_CLOUD_ORG_ID": "ваш_cloud_org_id"
}
}
}
}Claude Code
Используя uvx:
claude mcp add yandex-tracker uvx yandex-tracker-mcp@latest \
-e TRACKER_TOKEN=ваш_токен_трекера \
-e TRACKER_CLOUD_ORG_ID=ваш_cloud_org_id \
-e TRANSPORT=stdioИспользуя Docker:
claude mcp add yandex-tracker docker "run --rm -i -e TRACKER_TOKEN=ваш_токен_трекера -e TRACKER_CLOUD_ORG_ID=ваш_cloud_org_id -e TRANSPORT=stdio ghcr.io/aikts/yandex-tracker-mcp:latest"Cursor
Путь к файлу конфигурации:
- Для проекта:
.cursor/mcp.jsonв директории вашего проекта - Глобальный:
~/.cursor/mcp.json
Используя uvx:
{
"mcpServers": {
"yandex-tracker": {
"command": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "ваш_токен_трекера",
"TRACKER_CLOUD_ORG_ID": "ваш_cloud_org_id"
}
}
}
}Используя 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": "ваш_токен_трекера",
"TRACKER_CLOUD_ORG_ID": "ваш_cloud_org_id"
}
}
}
}Windsurf
Путь к файлу конфигурации:
~/.codeium/windsurf/mcp_config.json
Доступ через: Настройки Windsurf → вкладка Cascade → Model Context Protocol (MCP) Servers → "View raw config"
Используя uvx:
{
"mcpServers": {
"yandex-tracker": {
"command": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "ваш_токен_трекера",
"TRACKER_CLOUD_ORG_ID": "ваш_cloud_org_id"
}
}
}
}Используя 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": "ваш_токен_трекера",
"TRACKER_CLOUD_ORG_ID": "ваш_cloud_org_id"
}
}
}
}Zed
Путь к файлу конфигурации:
~/.config/zed/settings.json
Доступ через: Cmd+, (macOS) или Ctrl+, (Linux/Windows) или палитра команд: "zed: open settings"
Примечание: Требуется версия Zed Preview для поддержки MCP.
Используя uvx:
{
"context_servers": {
"yandex-tracker": {
"source": "custom",
"command": {
"path": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "ваш_токен_трекера",
"TRACKER_CLOUD_ORG_ID": "ваш_cloud_org_id"
}
}
}
}
}Используя 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": "ваш_токен_трекера",
"TRACKER_CLOUD_ORG_ID": "ваш_cloud_org_id"
}
}
}
}
}GitHub Copilot (VS Code)
Путь к файлу конфигурации:
- Рабочее пространство:
.vscode/mcp.jsonв директории вашего проекта - Глобальный: VS Code
settings.json
Вариант 1: Конфигурация рабочего пространства (рекомендуется для безопасности)
Создайте .vscode/mcp.json:
Используя uvx:
{
"inputs": [
{
"type": "promptString",
"id": "tracker-token",
"description": "Токен Яндекс.Трекера",
"password": true
},
{
"type": "promptString",
"id": "cloud-org-id",
"description": "Идентификатор организации Yandex Cloud"
}
],
"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"
}
}
}
}Используя Docker:
{
"inputs": [
{
"type": "promptString",
"id": "tracker-token",
"description": "Токен Яндекс.Трекера",
"password": true
},
{
"type": "promptString",
"id": "cloud-org-id",
"description": "Идентификатор организации Yandex Cloud"
}
],
"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"
}
}
}
}Вариант 2: Глобальная конфигурация
Добавьте в VS Code settings.json:
Используя uvx:
{
"github.copilot.chat.mcp.servers": {
"yandex-tracker": {
"type": "stdio",
"command": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "ваш_токен_трекера",
"TRACKER_CLOUD_ORG_ID": "ваш_cloud_org_id"
}
}
}
}Используя 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": "ваш_токен_трекера",
"TRACKER_CLOUD_ORG_ID": "ваш_cloud_org_id"
}
}
}
}Другие MCP-совместимые клиенты
Для других MCP-совместимых клиентов используйте стандартный формат конфигурации MCP сервера:
Используя uvx:
{
"mcpServers": {
"yandex-tracker": {
"command": "uvx",
"args": ["yandex-tracker-mcp@latest"],
"env": {
"TRACKER_TOKEN": "ваш_токен_трекера",
"TRACKER_CLOUD_ORG_ID": "ваш_cloud_org_id"
}
}
}
}Используя 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": "ваш_токен_трекера",
"TRACKER_CLOUD_ORG_ID": "ваш_cloud_org_id"
}
}
}
}Важные замечания:
- Замените значения на ваши реальные учетные данные
- Перезапустите ваш MCP-клиент после изменения конфигурации
- При использовании
uvxубедитесь, чтоuvxустановлен и доступен в вашем системном PATH - Для production использования рассмотрите использование переменных окружения вместо жесткого кодирования токенов
Сервер предоставляет следующие инструменты через протокол MCP:
Управление очередями
| Инструмент | Что делает | Ключевые аргументы |
|---|---|---|
queues_get_all |
Все очереди, доступные токену; возвращает {values, hits, pages} |
fields, page (не указывать — обойти все страницы), per_page |
queue_get_tags |
Теги, заведённые в очереди | queue_id (ключ вида "SOMEPROJECT") |
queue_get_versions |
Версии очереди с датами и статусом | queue_id |
queue_create_version |
Создать версию в очереди | queue_id, name, description, start_date, due_date (YYYY-MM-DD) |
queue_get_fields |
Поля, настроенные в очереди, включая локальные; schema.required отмечает обязательные |
queue_id, include_local_fields |
queue_get_metadata |
Название, описание, тип и приоритет по умолчанию плюс то, что запрошено в expand |
queue_id, expand (all, projects, components, versions, types, team, workflows, fields, issueTypesConfig) |
- Читайте
queue_get_fieldsпередissue_create, но это не полный реестр: системные поля вродеparentилиestimationможно задавать, хотя в нём их нет, аget_global_fieldsперечисляет все поля организации. queue_get_metadataсexpand: ["issueTypesConfig"]— источник резолюций, допустимых для каждого типа задачи; одна из них нужнаissue_close.- Все они учитывают
TRACKER_LIMIT_QUEUES.hits/pagesуqueues_get_allвозвращаются только для явно запрошенной страницы на сервере без allow-list: иначе итог считает и те очереди, которые allow-list затем скрывает.
Проекты, портфели и цели
Проекты, портфели и цели — это отдельные сущности Яндекс Трекера (отличные от очередей), доступные через API "entities" Трекера. Пользовательские (кастомные) атрибуты не моделируются и не возвращаются.
Эти инструменты включаются явно. Они регистрируются только при
TRACKER_ENTITIES_ENABLED=true(по умолчаниюfalse), потому что заметно увеличивают манифест инструментов и не подчиняются ограничениям по очередям — см. Управление доступом к очередям.
Все три типа сущностей используют один и тот же набор инструментов, поэтому он перечислен один раз: строка говорит, что делает инструмент, а столбцы — как он называется:
| Что делает | Проекты | Портфели | Цели |
|---|---|---|---|
| Одна сущность по id или shortId | project_get |
portfolio_get |
goal_get |
Поиск по подстроке в названии и/или фильтрам полей; возвращает {values, hits, pages} |
project_find |
portfolio_find |
goal_find |
Страница комментариев; возвращает {comments, next_cursor} |
project_get_comments |
portfolio_get_comments |
goal_get_comments |
| Создать и вернуть сущность | project_create |
portfolio_create |
goal_create |
| Изменить любое поле из тех, что принимает создание | project_update |
portfolio_update |
goal_update |
Удалить, а с with_board — и связанную доску (у целей доски нет) |
project_delete |
portfolio_delete |
goal_delete |
| Добавить комментарий | project_add_comment |
portfolio_add_comment |
goal_add_comment |
| Изменить комментарий | project_update_comment |
portfolio_update_comment |
goal_update_comment |
| Удалить комментарий | project_delete_comment |
portfolio_delete_comment |
goal_delete_comment |
| Добавить пункт чек-листа | project_add_checklist_item |
portfolio_add_checklist_item |
- |
| Изменить один пункт, оставив непереданные поля как есть | project_update_checklist_item |
portfolio_update_checklist_item |
- |
| Переставить пункт перед другим | project_move_checklist_item |
portfolio_move_checklist_item |
- |
| Удалить один пункт | project_delete_checklist_item |
portfolio_delete_checklist_item |
- |
| Изменить несколько существующих пунктов по id | project_update_checklist |
portfolio_update_checklist |
- |
| Удалить весь чек-лист | project_delete_checklist |
portfolio_delete_checklist |
- |
- Аргументы. Чтение принимает
entity_idиfields; инструменты*_find—input,filter,order_by,order_asc,root_only,page,per_page. Создание и изменение принимаютsummary(обязателен при создании),description,lead,team_users,clients,followers,start(у целей его нет),end,tags,entity_status,parent_entity,team_accessиlinks, а изменение ещёcommentиversion(оптимистичная блокировка). Все инструменты принимают один и тот же селекторfieldsи возвращают сущность. linksтолько добавляются, а не заменяются, и API их никогда не возвращает: прочитать или удалить существующую связь через этот сервер нельзя, а изменение, состоящее только изlinks, отклоняется — вместо того чтобы отчитаться об успехе, который Трекер молча проигнорировал.- Не входит в набор полей по умолчанию:
checklistItems(инструменты чек-листа возвращают сущность целиком, так что запрашивайте их, чтобы увидеть результат),metricItemsи ключевые результаты целиkeyResultItems— последние два доступны только на чтение. У целей свой набор значенийentityStatus(draft,according_to_plan,at_risk,blocked,achieved,partially_achieved,not_achieved,exceeded,cancelled). Массовые изменения не поддерживаются.
Управление пользователями
| Инструмент | Что делает | Ключевые аргументы |
|---|---|---|
users_get_all |
Страница пользователей организации; возвращает {values, hits, pages} |
page, per_page, fields |
user_get |
Один пользователь по логину или uid | user_id ("john.doe" или "12345") |
user_get_current |
Пользователь, которому принадлежит текущий токен | - |
users_search |
Поиск пользователей по логину, email или имени | login_or_email_or_name |
users_searchсначала ищет точное совпадение по логину и email, затем — нечёткое по имени (порог схожести 80%, не более трёх лучших совпадений).- Страница
users_get_all— последняя, когдаpageравенpages.
Управление полями
| Инструмент | Что делает | Ключевые аргументы |
|---|---|---|
get_global_fields |
Все глобальные поля организации со схемой и типом | - |
Локальных полей очереди здесь нет — queue_get_fields возвращает их вместе с глобальными.
Управление статусами и типами
| Инструмент | Что делает | Ключевые аргументы |
|---|---|---|
get_statuses |
Все статусы задач, заведённые в организации | - |
get_issue_types |
Все типы задач — для аргумента type у issue_create / issue_update |
- |
get_priorities |
Все приоритеты с id, key, name и order |
- |
get_resolutions |
Все резолюции — для resolution_id у issue_close |
- |
Все четыре списка общие для организации. Очередь может принимать лишь часть этих значений, и на неподходящее Трекер отвечает 422: какие резолюции допустимы для каждого типа задачи, показывает queue_get_metadata с expand: ["issueTypesConfig"].
Шаблоны
| Инструмент | Что делает | Ключевые аргументы |
|---|---|---|
issue_templates_get_all |
Шаблоны задач вместе со значениями fieldTemplates, которые они подставляют; возвращает {values, hits, pages} |
queue, page (не указывать — обойти все страницы), per_page |
issue_template_get |
Один шаблон задачи по id | template_id |
comment_templates_get_all |
Шаблоны комментариев с текстом template и его summonees / maillistSummonees |
queue, page, per_page |
comment_template_get |
Один шаблон комментария по id | template_id |
- Шаблоны доступны только на чтение. API не умеет создавать задачу или комментарий из шаблона, поэтому у
issue_createиissue_add_commentнетtemplate_id: прочитайте шаблон и передайте его значения аргументами самого инструмента записи. Макросы вроде{{today}}приходят как есть. - Текст задачи, который подставляет шаблон, лежит в
fieldTemplates.description; собственныйdescriptionшаблона описывает сам шаблон. queueвозвращает шаблоны этой очереди плюс те, что не привязаны ни к одной и годятся везде.TRACKER_LIMIT_QUEUESучитывается: шаблоны закрытой очереди не попадают в списки и отклоняются при прямом обращении, а шаблоны без очереди остаются видимыми.
Доски и спринты
| Инструмент | Что делает | Ключевые аргументы |
|---|---|---|
boards_get_all |
Agile-доски организации; возвращает {boards, next_cursor} |
queue, fields, cursor (предыдущий next_cursor), per_page |
board_get |
Одна доска с autoFilterSettings (что она собирает), estimateBy, useRanking и рабочим calendar |
board_id, fields |
board_get_columns |
Колонки доски со статусами задач, которые в них попадают | board_id |
board_get_sprints |
Спринты доски со статусом (draft, in_progress, released, archived) и плановыми/фактическими датами |
board_id, fields |
- У доски нет собственной очереди, поэтому
queueсопоставляется с фильтром самой доски и не находит доски, которые фильтруют по чему-то другому — например, персональные по исполнителю. Чтобы найти и их, прочитайте несколько задач очереди черезissues_findи посмотрите их полеboards. - Доски принадлежат организации, а не очереди, поэтому
TRACKER_LIMIT_QUEUESих не фильтрует: проверяется только аргументqueueуboards_get_all, а в ответах могут упоминаться закрытые очереди. - У не-scrum доски спринтов нет, и
board_get_sprintsдля неё отклоняется. Возвращённыйidспринта — это то, что принимаютissue_create/issue_update.
Операции с задачами
| Инструмент | Что делает | Ключевые аргументы |
|---|---|---|
issue_get |
Одна задача по ключу: полная запись, включая текущий version |
issue_id, include_description |
issue_get_url |
Веб-адрес задачи | issue_id |
issue_get_comments |
Страница комментариев, от старых к новым; возвращает {comments, next_cursor} |
issue_id, cursor, per_page, fields |
issue_add_comment |
Добавить комментарий; уведомляет именно summonees, а @login в тексте не уведомляет никого |
issue_id, text, summonees, maillist_summonees, markup_type, is_add_to_followers |
issue_update_comment |
Изменить комментарий | issue_id, comment_id, text, summonees, maillist_summonees |
issue_delete_comment |
Удалить комментарий | issue_id, comment_id |
issue_get_links |
Связи со связанными, блокирующими и дублирующими задачами | issue_id |
issue_add_link |
Связать две задачи | issue_id, relationship, issue |
issue_delete_link |
Удалить связь | issue_id, link_id (из issue_get_links) |
issue_get_worklogs |
Списанное время по одной или нескольким задачам | issue_ids, fields |
issue_add_worklog |
Списать время | issue_id, duration (ISO-8601, PT1H30M), comment, start |
issue_update_worklog |
Изменить запись о времени | issue_id, worklog_id, duration, comment, start |
issue_delete_worklog |
Удалить запись о времени | issue_id, worklog_id |
issue_get_attachments |
Метаданные вложений | issue_id, fields |
issue_get_checklist |
Чек-лист вместе с id пунктов, которые нужны инструментам записи | issue_id |
issue_add_checklist_items |
Добавить пункты по порядку, создав чек-лист, если его не было | issue_id, items (text, checked, assignee, deadline) |
issue_update_checklist_item |
Изменить один пункт; непереданные поля сохраняют значение | issue_id, checklist_item_id, text, checked, assignee, deadline, clear_assignee, clear_deadline |
issue_delete_checklist_item |
Удалить один пункт | issue_id, checklist_item_id |
issue_get_transitions |
Переходы по статусам, доступные сейчас, с их id | issue_id |
issue_execute_transition |
Выполнить переход; возвращает переходы, доступные после него | issue_id, transition_id, comment, fields |
issue_close |
Найти переход в статус «готово» и выполнить его с резолюцией | issue_id, resolution_id, comment, fields |
issue_get_changelog |
Изменения полей, переходы по статусам, правки комментариев и сработавшие триггеры; возвращает {entries, next_cursor} |
issue_id, cursor, per_page, field, type |
issue_create |
Создать задачу и вернуть её | queue, summary, type, description, markup_type, assignee, priority, parent, sprint, followers, components, tags, project, fields |
issue_update |
Изменить любое из этих полей; непереданные остаются как были | issue_id, version и аргументы issue_create |
issue_move |
Перенести задачу в другую очередь, что меняет её ключ (TASKS-1 → NEWQUEUE-42) |
issue_id, queue, notify, notify_author, move_all_fields, initial_status |
versionпротухает сам по себе. Триггеры очереди и автоматизации срабатывают сразу послеissue_createи увеличивают его, так что возвращённая версия обычно уже устарела. Перечитайте её черезissue_getпрямо передissue_updateили не передавайте вовсе, чтобы изменить последнюю версию безусловно: на устаревшей вызов падает с конфликтом редактирования.- Ссылочные поля принимают одни и те же значения и при создании, и при изменении: объект с
idи/илиkey, а дляtype,priorityиparent— ещё и голый ключ или id.componentsпринимают{"id": ...}или{"name": ...}, причёмcomponents/followersзаменяют текущий список, а не дополняют его. Всё, для чего нет отдельного аргумента, передаётся в картеfieldsпоidполя изqueue_get_fields; запись там перекрывает отдельный аргумент, а явныйnullочищает поле. - Переходы не угадываются.
issue_execute_transitionпринимает только id изissue_get_transitions, а передissue_closeпрочитайтеtypeзадачи черезissue_getи допустимые для этого типа резолюции черезqueue_get_metadataсexpand: ["issueTypesConfig"]— у каждого типа свой набор. Если клиент поддерживает elicitation,issue_moveсначала просит подтвердить свои флаги, и отказ отменяет перенос.
Все инструменты этого раздела учитывают TRACKER_LIMIT_QUEUES и TRACKER_READ_ONLY_QUEUES; те, что пишут, регистрируются, только если не задан TRACKER_READ_ONLY.
Поиск и обнаружение
| Инструмент | Что делает | Ключевые аргументы |
|---|---|---|
issues_find |
Поиск задач на языке запросов Яндекс Трекера; возвращает {values, hits, pages} |
query, fields, include_description, page, per_page |
issues_count |
Сколько задач подходит под запрос; возвращает {"count": N} |
query |
fieldsиспользует написание самого Трекера (storyPoints, а неstory_points) и принимает любое имя поля, включая локальные поля очереди и пользовательские поля организации — передавайтеidполя изqueue_get_fields. Неизвестное Трекеру имя молча отбрасывается.include_descriptionигнорируется, еслиdescriptionперечислен вfields: указание его там и есть явный запрос.per_pageпо умолчанию 100 и может быть уменьшен, если страница не влезает в контекст.
MCP сервер также может работать в режиме streamable-http для веб-интеграций или когда транспорт stdio не подходит.
# Обязательно - Установить транспорт в режим streamable-http
TRANSPORT=streamable-http
# Конфигурация сервера
HOST=0.0.0.0 # По умолчанию: 0.0.0.0 (все интерфейсы)
PORT=8000 # По умолчанию: 8000# Базовый запуск streamable-http сервера
TRANSPORT=streamable-http uvx yandex-tracker-mcp@latest
# С пользовательским хостом и портом
TRANSPORT=streamable-http \
HOST=localhost \
PORT=9000 \
uvx yandex-tracker-mcp@latest
# Со всеми переменными окружения
TRANSPORT=streamable-http \
HOST=0.0.0.0 \
PORT=8000 \
TRACKER_TOKEN=ваш_токен \
TRACKER_CLOUD_ORG_ID=ваш_org_id \
uvx yandex-tracker-mcp@latestВы можете пропустить настройку TRACKER_CLOUD_ORG_ID или TRACKER_ORG_ID, если используете следующий формат при подключении к MCP серверу (пример для Claude Code):
claude mcp add --transport http yandex-tracker "http://localhost:8000/mcp/?cloudOrgId=ваш_cloud_org_id&"или
claude mcp add --transport http yandex-tracker "http://localhost:8000/mcp/?orgId=org_id&"Вы также можете пропустить настройку глобальной переменной окружения TRACKER_TOKEN, если выберете использование OAuth 2.0 аутентификации (см. ниже).
Yandex Tracker MCP Server поддерживает OAuth 2.0 аутентификацию как безопасную альтернативу статическим API токенам. При настройке сервер выступает в качестве OAuth провайдера, облегчая аутентификацию между вашим MCP клиентом и сервисами Яндекс OAuth.
MCP сервер реализует стандартный поток кода авторизации OAuth 2.0:
- Регистрация клиента: Ваш MCP клиент регистрируется на сервере для получения учетных данных клиента
- Авторизация: Пользователи перенаправляются в Яндекс OAuth для аутентификации
- Обмен токенами: Сервер обменивает коды авторизации на токены доступа
- Доступ к API: Клиенты используют bearer токены для всех запросов API
- Обновление токенов: Истекшие токены можно обновить без повторной аутентификации
MCP Клиент → MCP Сервер → Яндекс OAuth → Аутентификация пользователя
↑ ↓
└────────── Токен доступа ←─────────────────┘
Для включения OAuth аутентификации установите следующие переменные окружения:
# Включить режим OAuth
OAUTH_ENABLED=true
# Учетные данные приложения Яндекс OAuth (обязательно для OAuth)
OAUTH_CLIENT_ID=ваш_id_приложения_яндекс_oauth
OAUTH_CLIENT_SECRET=ваш_секрет_яндекс_oauth
# Публичный URL вашего MCP сервера (обязательно для OAuth обратных вызовов)
MCP_SERVER_PUBLIC_URL=https://ваш-mcp-сервер.example.com
# Опциональные настройки OAuth
OAUTH_SERVER_URL=https://oauth.yandex.ru # OAuth сервер Яндекса по умолчанию
# Когда OAuth включен, TRACKER_TOKEN становится опциональнымПри OAUTH_USE_SCOPES=true (по умолчанию) сервер запрашивает, публикует и требует scope'ы Яндекс
Трекера tracker:read и tracker:write - либо только tracker:read, если задан
TRACKER_READ_ONLY=true, чтобы read-only инстанс никогда не просил у пользователя доступ на запись.
OAUTH_USE_SCOPES=false полностью убирает scope'ы из потока - это требуется для федерации
Yandex Cloud.
- Перейдите на Яндекс OAuth и создайте новое приложение
- Установите callback URL:
{MCP_SERVER_PUBLIC_URL}/oauth/yandex/callback - Запросите следующие разрешения:
tracker:read- Разрешения на чтение для Трекераtracker:write- Разрешения на запись для Трекера
- Сохраните ваш Client ID и Client Secret
| Функция | OAuth | Статический токен |
|---|---|---|
| Безопасность | Динамические токены с истечением | Долгоживущие статические токены |
| Пользовательский опыт | Интерактивный поток входа | Однократная настройка |
| Управление токенами | Автоматическое обновление | Ручная ротация |
| Контроль доступа | Аутентификация для каждого пользователя | Общий токен |
| Сложность настройки | Требует настройки OAuth приложения | Простая настройка токена |
- В настоящее время режим OAuth требует, чтобы MCP сервер был публично доступен для URL обратных вызовов
- Режим OAuth лучше всего подходит для интерактивных клиентов, которые поддерживают веб-потоки аутентификации
Когда OAuth включен, MCP клиентам необходимо:
- Поддерживать поток кода авторизации OAuth 2.0
- Обрабатывать обновление токенов при истечении срока действия токенов доступа
- Безопасно хранить токены обновления для постоянной аутентификации
Примечание: Не все MCP клиенты в настоящее время поддерживают OAuth аутентификацию. Проверьте документацию вашего клиента на совместимость с OAuth.
Пример конфигурации для Claude Code:
claude mcp add --transport http yandex-tracker https://ваш-mcp-сервер.example.com/mcp/ -s userMCP сервер поддерживает два различных бэкенда хранения для данных OAuth (регистрации клиентов, токены доступа, токены обновления и состояния авторизации):
Хранилище в памяти хранит все данные OAuth в памяти сервера. Это опция по умолчанию и не требует дополнительной настройки.
Характеристики:
- Постоянство: Данные теряются при перезапуске сервера
- Производительность: Очень быстрый доступ, так как данные хранятся в памяти
- Масштабируемость: Ограничено одним экземпляром сервера
- Настройка: Не требуются дополнительные зависимости
- Лучше всего для: Разработки, тестирования или развертываний с одним экземпляром, где потеря OAuth сессий при перезапуске приемлема
Конфигурация:
OAUTH_STORE=memory # Значение по умолчанию, можно опуститьRedis хранилище обеспечивает постоянное хранение данных OAuth с использованием базы данных Redis. Это гарантирует, что OAuth сессии переживут перезапуски сервера и позволяет развертывание с несколькими экземплярами.
Характеристики:
- Постоянство: Данные сохраняются при перезапусках сервера
- Производительность: Быстрый доступ с сетевыми накладными расходами
- Масштабируемость: Поддерживает несколько экземпляров сервера, использующих одну и ту же базу данных Redis
- Настройка: Требует установки и настройки сервера Redis
- Лучше всего для: Производственных развертываний, настроек высокой доступности или когда OAuth сессии должны сохраняться
Конфигурация:
# Включить Redis хранилище для данных OAuth
OAUTH_STORE=redis
# Настройки подключения Redis (те же, что используются для кеширования инструментов)
REDIS_ENDPOINT=localhost # По умолчанию: localhost
REDIS_PORT=6379 # По умолчанию: 6379
REDIS_DB=0 # По умолчанию: 0
REDIS_PASSWORD=ваш_пароль_redis # Опционально: пароль Redis
REDIS_POOL_MAX_SIZE=10 # По умолчанию: 10Поведение хранилища:
- Информация о клиенте: Хранится постоянно
- Состояния OAuth: Хранятся с TTL (временем жизни) для безопасности
- Коды авторизации: Хранятся с TTL и автоматически очищаются после использования
- Токены доступа: Хранятся с автоматическим истечением на основе времени жизни токена
- Токены обновления: Хранятся постоянно до отзыва
- Пространство имен ключей: Использует префиксы
oauth:*для избежания конфликтов с другими данными Redis
Важные замечания:
- Оба хранилища используют те же настройки подключения Redis, что и система кеширования инструментов
- При использовании Redis хранилища убедитесь, что ваш экземпляр Redis правильно защищен и доступен
- Настройка
OAUTH_STOREвлияет только на хранение данных OAuth; кеширование инструментов используетTOOLS_CACHE_ENABLED - Redis хранилище использует JSON сериализацию для лучшей совместимости между языками и отладки
При использовании Redis хранилища необходимо настроить шифрование для защиты OAuth токенов в состоянии покоя. Значения токенов шифруются с помощью Fernet (AES-128), а ключи Redis используют хеши SHA-256 вместо сырых токенов, что предотвращает раскрытие токенов в случае компрометации Redis.
Генерация ключа шифрования:
python3 -c "import base64, os; print(base64.b64encode(os.urandom(32)).decode())"Конфигурация:
# Один ключ шифрования
OAUTH_ENCRYPTION_KEYS=<base64-закодированный-32-байтовый-ключ>
# Несколько ключей для ротации (первый шифрует, все расшифровывают)
OAUTH_ENCRYPTION_KEYS=<новый-ключ>,<старый-ключ>Ротация ключей позволяет беспрепятственно обновлять ключи: сначала добавьте новый ключ, дождитесь истечения срока действия старых токенов, затем удалите старый ключ.
Yandex Tracker MCP Server поддерживает несколько методов аутентификации с четким порядком приоритета. Сервер будет использовать первый доступный метод аутентификации на основе этой иерархии:
-
Динамический OAuth токен (наивысший приоритет)
- Когда OAuth включен и пользователь аутентифицируется через OAuth поток
- Токены динамически получаются и обновляются для каждой сессии пользователя
- Поддерживает как стандартный Яндекс OAuth, так и федеративный OAuth Yandex Cloud
- Необходимые переменные окружения:
OAUTH_ENABLED=true,OAUTH_CLIENT_ID,OAUTH_CLIENT_SECRET,MCP_SERVER_PUBLIC_URL - Дополнительные переменные для федеративного OAuth:
OAUTH_SERVER_URL=https://auth.yandex.cloud/oauth,OAUTH_TOKEN_TYPE=Bearer,OAUTH_USE_SCOPES=false
-
Проброс OAuth токена через Bearer
- Когда OAuth middleware MCP не предоставил токен, сервер может прочитать OAuth токен Яндекса из входящего заголовка
Authorization: Bearer <token> - Полезно за доверенным reverse proxy или gateway, который аутентифицирует пользователей, получает их сохраненный OAuth токен Яндекса и добавляет его в каждый запрос
- Токен из MCP OAuth сохраняет приоритет, когда OAuth режим включен и активен
- Когда OAuth middleware MCP не предоставил токен, сервер может прочитать OAuth токен Яндекса из входящего заголовка
-
Статический OAuth токен
- Традиционный OAuth токен, предоставленный через переменную окружения
- Один токен используется для всех запросов
- Необходимая переменная окружения:
TRACKER_TOKEN(ваш OAuth токен)
-
Статический IAM токен
- IAM (Identity and Access Management) токен для межсервисной аутентификации
- Подходит для автоматизированных систем и CI/CD конвейеров
- Необходимая переменная окружения:
TRACKER_IAM_TOKEN(ваш IAM токен)
-
Динамический IAM токен (низший приоритет)
- Автоматически получается с использованием учетных данных сервисного аккаунта
- Токен извлекается и обновляется автоматически
- Необходимые переменные:
TRACKER_SA_KEY_ID,TRACKER_SA_SERVICE_ACCOUNT_ID,TRACKER_SA_PRIVATE_KEY
# Включить режим OAuth
OAUTH_ENABLED=true
OAUTH_CLIENT_ID=ваш_oauth_app_id
OAUTH_CLIENT_SECRET=ваш_oauth_app_secret
MCP_SERVER_PUBLIC_URL=https://ваш-сервер.com
# ID организации (выберите один)
TRACKER_CLOUD_ORG_ID=ваш_cloud_org_id # или TRACKER_ORG_ID# OAuth токен
TRACKER_TOKEN=ваш_oauth_токен
# ID организации (выберите один)
TRACKER_CLOUD_ORG_ID=ваш_cloud_org_id # или TRACKER_ORG_IDИспользуйте этот режим, когда доверенный gateway выполняет аутентификацию пользователя, получает его OAuth токен Яндекса и проксирует запрос к MCP серверу с этим токеном в заголовке:
Authorization: Bearer <oauth_токен_пользователя_в_яндексе># ID организации (выберите один)
TRACKER_CLOUD_ORG_ID=ваш_cloud_org_id # или TRACKER_ORG_IDПроброшенный токен используется только если OAuth middleware MCP не предоставил access token для запроса. В deployments с включенным OAuth и активной MCP OAuth сессией приоритет остается у токена MCP OAuth.
# IAM токен
TRACKER_IAM_TOKEN=ваш_iam_токен
# ID организации (выберите один)
TRACKER_CLOUD_ORG_ID=ваш_cloud_org_id # или TRACKER_ORG_ID# Учетные данные сервисного аккаунта
TRACKER_SA_KEY_ID=ваш_key_id
TRACKER_SA_SERVICE_ACCOUNT_ID=ваш_service_account_id
TRACKER_SA_PRIVATE_KEY=ваш_private_key
# ID организации (выберите один)
TRACKER_CLOUD_ORG_ID=ваш_cloud_org_id # или TRACKER_ORG_ID# Включить OAuth с федерацией Yandex Cloud
OAUTH_ENABLED=true
OAUTH_SERVER_URL=https://auth.yandex.cloud/oauth
OAUTH_TOKEN_TYPE=Bearer
OAUTH_USE_SCOPES=false
OAUTH_CLIENT_ID=ваш_oidc_client_id
OAUTH_CLIENT_SECRET=ваш_oidc_client_secret
MCP_SERVER_PUBLIC_URL=https://ваш-сервер.com
# ID организации (выберите один)
TRACKER_CLOUD_ORG_ID=ваш_cloud_org_id # или TRACKER_ORG_IDЭта конфигурация включает аутентификацию через OIDC-приложения Yandex Cloud, что требуется для федеративных аккаунтов в Yandex Cloud. Федеративные пользователи аутентифицируются через поставщика удостоверений (IdP) своей организации и используют этот OAuth поток для доступа к API Яндекс.Трекера.
- Сервер проверяет методы аутентификации в порядке, указанном выше
- За раз используется только один метод аутентификации
- Для production использования рекомендуются динамические токены (OAuth или IAM) для лучшей безопасности
- IAM токены имеют более короткое время жизни, чем OAuth токены, и могут требовать более частого обновления
- При использовании сервисных аккаунтов убедитесь, что аккаунт имеет соответствующие разрешения для Яндекс.Трекера
# Аутентификация (используйте один из следующих методов)
# Метод 1: OAuth токен
TRACKER_TOKEN=ваш_oauth_токен_яндекс_трекера
# Метод 2: IAM токен
TRACKER_IAM_TOKEN=ваш_iam_токен
# Метод 3: Сервисный аккаунт (для динамического IAM токена)
TRACKER_SA_KEY_ID=ваш_key_id # ID ключа сервисного аккаунта
TRACKER_SA_SERVICE_ACCOUNT_ID=ваш_sa_id # ID сервисного аккаунта
TRACKER_SA_PRIVATE_KEY=ваш_private_key # Приватный ключ сервисного аккаунта
# Конфигурация организации (задайте ровно одну - обе сразу задавать нельзя)
TRACKER_CLOUD_ORG_ID=ваш_cloud_org_id # Для организаций Yandex Cloud
TRACKER_ORG_ID=ваш_org_id # Для организаций Яндекс 360
# Конфигурация API (опционально)
TRACKER_API_BASE_URL=https://api.tracker.yandex.net # По умолчанию: https://api.tracker.yandex.net
TRACKER_API_TIMEOUT=10 # По умолчанию: 10 - Таймаут одного запроса к API Трекера, в секундах
# Безопасность - Ограничить доступ к конкретным очередям (опционально)
TRACKER_LIMIT_QUEUES=PROJ1,PROJ2,DEV # Ключи очередей через запятую - список разрешённых очередей
TRACKER_READ_ONLY_QUEUES=PROJ2 # Ключи очередей через запятую - доступны для чтения, но запись отклоняется (режим только для чтения по очередям)
TRACKER_ENTITIES_ENABLED=true # По умолчанию: false - регистрировать инструменты проектов/портфелей/целей (НЕ подчиняются ограничениям по очередям выше)
# Конфигурация сервера
HOST=0.0.0.0 # По умолчанию: 0.0.0.0
PORT=8000 # По умолчанию: 8000
TRANSPORT=stdio # Опции: stdio, streamable-http, sse
# Настройки подключения Redis (используются для кеширования и OAuth хранилища)
REDIS_ENDPOINT=localhost # По умолчанию: localhost
REDIS_PORT=6379 # По умолчанию: 6379
REDIS_DB=0 # По умолчанию: 0
REDIS_PASSWORD=ваш_пароль_redis # Опционально: пароль Redis
REDIS_POOL_MAX_SIZE=10 # По умолчанию: 10
# Конфигурация кеширования инструментов (опционально)
TOOLS_CACHE_ENABLED=true # По умолчанию: false
TOOLS_CACHE_REDIS_TTL=3600 # По умолчанию: 3600 секунд (1 час)
# OAuth 2.0 аутентификация (опционально)
OAUTH_ENABLED=true # По умолчанию: false
OAUTH_STORE=redis # Опции: memory, redis (по умолчанию: memory)
OAUTH_SERVER_URL=https://oauth.yandex.ru # По умолчанию: https://oauth.yandex.ru (используйте https://auth.yandex.cloud/oauth для федерации)
OAUTH_TOKEN_TYPE=<Bearer|OAuth|<empty>> # По умолчанию: <empty> (обязательно должен быть указан Bearer для федерации Yandex Cloud)
OAUTH_USE_SCOPES=true # По умолчанию: true (установите false для федерации Yandex Cloud)
OAUTH_CLIENT_ID=ваш_oauth_client_id # Обязательно когда OAuth включен
OAUTH_CLIENT_SECRET=ваш_oauth_secret # Обязательно когда OAuth включен
MCP_SERVER_PUBLIC_URL=https://ваш.сервер.com # Обязательно когда OAuth включен
TRACKER_READ_ONLY=true # По умолчанию: false - Отключить все инструменты записи для всего инстансаДоступ к очередям можно ограничивать на трёх уровнях — от грубого к более точному:
TRACKER_LIMIT_QUEUES— список разрешённых ключей очередей. Очереди вне списка считаются не найденными / недоступными как для чтения, так и для записи. Ключи сопоставляются без учёта регистра — и здесь, и вTRACKER_READ_ONLY_QUEUES, — поэтомуdevиDEVозначают одну очередь. Единственное исключение — инструменты досок: доска принадлежит организации, а не очереди, поэтому они не фильтруются и могут назвать запрещённую очередь в настройках доски.TRACKER_READ_ONLY— когдаtrue, все инструменты записи не регистрируются, и весь инстанс работает только на чтение.TRACKER_READ_ONLY_QUEUES— список очередей только для чтения. Инструменты записи остаются зарегистрированными, но любой изменяющий вызов (создание/обновление/перемещение/комментарий/списание времени/связь, создание версии очереди) к указанной очереди отклоняется, а чтение продолжает работать. Очереди, не указанные здесь, остаются доступными для записи.
Инструменты проектов, портфелей и целей в эту модель не входят. Проект, портфель или цель нельзя однозначно сопоставить с одной очередью, поэтому ни одна из трёх настроек выше их не ограничивает — ни инструменты чтения (
project_get,project_find,*_get_comments, …), ни инструменты записи (включая комментарии и чек-листы). Их включение даёт доступ к этим сущностям в рамках всей организации всем, кто может обратиться к серверу. Поэтому они включаются явно: регистрируются только приTRACKER_ENTITIES_ENABLED=true(по умолчаниюfalse), что заодно уменьшает манифест инструментов для тех, кому они не нужны.TRACKER_READ_ONLYпри этом продолжает действовать: он снимает регистрацию инструментов записи сущностей вместе со всеми остальными.
Это позволяет одному инстансу одновременно быть доступным для записи в одни
очереди и только для чтения — в другие: например, TRACKER_LIMIT_QUEUES=DEV,MGMT
вместе с TRACKER_READ_ONLY_QUEUES=MGMT даёт полный доступ к DEV и доступ
только для чтения к MGMT. Это особенно полезно для общего MCP-шлюза, когда
пользователи обращаются к Трекеру только через сервер и не владеют токеном напрямую.
Эти проверки — внутренние ограничители в рамках процесса. Для клиентов, которые держат токен Трекера напрямую, реальные ограничения следует дополнительно задавать на самом токене.
По умолчанию образ работает с TRANSPORT=stdio — общение идёт через stdin/stdout контейнера,
и никакой порт не слушается. Для примеров ниже, где сервер доступен по HTTP, задайте
TRANSPORT=streamable-http; для stdio-клиента запускайте контейнер с -i и без -p
(см. примеры в разделе Конфигурация MCP клиента).
# Используя файл окружения (в нём должно быть TRANSPORT=streamable-http)
docker run --env-file .env -p 8000:8000 ghcr.io/aikts/yandex-tracker-mcp:latest
# С встроенными переменными окружения
docker run -e TRACKER_TOKEN=ваш_токен \
-e TRACKER_CLOUD_ORG_ID=ваш_org_id \
-e TRANSPORT=streamable-http \
-p 8000:8000 \
ghcr.io/aikts/yandex-tracker-mcp:latestdocker build -t yandex-tracker-mcp .Используя готовый образ:
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-httpСборка локально:
services:
mcp-tracker:
build: .
ports:
- "8000:8000"
environment:
- TRACKER_TOKEN=${TRACKER_TOKEN}
- TRACKER_CLOUD_ORG_ID=${TRACKER_CLOUD_ORG_ID}
- TRANSPORT=streamable-http# Клонирование и настройка
git clone https://github.com/aikts/yandex-tracker-mcp
cd yandex-tracker-mcp
# Установка зависимостей для разработки
uv sync --dev
# Форматирование и статическая проверка
taskЭтот проект лицензирован в соответствии с условиями, указанными в файле LICENSE.
По вопросам и проблемам:
- Ознакомьтесь с документацией API Яндекс.Трекера
- Отправляйте проблемы на https://github.com/aikts/yandex-tracker-mcp/issues