@vitalyostanin/youtrack-mcp 0.10.0 → 0.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README-ru.md CHANGED
@@ -43,12 +43,13 @@ MCP сервер для полноценной интеграции с YouTrack
43
43
  - [Сервис](#сервис)
44
44
  - [Задачи](#задачи)
45
45
  - [Связи задач](#связи-задач)
46
+ - [Статусы задач](#статусы-задач)
46
47
  - [Звездочки задач](#звездочки-задач)
48
+ - [Вложения](#вложения)
47
49
  - [Трудозатраты](#трудозатраты)
48
50
  - [Пользователи и проекты](#пользователи-и-проекты)
49
51
  - [Статьи](#статьи)
50
52
  - [Лента активности](#лента-активности)
51
- - [Вложения](#вложения)
52
53
 
53
54
  ## Требования
54
55
 
@@ -274,10 +275,12 @@ YOUTRACK_TOKEN = "perm:your-token-here"
274
275
 
275
276
  ### Параметры сохранения файлов
276
277
 
277
- Многие инструменты поддерживают опциональные параметры `saveToFile` и `filePath` для работы с большими датасетами:
278
+ Многие инструменты поддерживают опциональные параметры сохранения файлов для работы с большими датасетами:
278
279
 
279
280
  - `saveToFile` — boolean, сохраняет результаты в JSON файл вместо возврата напрямую (полезно для больших датасетов)
280
281
  - `filePath` — string, пользовательский путь к файлу (опционально, генерируется автоматически если не указан, директория создается при необходимости)
282
+ - `format` — string, формат вывода при сохранении в файл: `jsonl` (JSON Lines) или `json` (JSON массив). По умолчанию `jsonl`
283
+ - `overwrite` — boolean, разрешить перезапись существующих файлов при использовании явного пути к файлу. По умолчанию `false`
281
284
 
282
285
  Когда `saveToFile` установлено в `true`, инструменты возвращают метаданные о сохраненном файле вместо полных данных.
283
286
 
@@ -291,18 +294,18 @@ YOUTRACK_TOKEN = "perm:your-token-here"
291
294
 
292
295
  | Tool | Описание | Основные параметры |
293
296
  | --- | --- | --- |
294
- | `issue_lookup` | Краткая информация о задаче. **Использование:** Быстрый просмотр базовой информации о задаче без полной детализации. **Возвращает:** предопределенные поля - id, idReadable, summary, description, wikifiedDescription, usesMarkdown, project, parent, assignee. Пользовательские поля не включены. | `issueId` — код задачи (например, `PROJ-123`) |
295
- | `issues_lookup` | Краткая информация о нескольких задачах (пакетный режим, макс 50). **Использование:** Эффективное получение информации о множестве задач одновременно. **Возвращает:** те же поля, что и `issue_lookup`. **Ограничение:** максимум 50 задач за запрос | `issueIds[]` — массив кодов задач (например, `['PROJ-123', 'PROJ-124']`), макс 50; `briefOutput` — опционально (по умолчанию `true`) |
296
- | `issue_details` | Режимы краткий/полный для деталей задачи. **Использование:** Просмотр деталей задачи. **Краткий (по умолчанию):** предопределённые поля — id, idReadable, summary, description, wikifiedDescription, usesMarkdown, created, updated, resolved, project, parent, assignee, reporter, updater, watchers(hasStar). **Полный (`briefOutput=false`):** добавляет `customFields(id,name,value(id,name,presentation),$type,possibleEvents(id,presentation))`, включая поле `State`. | `issueId` — код задачи; `briefOutput` — опционально (по умолчанию `true`) |
297
- | `issues_details` | Режимы краткий/полный для множества задач (макс 50). **Краткий:** предопределённые поля. **Полный (`briefOutput=false`):** добавляет `customFields` для каждой задачи. **Замечание:** объём ответа может быть большим, поэтому по умолчанию используется краткий режим. **Ограничение:** максимум 50 задач за запрос | `issueIds[]` — массив кодов задач, макс 50; `briefOutput` — опционально (по умолчанию `true`) |
298
- | `issue_comments` | Комментарии задачи. **Использование:** Просмотр всех комментариев к задаче. **Возвращает:** предопределенные поля - id, text, textPreview, usesMarkdown, author (id, login, name), created, updated, commentUrl (прямая ссылка на комментарий) | `issueId` — код задачи |
299
- | `issues_comments` | Комментарии для нескольких задач (пакетный режим, макс 50). **Использование:** Эффективное получение комментариев для множества задач одновременно. **Ограничение:** максимум 50 задач за запрос | `issueIds[]` — массив кодов задач, макс 50; `briefOutput` — опционально (по умолчанию `true`) |
297
+ | `issue_lookup` | Получить информацию о задаче YouTrack. **Использование:** Быстрый просмотр базовой информации о задаче. **Возвращает:** предопределенные поля включая метки времени (created, updated) и базовую информацию - id, idReadable, summary, description, wikifiedDescription, usesMarkdown, created, updated, project (id, shortName, name), parent (id, idReadable), assignee (id, login, name), reporter (id, login, name), updater (id, login, name). Пользовательские поля не включены по умолчанию. Используйте `briefOutput=false` для получения всех пользовательских полей включая State. | `issueId` — код задачи (например, `PROJ-123`); `briefOutput` — опционально (по умолчанию `true`) |
298
+ | `issues_lookup` | Получить информацию о нескольких задачах YouTrack (пакетный режим, макс 50). **Использование:** Эффективное получение информации о множестве задач одновременно. **Возвращает:** те же поля, что и `issue_lookup`. **Ограничение:** максимум 50 задач за запрос | `issueIds[]` — массив кодов задач (например, `['PROJ-123', 'PROJ-124']`), макс 50; `briefOutput` — опционально (по умолчанию `true`) |
299
+ | `issue_details` | Режимы краткий/полный для деталей задачи. **Использование:** Просмотр деталей задачи. **Краткий (по умолчанию):** предопределённые поля — id, idReadable, summary, description, wikifiedDescription, usesMarkdown, created, updated, resolved, project, parent, assignee, reporter, updater, watchers(hasStar). **Полный (`briefOutput=false`):** добавляет `customFields(id,name,value(id,name,presentation),$type,possibleEvents(id,presentation))`, включая поле `State`. | `issueId` — код задачи; `briefOutput` — опционально (по умолчанию `true`); `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
300
+ | `issues_details` | Режимы краткий/полный для множества задач (макс 50). **Краткий:** предопределённые поля. **Полный (`briefOutput=false`):** добавляет `customFields` для каждой задачи. **Замечание:** объём ответа может быть большим, поэтому по умолчанию используется краткий режим. **Ограничение:** максимум 50 задач за запрос | `issueIds[]` — массив кодов задач, макс 50; `briefOutput` — опционально (по умолчанию `true`); `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
301
+ | `issue_comments` | Комментарии задачи. **Использование:** Просмотр всех комментариев к задаче. **Возвращает:** предопределенные поля - id, text, textPreview, usesMarkdown, author (id, login, name), created, updated, commentUrl (прямая ссылка на комментарий) | `issueId` — код задачи; `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
302
+ | `issues_comments` | Комментарии для нескольких задач (пакетный режим, макс 50). **Использование:** Эффективное получение комментариев для множества задач одновременно. **Ограничение:** максимум 50 задач за запрос | `issueIds[]` — массив кодов задач, макс 50; `briefOutput` — опционально (по умолчанию `true`); `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
300
303
  | `issue_create` | Создание новой задачи в YouTrack. **Использование:** Создание задач, подзадач (через `parentIssueId`), назначение исполнителя при создании, одновременное создание дополнительных связей. **Возвращает:** стандартные поля созданной задачи (id, idReadable, summary, description, wikifiedDescription, usesMarkdown, project, parent, assignee). Пользовательские поля не включены. | `projectId` — внутренний ID проекта, `summary`, опционально `description`, `parentIssueId`, `assigneeLogin`, `stateName`, `usesMarkdown`, `links[]` — массив объектов связи |
301
304
  | `issue_update` | Обновление существующей задачи. **Использование:** Изменение summary, description, родительской задачи. **Примечание:** для изменения исполнителя используйте `issue_assign`. Пустая строка в `parentIssueId` удаляет родителя. **Возвращает:** стандартные поля обновленной задачи | `issueId` — ID или код задачи, опционально `summary`, `description`, `parentIssueId` (пустая строка очищает родителя), `usesMarkdown` |
302
305
  | `issue_assign` | Назначение исполнителя для задачи. **Использование:** Изменение исполнителя задачи. Поддерживает алиас `me` для текущего пользователя. **Возвращает:** стандартные поля обновленной задачи | `issueId` — ID или код задачи, `assigneeLogin` — логин исполнителя или `me` |
303
306
  | `issue_comment_create` | Добавление комментария к задаче. **Использование:** Оставлять комментарии, заметки, обсуждения в задачах. Поддерживает Markdown. **Возвращает:** поля комментария - id, text, textPreview, usesMarkdown, author, created, updated | `issueId` — ID или код задачи, `text` — текст комментария, опционально `usesMarkdown` |
304
307
  | `issue_comment_update` | Обновление существующего комментария. **Использование:** Редактирование текста комментария, изменение режима форматирования, исправление опечаток. Поддерживает Markdown. **Возвращает:** поля комментария - id, text, textPreview, usesMarkdown, author, created, updated, commentUrl | `issueId` — ID или код задачи, `commentId` — ID комментария, опционально `text`, `usesMarkdown`, `muteUpdateNotifications` |
305
- | `issue_activities` | Получение истории изменений задачи (активности). **Использование:** Просмотр полной истории задачи, отслеживание изменений полей во времени, мониторинг кто и когда что изменил, анализ эволюции задачи, аудит модификаций. **Возвращает:** Элементы активности с временными метками (ISO datetime), авторами, категориями, типами изменений и деталями изменений (добавленные/удалённые значения). Поддерживает фильтрацию по автору, диапазону дат и категориям активности. **Примечание:** Возвращает предопределённые поля - id, timestamp, author (id, login, name), category (id), target (text), добавленные значения, удалённые значения, тип активности. Полезно для понимания жизненного цикла задачи, отслеживания модификаций полей, просмотра истории комментариев и анализа паттернов совместной работы. | `issueId` — код задачи, опционально `author` (логин пользователя), `startDate` (формат YYYY-MM-DD, timestamp или Date), `endDate`, `categories` (через запятую: `CustomFieldCategory` для изменений полей, `CommentsCategory` для комментариев, `AttachmentsCategory` для вложений, `LinksCategory` для связей, `VcsChangeActivityCategory` для VCS изменений, `WorkItemsActivityCategory` для трудозатрат), `limit` (макс 200), `skip` для пагинации |
308
+ | `issue_activities` | Получение истории изменений задачи (активности). **Использование:** Просмотр полной истории задачи, отслеживание изменений полей во времени, мониторинг кто и когда что изменил, анализ эволюции задачи, аудит модификаций. **Возвращает:** Элементы активности с временными метками (ISO datetime), авторами, категориями, типами изменений и деталями изменений (добавленные/удалённые значения). Поддерживает фильтрацию по автору, диапазону дат и категориям активности. **Примечание:** Возвращает предопределённые поля - id, timestamp, author (id, login, name), category (id), target (text), добавленные значения, удалённые значения, тип активности. Полезно для понимания жизненного цикла задачи, отслеживания модификаций полей, просмотра истории комментариев и анализа паттернов совместной работы. | `issueId` — код задачи, опционально `author` (логин пользователя), `startDate` (формат YYYY-MM-DD, timestamp или Date), `endDate`, `categories` (через запятую: `CustomFieldCategory` для изменений полей, `CommentsCategory` для комментариев, `AttachmentsCategory` для вложений, `LinksCategory` для связей, `VcsChangeActivityCategory` для VCS изменений, `WorkItemsActivityCategory` для трудозатрат), `limit` (макс 200), `skip` для пагинации; `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
306
309
  | `issue_change_state` | Изменение состояния/статуса задачи через переходы workflow. **Использование:** Перемещение задач через состояния рабочего процесса (например, 'Открыта' → 'В работе'). Автоматически определяет доступные переходы и валидирует запрошенное изменение состояния. Регистронезависимое сопоставление имён состояний. **Возвращает:** информацию о предыдущем состоянии, новом состоянии и использованном переходе | `issueId` — код задачи, `stateName` — имя целевого состояния (например, 'В работе', 'Открыта', 'Исправлена', 'Проверена'). Регистронезависимое |
307
310
 
308
311
  ### Связи задач
@@ -324,6 +327,13 @@ YOUTRACK_TOKEN = "perm:your-token-here"
324
327
  - `sourceId` — опционально. Если не указан, исходной считается новая задача; укажите его, чтобы привязать новую задачу как `target` к уже существующей.
325
328
  - После создания задачи повторно запросите связи (`issue_links`) для подтверждения, что YouTrack применил все отношения.
326
329
 
330
+ ### Статусы задач
331
+
332
+ | Tool | Описание | Основные параметры |
333
+ | --- | --- | --- |
334
+ | `issue_status` | Получить статус задачи YouTrack. Возвращает поле State задачи. | `issueId` — код задачи (например, `PROJ-123`) |
335
+ | `issues_status` | Получить статусы нескольких задач YouTrack (пакетный режим, макс 50). Возвращает поле State каждой задачи. | `issueIds[]` — массив кодов задач (например, `['PROJ-123', 'PROJ-124']`), макс 50 |
336
+
327
337
  ### Звездочки задач
328
338
 
329
339
  | Tool | Описание | Основные параметры |
@@ -338,25 +348,25 @@ YOUTRACK_TOKEN = "perm:your-token-here"
338
348
 
339
349
  | Tool | Описание | Основные параметры |
340
350
  | --- | --- | --- |
341
- | `workitems_list` | Получение трудозатрат текущего или указанного пользователя. **Использование:** Просмотр учтенного времени, фильтрация по задаче, автору, периоду. **Возвращает:** предопределенные поля - id, date, duration (minutes, presentation), text, textPreview, usesMarkdown, description, issue (id, idReadable), author (id, login, name, email) | Опционально `issueId`, `author` (логин пользователя), `startDate` (формат YYYY-MM-DD, timestamp или date-time), `endDate`, `allUsers` |
342
- | `workitems_all_users` | Получение трудозатрат всех пользователей. **Использование:** Просмотр времени всей команды, анализ загрузки проекта. **Возвращает:** те же поля, что и `workitems_list` | Опционально `issueId`, `startDate`, `endDate` |
343
- | `workitems_for_users` | Получение трудозатрат выбранных пользователей. **Использование:** Просмотр времени конкретных участников команды, сравнение загрузки между пользователями. **Возвращает:** те же поля, что и `workitems_list` | `users[]` — массив логинов пользователей, опционально `issueId`, `startDate`, `endDate` |
344
- | `workitems_recent` | Получение последних записей трудозатрат с сортировкой по времени обновления (новые первыми). **Использование:** Быстрый просмотр недавних записей времени, мониторинг текущей активности. **Возвращает:** те же поля, что и `workitems_list`. **Ограничение:** по умолчанию 50 записей, макс 200 | Опционально `users[]` (по умолчанию текущий пользователь), `limit` (по умолчанию 50, макс 200) |
351
+ | `workitems_list` | Получение трудозатрат текущего или указанного пользователя. **Использование:** Просмотр учтенного времени, фильтрация по задаче, автору, периоду. **Возвращает:** предопределенные поля - id, date, duration (minutes, presentation), text, textPreview, usesMarkdown, description, issue (id, idReadable), author (id, login, name, email) | Опционально `issueId`, `author` (логин пользователя), `startDate` (формат YYYY-MM-DD, timestamp или date-time), `endDate`, `allUsers`; `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
352
+ | `workitems_all_users` | Получение трудозатрат всех пользователей. **Использование:** Просмотр времени всей команды, анализ загрузки проекта. **Возвращает:** те же поля, что и `workitems_list` | Опционально `issueId`, `startDate`, `endDate`; `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
353
+ | `workitems_for_users` | Получение трудозатрат выбранных пользователей. **Использование:** Просмотр времени конкретных участников команды, сравнение загрузки между пользователями. **Возвращает:** те же поля, что и `workitems_list` | `users[]` — массив логинов пользователей, опционально `issueId`, `startDate`, `endDate`; `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
354
+ | `workitems_recent` | Получение последных записей трудозатрат с сортировкой по времени обновления (новые первыми). **Использование:** Быстрый просмотр недавних записей времени, мониторинг текущей активности. **Возвращает:** те же поля, что и `workitems_list`. **Ограничение:** по умолчанию 50 записей, макс 200 | Опционально `users[]` (по умолчанию текущий пользователь), `limit` (по умолчанию 50, макс 200); `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
345
355
  | `workitem_create` | Создание записи трудозатрат. **Использование:** Учет времени на задачу за конкретную дату. **Возвращает:** предопределенные поля созданной записи. **Примечание:** может создавать дубликаты, для предотвращения используйте `workitem_create_idempotent` | `issueId` — ID задачи, `date` (формат YYYY-MM-DD, timestamp или date-time), `minutes` — количество минут (>0), опционально `summary` — краткий текст, `description`, `usesMarkdown` |
346
356
  | `workitem_create_idempotent` | Создание записи без дублей (по описанию и дате). **Использование:** Безопасное создание записи времени с предотвращением дублирования. Проверяет существование похожей записи по описанию. **Возвращает:** предопределенные поля созданной или найденной записи | `issueId` — ID задачи, `date`, `minutes`, `description` — текст для поиска существующей записи, опционально `usesMarkdown` |
347
357
  | `workitem_update` | Обновление записи трудозатрат. **Использование:** Исправление учтенного времени, даты или описания. **Возвращает:** предопределенные поля обновленной записи | `issueId` — ID задачи, `workItemId` — ID записи трудозатрат, опционально `date`, `minutes`, `summary` — новый текст, `description`, `usesMarkdown` |
348
358
  | `workitem_delete` | Удаление записи трудозатрат. **Использование:** Удаление ошибочно созданных или неактуальных записей | `issueId` — ID задачи, `workItemId` — ID записи трудозатрат |
349
359
  | `workitems_create_period` | Массовое создание трудозатрат по диапазону дат. **Использование:** Учет регулярной работы за период, автоматическое исключение выходных и праздников. **Возвращает:** массив созданных записей с предопределенными полями. **Примечание:** автоматически пропускает выходные при `excludeWeekends=true` и даты из списка `holidays` | `issueId`, `startDate`, `endDate`, `minutes` — минут в день, опционально `summary`, `description`, `usesMarkdown`, `excludeWeekends` — исключить субботы и воскресенья, `excludeHolidays`, `holidays[]` — массив дат праздников (YYYY-MM-DD, timestamp или date-time), `preHolidays[]` — массив предпраздничных дат |
350
- | `workitems_report_summary` | Сводный отчёт по трудозатратам. **Использование:** Анализ загрузки за период, сравнение плана и факта, выявление недостатка/избытка часов. **Возвращает:** общую статистику - общее количество минут, ожидаемое количество, отклонение, количество рабочих дней, данные по дням | Опционально `author` (логин), `issueId`, `startDate`, `endDate`, `expectedDailyMinutes` — норма минут в день (например, 480 для 8 часов), `excludeWeekends`, `excludeHolidays`, `holidays[]`, `preHolidays[]`, `allUsers` — включить всех пользователей |
351
- | `workitems_report_invalid` | Список дней с отклонением от нормы времени. **Использование:** Поиск дней с недостатком или избытком учтенного времени, контроль соблюдения нормы. **Возвращает:** массив дней, где факт отличается от нормы, с детализацией по записям | Те же параметры, что и для `workitems_report_summary` |
352
- | `workitems_report_users` | Отчёт по трудозатратам списка пользователей. **Использование:** Сравнительный анализ загрузки нескольких пользователей, командная статистика. **Возвращает:** отчет по каждому пользователю с общей статистикой и детализацией по дням | `users[]` — массив логинов пользователей + общие параметры отчёта (`issueId`, `startDate`, `endDate`, `expectedDailyMinutes`, `excludeWeekends`, `excludeHolidays`, `holidays[]`, `preHolidays[]`) |
353
- | `workitems_report` | Генерация отчёта по трудозатратам (устаревший). **Использование:** Для совместимости со старыми клиентами. Рекомендуется использовать специализированные инструменты отчётов (`workitems_report_summary`, `workitems_report_invalid`, `workitems_report_users`) | Опционально `author`, `issueId`, `startDate`, `endDate`, `expectedDailyMinutes`, `excludeWeekends`, `excludeHolidays`, `holidays[]`, `preHolidays[]`, `allUsers` |
360
+ | `workitems_report_summary` | Сводный отчёт по трудозатратам. **Использование:** Анализ загрузки за период, сравнение плана и факта, выявление недостатка/избытка часов. **Возвращает:** общую статистику - общее количество минут, ожидаемое количество, отклонение, количество рабочих дней, данные по дням | Опционально `author` (логин), `issueId`, `startDate`, `endDate`, `expectedDailyMinutes` — норма минут в день (например, 480 для 8 часов), `excludeWeekends`, `excludeHolidays`, `holidays[]`, `preHolidays[]`, `allUsers` — включить всех пользователей; `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
361
+ | `workitems_report_invalid` | Список дней с отклонением от нормы времени. **Использование:** Поиск дней с недостатком или избытком учтенного времени, контроль соблюдения нормы. **Возвращает:** массив дней, где факт отличается от нормы, с детализацией по записям | Те же параметры, что и для `workitems_report_summary`; `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
362
+ | `workitems_report_users` | Отчёт по трудозатратам списка пользователей. **Использование:** Сравнительный анализ загрузки нескольких пользователей, командная статистика. **Возвращает:** отчет по каждому пользователю с общей статистикой и детализацией по дням | `users[]` — массив логинов пользователей + общие параметры отчёта (`issueId`, `startDate`, `endDate`, `expectedDailyMinutes`, `excludeWeekends`, `excludeHolidays`, `holidays[]`, `preHolidays[]`); `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
363
+ | `workitems_report` | Генерация отчёта по трудозатратам (устаревший). **Использование:** Для совместимости со старыми клиентами. Рекомендуется использовать специализированные инструменты отчётов (`workitems_report_summary`, `workitems_report_invalid`, `workitems_report_users`) | Опционально `author`, `issueId`, `startDate`, `endDate`, `expectedDailyMinutes`, `excludeWeekends`, `excludeHolidays`, `holidays[]`, `preHolidays[]`, `allUsers`; `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
354
364
 
355
365
  ### Пользователи и проекты
356
366
 
357
367
  | Tool | Описание | Основные параметры |
358
368
  | --- | --- | --- |
359
- | `users_list` | Список всех пользователей YouTrack. **Использование:** Просмотр доступных пользователей, поиск логинов для назначения задач. **Возвращает:** предопределенные поля - id, login, name, fullName, email | — |
369
+ | `users_list` | Список всех пользователей YouTrack. **Использование:** Просмотр доступных пользователей, поиск логинов для назначения задач. **Возвращает:** предопределенные поля - id, login, name, fullName, email | `saveToFile`, `filePath`, `format`, `overwrite` параметры сохранения файлов |
360
370
  | `user_get` | Получение пользователя по логину. **Использование:** Проверка существования пользователя, получение деталей профиля. **Возвращает:** предопределенные поля - id, login, name, fullName, email | `login` — логин пользователя |
361
371
  | `user_current` | Получение текущего аутентифицированного пользователя. **Использование:** Проверка, под каким пользователем работает API токен, получение собственного ID для операций. **Возвращает:** предопределенные поля - id, login, name, fullName, email | — |
362
372
  | `projects_list` | Список всех проектов YouTrack. **Использование:** Просмотр доступных проектов, поиск ID проекта для создания задач. **Возвращает:** предопределенные поля - id, shortName, name | — |
@@ -370,24 +380,24 @@ YOUTRACK_TOKEN = "perm:your-token-here"
370
380
  | `article_list` | Список статей с фильтрами. **Использование:** Просмотр структуры базы знаний, навигация по статьям. **Возвращает:** предопределенные поля - id, idReadable, summary, usesMarkdown, parentArticle (id, idReadable), project (id, shortName, name). Поле content не включено для производительности | Опционально `parentArticleId` — фильтр по родительской статье, `projectId` — фильтр по проекту |
371
381
  | `article_create` | Создание статьи в базе знаний. **Использование:** Создание документации, инструкций, статей поддержки. Поддерживает иерархическую структуру через `parentArticleId`. **Возвращает:** предопределенные поля созданной статьи - id, idReadable, summary, content, contentPreview, usesMarkdown, parentArticle, project | `summary` — заголовок статьи, опционально `content` — содержимое, `parentArticleId` — ID родительской статьи для создания подстатьи, `projectId` — ID проекта, `usesMarkdown` — использовать Markdown форматирование, `returnRendered` — вернуть отрендеренный preview |
372
382
  | `article_update` | Обновление существующей статьи. **Использование:** Редактирование содержимого, изменение заголовка статьи. **Возвращает:** предопределенные поля обновленной статьи | `articleId` — ID статьи, опционально `summary` — новый заголовок, `content` — новое содержимое, `usesMarkdown`, `returnRendered` |
373
- | `article_search` | Поиск статей в базе знаний по тексту. **Использование:** Полнотекстовый поиск по заголовкам и содержимому статей, поиск документации. Поддерживает фильтрацию по проекту и родительской статье. **Возвращает:** предопределенные поля - id, idReadable, summary, usesMarkdown, contentPreview (если `returnRendered=true`), parentArticle, project. Поле content не включено для производительности. **Ограничение:** минимум 2 символа в запросе, максимум 200 результатов | `query` — текст для поиска (минимум 2 символа), опционально `projectId` — фильтр по проекту, `parentArticleId` — фильтр по родительской статье, `limit` — максимум результатов (макс 200), `returnRendered` — вернуть отрендеренный preview содержимого |
374
- | `articles_search` | Полнотекстовый поиск по статьям базы знаний YouTrack по заголовку и содержимому. Возвращает `webUrl` для прямого перехода. | `query`, `limit`, `skip`, опционально `projectId`, `parentArticleId` |
375
- | `issues_search` | Полнотекстовый поиск по задачам YouTrack по summary, description и комментариям. Если `query` не указан или пуст, будут возвращены все задачи. Поддерживает фильтрацию по проектам, исполнителю, автору, статусу и типу. | `query` (необязательный), `limit`, `skip`, `countOnly` (необязательный), `projects` (необязательный), `assignee` (необязательный), `reporter` (необязательный), `state` (необязательный), `type` (необязательный) |
376
- | `issues_list` | Список задач по фильтрам с поддержкой сортировки. **Использование:** Дашборды, аудит командной загрузки, подготовка батч-операций. Поддерживает фильтрацию по проектам, датам создания/обновления, статусам, типам, исполнителю. **Возвращает:** краткие или полные данные задачи в зависимости от `briefOutput`, а также информацию о сортировке и пагинации. | Фильтры: `projectIds`, `createdAfter/Before`, `updatedAfter/Before`, `statuses`, `assigneeLogin`, `types`; сортировка: `sortField` (`created`/`updated`), `sortDirection` (`asc`/`desc`); пагинация: `limit`, `skip`; формат: `briefOutput` |
377
- | `issues_count` | Подсчёт задач с теми же фильтрами, что у `issues_list`, с разбивкой по проектам. **Использование:** Быстрая оценка объёмов работ перед загрузкой полного списка, подготовка аналитических отчётов. При запросе одного проекта обращается к `/api/issuesGetter/count`, иначе считает постранично. | Те же фильтры, что и `issues_list`; опциональный `top` ограничивает объём ручной агрегации (при необходимости частичной выборки) |
383
+ | `article_search` | Поиск статей в базе знаний по тексту. **Использование:** Полнотекстовый поиск по заголовкам и содержимому статей, поиск документации. Поддерживает фильтрацию по проекту и родительской статье. **Возвращает:** предопределенные поля - id, idReadable, summary, usesMarkdown, contentPreview (если `returnRendered=true`), parentArticle, project. Поле content не включено для производительности. **Ограничение:** минимум 2 символа в запросе, максимум 200 результатов | `query` — текст для поиска (минимум 2 символа), опционально `projectId` — фильтр по проекту, `parentArticleId` — фильтр по родительской статье, `limit` — максимум результатов (макс 200), `returnRendered` — вернуть отрендеренный preview содержимого; `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
384
+ | `articles_search` | Полнотекстовый поиск по статьям базы знаний YouTrack по заголовку и содержимому. Возвращает `webUrl` для прямого перехода. | `query`, `limit`, `skip`, опционально `projectId`, `parentArticleId`; `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
385
+ | `issues_search` | Полнотекстовый поиск по задачам YouTrack по summary, description и комментариям. Если `query` не указан или пуст, будут возвращены все задачи. Поддерживает фильтрацию по проектам, исполнителю, автору, статусу и типу. | `query` (необязательный), `limit`, `skip`, `countOnly` (необязательный), `projects` (необязательный), `assignee` (необязательный), `reporter` (необязательный), `state` (необязательный), `type` (необязательный); `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
386
+ | `issues_list` | Список задач по фильтрам с поддержкой сортировки. **Использование:** Дашборды, аудит командной загрузки, подготовка батч-операций. Поддерживает фильтрацию по проектам, датам создания/обновления, статусам, типам, исполнителю. **Возвращает:** краткие или полные данные задачи в зависимости от `briefOutput`, а также информацию о сортировке и пагинации. | Фильтры: `projectIds`, `createdAfter/Before`, `updatedAfter/Before`, `statuses`, `assigneeLogin`, `types`; сортировка: `sortField` (`created`/`updated`), `sortDirection` (`asc`/`desc`); пагинация: `limit`, `skip`; формат: `briefOutput`; `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
387
+ | `issues_count` | Подсчёт задач с теми же фильтрами, что у `issues_list`, с разбивкой по проектам. **Использование:** Быстрая оценка объёмов работ перед загрузкой полного списка, подготовка аналитических отчётов. При запросе одного проекта обращается к `/api/issuesGetter/count`, иначе считает постранично. | Те же фильтры, что и `issues_list`; опциональный `top` ограничивает объём ручной агрегации (при необходимости частичной выборки); `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
378
388
 
379
389
  ### Лента активности
380
390
 
381
391
  | Tool | Описание | Основные параметры |
382
392
  | --- | --- | --- |
383
- | `users_activity` | Авторо-центричная лента активности на базе `/api/activities`. **Использование:** аудит обновлений коллеги, накопление комментариев/смен состояний по множеству задач, проверка таймлайна выката. Возвращает нормализованные записи с ISO-временем, ссылками на задачи и полями `added`/`removed`. После анализа обязательно повторно запросите затронутые задачи или рабочие элементы, чтобы убедиться в актуальном состоянии. Поддерживаемые категории: `CustomFieldCategory` (изменения полей), `CommentsCategory` (комментарии), `AttachmentsCategory` (файлы), `LinksCategory` (ссылки), `VcsChangeActivityCategory` (VCS изменения), `WorkItemsActivityCategory` (трудозатраты). | `author` *(обязательный)* — логин пользователя (например, `vyt`); `categories` *(обязательный)* — список категорий через запятую из перечня выше; опционально `start` / `end` (ISO-строка, timestamp в мс или `Date`) для ограничения диапазона, `reverse` (boolean) для прямого хронометража, `limit` (по умолчанию 100, макс 200), `skip` (смещение пагинации), `fields` (расширенный перегруз возвращаемых полей). |
393
+ | `users_activity` | Авторо-центричная лента активности на базе `/api/activities`. **Использование:** аудит обновлений коллеги, накопление комментариев/смен состояний по множеству задач, проверка таймлайна выката. Возвращает нормализованные записи с ISO-временем, ссылками на задачи и полями `added`/`removed`. После анализа обязательно повторно запросите затронутые задачи или рабочие элементы, чтобы убедиться в актуальном состоянии. Поддерживаемые категории: `CustomFieldCategory` (изменения полей), `CommentsCategory` (комментарии), `AttachmentsCategory` (файлы), `LinksCategory` (ссылки), `VcsChangeActivityCategory` (VCS изменения), `WorkItemsActivityCategory` (трудозатраты). | `author` *(обязательный)* — логин пользователя (например, `vyt`); `categories` *(обязательный)* — список категорий через запятую из перечня выше; опционально `start` / `end` (ISO-строка, timestamp в мс или `Date`) для ограничения диапазона, `reverse` (boolean) для прямого хронометража, `limit` (по умолчанию 100, макс 200), `skip` (смещение пагинации), `fields` (расширенный перегруз возвращаемых полей); `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов. |
384
394
 
385
395
  ### Вложения
386
396
 
387
397
  | Tool | Описание | Основные параметры |
388
398
  | --- | --- | --- |
389
- | `issue_attachments_list` | Получение списка вложений задачи. **Использование:** Просмотр всех файлов, прикрепленных к задаче. **Возвращает:** метаданные всех вложений задачи | `issueId` — код задачи (например, `PROJ-123`) |
390
- | `issue_attachment_get` | Получение детальной информации о конкретном вложении. **Использование:** Проверка метаданных файла (размер, имя, тип, автор, дата). **Возвращает:** подробные метаданные вложения | `issueId` — код задачи, `attachmentId` — ID вложения |
391
- | `issue_attachment_download` | Получение информации для скачивания вложения. **Использование:** Получение подписанного URL для загрузки файла. **Возвращает:** метаданные вложения и подписанный URL, который можно использовать напрямую без дополнительной аутентификации | `issueId` — код задачи, `attachmentId` — ID вложения |
399
+ | `issue_attachments_list` | Получение списка вложений задачи. **Использование:** Просмотр всех файлов, прикрепленных к задаче. **Возвращает:** метаданные всех вложений задачи | `issueId` — код задачи (например, `PROJ-123`); `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
400
+ | `issue_attachment_get` | Получение детальной информации о конкретном вложении. **Использование:** Проверка метаданных файла (размер, имя, тип, автор, дата). **Возвращает:** подробные метаданные вложения | `issueId` — код задачи, `attachmentId` — ID вложения; `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
401
+ | `issue_attachment_download` | Получение URL для скачивания вложения или прямая загрузка файла в локальную файловую систему. **Использование:** Получение подписанного URL для загрузки файла или прямая загрузка файла в локальную файловую систему. **Возвращает:** метаданные вложения и подписанный URL, который можно использовать напрямую без дополнительной аутентификации, или информацию о загруженном файле | `issueId` — код задачи, `attachmentId` — ID вложения; `downloadToFile` — boolean, загрузить файл непосредственно в локальную файловую систему (по умолчанию: false); `downloadPath` — путь для сохранения файла (генерируется автоматически, если не указан); `overwrite` — разрешить перезапись существующих файлов (по умолчанию: false, выдает ошибку, если файл существует); `saveToFile`, `filePath`, `format`, `overwrite` — параметры сохранения файлов |
392
402
  | `issue_attachment_upload` | Загрузка файлов к задаче YouTrack. **Использование:** Прикрепление документов, скриншотов, логов к задаче. Файлы должны существовать в локальной файловой системе. **Примечание:** можно прикреплять файлы только к существующим задачам, не при создании. **Ограничение:** максимум 10 файлов за запрос | `issueId` — код задачи, `filePaths[]` — массив абсолютных путей к файлам (макс 10), опционально `muteUpdateNotifications` — не отправлять уведомления об обновлении |
393
403
  | `issue_attachment_delete` | Удаление вложения из задачи YouTrack. **ВАЖНО:** Требует явного подтверждения через параметр `confirmation` для предотвращения случайного удаления. **Использование:** Удаление устаревших или ошибочно загруженных файлов. Это деструктивная операция, которую нельзя отменить. | `issueId` — код задачи, `attachmentId` — ID вложения для удаления, `confirmation` — должен быть явно установлен в `true` для подтверждения удаления (обязательный параметр безопасности) |
package/README.md CHANGED
@@ -45,7 +45,9 @@ MCP server for comprehensive YouTrack integration with the following capabilitie
45
45
  - [Service](#service)
46
46
  - [Issues](#issues)
47
47
  - [Issue Links](#issue-links)
48
+ - [Issues Status](#issues-status)
48
49
  - [Issue Stars](#issue-stars)
50
+ - [Attachments](#attachments)
49
51
  - [Work Items](#work-items)
50
52
  - [Users and Projects](#users-and-projects)
51
53
  - [Articles](#articles)
@@ -278,10 +280,12 @@ To use this MCP server with [Cline](https://github.com/cline/cline) extension in
278
280
 
279
281
  ### File Storage Parameters
280
282
 
281
- Many tools support optional `saveToFile` and `filePath` parameters for handling large datasets:
283
+ Many tools support optional file storage parameters for handling large datasets:
282
284
 
283
285
  - `saveToFile` — boolean, saves results to a JSON file instead of returning directly (useful for large datasets)
284
286
  - `filePath` — string, custom file path (optional, auto-generated if not provided, directory created if needed)
287
+ - `format` — string, output format when saving to file: `jsonl` (JSON Lines) or `json` (JSON array format). Default is `jsonl`
288
+ - `overwrite` — boolean, allow overwriting existing files when using explicit filePath. Default is `false`
285
289
 
286
290
  When `saveToFile` is `true`, tools return metadata about the saved file instead of the full data.
287
291
 
@@ -295,22 +299,22 @@ When `saveToFile` is `true`, tools return metadata about the saved file instead
295
299
 
296
300
  | Tool | Description | Main Parameters |
297
301
  | --- | --- | --- |
298
- | `issue_lookup` | Brief issue information | `issueId` — issue code (e.g., PROJ-123) |
299
- | `issues_lookup` | Brief information about multiple issues (batch mode, max 50) | `issueIds[]` — array of issue codes (e.g., ['PROJ-123', 'PROJ-124']), max 50; `briefOutput` — optional boolean (default `true`) |
300
- | `issue_details` | Issue details with brief/full modes | `issueId` — issue code; `briefOutput` — optional boolean (default `true`). Brief: predefined fields only. Full (`false`): adds `customFields` including `State` |
301
- | `issues_details` | Detailed information about multiple issues (batch mode, max 50). Brief (default): predefined fields only. Full (`briefOutput=false`): adds `customFields` for each issue | `issueIds[]` — array of issue codes, max 50; `briefOutput` — optional boolean (default `true`) |
302
- | `issue_comments` | Issue comments | `issueId` — issue code |
303
- | `issues_comments` | Comments for multiple issues (batch mode, max 50) | `issueIds[]` — array of issue codes, max 50; `briefOutput` — optional boolean (default `true`) |
302
+ | `issue_lookup` | Get information about YouTrack issue. Note: Returns predefined fields including timestamps (created, updated) and basic info - id, idReadable, summary, description, wikifiedDescription, usesMarkdown, created, updated, project (id, shortName, name), parent (id, idReadable), assignee (id, login, name), reporter (id, login, name), updater (id, login, name). By default, custom fields are not included. Use briefOutput=false to get all customFields including State. | `issueId` — issue code (e.g., PROJ-123); `briefOutput` — optional boolean (default `true`) |
303
+ | `issues_lookup` | Get information about multiple YouTrack issues (batch mode, max 50). Note: Returns predefined fields including timestamps (created, updated) and basic info - id, idReadable, summary, description, wikifiedDescription, usesMarkdown, created, updated, project (id, shortName, name), parent (id, idReadable), assignee (id, login, name), reporter (id, login, name), updater (id, login, name). By default, custom fields are not included. Use briefOutput=false to get all customFields including State. | `issueIds[]` — array of issue codes (e.g., ['PROJ-123', 'PROJ-124']), max 50; `briefOutput` — optional boolean (default `true`) |
304
+ | `issue_details` | Issue details with brief/full modes | `issueId` — issue code; `briefOutput` — optional boolean (default `true`). Brief: predefined fields only. Full (`false`): adds `customFields` including `State`; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
305
+ | `issues_details` | Detailed information about multiple issues (batch mode, max 50). Brief (default): predefined fields only. Full (`briefOutput=false`): adds `customFields` for each issue | `issueIds[]` — array of issue codes, max 50; `briefOutput` — optional boolean (default `true`); `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
306
+ | `issue_comments` | Issue comments | `issueId` — issue code; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
307
+ | `issues_comments` | Comments for multiple issues (batch mode, max 50) | `issueIds[]` — array of issue codes, max 50; `briefOutput` — optional boolean (default `true`); `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
304
308
  | `issue_create` | Create issue | `projectId`, `summary`, optional `description`, `parentIssueId`, `assigneeLogin`, `stateName`, `usesMarkdown`, `links` (array of link objects) |
305
309
  | `issue_update` | Update existing issue | `issueId`, optionally `summary`, `description`, `parentIssueId` (empty string clears parent), `usesMarkdown` |
306
310
  | `issue_assign` | Assign issue to user | `issueId`, `assigneeLogin` (login or `me`) |
307
311
  | `issue_comment_create` | Add comment to issue | `issueId`, `text` — comment text, optionally `usesMarkdown` |
308
312
  | `issue_comment_update` | Update existing comment | `issueId`, `commentId`, optionally `text`, `usesMarkdown`, `muteUpdateNotifications` |
309
- | `issue_activities` | Get issue change history | `issueId` — issue code, optionally `author` (login), `startDate` (YYYY-MM-DD, timestamp, or Date), `endDate`, `categories` (comma-separated: `CustomFieldCategory` for field changes, `CommentsCategory` for comments, `AttachmentsCategory` for attachments, `LinksCategory` for links, `VcsChangeActivityCategory` for VCS changes, `WorkItemsActivityCategory` for work items), `limit` (max 200), `skip` for pagination. Returns activity items with timestamps (ISO datetime), authors, categories, and change details (added/removed values). Useful for tracking field modifications, reviewing comment history, and analyzing collaboration patterns |
313
+ | `issue_activities` | Get issue change history | `issueId` — issue code, optionally `author` (login), `startDate` (YYYY-MM-DD, timestamp, or Date), `endDate`, `categories` (comma-separated: `CustomFieldCategory` for field changes, `CommentsCategory` for comments, `AttachmentsCategory` for attachments, `LinksCategory` for links, `VcsChangeActivityCategory` for VCS changes, `WorkItemsActivityCategory` for work items), `limit` (max 200), `skip` for pagination; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options. Returns activity items with timestamps (ISO datetime), authors, categories, and change details (added/removed values). Useful for tracking field modifications, reviewing comment history, and analyzing collaboration patterns |
310
314
  | `issue_change_state` | Change issue state/status through workflow transitions | `issueId` — issue code, `stateName` — target state name (e.g., 'In Progress', 'Open', 'Fixed', 'Verified'). Case-insensitive. Automatically discovers available transitions and validates requested state change. Returns information about previous state, new state, and transition used. Use for moving issues through workflow states |
311
- | `issue_attachments_list` | Get list of attachments | `issueId` — issue code |
312
- | `issue_attachment_get` | Get attachment info | `issueId`, `attachmentId` |
313
- | `issue_attachment_download` | Get download URL for attachment | `issueId`, `attachmentId` — returns signed URL |
315
+ | `issue_attachments_list` | Get list of attachments | `issueId` — issue code; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
316
+ | `issue_attachment_get` | Get attachment info | `issueId`, `attachmentId`; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
317
+ | `issue_attachment_download` | Get download URL for attachment or download file directly to local filesystem | `issueId`, `attachmentId` — returns signed download URL when downloadToFile=false; `downloadToFile` — boolean, download file directly to local system (default: false); `downloadPath` — custom path to save file (auto-generated if not provided); `overwrite` — allow overwriting existing files (default: false, throws error if file exists); `saveToFile`, `filePath`, `format`, `overwrite` — file storage options for metadata |
314
318
  | `issue_attachment_upload` | Upload files to issue | `issueId`, `filePaths[]` — array of file paths (max 10), optionally `muteUpdateNotifications` |
315
319
  | `issue_attachment_delete` | Delete attachment (requires confirmation) | `issueId`, `attachmentId`, `confirmation` (must be `true`) |
316
320
 
@@ -323,6 +327,13 @@ When `saveToFile` is `true`, tools return metadata about the saved file instead
323
327
  | `issue_link_add` | Create a link between two issues | `sourceId`, `targetId`, `linkType` (name or id), optionally `direction` (`outbound` or `inbound`) |
324
328
  | `issue_link_delete` | Delete a link by id for a specific issue | `issueId` — issue code, `linkId` — link id to delete |
325
329
 
330
+ ### Issues Status
331
+
332
+ | Tool | Description | Main Parameters |
333
+ | --- | --- | --- |
334
+ | `issue_status` | Get status of a YouTrack issue. Returns the State of the issue. | `issueId` — issue code (e.g., PROJ-123) |
335
+ | `issues_status` | Get status of multiple YouTrack issues (batch mode, max 50). Returns the State of each issue. | `issueIds[]` — array of issue codes (e.g., ['PROJ-123', 'PROJ-124']), max 50 |
336
+
326
337
  ### Issue Stars
327
338
 
328
339
  | Tool | Description | Main Parameters |
@@ -337,25 +348,25 @@ When `saveToFile` is `true`, tools return metadata about the saved file instead
337
348
 
338
349
  | Tool | Description | Main Parameters |
339
350
  | --- | --- | --- |
340
- | `workitems_list` | Get work items for current or specified user | Optionally `issueId`, `author`, `startDate`, `endDate`, `allUsers` |
341
- | `workitems_all_users` | Get work items for all users | Optionally `issueId`, `startDate`, `endDate` |
342
- | `workitems_for_users` | Get work items for selected users | `users[]`, optionally `issueId`, `startDate`, `endDate` |
343
- | `workitems_recent` | Get recent work items sorted by update time (newest first) | Optionally `users[]` (defaults to current user), `limit` (default 50, max 200) |
351
+ | `workitems_list` | Get work items for current or specified user | Optionally `issueId`, `author`, `startDate`, `endDate`, `allUsers`; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
352
+ | `workitems_all_users` | Get work items for all users | Optionally `issueId`, `startDate`, `endDate`; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
353
+ | `workitems_for_users` | Get work items for selected users | `users[]`, optionally `issueId`, `startDate`, `endDate`; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
354
+ | `workitems_recent` | Get recent work items sorted by update time (newest first) | Optionally `users[]` (defaults to current user), `limit` (default 50, max 200); `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
344
355
  | `workitem_create` | Create work item entry | `issueId`, `date`, `minutes`, optionally `summary`, `description`, `usesMarkdown` |
345
356
  | `workitem_create_idempotent` | Create work item without duplicates (by description and date) | `issueId`, `date`, `minutes`, `description`, optionally `usesMarkdown` |
346
357
  | `workitem_update` | Update work item (recreate) | `issueId`, `workItemId`, optionally `date`, `minutes`, `summary`, `description`, `usesMarkdown` |
347
358
  | `workitem_delete` | Delete work item | `issueId`, `workItemId` |
348
359
  | `workitems_create_period` | Batch create for date range | `issueId`, `startDate`, `endDate`, `minutes`, optionally `summary`, `description`, `usesMarkdown`, `excludeWeekends`, `excludeHolidays`, `holidays[]`, `preHolidays[]` |
349
- | `workitems_report_summary` | Summary report for work items | Common parameters: `author`, `issueId`, `startDate`, `endDate`, `expectedDailyMinutes`, `excludeWeekends`, `excludeHolidays`, `holidays[]`, `preHolidays[]`, `allUsers` |
350
- | `workitems_report_invalid` | Days with deviation from expected hours | Same parameters as summary |
351
- | `workitems_report_users` | Work items report for list of users | `users[]` + common report parameters |
352
- | `workitems_report` | Report structure (compatibility with older clients) | Optionally `author`, `issueId`, `startDate`, `endDate`, `expectedDailyMinutes`, `excludeWeekends`, `excludeHolidays`, `holidays[]`, `preHolidays[]`, `allUsers` |
360
+ | `workitems_report_summary` | Summary report for work items | Common parameters: `author`, `issueId`, `startDate`, `endDate`, `expectedDailyMinutes`, `excludeWeekends`, `excludeHolidays`, `holidays[]`, `preHolidays[]`, `allUsers`; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
361
+ | `workitems_report_invalid` | Days with deviation from expected hours | Same parameters as summary; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
362
+ | `workitems_report_users` | Work items report for list of users | `users[]` + common report parameters; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
363
+ | `workitems_report` | Report structure (compatibility with older clients) | Optionally `author`, `issueId`, `startDate`, `endDate`, `expectedDailyMinutes`, `excludeWeekends`, `excludeHolidays`, `holidays[]`, `preHolidays[]`, `allUsers`; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
353
364
 
354
365
  ### Users and Projects
355
366
 
356
367
  | Tool | Description | Main Parameters |
357
368
  | --- | --- | --- |
358
- | `users_list` | List all YouTrack users | — |
369
+ | `users_list` | List all YouTrack users | `saveToFile`, `filePath`, `format`, `overwrite` file storage options |
359
370
  | `user_get` | Get user by login | `login` — user login |
360
371
  | `user_current` | Get current authenticated user | — |
361
372
  | `projects_list` | List all YouTrack projects | — |
@@ -369,9 +380,9 @@ When `saveToFile` is `true`, tools return metadata about the saved file instead
369
380
  | `article_list` | List articles with filters | Optionally `parentArticleId`, `projectId` |
370
381
  | `article_create` | Create article in knowledge base | `summary`, optionally `content`, `parentArticleId`, `projectId`, `usesMarkdown`, `returnRendered` |
371
382
  | `article_update` | Update article | `articleId`, optionally `summary`, `content`, `usesMarkdown`, `returnRendered` |
372
- | `article_search` | Search articles in knowledge base | `query`, optionally `projectId`, `parentArticleId`, `limit`, `returnRendered` |
373
- | `articles_search` | Full-text search across YouTrack knowledge base articles by title and content. Returns `webUrl` for direct access. | `query`, `limit`, `skip`, optionally `projectId`, `parentArticleId` |
374
- | `issues_search` | Full-text search across YouTrack issues by summary, description, and comments. If `query` is not provided or empty, all issues will be returned. Supports filtering by projects, assignee, reporter, state, and type. | `query` (optional), `limit`, `skip`, `countOnly` (optional), `projects` (optional), `assignee` (optional), `reporter` (optional), `state` (optional), `type` (optional) |
383
+ | `article_search` | Search articles in knowledge base | `query`, optionally `projectId`, `parentArticleId`, `limit`, `returnRendered`; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
384
+ | `articles_search` | Full-text search across YouTrack knowledge base articles by title and content. Returns `webUrl` for direct access. | `query`, `limit`, `skip`, optionally `projectId`, `parentArticleId`; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
385
+ | `issues_search` | Full-text search across YouTrack issues by summary, description, and comments. If `query` is not provided or empty, all issues will be returned. Supports filtering by projects, assignee, reporter, state, and type. | `query` (optional), `limit`, `skip`, `countOnly` (optional), `projects` (optional), `assignee` (optional), `reporter` (optional), `state` (optional), `type` (optional); `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
375
386
 
376
387
  ### Search
377
388
 
@@ -384,9 +395,9 @@ When `saveToFile` is `true`, tools return metadata about the saved file instead
384
395
 
385
396
  | Tool | Description | Main Parameters |
386
397
  | --- | --- | --- |
387
- | `users_activity` | Author-centric activity feed backed by `/api/activities`. **Use for:** auditing a teammate's updates, gathering comment/state changes across many issues, and reviewing deployment timelines. Returns normalized entries with ISO timestamps, optional issue references, and `added`/`removed` payloads. Always follow up by re-fetching the affected issue or work-item to confirm the latest state. Supported categories: `CustomFieldCategory` (field changes), `CommentsCategory` (comments), `AttachmentsCategory` (file events), `LinksCategory` (issue links), `VcsChangeActivityCategory` (VCS changes), `WorkItemsActivityCategory` (work items). | `author` *(required)* — login such as `vyt`; `categories` *(required)* — comma-separated list built from the supported categories above; optional `start` / `end` (ISO string, timestamp in ms, or `Date`) to bound the range, `reverse` (boolean) to switch to chronological order, `limit` (default 100, max 200), `skip` (pagination offset), `fields` (advanced override of response fields). |
388
- | `issues_list` | List issues across projects with filtering and sorting | Filters: `projectIds`, `createdAfter/Before`, `updatedAfter/Before`, `statuses`, `assigneeLogin`, `types`; Sorting: `sortField`, `sortDirection`; Pagination: `limit`, `skip`; Output mode: `briefOutput` |
389
- | `issues_count` | Count issues using same filters as `issues_list`, returns per-project breakdown | Same filters as above, optional `top` to cap manual aggregation when many projects are involved |
398
+ | `users_activity` | Author-centric activity feed backed by `/api/activities`. **Use for:** auditing a teammate's updates, gathering comment/state changes across many issues, and reviewing deployment timelines. Returns normalized entries with ISO timestamps, optional issue references, and `added`/`removed` payloads. Always follow up by re-fetching the affected issue or work-item to confirm the latest state. Supported categories: `CustomFieldCategory` (field changes), `CommentsCategory` (comments), `AttachmentsCategory` (file events), `LinksCategory` (issue links), `VcsChangeActivityCategory` (VCS changes), `WorkItemsActivityCategory` (work items). | `author` *(required)* — login such as `vyt`; `categories` *(required)* — comma-separated list built from the supported categories above; optional `start` / `end` (ISO string, timestamp in ms, or `Date`) to bound the range, `reverse` (boolean) to switch to chronological order, `limit` (default 100, max 200), `skip` (pagination offset), `fields` (advanced override of response fields); `saveToFile`, `filePath`, `format`, `overwrite` — file storage options. |
399
+ | `issues_list` | List issues across projects with filtering and sorting | Filters: `projectIds`, `createdAfter/Before`, `updatedAfter/Before`, `statuses`, `assigneeLogin`, `types`; Sorting: `sortField`, `sortDirection`; Pagination: `limit`, `skip`; Output mode: `briefOutput`; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
400
+ | `issues_count` | Count issues using same filters as `issues_list`, returns per-project breakdown | Same filters as above, optional `top` to cap manual aggregation when many projects are involved; `saveToFile`, `filePath`, `format`, `overwrite` — file storage options |
390
401
 
391
402
  ## Important Notes
392
403
 
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitalyostanin/youtrack-mcp",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "scripts": {
5
5
  "build": "tsc -p tsconfig.json",
6
6
  "postbuild": "chmod +x dist/index.js",
@@ -13,6 +13,7 @@ import { registerAttachmentTools } from "./tools/attachment-tools.js";
13
13
  import { registerIssueStarTools } from "./tools/issue-star-tools.js";
14
14
  import { registerIssueLinkTools } from "./tools/issue-link-tools.js";
15
15
  import { registerIssueListTools } from "./tools/issue-list-tools.js";
16
+ import { registerIssueStatusTools } from "./tools/issue-status-tools.js";
16
17
  import { usersActivityArgs, usersActivityHandler } from "./tools/users-activity-tools.js";
17
18
  import { YoutrackClient } from "./youtrack-client.js";
18
19
  import { loadConfig } from "./config.js";
@@ -52,6 +53,7 @@ export class YoutrackServer {
52
53
  registerIssueStarTools(this.server, this.client);
53
54
  registerIssueLinkTools(this.server, this.client);
54
55
  registerIssueListTools(this.server, this.client);
56
+ registerIssueStatusTools(this.server, this.client);
55
57
  }
56
58
  async connect(transport) {
57
59
  await this.server.connect(transport);
@@ -8,6 +8,8 @@ export declare const articlesSearchArgs: {
8
8
  parentArticleId: z.ZodOptional<z.ZodString>;
9
9
  saveToFile: z.ZodOptional<z.ZodBoolean>;
10
10
  filePath: z.ZodOptional<z.ZodString>;
11
+ format: z.ZodOptional<z.ZodEnum<["json", "jsonl"]>>;
12
+ overwrite: z.ZodOptional<z.ZodBoolean>;
11
13
  };
12
14
  export declare const articlesSearchSchema: z.ZodObject<{
13
15
  query: z.ZodString;
@@ -17,11 +19,15 @@ export declare const articlesSearchSchema: z.ZodObject<{
17
19
  parentArticleId: z.ZodOptional<z.ZodString>;
18
20
  saveToFile: z.ZodOptional<z.ZodBoolean>;
19
21
  filePath: z.ZodOptional<z.ZodString>;
22
+ format: z.ZodOptional<z.ZodEnum<["json", "jsonl"]>>;
23
+ overwrite: z.ZodOptional<z.ZodBoolean>;
20
24
  }, "strip", z.ZodTypeAny, {
21
25
  query: string;
22
26
  skip: number;
23
27
  limit: number;
24
28
  filePath?: string | undefined;
29
+ format?: "json" | "jsonl" | undefined;
30
+ overwrite?: boolean | undefined;
25
31
  saveToFile?: boolean | undefined;
26
32
  projectId?: string | undefined;
27
33
  parentArticleId?: string | undefined;
@@ -30,6 +36,8 @@ export declare const articlesSearchSchema: z.ZodObject<{
30
36
  skip?: number | undefined;
31
37
  limit?: number | undefined;
32
38
  filePath?: string | undefined;
39
+ format?: "json" | "jsonl" | undefined;
40
+ overwrite?: boolean | undefined;
33
41
  saveToFile?: boolean | undefined;
34
42
  projectId?: string | undefined;
35
43
  parentArticleId?: string | undefined;
@@ -9,6 +9,8 @@ export const articlesSearchArgs = {
9
9
  parentArticleId: z.string().optional().describe("Filter by parent article ID"),
10
10
  saveToFile: z.boolean().optional().describe("Save results to a file instead of returning them directly. Useful for large datasets that can be analyzed by scripts."),
11
11
  filePath: z.string().optional().describe("Explicit path to save the file (optional, auto-generated if not provided). Directory will be created if it doesn't exist."),
12
+ format: z.enum(["json", "jsonl"]).optional().describe("Output format when saving to file: jsonl (JSON Lines) or json (JSON array format). Default is jsonl."),
13
+ overwrite: z.boolean().optional().describe("Allow overwriting existing files when using explicit filePath. Default is false."),
12
14
  };
13
15
  export const articlesSearchSchema = z.object(articlesSearchArgs);
14
16
  export async function articlesSearchHandler(client, rawInput) {
@@ -34,7 +36,7 @@ export async function articlesSearchHandler(client, rawInput) {
34
36
  webUrl: `${baseUrl}/articles/${article.idReadable}`,
35
37
  }))
36
38
  : data;
37
- const processedResult = processWithFileStorage(articlesWithLinks, input.saveToFile, input.filePath);
39
+ const processedResult = await processWithFileStorage(articlesWithLinks, input.saveToFile, input.filePath, input.format ?? 'jsonl', input.overwrite);
38
40
  if (processedResult.savedToFile) {
39
41
  return toolSuccess({
40
42
  savedToFile: true,
@@ -1,10 +1,14 @@
1
1
  import { z } from "zod";
2
2
  import { toolError, toolSuccess } from "../utils/tool-response.js";
3
3
  import { processWithFileStorage } from "../utils/file-storage.js";
4
+ import { downloadFileFromUrl, extractFilenameFromUrlOrHeader } from "../utils/file-download.js";
5
+ import { join } from "path";
4
6
  const issueIdArgs = {
5
7
  issueId: z.string().min(1).describe("Issue code (e.g., PROJ-123)"),
6
8
  saveToFile: z.boolean().optional().describe("Save results to a file instead of returning them directly. Useful for large datasets that can be analyzed by scripts."),
7
9
  filePath: z.string().optional().describe("Explicit path to save the file (optional, auto-generated if not provided). Directory will be created if it doesn't exist."),
10
+ format: z.enum(["json", "jsonl"]).optional().describe("Output format when saving to file: jsonl (JSON Lines) or json (JSON array format). Default is jsonl."),
11
+ overwrite: z.boolean().optional().describe("Allow overwriting existing files when using explicit filePath. Default is false."),
8
12
  };
9
13
  const issueIdSchema = z.object(issueIdArgs);
10
14
  const attachmentGetArgs = {
@@ -12,6 +16,13 @@ const attachmentGetArgs = {
12
16
  attachmentId: z.string().min(1).describe("Attachment ID"),
13
17
  };
14
18
  const attachmentGetSchema = z.object(attachmentGetArgs);
19
+ const attachmentDownloadArgs = {
20
+ ...issueIdArgs,
21
+ attachmentId: z.string().min(1).describe("Attachment ID"),
22
+ downloadToFile: z.boolean().optional().describe("Download the attachment file directly to local file system"),
23
+ downloadPath: z.string().optional().describe("Path to save the downloaded file (optional, auto-generated if not provided based on attachment name). Directory will be created if it doesn't exist."),
24
+ };
25
+ const attachmentDownloadSchema = z.object(attachmentDownloadArgs);
15
26
  const attachmentUploadArgs = {
16
27
  ...issueIdArgs,
17
28
  filePaths: z
@@ -35,7 +46,7 @@ export function registerAttachmentTools(server, client) {
35
46
  try {
36
47
  const payload = issueIdSchema.parse(rawInput);
37
48
  const result = await client.listAttachments(payload.issueId);
38
- const processedResult = processWithFileStorage(result, payload.saveToFile, payload.filePath);
49
+ const processedResult = await processWithFileStorage(result, payload.saveToFile, payload.filePath, payload.format ?? 'jsonl', payload.overwrite);
39
50
  if (processedResult.savedToFile) {
40
51
  return toolSuccess({
41
52
  savedToFile: true,
@@ -62,12 +73,54 @@ export function registerAttachmentTools(server, client) {
62
73
  return errorResponse;
63
74
  }
64
75
  });
65
- server.tool("issue_attachment_download", "Get download information for an attachment. Returns attachment metadata and a signed URL for downloading the file. The signed URL can be used directly without additional authentication.", attachmentGetArgs, async (rawInput) => {
76
+ server.tool("issue_attachment_download", "Get download information for an attachment. Returns attachment metadata and a signed URL for downloading the file. The signed URL can be used directly without additional authentication. With downloadToFile=true, will download the file directly to local filesystem.", attachmentDownloadArgs, async (rawInput) => {
66
77
  try {
67
- const payload = attachmentGetSchema.parse(rawInput);
68
- const result = await client.getAttachmentDownloadInfo(payload.issueId, payload.attachmentId);
69
- const response = toolSuccess(result);
70
- return response;
78
+ const payload = attachmentDownloadSchema.parse(rawInput);
79
+ // If downloadToFile is true, download the file directly
80
+ if (payload.downloadToFile) {
81
+ // Get attachment info to obtain the download URL and filename
82
+ const attachmentInfo = await client.getAttachmentDownloadInfo(payload.issueId, payload.attachmentId);
83
+ const { downloadUrl, attachment } = attachmentInfo;
84
+ // Determine the file path for download
85
+ let downloadFilePath;
86
+ if (payload.downloadPath) {
87
+ downloadFilePath = payload.downloadPath;
88
+ }
89
+ else {
90
+ // Generate filename from attachment info
91
+ const filename = attachment.name || extractFilenameFromUrlOrHeader(downloadUrl);
92
+ downloadFilePath = join("downloads", payload.issueId, filename);
93
+ }
94
+ // Download the file
95
+ const downloadedPath = await downloadFileFromUrl({
96
+ url: downloadUrl,
97
+ filePath: downloadFilePath,
98
+ overwrite: payload.overwrite,
99
+ });
100
+ // Return success response with download info
101
+ const response = toolSuccess({
102
+ downloaded: true,
103
+ filePath: downloadedPath,
104
+ attachmentId: payload.attachmentId,
105
+ issueId: payload.issueId,
106
+ originalAttachmentInfo: attachment,
107
+ });
108
+ return response;
109
+ }
110
+ // If downloadToFile is false, return the original download info
111
+ else {
112
+ const result = await client.getAttachmentDownloadInfo(payload.issueId, payload.attachmentId);
113
+ const processedResult = await processWithFileStorage(result, payload.saveToFile, payload.filePath, payload.format ?? 'jsonl', payload.overwrite);
114
+ if (processedResult.savedToFile) {
115
+ return toolSuccess({
116
+ savedToFile: true,
117
+ filePath: processedResult.filePath,
118
+ attachmentId: payload.attachmentId,
119
+ issueId: payload.issueId,
120
+ });
121
+ }
122
+ return toolSuccess(result);
123
+ }
71
124
  }
72
125
  catch (error) {
73
126
  const errorResponse = toolError(error);
@@ -28,7 +28,9 @@ const issueActivitiesArgs = {
28
28
  .describe("Maximum number of activities to return (default: no limit, max: 200)"),
29
29
  skip: z.number().int().min(0).optional().describe("Number of activities to skip for pagination (default: 0)"),
30
30
  saveToFile: z.boolean().optional().describe("Save results to a file instead of returning them directly. Useful for large datasets that can be analyzed by scripts."),
31
+ format: z.enum(["json", "jsonl"]).optional().describe("Output format when saving to file: jsonl (JSON Lines) or json (JSON array format). Default is jsonl."),
31
32
  filePath: z.string().optional().describe("Explicit path to save the file (optional, auto-generated if not provided). Directory will be created if it doesn't exist."),
33
+ overwrite: z.boolean().optional().describe("Allow overwriting existing files when using explicit filePath. Default is false."),
32
34
  };
33
35
  const issueActivitiesSchema = z.object(issueActivitiesArgs);
34
36
  export function registerIssueActivityTools(server, client) {
@@ -71,7 +73,7 @@ export function registerIssueActivityTools(server, client) {
71
73
  skip: input.skip ?? 0,
72
74
  },
73
75
  };
74
- const processedResult = processWithFileStorage(payload, input.saveToFile, input.filePath);
76
+ const processedResult = await processWithFileStorage(payload, input.saveToFile, input.filePath, input.format ?? 'jsonl', input.overwrite);
75
77
  if (processedResult.savedToFile) {
76
78
  return toolSuccess({
77
79
  savedToFile: true,
@@ -68,6 +68,11 @@ const issueListArgs = {
68
68
  .string()
69
69
  .optional()
70
70
  .describe("Explicit path to save the file (optional, auto-generated if not provided). Directory will be created if it doesn't exist."),
71
+ format: z
72
+ .enum(["json", "jsonl"])
73
+ .optional()
74
+ .describe("Output format when saving to file: jsonl (JSON Lines) or json (JSON array format). Default is jsonl."),
75
+ overwrite: z.boolean().optional().describe("Allow overwriting existing files when using explicit filePath. Default is false."),
71
76
  };
72
77
  const issueListSchema = z.object(issueListArgs);
73
78
  export function registerIssueListTools(server, client) {
@@ -89,7 +94,7 @@ export function registerIssueListTools(server, client) {
89
94
  limit: payload.limit,
90
95
  skip: payload.skip,
91
96
  });
92
- const processedResult = processWithFileStorage(result, payload.saveToFile, payload.filePath);
97
+ const processedResult = await processWithFileStorage(result, payload.saveToFile, payload.filePath, payload.format ?? 'jsonl', payload.overwrite);
93
98
  if (processedResult.savedToFile) {
94
99
  return toolSuccess({
95
100
  savedToFile: true,