OpenProject MCP Server
A Model Context Protocol (MCP) server providing seamless integration with OpenProject API v3. Enable AI assistants to interact with your OpenProject instance for project management, work package tracking, and task automation.
Features
- 🔌 Full OpenProject API v3 Integration
- 📋 Project Management: List and filter projects
- 📝 Work Package Management: Create, list, update, and filter work packages
- 👥 User & Team Management: List users, memberships, and roles
- ⏱️ Time Tracking: Create and manage time entries
- 🏷️ Type Management: List available work package types, statuses, and priorities
- 🔐 Secure Authentication: API key-based authentication with HTTP Basic Auth
- 🌐 Proxy Support: Optional HTTP proxy configuration
- 🚀 Async Operations: Built with modern async/await patterns
Quick Start
Installation
# Install with uvx (recommended - no installation required)
uvx openproject-mcp
# Or install globally with pip
pip install openproject-mcp
Configuration
Get your OpenProject API key:
- Log into your OpenProject instance
- Go to My Account → Access Tokens
- Click + API to create a new token
- Copy the generated token
Installation Guides by Editor/IDE
Claude Code
Config file: ~/.claude.json
Add the MCP server to the mcpServers section:
{
"mcpServers": {
"openproject": {
"type": "stdio",
"command": "uvx",
"args": ["openproject-mcp"],
"env": {
"OPENPROJECT_URL": "https://your-instance.openproject.com",
"OPENPROJECT_API_KEY": "your-api-key-here"
}
}
}
}
Restart Claude Code after saving.
Claude Desktop
Config file locations:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"openproject": {
"command": "openproject-mcp",
"env": {
"OPENPROJECT_URL": "https://your-instance.openproject.com",
"OPENPROJECT_API_KEY": "your-api-key-here"
}
}
}
}
Restart Claude Desktop after saving.
Cursor
Config file: ~/.cursor/mcp.json (global) or .cursor/mcp.json (project-specific)
{
"mcpServers": {
"openproject": {
"command": "uvx",
"args": ["openproject-mcp"],
"env": {
"OPENPROJECT_URL": "https://your-instance.openproject.com",
"OPENPROJECT_API_KEY": "your-api-key-here"
}
}
}
}
You can also configure MCP servers through Cursor's GUI:
- Open Settings → Features → Model Context Protocol
- Click Add MCP Server
- Configure the server with the command and environment variables above
Zed
Config file locations:
- macOS:
~/.zed/settings.json - Linux:
~/.config/zed/settings.json
Add to your settings file (open with cmd-, on macOS or ctrl-, on Linux):
{
"context_servers": {
"openproject": {
"settings": {},
"command": {
"path": "uvx",
"args": ["openproject-mcp"],
"env": {
"OPENPROJECT_URL": "https://your-instance.openproject.com",
"OPENPROJECT_API_KEY": "your-api-key-here"
}
}
}
}
}
MCP tools will be available through Zed's AI assistant.
VS Code (with GitHub Copilot)
Requires: VS Code 1.99+ with GitHub Copilot extension
Config file: .vscode/mcp.json (workspace) or User Profile's mcp.json
{
"servers": {
"openproject": {
"type": "stdio",
"command": "uvx",
"args": ["openproject-mcp"],
"env": {
"OPENPROJECT_URL": "https://your-instance.openproject.com",
"OPENPROJECT_API_KEY": "your-api-key-here"
}
}
}
}
You can also use the Command Palette: MCP: Add Server to configure servers through the GUI.
IntelliJ IDEA (2025.1+) & JetBrains IDEs (2025.2+)
Requires: IntelliJ IDEA 2025.1+ or JetBrains IDE 2025.2+
- Go to Settings/Preferences → Tools → Model Context Protocol
- Click Add MCP Server
- Configure:
- Command:
openproject-mcp - Environment Variables:
OPENPROJECT_URL:https://your-instance.openproject.comOPENPROJECT_API_KEY:your-api-key-here
- Command:
Or edit the MCP configuration file directly (location varies by IDE).
Continue (VS Code & JetBrains)
Continue is an open-source AI coding assistant.
Config location: .continue/mcpServers/ folder in your workspace
Create a file .continue/mcpServers/openproject.json:
{
"name": "openproject",
"version": "1.0.0",
"schema": "1.0.0",
"type": "stdio",
"command": "uvx",
"args": ["openproject-mcp"],
"env": {
"OPENPROJECT_URL": "https://your-instance.openproject.com",
"OPENPROJECT_API_KEY": "your-api-key-here"
}
}
Alternatively, you can use YAML format (.continue/mcpServers/openproject.yaml) which is the preferred format in newer versions.
Windsurf
Config file locations:
- macOS/Linux:
~/.codeium/windsurf/mcp_config.json - Windows:
%USERPROFILE%\.codeium\windsurf\mcp_config.json
{
"mcpServers": {
"openproject": {
"command": "uvx",
"args": ["openproject-mcp"],
"env": {
"OPENPROJECT_URL": "https://your-instance.openproject.com",
"OPENPROJECT_API_KEY": "your-api-key-here"
}
}
}
}
You can also access this through Windsurf's GUI:
- Go to Settings → Manage MCPs
- Click View raw config to edit the
mcp_config.jsonfile
Environment Variables
| Variable | Required | Description | Example |
|---|---|---|---|
OPENPROJECT_URL |
Yes | Your OpenProject instance URL | https://mycompany.openproject.com |
OPENPROJECT_API_KEY |
Yes | API key from your user profile | 8169846b42461e6e... |
OPENPROJECT_PROXY |
No | HTTP proxy URL if needed | http://proxy.company.com:8080 |
LOG_LEVEL |
No | Logging level | INFO, DEBUG, WARNING, ERROR |
TEST_CONNECTION_ON_STARTUP |
No | Test API connection on startup | true or false |
Important: Reverse Proxy / Authentication Gateway Setup
If your OpenProject instance is behind an authentication gateway (Authelia, Authentik, Keycloak, etc.), you must configure it to bypass authentication for API endpoints.
Problem
Authentication gateways intercept ALL requests, including API calls, redirecting them to login pages. This breaks API token authentication.
Solution
Configure your reverse proxy to bypass authentication for /api/ paths, allowing OpenProject's native API authentication to work.
Example: Traefik + Authelia
Create a higher-priority route for API endpoints:
File: /path/to/traefik/config/openproject-api.yml
http:
routers:
openproject-api:
rule: "Host(`projects.example.com`) && PathPrefix(`/api/`)"
service: openproject
priority: 100 # Higher than main route
tls: true
# No Authelia middleware - OpenProject handles API auth
services:
openproject:
loadBalancer:
servers:
- url: "http://openproject:80"
This configuration:
- ✅ Web UI requests → Authenticated via Authelia (2FA, SSO, etc.)
- ✅ API requests → Authenticated via OpenProject API keys
Other Reverse Proxies
Nginx:
location /api/ {
# Bypass auth for API
proxy_pass http://openproject:80;
}
location / {
# Require auth for web UI
auth_request /auth;
proxy_pass http://openproject:80;
}
Caddy:
projects.example.com {
@api path /api/*
handle @api {
reverse_proxy openproject:80
}
handle {
forward_auth authelia:9091
reverse_proxy openproject:80
}
}
Authentication Format
OpenProject uses HTTP Basic Authentication for API access:
- Username:
apikey - Password: Your API key
- Header Format:
Authorization: Basic base64(apikey:YOUR_API_KEY)
The MCP server handles this automatically.
Available Tools
test_connection
Test connection to your OpenProject instance.
Example: "Test the OpenProject connection"
list_projects
List all projects you have access to.
Parameters:
active_only(boolean, optional): Show only active projects (default: true)
Example: "List all active OpenProject projects"
list_work_packages
List work packages with optional filtering.
Parameters:
project_id(integer, optional): Filter by project IDstatus(string, optional): Filter by status nameassignee_id(integer, optional): Filter by assignee user IDpage_size(integer, optional): Number of results (default: 20)
Example: "Show all work packages in project 3"
create_work_package
Create a new work package.
Parameters:
project_id(integer, required): Project IDsubject(string, required): Work package titletype_id(integer, required): Work package type IDdescription(string, optional): Description in markdownassignee_id(integer, optional): User ID to assignstatus_id(integer, optional): Status ID
Example: "Create a task in project 3 called 'Fix login bug'"
update_work_package
Update an existing work package.
Parameters:
work_package_id(integer, required): Work package IDsubject(string, optional): New titledescription(string, optional): New descriptionstatus_id(integer, optional): New statusassignee_id(integer, optional): New assignee
Example: "Update work package #42 status to 'In Progress'"
list_users
List all users in the OpenProject instance.
Example: "Show all OpenProject users"
list_work_package_types
List available work package types.
Example: "What work package types are available?"
list_work_package_statuses
List available work package statuses.
Example: "Show all available statuses"
create_time_entry
Create a time entry for a work package.
Parameters:
work_package_id(integer, required): Work package IDhours(float, required): Hours spentcomment(string, optional): Comment/descriptionspent_on(string, optional): Date (YYYY-MM-DD)
Example: "Log 2.5 hours on work package #39 for today"
list_memberships
List project memberships.
Parameters:
project_id(integer, optional): Filter by project
Example: "Show who has access to project 3"
Development
Install from Source
# Clone repository
git clone https://github.com/Compass-Rose-Systems/openproject-mcp.git
cd openproject-mcp
# Build package
uv build
# Install locally
pip install dist/openproject_mcp-1.0.0-py3-none-any.whl
Run Tests
# Install dev dependencies
uv sync --extra dev
# Run tests
pytest
Roadmap
Based on community contributions and open pull requests, here are planned improvements:
🐳 Docker Containerization (#14)
- Simplified deployment with Docker
- Environment consistency
- Easy scaling and orchestration
📊 Project Grid & Research Features (#11)
- Enhanced data visualization
- Grid-based project management
- Advanced filtering and sorting
🤖 Tool Automation (#10)
- Automated update and upgrade workflows
- Streamlined maintenance
🔧 Additional Tools (#4)
- Expanded tool capabilities
- More OpenProject API coverage
Future Enhancements
- Webhook support for real-time notifications
- Bulk operations for work packages
- Custom field support
- Advanced query builder
- Export functionality (CSV, PDF)
- Integration with external tools (Slack, email, etc.)
Troubleshooting
"Unauthenticated" errors
Cause: API key format incorrect or authentication gateway blocking requests.
Solutions:
- Verify API key is correct (check OpenProject → My Account → Access Tokens)
- Ensure authentication gateway bypasses
/api/paths (see setup guide above) - Check
OPENPROJECT_URLis correct and accessible
Connection timeouts
Cause: Network issues, firewall, or proxy misconfiguration.
Solutions:
- Test direct access:
curl -u "apikey:YOUR_KEY" https://your-instance/api/v3/projects - If behind corporate proxy, set
OPENPROJECT_PROXYenvironment variable - Check firewall rules allow outbound HTTPS
MCP server not appearing in editor
Cause: Configuration file syntax error or incorrect path.
Solutions:
- Validate JSON syntax (use online JSON validator)
- Check config file location for your editor
- Restart editor after configuration changes
- Check editor logs for MCP loading errors
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes with tests
- Submit a pull request
License
MIT License - see LICENSE file for details.
Credits
Original Author: AndyEverything Current Maintainer: cleanspin Organization: Compass Rose Systems
This project is a maintained fork with active development, easy installation via PyPI, comprehensive documentation, and ongoing feature improvements.
Metadata
Release files for openproject-mcp 1.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| openproject_mcp-1.0.2.tar.gz | 123.7 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| openproject_mcp-1.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 262.5 kB
Release files / openproject_mcp-1.0.2.tar.gz
| Download URL | openproject_mcp-1.0.2.tar.gz |
|---|---|
| Size | 123.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9334c356104276e23113824f0e93a7f5ace4135ae5d8a59fbb819070b1abc8c0
|
|
BLAKE2b-256 checksum How to use checksums |
4a9dc04c590a8f5f15cc001a4b034897ccbe91e4d87081f994419786606d5a29
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / openproject_mcp-1.0.2-py3-none-any.whl
| Download URL | openproject_mcp-1.0.2-py3-none-any.whl |
|---|---|
| Size | 138.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
891f7e3c7c49cef5c79a973e9e06ff5feda5c09cc72dccbcd98f993b06e1eb99
|
|
BLAKE2b-256 checksum How to use checksums |
24f0b9470e6cf5ec65ce6097d9bef1b8cdaeaf2f0155c2f236ae7be8e589e9a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for openproject-mcp 1.0.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.