openproject-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| OP_URL | Yes | Base URL of your OpenProject without a trailing '/'. Example: https://openproject.example.com | |
| MCP_BIND | No | HTTP transport address as host:port (IPv6: [address]:port). Default 127.0.0.1:8000. In Docker — 0.0.0.0:8000. Ignored for stdio. | 127.0.0.1:8000 |
| OP_API_KEY | Yes | Personal API token. Created in profile settings → Access tokens. Requires the administrator setting 'Enable API tokens'. | |
| MCP_LOG_LEVEL | No | DEBUG / INFO / WARNING / ERROR. Default INFO. | INFO |
| MCP_TRANSPORT | No | Transport: stdio (default) | streamable-http | sse | stdio |
| MCP_AUTH_TOKEN | No | Optional Bearer token protecting the HTTP endpoint. Empty = no auth (trusted network / reverse proxy only). Clients send Authorization: Bearer <value>. | |
| MCP_ALLOWED_HOSTS | No | Comma-separated host list (DNS-rebinding protection). Suffix ':*' — any port. Empty = host protection disabled. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| op_search_work_packagesA | Поиск задач (work packages) в OpenProject. Поиск по теме выполняется по синонимам: передавайте сразу несколько
вариантов формулировки в Логика поиска по subject:
Прочие параметры (project_id, status, type_id и т.д.) сужают область поиска (объединение И с условием по теме/описанию). Если совпадений нет, возвращается пустой список с подсказкой переформулировать запрос — полный список задач НЕ выдаётся. Args: subject: Тема задачи или список синонимов (строка либо список строк). Поиск по части темы (оператор содержания '~'), объединение ИЛИ между синонимами. Пример: "баг" или ["баг", "ошибка", "дефект"]. project_id: Фильтр по проекту; если задан — поиск ведётся в рамках проекта. status: Семантический статус: 'open' (открытые), 'closed' (закрытые), 'all'. type_id: Фильтр по типу задачи (например '1' для Task, '2' для Bug). assignee_id: Фильтр по исполнителю (ID пользователя или 'me'). priority_id: Фильтр по приоритету. filters: Произвольный JSON-массив фильтров API, например [{"status_id":{"operator":"o","values":null}}]. Объединяется (AND) с другими параметрами. Используется, когда не задан subject (поиск без текста), либо как доп. ограничение. page_size: Размер страницы (по умолчанию 20, максимум 100). При поиске по subject применяется к каждому синониму отдельно. offset: Номер страницы, начиная с 1. При поиске по subject игнорируется (возвращаются все найденные совпадения, дедуплицированные). sort_by: JSON-массив сортировки, например [["status","asc"],["id","desc"]]. Returns: JSON со списком задач (компактный вид) и сводкой. При поиске по синонимам добавляются поля searched_field (subject/description), matched_terms (сработавшие синонимы) и fallback_used. При пустом результате — список [] и note с подсказкой. |
| op_list_projectsA | Получить список проектов и подпроектов в OpenProject. Поиск по имени (параметр Логика поиска по имени:
Режимы работы (без учёта name):
Если совпадений по name нет, возвращается пустой список с подсказкой. Args:
parent_id: ID проекта-родителя. Если задан — вернуть его подпроекты.
Игнорируется при as_tree=True.
direct_children_only: True → только прямые дети parent_id (фильтр
Returns: JSON со списком проектов (компактный вид) и сводкой. При поиске по синонимам добавляются поля searched_field, matched_terms, fallback_used. При as_tree — дерево {'projects': [<узел>]}. При пустом результате — список [] и note с подсказкой. |
| op_get_work_packageA | Получить детальную информацию о задаче по её ID. Args: work_package_id: Идентификатор задачи. include_comments: Если True — дополнительно подгрузить последние комментарии. include_attachments: Если True — дополнительно подгрузить список вложений. Returns: JSON с полными полями задачи (тема, описание, тип, статус, даты, оценки времени, автор, ответственный, ссылки на действия) и, опционально, комментариями/вложениями. |
| op_add_commentA | Добавить комментарий (заметку) к задаче. Args: work_package_id: Идентификатор задачи. comment: Текст комментария. internal: True для внутреннего комментария (требует права add_internal_comments). Returns: JSON с созданной активностью (id, текст, автор, дата). |
| op_add_attachmentA | Загрузить файл как вложение к задаче. OpenProject требует multipart/form-data ровно из двух частей: 'metadata' (JSON {fileName}) и 'file' (сырые байты). Args: work_package_id: Идентификатор задачи. file_path: Абсолютный путь к локальному файлу, который нужно загрузить. file_name: Имя файла для сохранения (по умолчанию берётся из file_path). Returns: JSON с созданным вложением (id, fileName, fileSize, contentType, ссылка). |
| op_list_time_entry_activitiesA | Получить список доступных активностей учёта времени (Time Entry Activities). Активность может быть обязательна при записи времени. Используйте ID/title из этого списка в параметре activity_id инструмента op_log_time. Если список пуст или возвращена ошибка 404 — модуль учёта времени («Time and costs», либо «Time tracking activities» в Administration) не включён/не настроен на сервере. Returns: JSON со списком активностей: [{id, title, ...}]. |
| op_log_timeA | Записать затраченное время к задаче (time entry). Требует, чтобы в проекте задачи был включён модуль «Time and costs» и у роли пользователя было право «Log time». Args: work_package_id: Идентификатор задачи. hours: Затраченное время. Принимает человекочитаемые формы: '1.5h', '2h30m', '90m', '1:30', 'PT1H30M'. activity_id: ID активности учёта времени (из op_list_time_entry_activities). Необязательно: если не задан, используется активность по умолчанию (или сервер отклонит, если активности обязательны и не настроены). spent_on: Дата в формате YYYY-MM-DD (по умолчанию — сегодня). comment: Необязательный комментарий к записи времени. Returns: JSON с созданной записью времени (id, hours, spentOn, activity, ...). |
| op_list_time_entriesA | Отчёт по записям времени (time entries) за период. Возвращает записи сгруппированными по проектам, с суммой часов по каждому проекту и общим итогом. Удобно для ответов вида «покажи время по мне за июль, сгруппированное по проектам, и общее количество часов». Args: user_id: ID пользователя или 'me' (текущий). OpenProject принимает 'me' напрямую в фильтре user_id. project_id: Фильтр по проекту (числовой ID). date_from: Начало периода (YYYY-MM-DD, включительно). date_to: Конец периода (YYYY-MM-DD, включительно). Границы диапазона передаются в фильтр spent_on оператором <>d; агент считает границы месяца/недели сам («за июль» → 2026-07-01..2026-07-31). activity_id: Фильтр по активности учёта времени (ID). filters: Произвольный JSON-массив фильтров API, например [{"entity_id":{"operator":"=","values":["5"]}}]. Объединяется (AND) с другими параметрами. include_comments: True (по умолчанию) — выводить текст комментария каждой записи; False — только цифры (id, hours, дата, задача, активность), без комментариев. Компактнее для сводок. page_size: Размер страницы (по умолчанию 100). ВНИМАНИЕ: итог и группировка корректны только если выгружены ВСЕ записи периода — при total > возвращенного в ответе будет предупреждение, что итог неполон. Для полного отчёта увеличьте page_size. offset: Номер страницы, начиная с 1. sort_by: JSON-массив сортировки, по умолчанию [["spent_on","asc"], ["id","asc"]]. Допустимые поля: id, hours, spent_on, created_at, updated_at. Returns: JSON: period, filters_applied, total (entries + hours ISO/decimal), by_project [{project, project_id, entries_count, hours, entries}], pagination. При total > count — note о неполном итоге. |
| op_list_usersA | Поиск пользователей по имени или логину. Люди обращаются друг к другу по именам, а не по номерам. Этот инструмент помогает найти ID пользователя (например, для передачи в op_list_time_entries параметром user_id). Ищет по имени и логину (оба — оператор содержания). Требует прав на чтение списка пользователей; при их отсутствии вернёт ошибку с подсказкой. Args: query: Подстрока имени или логина (ищет и по name, и по login). filters: Произвольный JSON-массив фильтров API, например [{"status":{"operator":"=","values":["active"]}}]. Объединяется (AND) с query. page_size: Размер страницы (по умолчанию 50). offset: Номер страницы, начиная с 1. Returns: JSON со списком пользователей [{id, name, login, email, self}] и сводкой пагинации. |
| op_check_connectionA | Проверить соединение с OpenProject и корректность API-токена. Returns: JSON с результатом: ok=true/false и информацией об экземпляре/пользователе. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 10 tools
Each tool targets a distinct resource and action: searching work packages, listing projects, retrieving a work package, adding comments/attachments, time tracking activities, logging time, listing time entries, searching users, and checking connection. No two tools have overlapping responsibilities; even the time-related tools are clearly separated between activity catalog, entry creation, and reporting.
All tools share the 'op_' prefix and follow a consistent verb_noun pattern: search_work_packages, list_projects, get_work_package, add_comment, add_attachment, list_time_entry_activities, log_time, list_time_entries, list_users, check_connection. The naming is uniform and predictable, with no mixed conventions.
With 10 tools, the server is well-scoped for OpenProject operations. It covers the core areas (projects, work packages, comments, attachments, time tracking, users, connection) without unnecessary bloat or thin coverage. Each tool earns its place.
The set covers searching/reading work packages, adding comments/attachments, and time tracking well, but lacks work package creation, update, deletion, and status/type management. This creates notable gaps for full workflow coverage, though the available operations form a coherent internal surface.