OpenProject MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| OPENPROJECT_TIMEOUT | No | Request timeout in seconds | 12 |
| OPENPROJECT_BASE_URL | Yes | Base URL of your OpenProject instance, e.g. https://op.example.com | |
| OPENPROJECT_API_TOKEN | Yes | Personal API token | |
| OPENPROJECT_LOG_LEVEL | No | CRITICAL, ERROR, WARNING, or INFO | WARNING |
| OPENPROJECT_VERIFY_SSL | No | Verify TLS certificates | true |
| OPENPROJECT_MAX_RESULTS | No | Hard cap on total results returned by a tool | 100 |
| OPENPROJECT_MAX_PAGE_SIZE | No | Hard cap on results per request | 50 |
| OPENPROJECT_ALLOWED_PROJECTS | No | Backward-compatible alias for OPENPROJECT_ALLOWED_PROJECTS_READ | |
| OPENPROJECT_DEFAULT_PAGE_SIZE | No | Default results per page | 20 |
| OPENPROJECT_ENABLE_BOARD_READ | No | Boards and views | true |
| OPENPROJECT_AUTO_CONFIRM_WRITE | No | Skip the preview step for all writes | false |
| OPENPROJECT_ENABLE_ADMIN_WRITE | No | User and group management (create/update/delete/lock users, create/update/delete groups) | false |
| OPENPROJECT_ENABLE_BOARD_WRITE | No | Board create/update/delete | false |
| OPENPROJECT_HIDE_CUSTOM_FIELDS | No | Custom field names or keys to omit; * wildcards supported | |
| OPENPROJECT_AUTO_CONFIRM_DELETE | No | Skip the preview step for deletes; inherits OPENPROJECT_AUTO_CONFIRM_WRITE if not set | |
| OPENPROJECT_ENABLE_PROJECT_READ | No | Projects, documents, news, wiki, lifecycle | true |
| OPENPROJECT_ENABLE_VERSION_READ | No | Versions | true |
| OPENPROJECT_ENABLE_PROJECT_WRITE | No | Project create/update/delete, news, documents, grids | false |
| OPENPROJECT_ENABLE_VERSION_WRITE | No | Version create/update/delete | false |
| OPENPROJECT_HIDE_<ENTITY>_FIELDS | No | Comma-separated fields to omit from reads and reject on writes; * wildcards supported | |
| OPENPROJECT_ALLOWED_PROJECTS_READ | No | Readable projects; comma-separated identifiers, names, or glob patterns; * allows all visible projects | * |
| OPENPROJECT_ALLOWED_PROJECTS_WRITE | No | Writable projects; empty disables all project-scoped writes; always intersected with read scope | |
| OPENPROJECT_ENABLE_MEMBERSHIP_READ | No | Memberships, roles, principals | true |
| OPENPROJECT_ENABLE_MEMBERSHIP_WRITE | No | Project membership create/update/delete | false |
| OPENPROJECT_ENABLE_WORK_PACKAGE_READ | No | Work packages, relations, attachments, time entries | true |
| OPENPROJECT_ENABLE_WORK_PACKAGE_WRITE | No | Work-package create/update/delete, comments, relations, attachments, time entries | false |
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 |
|---|---|
| list_projects | List visible projects with optional name or identifier search. select restricts each result row to the given fields (e.g. ["id", "name", "identifier"]); an invalid name returns the allowed set. Common fields: id, name, identifier, active, public, status, parent_name, created_at, updated_at. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. Under a restrictive OPENPROJECT_READ_PROJECTS, total reflects only the allowed projects already scanned to fill this page, not a full count of all matches — the search stops as soon as it has enough, so an exact total would need an extra full walk. Page until next_offset is null. |
| get_project | Get a compact project summary by id or identifier. project: numeric id (e.g., 7) or identifier (e.g., "my-project"), not display name. |
| get_project_admin_context | Return project admin metadata such as lifecycle statuses, parent options, and writable fields. |
| get_project_configuration | Return project-scoped configuration such as internal comment support. |
| list_sprints | List Backlogs sprints visible to the current token. Requires the OpenProject Backlogs module; unavailable instances return a clear not-found message. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. |
| list_project_sprintsA | List Backlogs sprints for a project by id or identifier. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. |
| get_sprint | Get a Backlogs sprint by id. |
| list_documents | List documents, optionally filtered to a single project. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. |
| get_document | Get a single document by id. |
| list_news | List news entries, optionally filtered by project or title/summary search. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. |
| get_newsC | Get a single news entry by id. |
| get_wiki_page | Get a single wiki page by id. |
| list_views | List saved OpenProject views, optionally filtered by project or view subtype. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. |
| get_view | Get a single OpenProject view by id. |
| list_grids | List dashboard grids, optionally filtered by scope (page path). |
| get_grid | Get a single dashboard grid by id. |
| list_categories | List work-package categories configured for a project. |
| get_category | Get a single category from a project's category list. |
| list_project_phase_definitions | List available project lifecycle phase definitions exposed by OpenProject. |
| get_project_phase_definition | Get a single project lifecycle phase definition by id. |
| get_project_phaseB | Get a single project lifecycle phase by id. |
| get_my_project_access | Return the current user's membership and inferred access hints for a project. |
| get_project_work_package_context | Return project metadata and, optionally, the writable work-package schema for a given type. |
| get_instance_configuration | Return instance-level OpenProject configuration and active feature flags. |
| get_job_status | Get the current status of a background job such as project copy. |
| list_work_packages | List work packages with structured filters and no free-text query requirement. version_status filters by the status of a work package's assigned version: one of 'open', 'closed', or 'locked'. assignee filters by any user (username, id, or "me"). assignee_me takes precedence. status/priority filter by exact OpenProject status/priority name or numeric ID (case-insensitive) — not meta-values like 'open'/'closed'; set open_only=true to restrict results to not-closed work packages instead. Date filters accept YYYY-MM-DD format:
sort_by accepts a list of sort criteria in format "field:direction" (e.g., ["status:desc", "priority:asc"]). Direction defaults to "asc" if omitted. Common sortable fields: id, subject, status, priority, type, assignee, author, created_at, updated_at, start_date, due_date. group_by accepts a field name to group results by (e.g., "status", "assignee"). Common groupable fields: status, priority, type, assignee, author, version, category. select restricts each result row to the given fields (e.g. ["id", "subject", "status"]); an invalid name returns the allowed set. Common fields: id, display_id, subject, type, status, priority, assignee, project, version, parent_id, parent_display_id, start_date, due_date, estimated_time, spent_time, created_at, updated_at, author, category, description, schedule_manually, derived_start_date, derived_due_date, percentage_done, derived_percentage_done, readonly, ignore_non_working_days. parent_display_id is only populated on OpenProject 17.5+ (semantic mode); it stays null on older/classic instances even when parent_id is set. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. total is the real matching count only when the query is provably restricted to OPENPROJECT_READ_PROJECTS server-side — scope is unrestricted, an explicit project was given, or (no project, restricted scope) a server-side filter for the resolved allowed project IDs was sent. Otherwise total falls back to this page's item count, and next_offset/truncated are based on whether this page came back full rather than the server's own total, so nothing here ever reveals how many matches exist in projects you can't see. Page until next_offset is null either way. |
| search_work_packages | Search work packages by free text, optionally scoped to a project. Set status to restrict results to an exact OpenProject status name or numeric ID — not a meta-value like 'open'/'closed'. Set open_only=true to return only open (not-closed) work packages. Set assignee_me=true to return only work packages assigned to the current user. assignee filters by any user (username, id, or "me"). assignee_me takes precedence. priority filters by priority name or numeric ID (case-insensitive). Date filters accept YYYY-MM-DD format:
sort_by accepts a list of sort criteria in format "field:direction" (e.g., ["status:desc", "priority:asc"]). Direction defaults to "asc" if omitted. Common sortable fields: id, subject, status, priority, type, assignee, author, created_at, updated_at, start_date, due_date. group_by accepts a field name to group results by (e.g., "status", "assignee"). Common groupable fields: status, priority, type, assignee, author, version, category. select restricts each result row to the given fields (e.g. ["id", "subject", "status"]); an invalid name returns the allowed set. Common fields: id, display_id, subject, type, status, priority, assignee, project, version, parent_id, parent_display_id, start_date, due_date, estimated_time, spent_time, created_at, updated_at, author, category, description, schedule_manually, derived_start_date, derived_due_date, percentage_done, derived_percentage_done, readonly, ignore_non_working_days. parent_display_id is only populated on OpenProject 17.5+ (semantic mode); it stays null on older/classic instances even when parent_id is set. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. total is the real matching count only when the query is provably restricted to OPENPROJECT_READ_PROJECTS server-side — scope is unrestricted, or an explicit project was given. Otherwise (no project, restricted scope) total falls back to this page's item count, and next_offset/truncated are based on whether this page came back full rather than the server's own total, so nothing here ever reveals how many matches exist in projects you can't see. Page until next_offset is null either way. |
| get_work_package | Get a work package by id, including its full description. work_package_id: internal id (e.g., 952) or display_id (e.g., "PROJ-51"), not UI display number (e.g., 51). The description is returned in full by default (single work packages are not
truncated). Pass |
| get_work_packages | Get multiple work packages by ID in a single batch call. Fetches work packages in parallel and returns per-item results. Failed fetches are reported individually without stopping the batch. Maximum 100 IDs per batch. ids: internal ids (e.g., 952) or display_ids (e.g., "PROJ-51"), not UI display numbers. Duplicate IDs are automatically deduplicated. select restricts each result's work_package to the given fields (e.g. ["id", "subject", "status"]); an invalid name returns the allowed set. The id/success/error fields on each result are always included regardless of select, so you can still tell which items succeeded. For batches with many full-detail items, set text_limit and/or select proactively — an unbounded batch of large work packages can exceed the tool-result size limit and get redirected to a file. |
| list_my_open_work_packagesA | List the current user's open assigned work packages. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. This query has no project scope of its own, so total is the real matching count only when OPENPROJECT_READ_PROJECTS is unrestricted ("*"); under a restricted scope, total always falls back to this page's item count, and next_offset/truncated are based on whether this page came back full rather than the server's own total, so nothing here ever reveals how many matches exist in projects you can't see. Page until next_offset is null either way. |
| get_work_package_activities | Get the activity log for a work package, most recent first. work_package_id: internal id (e.g., 952) or display_id (e.g., "PROJ-51"), not UI display number. Comments are capped by default to keep the log compact; pass |
| list_work_package_reactions | List emoji reactions across a work package's comment activities. work_package_id: internal id (e.g., 952) or display_id (e.g., "PROJ-51"), not UI display number. |
| list_reminders | List the current user's active reminders across all work packages. |
| get_work_package_relations | Get all relations for a work package (blocks, relates to, duplicates, etc.). work_package_id: internal id (e.g., 952) or display_id (e.g., "PROJ-51"), not UI display number. type/from_id/to_id reflect how OpenProject actually stored the relation, which does not depend on which work package's relations you query — but can differ from how it was originally requested, since OpenProject canonicalizes some relation types at creation time (e.g. a relation requested as 'precedes' is stored as 'follows' with from_id/to_id swapped; see create_work_package_relation). Use from_id/to_id together with type, not the request you expect to have made, to determine the actual direction. |
| list_work_package_attachments | List attachments on a work package. work_package_id: internal id (e.g., 952) or display_id (e.g., "PROJ-51"), not UI display number. |
| get_attachment | Get a single attachment by id. |
| list_work_package_file_links | List Nextcloud file links attached to a work package (Community Edition). work_package_id: internal id (e.g., 952) or display_id (e.g., "PROJ-51"), not UI display number. |
| list_work_package_watchersA | List watchers of a work package. work_package_id: internal id (e.g., 952) or display_id (e.g., "PROJ-51"), not UI display number. |
| list_statusesA | List all available work package statuses. Read-only: statuses cannot be created or modified via the OpenProject API (Community Edition); configure them in the web admin UI. |
| get_statusB | Get a single work package status by id. |
| list_priorities | List all available work package priorities. |
| get_priority | Get a single work package priority by id. |
| list_types | List all available work package types, optionally filtered by project. Read-only: types cannot be created or modified via the OpenProject API (Community Edition); configure them in the web admin UI. |
| get_type | Get a single work package type by id. |
| list_time_entry_activities | List available time entry activities. |
| list_time_entries | List time entries with optional project, work package, user, and date filters. work_package_id: internal id (e.g., 952) or display_id (e.g., "PROJ-51"), not UI display number. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. |
| get_time_entry | Get a single time entry by id. |
| list_relations | List all relations across the instance, optionally filtered by type (e.g. 'blocks', 'follows'). type/from_id/to_id reflect how OpenProject actually stored the relation (it does not change depending on which work package's relations you're viewing), which can differ from how it was originally requested — OpenProject canonicalizes some relation types at creation time (e.g. a relation requested as 'precedes' is stored as 'follows' with from_id/to_id swapped; see create_work_package_relation). Filtering by relation_type matches the stored (canonical) type, not necessarily the type a caller originally requested when creating it. |
| list_project_memberships | List memberships for a project, including principal and role names. |
| get_membership | Get a compact membership summary by id. |
| list_roles | List OpenProject roles visible to the current user. |
| get_current_user | Return the currently authenticated user's profile. |
| list_actions | List API actions exposed by OpenProject. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. |
| list_capabilities | List API capabilities exposed by OpenProject. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. |
| list_versions | List versions globally or for a specific project, optionally filtered by a case-insensitive name substring. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. |
| get_version | Get a compact version summary by id. |
| list_boards | List saved OpenProject boards/queries, optionally scoped to a project. limit is capped at OPENPROJECT_MAX_PAGE_SIZE (default 50); pass the returned next_offset as the next call's offset to page past the cap. |
| get_board | Get a saved OpenProject board/query by id. |
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/jtauschl/openproject-ce-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server