A Model Context Protocol (MCP) server for OpenProject API v3 integration
Project description
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file openproject_mcp-1.0.2.tar.gz.
File metadata
- Download URL: openproject_mcp-1.0.2.tar.gz
- Upload date:
- Size: 123.7 kB
- Tags: Source
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9334c356104276e23113824f0e93a7f5ace4135ae5d8a59fbb819070b1abc8c0
|
|
| MD5 |
e1f77270e91683aac9284de492325c01
|
|
| BLAKE2b-256 |
4a9dc04c590a8f5f15cc001a4b034897ccbe91e4d87081f994419786606d5a29
|
File details
Details for the file openproject_mcp-1.0.2-py3-none-any.whl.
File metadata
- Download URL: openproject_mcp-1.0.2-py3-none-any.whl
- Upload date:
- Size: 138.8 kB
- Tags: Python 3
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
891f7e3c7c49cef5c79a973e9e06ff5feda5c09cc72dccbcd98f993b06e1eb99
|
|
| MD5 |
1912635b69f18faae8fb520228c54990
|
|
| BLAKE2b-256 |
24f0b9470e6cf5ec65ce6097d9bef1b8cdaeaf2f0155c2f236ae7be8e589e9a5
|