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 | |
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