redmine-mcp-server

by jztan

Not rated
GitHub

About

Production-ready MCP server for Redmine with security, pagination, and enterprise features

Details

Author
jztan
Categories
Productivity, Project Management

Setup

Install redmine-mcp-server in your MCP client (Claude Desktop, Cursor, Windsurf, and others).

Repository: https://github.com/jztan/redmine-mcp-server

Follow the installation instructions in the repository README, then restart your MCP client.

](https://redmine-mcp-server.jztan.com)Tool reference|Changelog|Contributing|Troubleshooting

- 51 MCP Tools(plus 1 operator tool gated byREDMINE_MCP_EXPOSE_ADMIN_TOOLS=true): Issues, projects, time tracking, wiki, Gantt, file operations, membership management, products, contacts (CRM), DMSF documents, and more
- Interactive Kanban Board:show_triage_boardrenders a live, drag-and-drop issue board right in the chat via the MCP Apps extension
- Flexible Authentication: API key, username/password, or OAuth2 per-user tokens
- Prompt Injection Protection: User-controlled content wrapped in boundary tags for safe LLM consumption
- Read-Only Mode: Restrict to read-only operations viaREDMINE_MCP_READ_ONLYenvironment variable
- HTTP File Serving: Secure attachment access via UUID-based URLs with automatic expiry
- Pagination Support: Handle large result sets with configurable limits
- MCP Compliant: Built on FastMCP with HTTP transport
- Docker Ready: Dockerfile, docker-compose setup, and prebuilt images on GHCR
- Install the package

pip install redmine-mcp-server

Once running, the server listens onhttp://localhost:8000with the MCP endpoint at/mcp, health check at/health, and file serving at/files/{file_id}.

- Python 3.10+ (for local installation)
- Docker (alternative deployment, uses Python 3.13)
- Access to a Redmine instance

The integration suite passes in full against Redmine 6.1 and 7.0. Older versions are untested. Individual tools list their own minimum where one is known (global search needs 3.3.0+, issue watchers 2.3.0+, project time-entry activities 3.4.0+), so on an older server those specific tools fail rather than the whole server.

OAuth2 is the one hard requirement: it needs Redmine 6.1+ for Doorkeeper support. Seedocs/oauth-setup.md.

# Install the package pip install redmine-mcp-server # Create configuration file .env cat > .env << 'EOF' # Redmine connection (required) REDMINE_URL=https://your-redmine-server.com # Authentication - Use either API key (recommended) or username/password REDMINE_API_KEY=your_api_key # OR use username/password: # REDMINE_USERNAME=your_username # REDMINE_PASSWORD=your_password # Server configuration (optional, defaults shown) SERVER_HOST=0.0.0.0 SERVER_PORT=8000 # Public URL for file serving (optional) PUBLIC_HOST=localhost PUBLIC_PORT=8000 # File management (optional) ATTACHMENTS_DIR=./attachments AUTO_CLEANUP_ENABLED=true CLEANUP_INTERVAL_MINUTES=10 ATTACHMENT_EXPIRES_MINUTES=60 EOF # Edit .env with your actual Redmine settings nano .env # or use your preferred editor # Run the server redmine-mcp-server # Or alternatively: python -m redmine_mcp_server.main

The server runs onhttp://localhost:8000with the MCP endpoint at/mcp, health check at/health, and file serving at/files/{file_id}.

Required whenREDMINE_AUTH_MODE=legacy-per-user.† Required whenREDMINE_AUTH_MODE=legacy. EitherREDMINE_API_KEYorREDMINE_USERNAME+REDMINE_PASSWORDmust be set. API key is recommended.‡ Required whenREDMINE_AUTH_MODE=oauthorREDMINE_AUTH_MODE=oauth-proxy.§ Required whenREDMINE_AUTH_MODE=oauth-proxy.*Secret values can also be supplied with Docker/Kubernetes-style file variables:REDMINE_INTROSPECT_CLIENT_SECRET_FILE,REDMINE_MCP_JWT_SIGNING_KEY_FILE, andREDMINE_OAUTH_CLIENT_SECRET_FILE.

WhenREDMINE_AUTOFILL_REQUIRED_CUSTOM_FIELDS=true,create_redmine_issueretries once on relevant custom-field validation errors (for example<Field Name> cannot be blankor<Field Name> is not included in the list) and fills values only from:

- the Redmine custom fielddefault_value, or
- REDMINE_REQUIRED_CUSTOM_FIELD_DEFAULTS

REDMINE_AUTOFILL_REQUIRED_CUSTOM_FIELDS=true REDMINE_REQUIRED_CUSTOM_FIELD_DEFAULTS='{"Required Field A":"Value A","Required Field B":"Value B"}'

Configure SSL certificate handling for Redmine servers with self-signed certificates or internal CA infrastructure.

If your Redmine server uses a self-signed certificate or internal CA:

# In .env file REDMINE_URL=https://redmine.company.com REDMINE_API_KEY=your_api_key REDMINE_SSL_CERT=/path/to/ca-certificate.crt

Supported certificate formats:.pem,.crt,.cer

For environments requiring client certificate authentication:

# In .env file REDMINE_URL=https://secure.redmine.com REDMINE_API_KEY=your_api_key REDMINE_SSL_CERT=/path/to/ca-bundle.pem REDMINE_SSL_CLIENT_CERT=/path/to/cert.pem,/path/to/key.pem

Note: Private keys must be unencrypted (Python requests library requirement).

⚠️WARNING: Only use in development/testing environments!

Disabling SSL verification makes your connection vulnerable to man-in-the-middle attacks.

For SSL troubleshooting, see theTroubleshooting Guide.

The server supports four authentication modes, selected viaREDMINE_AUTH_MODE. It defaults tolegacy, so existing deployments keep working with no changes; OAuth2 support is purely additive.

The advanced modes are collapsed below. For full setup, theOAuth2 Setup Guidecoversoauthandoauth-proxy, and thelegacy-per-user guidecoverslegacy-per-user.

A single shared credential (API key or username/password) configured once in.env. Every request to Redmine uses the same identity.

REDMINE_AUTH_MODE=legacy # or omit entirely; this is the default REDMINE_URL=https://redmine.example.com REDMINE_API_KEY=your_api_key # OR: # REDMINE_USERNAME=your_username # REDMINE_PASSWORD=your_password

Each MCP request carries its ownAuthorization: Bearer <token>, so every user authenticates with their own Redmine account. The server validates each token against Doorkeeper's introspection endpoint before forwarding it, and exposes the OAuth2 discovery and/revokeendpoints clients need.

REDMINE_AUTH_MODE=oauth REDMINE_URL=https://redmine.example.com REDMINE_MCP_BASE_URL=https://redmine-mcp.example.com # public URL of this server # Confidential OAuth app registered in Redmine admin (see setup guide) REDMINE_INTROSPECT_CLIENT_ID=... REDMINE_INTROSPECT_CLIENT_SECRET=...

You register the OAuth app manually in Redmine admin →Applications(no Dynamic Client Registration). Full walkthrough, endpoint reference, and troubleshooting:OAuth2 Setup Guide.

FastMCP acts as the MCP-facing authorization server: it handles DCR for MCP clients, then redirects users to Redmine as the upstream OAuth provider for consent. Use this when clients (e.g. Claude Desktop, VS Code) expect to register themselves.

REDMINE_AUTH_MODE=oauth-proxy REDMINE_URL=https://redmine.example.com REDMINE_MCP_BASE_URL=https://redmine-mcp.example.com # public URL of this server # Confidential OAuth app registered in Redmine admin (see setup guide) REDMINE_INTROSPECT_CLIENT_ID=... REDMINE_INTROSPECT_CLIENT_SECRET=... REDMINE_MCP_JWT_SIGNING_KEY=...

The upstream Redmine app must register${REDMINE_MCP_BASE_URL}/auth/callbackas its redirect URI. Storage, scaling, and credential-reuse notes are in theOAuth2 Setup Guide.

For Redmine instances too old for OAuth, each user's MCP client sends its own Redmine API key in anX-Redmine-API-Keyheader. Each request runs as that user's identity with that user's permissions.

This is an advanced, opt-in mode.It requires TLS end-to-end and a correctly configured reverse proxy. Readdocs/legacy-per-user-auth.mdfor the threat model, firewall guidance, and revocation runbook before enabling it.

{ "mcpServers": { "redmine": { "command": "npx", "args": ["mcp-remote", "https://your-host/mcp", "--header", "X-Redmine-API-Key:${RM_KEY}"], "env": { "RM_KEY": "<your redmine api key>" } }}}

Note the colon with no surrounding spaces inX-Redmine-API-Key:${RM_KEY}. This avoids an arg-escaping bug in Cursor and Claude Desktop on Windows.

Use.vscode/mcp.json(workspace file) or the user profilemcp.json. The workspace.mcp.jsonsilently dropsheaders(see microsoft/vscode#319528), so do not use that file. Pin VS Code 1.102 or newer.

{ "servers": { "redmine": { "type": "http", "url": "https://your-host/mcp", "headers": { "X-Redmine-API-Key": "${input:rmKey}" }, "inputs": [{ "id": "rmKey", "type": "promptString", "description": "Redmine API key", "password": true }] } } }

Unsupported:any client that cannot set a custom request header, or that reserves theAuthorizationheader for its own OAuth flow.

The server exposes an HTTP endpoint athttp://127.0.0.1:8000/mcp. Register it with your preferred MCP-compatible agent using the instructions below.

The examples below assumelegacyoroauthmode. Inlegacy-per-usermode each client must also send anX-Redmine-API-Keyheader; seelegacy-per-user modeabove for header-aware configs.

VS Code has built-in MCP support via GitHub Copilot (requires VS Code 1.102+).

code --add-mcp '{"name":"redmine","type":"http","url":"http://127.0.0.1:8000/mcp"}'

- Open Command Palette (Cmd/Ctrl+Shift+P)
- RunMCP: Open User Configuration(for global) orMCP: Open Workspace Folder Configuration(for project-specific)
- Add the configuration:

{ "servers": { "redmine": { "type": "http", "url": "http://127.0.0.1:8000/mcp" } } }

Manual Configuration:Create.vscode/mcp.jsonin your workspace (ormcp.jsonin your user profile directory):

{ "servers": { "redmine": { "type": "http", "url": "http://127.0.0.1:8000/mcp" } } }

Add to Claude Code using the CLI command:

claude mcp add --transport http redmine http://127.0.0.1:8000/mcp

Or configure manually in your Claude Code settings file (~/.claude.json):

{ "mcpServers": { "redmine": { "type": "http", "url": "http://127.0.0.1:8000/mcp" } } }

Claude Desktop's config file supports stdio transport only. Use FastMCP's proxy viauvto bridge to this HTTP server.
- Open Claude Desktop
- Click theClaudemenu (macOS menu bar / Windows title bar) >Settings...
- Click theDevelopertab >Edit Config
- Add the following configuration:

{ "mcpServers": { "redmine": { "command": "uv", "args": [ "run", "--with", "fastmcp", "fastmcp", "run", "http://127.0.0.1:8000/mcp" ] } } }

- Save the file, thenfully quit and restartClaude Desktop
- Look for the tools icon in the input area to verify the connection

- macOS:~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:%APPDATA%\Claude\claude_desktop_config.json

Note:The Redmine MCP server must be running before starting Claude Desktop.

Cursor talks to HTTP MCP servers directly, with no bridge.
- Create~/.cursor/mcp.json(available in every project) or.cursor/mcp.jsonin your project root (that project only):

{ "mcpServers": { "redmine": { "url": "http://127.0.0.1:8000/mcp" } } }

Note:Cursor identifies a remote server by a bareurland has notypefield, unlike the VS Code and Claude Code configs above.

Inlegacy-per-usermode, add the API key header:

{ "mcpServers": { "redmine": { "url": "https://your-host/mcp", "headers": { "X-Redmine-API-Key": "<your redmine api key>" } } } }

Inoauthmode, setREDMINE_OAUTH_DISCOVERY_AS=selfon the MCP server. Cursor looks for authorization server metadata at its own canonical well-known location, which the default (redmine) discovery profile does not serve, so the flow stalls without it (#188). SeeCursor and self-AS discovery.

codex mcp add redmine -- npx -y mcp-client-http http://127.0.0.1:8000/mcp

Or configure manually in~/.codex/config.toml:

[mcp_servers.redmine] command = "npx" args = ["-y", "mcp-client-http", "http://127.0.0.1:8000/mcp"]

Note:Codex CLI primarily supports stdio-based MCP servers. The above usesmcp-client-httpas a bridge for HTTP transport.

Kiro primarily supports stdio-based MCP servers. For HTTP servers, use an HTTP-to-stdio bridge:
- Create or edit.kiro/settings/mcp.jsonin your workspace:

{ "mcpServers": { "redmine": { "command": "npx", "args": [ "-y", "mcp-client-http", "http://127.0.0.1:8000/mcp" ], "disabled": false } } }

Note:Direct HTTP transport support in Kiro is limited. The above configuration usesmcp-client-httpas a bridge to connect to HTTP MCP servers.

Most MCP clients use a standard configuration format. For HTTP servers:

{ "mcpServers": { "redmine": { "type": "http", "url": "http://127.0.0.1:8000/mcp" } } }

For clients that require a command-based approach with HTTP bridge:

{ "mcpServers": { "redmine": { "command": "npx", "args": ["-y", "mcp-client-http", "http://127.0.0.1:8000/mcp"] } } }
# Test connection by checking health endpoint curl http://localhost:8000/health

The server works against a stock Redmine instance. Six optional plugins add more. To use one, install it on your Redmine server and set the matching env var. Skipping a plugin costs you only that plugin's features.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.