A Model Context Protocol (MCP) server for OpenProject, written in Go. Exposes 48 tools covering projects, work packages, users, memberships, time entries, versions, relations, boards, search, and notifications — enabling AI assistants such as Claude and GitHub Copilot to manage OpenProject directly.
Built with the official MCP Go SDK.
Via go install (recommended):
go install github.com/pinealctx/openproject-mcp@latestDownload a pre-built binary:
Grab the latest release for your platform from GitHub Releases.
Build from source:
git clone https://github.com/pinealctx/openproject-mcp.git
cd openproject-mcp
make build # output: ./build/openproject-mcp# Build
go build -o openproject-mcp .
# Run in stdio mode (Claude Desktop / MCP clients)
OPENPROJECT_URL=https://your-instance.openproject.com \
OPENPROJECT_API_KEY=your-api-key \
openproject-mcpThis tool operates in two modes:
Starts an MCP server for AI assistants. No subcommand needed — just run the binary.
# stdio mode (default) - for Claude Desktop, Cursor, etc.
openproject-mcp
# SSE mode - for web-based MCP clients
openproject-mcp mcp -t sse -p 3000
# HTTP mode - for HTTP-based MCP clients
openproject-mcp mcp -t http -p 8080Direct command-line interaction with OpenProject API. Useful for scripting and automation.
# List all projects
openproject-mcp project list
# Get project details
openproject-mcp project get 42
# Create a new project
openproject-mcp project create -n "My Project" -i "my-project"
# List work packages in a project
openproject-mcp wp list -p 42
# Create a work package
openproject-mcp wp create -p 42 -s "Implement feature X"
# Search across OpenProject
openproject-mcp search "bug"
# Output as JSON for scripting
openproject-mcp project list -o json| Command | Alias | Description |
|---|---|---|
project |
proj, p |
Manage projects |
work-package |
wp |
Manage work packages (tasks, bugs, features) |
user |
u |
Manage users |
membership |
member, m |
Manage project memberships |
time-entry |
time, te |
Manage time entries (work logs) |
board |
- | Manage Kanban boards |
notification |
notify |
Manage notifications |
search |
- | Search across projects, work packages, users |
status |
- | List work package statuses |
priority |
priorities |
List work package priorities |
type |
types |
List work package types |
role |
roles |
List user roles |
version |
- | Manage project versions/milestones |
mcp |
- | Start MCP server |
# === Projects ===
openproject-mcp project list
openproject-mcp project get 42
openproject-mcp project create -n "Website Redesign" -i "website-redesign"
openproject-mcp project update 42 -n "New Name"
openproject-mcp project delete 42
# === Work Packages ===
openproject-mcp wp list -p 42
openproject-mcp wp get 123
openproject-mcp wp create -p 42 -s "Fix login bug" -d "Description here"
openproject-mcp wp update 123 --status "In Progress" --progress 50
openproject-mcp wp update 123 --assignee 5
openproject-mcp wp delete 123
# === Work Package Relations ===
openproject-mcp wp set-parent 123 -p 100
openproject-mcp wp relation create --from 123 --to 456 --type blocks
# === Users ===
openproject-mcp user list
openproject-mcp user get 5
openproject-mcp user me
# === Time Entries ===
openproject-mcp time-entry list -p 42
openproject-mcp time-entry create -H 4 -c "Worked on feature X"
openproject-mcp time-entry create -H 8 -w 123 -d 2024-01-15
# === Memberships ===
openproject-mcp membership list -p 42
openproject-mcp membership create -p 42 -u 5 -r "3,4"
openproject-mcp membership delete 123
# === Search ===
openproject-mcp search "bug"
openproject-mcp search "website" -t project
openproject-mcp search "john" -t user
# === Notifications ===
openproject-mcp notification list
openproject-mcp notification list -u # unread only
openproject-mcp notification read-allRun openproject-mcp [command] --help for detailed usage of each command.
| Mode | Command | Use Case |
|---|---|---|
stdio |
openproject-mcp or openproject-mcp mcp -t stdio |
Claude Desktop, Cursor, Continue (default) |
sse |
openproject-mcp mcp -t sse -p 3000 |
Server-Sent Events for web-based MCP clients |
http |
openproject-mcp mcp -t http -p 8080 |
Streamable HTTP for web-based clients |
Communication via stdin/stdout. The server reads JSON-RPC messages from stdin and writes responses to stdout. All logging is suppressed to avoid protocol interference.
Compatible with: Claude Desktop, Cursor, Continue, Zed, and other MCP clients that spawn the server as a subprocess.
# Set environment variables
export OPENPROJECT_URL="https://your-instance.openproject.com"
export OPENPROJECT_API_KEY="your-api-token"
# Start MCP server (all three commands are equivalent)
openproject-mcp
openproject-mcp mcp
openproject-mcp mcp -t stdioFor web-based MCP clients. Requires a port to listen on.
# SSE mode
openproject-mcp mcp -t sse -p 3000
# HTTP mode
openproject-mcp mcp -t http -p 8080Mode 1 — Server pre-configured (single-tenant / self-hosted)
Set credentials via environment variables at startup. All requests share the same OpenProject account.
export OPENPROJECT_URL=https://your-instance.openproject.com
export OPENPROJECT_API_KEY=your-api-key
openproject-mcp mcp -t http -p 8080For
stdiotransport, credentials are required at startup.
Mode 2 — Per-request credentials (multi-tenant / service)
Start without credentials; each HTTP/SSE client supplies its own via request headers.
openproject-mcp mcp -t http -p 8080
# no env vars neededClients include headers with every request:
X-OpenProject-URL: https://your-instance.openproject.com
X-OpenProject-API-Key: your-api-key
If neither server-level nor per-request credentials are available, the server responds with HTTP 401.
| Variable | Required (stdio) | Description |
|---|---|---|
OPENPROJECT_URL |
Yes | OpenProject instance URL |
OPENPROJECT_API_KEY |
Yes | API key for authentication |
OPENPROJECT_PROXY |
No | HTTP/HTTPS/SOCKS5 proxy URL |
LOG_LEVEL |
No | debug, info, warn, error (default: info) |
TRANSPORT |
No | stdio, sse, http (default: stdio) |
PORT |
No | Port for SSE/HTTP transport (default: 8080) |
Add to claude_desktop_config.json:
{
"mcpServers": {
"openproject": {
"command": "/path/to/openproject-mcp",
"args": [],
"env": {
"OPENPROJECT_URL": "https://your-instance.openproject.com",
"OPENPROJECT_API_KEY": "your-api-key"
}
}
}
}Add to .cursor/mcp.json
{
"mcpServers": {
"openproject": {
"command": "/path/to/openproject-mcp",
"args": [],
"env": {
"OPENPROJECT_URL": "https://your-instance.openproject.com",
"OPENPROJECT_API_KEY": "your-api-key"
}
}
}
}{
"servers": {
"openproject": {
"type": "http",
"url": "http://localhost:8080/mcp"
}
}Add to your Zed settings:
{
"context_servers": {
"openproject": {
"command": "/path/to/openproject-mcp",
"args": [],
"env": {
"OPENPROJECT_URL": "https://your-instance.openproject.com",
"OPENPROJECT_API_KEY": "your-api-key"
}
}
}
}| Tool | Description |
|---|---|
test_connection |
Test connectivity and verify authentication |
check_permissions |
Check current user permissions |
get_current_user |
Get the authenticated user's full profile |
get_api_info |
Get OpenProject API root information |
| Tool | Description |
|---|---|
list_projects |
List projects with optional filters |
get_project |
Get a project by ID |
create_project |
Create a new project |
update_project |
Update a project |
delete_project |
Delete a project |
| Tool | Description |
|---|---|
list_work_packages |
List work packages with filters |
list_project_work_packages |
List work packages in a specific project |
get_work_package |
Get a work package by ID |
create_work_package |
Create a work package |
update_work_package |
Update a work package (auto-fetches lockVersion) |
delete_work_package |
Delete a work package |
move_work_package |
Move a work package to another project |
watch_work_package |
Watch a work package for notifications |
list_types |
List available work package types |
list_statuses |
List available work package statuses |
list_priorities |
List available work package priorities |
| Tool | Description |
|---|---|
set_work_package_parent |
Set the parent of a work package |
remove_work_package_parent |
Remove the parent relationship |
list_work_package_children |
List child work packages |
create_work_package_relation |
Create a relation between two work packages |
list_work_package_relations |
List all relations for a work package |
get_work_package_relation |
Get a specific relation |
update_work_package_relation |
Update a relation |
delete_work_package_relation |
Delete a relation |
| Tool | Description |
|---|---|
list_users |
List users |
get_user |
Get a user by ID |
| Tool | Description |
|---|---|
list_memberships |
List memberships |
get_membership |
Get a membership by ID |
create_membership |
Add a user to a project |
update_membership |
Update a membership's roles |
delete_membership |
Remove a user from a project |
list_project_members |
List members of a specific project |
| Tool | Description |
|---|---|
list_time_entries |
List time entries with optional filters |
create_time_entry |
Log time on a work package |
update_time_entry |
Update a time entry |
delete_time_entry |
Delete a time entry |
list_time_entry_activities |
List available activity types |
| Tool | Description |
|---|---|
list_versions |
List versions in a project |
create_version |
Create a new version |
| Tool | Description |
|---|---|
get_boards |
List boards, optionally filtered by project |
get_board |
Get a board by ID |
create_board |
Create a new board |
update_board |
Update a board |
delete_board |
Delete a board |
add_board_widget |
Add a widget (column) to a board |
remove_board_widget |
Remove a widget from a board |
| Tool | Description |
|---|---|
list_notifications |
List notifications for the current user |
mark_notification_read |
Mark a notification as read |
mark_all_notifications_read |
Mark all notifications as read |
| Tool | Description |
|---|---|
search |
Search across projects, work packages, and users |
make build # Build for current platform → ./build/openproject-mcp
make build-all # Cross-compile for Linux / macOS / Windows
make test # Run tests
make clean # Remove build artifactsMIT