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. |
Capabilities
Features and capabilities supported by this server
| 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 | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sergeyfedyakov/openproject-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server