PluginBench
MCP Server
Active
MIT

io.github.jztan/redmine-mcp-server MCP Server

io.github.jztan/redmine-mcp-server

AI-powered Redmine issue and project management through MCP tools.

What is the io.github.jztan/redmine-mcp-server MCP server?

The Redmine MCP Server is a Model Context Protocol server that connects AI assistants to Redmine instances, exposing projects, issues, time tracking, wiki pages, and files as MCP tools. It supports 51+ tools for issue management, Kanban boards, file operations, and integrations with RedmineUP plugins, with flexible authentication modes including API key, OAuth2, and per-user credentials.

This server lets AI assistants interact with your Redmine instance to create, update, and manage issues, projects, time entries, wiki pages, and attachments. It's useful for automating issue triage, sprint planning, time tracking, and project coordination through natural language commands. The server includes an interactive Kanban board, prompt-injection protection, read-only mode, and support for popular Redmine plugins like Agile, Checklists, Products, and CRM.

How to install io.github.jztan/redmine-mcp-server

Copy-paste configuration for popular MCP clients.

transport: stdio
Config generated by PluginBench — verify against the source before use.
Environment / auth
  • REDMINE_URL
    required

    URL of your Redmine server (e.g., https://your-redmine-server.com)

  • REDMINE_USERNAME

    Redmine username for authentication (alternative to API key)

  • REDMINE_PASSWORD
    secret

    Redmine password for authentication (alternative to API key)

  • REDMINE_API_KEY
    secret

    Redmine API key for authentication (alternative to username/password)

  • SERVER_HOST

    Host address for the MCP server (default: 0.0.0.0)

  • SERVER_PORT

    Port for the MCP server (default: 8000)

  • PUBLIC_HOST

    Public hostname for file download URLs (default: localhost)

  • PUBLIC_PORT

    Public port for file download URLs (default: 8000)

  • ATTACHMENTS_DIR

    Directory for storing downloaded attachments (default: ./attachments)

  • AUTO_CLEANUP_ENABLED

    Enable automatic cleanup of expired files (default: true)

  • CLEANUP_INTERVAL_MINUTES

    Interval between cleanup runs in minutes (default: 10)

  • ATTACHMENT_EXPIRES_MINUTES

    Default expiry time for attachments in minutes (default: 60)

~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "redmine-mcp-server": {
      "command": "uvx",
      "args": [
        "redmine-mcp-server"
      ],
      "env": {
        "REDMINE_URL": "<YOUR_REDMINE_URL>",
        "REDMINE_USERNAME": "<YOUR_REDMINE_USERNAME>",
        "REDMINE_PASSWORD": "<YOUR_REDMINE_PASSWORD>",
        "REDMINE_API_KEY": "<YOUR_REDMINE_API_KEY>",
        "SERVER_HOST": "<YOUR_SERVER_HOST>",
        "SERVER_PORT": "<YOUR_SERVER_PORT>",
        "PUBLIC_HOST": "<YOUR_PUBLIC_HOST>",
        "PUBLIC_PORT": "<YOUR_PUBLIC_PORT>",
        "ATTACHMENTS_DIR": "<YOUR_ATTACHMENTS_DIR>",
        "AUTO_CLEANUP_ENABLED": "<YOUR_AUTO_CLEANUP_ENABLED>",
        "CLEANUP_INTERVAL_MINUTES": "<YOUR_CLEANUP_INTERVAL_MINUTES>",
        "ATTACHMENT_EXPIRES_MINUTES": "<YOUR_ATTACHMENT_EXPIRES_MINUTES>"
      }
    }
  }
}

Tools & capabilities

Tools this server exposes to the agent.

  • Issues — Create, read, update, and delete Redmine issues with custom fields, watchers, and relations
  • Projects — List and manage Redmine projects, including project settings and membership
  • Time Tracking — Log, list, and manage time entries and activities
  • Wiki Pages — Create, read, and update wiki pages within projects
  • Attachments — Upload, download, and manage file attachments with UUID-based secure URLs
  • Kanban Board — Interactive drag-and-drop issue board for sprint triage via MCP Apps
  • Gantt Charts — View and manage Gantt chart data for project scheduling
  • Membership Management — Manage project members and roles
  • RedmineUP Agile — Story points, sprint management, and agile board support (plugin-dependent)
  • RedmineUP Checklists — Create and manage issue checklists (plugin-dependent)
  • RedmineUP Products — Manage products and product-related data (plugin-dependent)
  • RedmineUP CRM — Manage contacts and CRM operations (plugin-dependent)
  • DMSF Documents — Manage document management system files (plugin-dependent)
  • Tags — Add and manage issue tags via additional_tags plugin (plugin-dependent)
  • Global Search — Search across Redmine resources (requires Redmine 3.3.0+)

Use cases

  • Automate issue triage and sprint planning by having AI agents create and update issues based on natural language requests
  • Track project progress and time spent by querying issues, time entries, and Gantt charts through conversational commands
  • Manage wiki documentation and project knowledge by creating and updating wiki pages alongside issue management
  • Coordinate team workflows using the interactive Kanban board to visualize and reorganize issues in real time
  • Integrate with RedmineUP plugins to manage products, contacts, checklists, and agile sprints from a single AI interface

io.github.jztan/redmine-mcp-server MCP server FAQ

What is the Redmine MCP Server?

It's an MCP server that exposes your Redmine instance's issues, projects, time tracking, wiki, and files as tools for AI assistants. It includes 51+ tools, an interactive Kanban board, and support for RedmineUP plugins.

Is it free?

Yes, the Redmine MCP Server is open-source (licensed under the repository's LICENSE) and free to use. You only need a Redmine instance to connect to.

How do I install it in Cursor or Claude?

Install via PyPI (`pip install redmine-mcp-server`), configure a `.env` file with your Redmine URL and API key, run `redmine-mcp-server`, then add the server to your MCP client configuration pointing to `http://localhost:8000/mcp`.

What authentication methods are supported?

The server supports API key (recommended), username/password, OAuth2 (Redmine 6.1+), and per-user legacy authentication. Choose the mode via `REDMINE_AUTH_MODE` environment variable.

Can I use it in read-only mode?

Yes, set `REDMINE_MCP_READ_ONLY=true` to block all write operations (create/update/delete) and restrict the server to read-only access.

Does it work with Redmine plugins?

Yes, it supports RedmineUP Agile, Checklists, Products, CRM, DMSF documents, and additional_tags plugins. Enable them via environment variables like `REDMINE_AGILE_ENABLED=true`.

README (reference)

Source of truth, from the repository.

Redmine MCP Server

PyPI Version License Python Version Redmine Version GitHub Issues CI Coverage Downloads

A Model Context Protocol (MCP) server that connects AI assistants to Redmine. It exposes your Redmine instance's projects, issues, time tracking, wiki pages, and files as MCP tools.

mcp-name: io.github.jztan/redmine-mcp-server

<p align="center"> <a href="https://redmine-mcp-server.jztan.com"> <img src="https://raw.githubusercontent.com/jztan/redmine-mcp-server/develop/assets/redmine-mcp-demo.gif" alt="An AI agent triaging a Redmine sprint backlog through redmine-mcp-server" width="820" /> </a> </p> <p align="center"><sub>An AI agent triaging a Redmine sprint through redmine-mcp-server. <a href="https://redmine-mcp-server.jztan.com">Try the live demo →</a></sub></p>

Tool reference | Changelog | Contributing | Troubleshooting

Features

  • 51 MCP Tools (plus 1 operator tool gated by REDMINE_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_board renders 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 via REDMINE_MCP_READ_ONLY environment 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

Quick Start

  1. Install the package
    pip install redmine-mcp-server
    
  2. Create a .env file with your Redmine credentials (see Installation for template)
  3. Start the server
    redmine-mcp-server
    
  4. Add the server to your MCP client using one of the guides in MCP Client Configuration.

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

Installation

Prerequisites

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

Redmine Compatibility

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. See docs/oauth-setup.md.

Install from PyPI (Recommended)

# 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 on http://localhost:8000 with the MCP endpoint at /mcp, health check at /health, and file serving at /files/{file_id}.

Environment Variables Configuration

<details> <summary><strong>Environment Variables</strong></summary>
VariableRequiredDefaultDescription
REDMINE_URLYes–Base URL of your Redmine instance
REDMINE_AUTH_MODENolegacyAuthentication mode: legacy, legacy-per-user, oauth, or oauth-proxy (see Authentication)
REDMINE_PER_USER_TRUST_PROXYYes*falseRequired for legacy-per-user mode. Operator attestation: "this server sits behind TLS and my proxy does not forward client X-Forwarded-Proto."
REDMINE_PER_USER_AUDIT_IDENTITYNofalselegacy-per-user only: resolve and log the Redmine user ID per request (adds one extra round-trip)
REDMINE_API_KEYYes†–API key (legacy mode only)
REDMINE_USERNAMEYes†–Username for basic auth (legacy mode only)
REDMINE_PASSWORDYes†–Password for basic auth (legacy mode only)
REDMINE_MCP_BASE_URLYes‡http://localhost:3040Public base URL of this server, no trailing slash (OAuth modes only)
FASTMCP_STREAMABLE_HTTP_PATHNo/mcpMCP transport path inside REDMINE_MCP_BASE_URL
REDMINE_INTROSPECT_CLIENT_IDYes‡–Doorkeeper OAuth client ID used by the MCP server to introspect Bearer tokens (RFC 7662). Register a confidential OAuth app in Redmine (see docs/oauth-setup.md Step 2).
REDMINE_INTROSPECT_CLIENT_SECRETYes‡–Secret for the introspection client
REDMINE_MCP_JWT_SIGNING_KEYYes§–Stable signing/encryption key used by FastMCP OAuthProxy tokens and storage
REDMINE_OAUTH_CLIENT_IDNo–Optional upstream Redmine OAuth client ID for oauth-proxy; defaults to REDMINE_INTROSPECT_CLIENT_ID
REDMINE_OAUTH_CLIENT_SECRETNo–Optional upstream Redmine OAuth client secret for oauth-proxy; defaults to REDMINE_INTROSPECT_CLIENT_SECRET
FASTMCP_HOMENoplatform defaultFastMCP data directory. In oauth-proxy mode, encrypted OAuthProxy state is stored below FASTMCP_HOME/oauth-proxy/
REDMINE_MCP_ALLOWED_CLIENT_REDIRECT_URISNoloopback onlyoauth-proxy client redirect-URI allowlist (glob patterns, comma/space separated). Unset = http://localhost:* and http://127.0.0.1:*; * = allow any
HEALTH_INTROSPECTION_TTL_SECONDSNo30TTL (seconds) for the /health Doorkeeper introspection probe cache. Set to 0 to disable caching.
SERVER_HOSTNo0.0.0.0Host/IP the MCP server binds to
SERVER_PORTNo8000Port the MCP server listens on
PUBLIC_HOSTNolocalhostHostname used when generating download URLs
PUBLIC_PORTNo8000Public port used for download URLs
REDMINE_PUBLIC_URLNo–Publicly-reachable URL of your Redmine instance. When set, content_url values returned on attachments are rewritten from REDMINE_URL's origin to this one (preserving path/query/fragment and any reverse-proxy subpath). Useful when REDMINE_URL is the internal container hostname unreachable from MCP clients. When unset, the raw URL Redmine echoes back is returned.
ATTACHMENTS_DIRNo./attachmentsDirectory for downloaded attachments
ATTACHMENT_MAX_DOWNLOAD_BYTESNo209715200 (200 MB)Cap applied to every get_redmine_attachment download regardless of content type. Exceeding the cap aborts the download mid-stream and deletes the partial file.
REDMINE_MCP_UPLOAD_FILE_ROOTSNo–Extra directories allowed as file_path upload sources (OS path separator-separated). ATTACHMENTS_DIR is always allowed. Unset restricts uploads to ATTACHMENTS_DIR only.
AUTO_CLEANUP_ENABLEDNotrueToggle automatic cleanup of expired attachments
CLEANUP_INTERVAL_MINUTESNo10Interval for cleanup task
ATTACHMENT_EXPIRES_MINUTESNo60Expiry window for generated download URLs
REDMINE_MCP_EXPOSE_ADMIN_TOOLSNofalseExpose operator/admin tools on the MCP surface. Currently gates cleanup_attachment_files. The background cleanup task runs regardless of this flag.
REDMINE_SSL_VERIFYNotrueEnable/disable SSL certificate verification
REDMINE_SSL_CERTNo–Path to custom CA certificate file
REDMINE_SSL_CLIENT_CERTNo–Path to client certificate for mutual TLS
REDMINE_TIMEOUTNo30Whole seconds to wait for a Redmine HTTP response before failing the call. Applied as a connect timeout of at most 10s plus a read timeout of the full value. Set to 0 to wait indefinitely, which restores the previous behavior and can hang the request.
REDMINE_MCP_READ_ONLYNofalseBlock all write operations (create/update/delete) when set to true
REDMINE_OAUTH_SCOPE_ENFORCEMENTNoonOAuth modes only: deny tool calls whose access token lacks the tool's Redmine permission scopes, and filter tools/list accordingly. Set to off temporarily while re-consenting older tokens (details)
REDMINE_OAUTH_DISCOVERY_ASNoredmineOAuth modes only: which authorization server discovery advertises. redmine names your Redmine; self advertises this server (issuer = REDMINE_MCP_BASE_URL) and serves RFC 8414 metadata at its own canonical well-known location, which clients that probe there need, Cursor among them (details)
REDMINE_MCP_SCOPESNo–OAuth modes only: advertise a subset of scopes in discovery, matching the permissions your Redmine OAuth Application actually enables. Avoids invalid_scope at consent when a client requests the full advertised list
REDMINE_AGILE_ENABLEDNofalseEnable RedmineUP Agile plugin support: get_redmine_issue returns story_points, agile_sprint_id, agile_position; update_redmine_issue accepts story_points
REDMINE_CHECKLISTS_ENABLEDNofalseEnable RedmineUP Checklists plugin support: get_checklist, create_checklist_item, update_checklist_item (requires Checklists Pro plugin)
REDMINE_PRODUCTS_ENABLEDNofalseEnable RedmineUP Products plugin support: manage_product (action=list/get/create/update)
REDMINE_CRM_ENABLEDNofalseEnable RedmineUP CRM plugin support: manage_contact (action=list/get/create/update/delete/assign_to_project/remove_from_project)
REDMINE_DMSF_ENABLEDNofalseEnable DMSF document-management plugin support: manage_document (action=list/get/create/update). Requires redmine_dmsf plugin on the Redmine server.
REDMINE_TAGS_ENABLEDNofalseEnable AlphaNodes additional_tags plugin support: get_redmine_issue returns a tags array, and create_redmine_issue/update_redmine_issue accept a tag_list. Requires the additional_tags plugin and the view_issue_tags / create_issue_tags / edit_issue_tags permissions on the Redmine server.
REDMINE_AUTOFILL_REQUIRED_CUSTOM_FIELDSNofalseEnable one retry for issue creation by filling missing required custom fields
REDMINE_REQUIRED_CUSTOM_FIELD_DEFAULTSNo{}JSON object mapping required custom field names to fallback values used when creating issues
REDMINE_ALLOW_PRIVATE_FETCH_URLSNofalseWarning: disables all SSRF protection for attachment fetching. Never set to true in production.

* Required when REDMINE_AUTH_MODE=legacy-per-user. † Required when REDMINE_AUTH_MODE=legacy. Either REDMINE_API_KEY or REDMINE_USERNAME+REDMINE_PASSWORD must be set. API key is recommended. ‡ Required when REDMINE_AUTH_MODE=oauth or REDMINE_AUTH_MODE=oauth-proxy. § Required when REDMINE_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, and REDMINE_OAUTH_CLIENT_SECRET_FILE.

When REDMINE_AUTOFILL_REQUIRED_CUSTOM_FIELDS=true, create_redmine_issue retries once on relevant custom-field validation errors (for example <Field Name> cannot be blank or <Field Name> is not included in the list) and fills values only from:

  • the Redmine custom field default_value, or
  • REDMINE_REQUIRED_CUSTOM_FIELD_DEFAULTS

Example:

REDMINE_AUTOFILL_REQUIRED_CUSTOM_FIELDS=true
REDMINE_REQUIRED_CUSTOM_FIELD_DEFAULTS='{"Required Field A":"Value A","Required Field B":"Value B"}'
</details>

SSL Certificate Configuration

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

<details> <summary><strong>Self-Signed Certificates</strong></summary>

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

</details> <details> <summary><strong>Mutual TLS (Client Certificates)</strong></summary>

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).

</details> <details> <summary><strong>Disable SSL Verification (Development Only)</strong></summary>

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

# In .env file
REDMINE_SSL_VERIFY=false

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

</details>

For SSL troubleshooting, see the Troubleshooting Guide.

Authentication

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

Your situationModeRedmine
Single shared credential, simplest setuplegacy (default)any
Multi-user, you control the MCP clientoauth6.1+
Hosted server, clients self-register (DCR)oauth-proxy6.1+
Multi-user, Redmine too old for OAuthlegacy-per-user< 6.1

The advanced modes are collapsed below. For full setup, the OAuth2 Setup Guide covers oauth and oauth-proxy, and the legacy-per-user guide covers legacy-per-user.

Legacy mode (default)

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
<details> <summary><strong>OAuth2 mode</strong> (multi-user, Redmine 6.1+)</summary>

Each MCP request carries its own Authorization: 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 /revoke endpoints 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.

</details> <details> <summary><strong>OAuthProxy mode</strong> (hosted deployments with client self-registration)</summary>

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/callback as its redirect URI. Storage, scaling, and credential-reuse notes are in the OAuth2 Setup Guide.

</details> <details> <summary><strong>legacy-per-user mode</strong> (Redmine older than 6.1)</summary>

For Redmine instances too old for OAuth, each user's MCP client sends its own Redmine API key in an X-Redmine-API-Key header. 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. Read docs/legacy-per-user-auth.md for the threat model, firewall guidance, and revocation runbook before enabling it.

mcp-remote (recommended):

{ "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 in X-Redmine-API-Key:${RM_KEY}. This avoids an arg-escaping bug in Cursor and Claude Desktop on Windows.

VS Code (mcp.json):

Use .vscode/mcp.json (workspace file) or the user profile mcp.json. The workspace .mcp.json silently drops headers (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 the Authorization header for its own OAuth flow.

</details>

MCP Client Configuration

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

The examples below assume legacy or oauth mode. In legacy-per-user mode each client must also send an X-Redmine-API-Key header; see legacy-per-user mode above for header-aware configs.

<details> <summary><strong>Visual Studio Code (Native MCP Support)</strong></summary>

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

Using CLI (Quickest):

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

Using Command Palette:

  1. Open Command Palette (Cmd/Ctrl+Shift+P)
  2. Run MCP: Open User Configuration (for global) or MCP: Open Workspace Folder Configuration (for project-specific)
  3. Add the configuration:
    {
      "servers": {
        "redmine": {
          "type": "http",
          "url": "http://127.0.0.1:8000/mcp"
        }
      }
    }
    
  4. Save the file. VS Code will automatically load the MCP server.

Manual Configuration: Create .vscode/mcp.json in your workspace (or mcp.json in your user profile directory):

{
  "servers": {
    "redmine": {
      "type": "http",
      "url": "http://127.0.0.1:8000/mcp"
    }
  }
}
</details> <details> <summary><strong>Claude Code</strong></summary>

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"
    }
  }
}
</details> <details> <summary><strong>Claude Desktop (macOS & Windows)</strong></summary>

Claude Desktop's config file supports stdio transport only. Use FastMCP's proxy via uv to bridge to this HTTP server.

Setup:

  1. Open Claude Desktop
  2. Click the Claude menu (macOS menu bar / Windows title bar) > Settings...
  3. Click the Developer tab > Edit Config
  4. Add the following configuration:
{
  "mcpServers": {
    "redmine": {
      "command": "uv",
      "args": [
        "run",
        "--with", "fastmcp",
        "fastmcp",
        "run",
        "http://127.0.0.1:8000/mcp"
      ]
    }
  }
}
  1. Save the file, then fully quit and restart Claude Desktop
  2. Look for the tools icon in the input area to verify the connection

Config file locations:

  • 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.

</details> <details> <summary><strong>Cursor</strong></summary>

Cursor talks to HTTP MCP servers directly, with no bridge.

  1. Create ~/.cursor/mcp.json (available in every project) or .cursor/mcp.json in your project root (that project only):
    {
      "mcpServers": {
        "redmine": {
          "url": "http://127.0.0.1:8000/mcp"
        }
      }
    }
    
  2. Save the file. Cursor picks the server up automatically; its MCP settings list the server and the tools it loaded.

Note: Cursor identifies a remote server by a bare url and has no type field, unlike the VS Code and Claude Code configs above.

In legacy-per-user mode, add the API key header:

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

In oauth mode, set REDMINE_OAUTH_DISCOVERY_AS=self on 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). See Cursor and self-AS discovery.

</details> <details> <summary><strong>Codex CLI</strong></summary>

Add to Codex CLI using the command:

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 uses mcp-client-http as a bridge for HTTP transport.

</details> <details> <summary><strong>Kiro</strong></summary>

Kiro primarily supports stdio-based MCP servers. For HTTP servers, use an HTTP-to-stdio bridge:

  1. Create or edit .kiro/settings/mcp.json in your workspace:
    {
      "mcpServers": {
        "redmine": {
          "command": "npx",
          "args": [
            "-y",
            "mcp-client-http",
            "http://127.0.0.1:8000/mcp"
          ],
          "disabled": false
        }
      }
    }
    
  2. Save the file and restart Kiro. The Redmine tools will appear in the MCP panel.

Note: Direct HTTP transport support in Kiro is limited. The above configuration uses mcp-client-http as a bridge to connect to HTTP MCP servers.

</details> <details> <summary><strong>Generic MCP Clients</strong></summary>

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"]
    }
  }
}
</details>

Testing Your Setup

# Test connection by checking health endpoint
curl http://localhost:8000/health

Supported Redmine Plugins

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.

PluginVendorEnv varWhat it adds
AgileRedmineUPREDMINE_AGILE_ENABLEDget_redmine_issue returns story_points, agile_sprint_id, agile_position; update_redmine_issue accepts story_points
ChecklistsRedmineUP (Pro)REDMINE_CHECKLISTS_ENABLED3 tools: get_checklist, create_checklist_item, update_checklist_item
ProductsRedmineUPREDMINE_PRODUCTS_ENABLED1 tool: manage_product
CRMRedmineUPREDMINE_CRM_ENABLED1 tool: manage_contact
DMSFdanmunn (open source)REDMINE_DMSF_ENABLED1 tool: manage_document
Additional TagsAlphaNodes (open source)REDMINE_TAGS_ENABLEDget_redmine_issue returns a tags array; create_redmine_issue / update_redmine_issue accept tag_list

Agile and Additional Tags add fields to tools you already have, so they register no new tools. The other four bring their own, which appear in tools/list either way but return a feature-disabled error until you set the flag. Tags also needs the view_issue_tags, create_issue_tags, and edit_issue_tags permissions on the Redmine server.

Available Tools

This MCP server provides 51 tools for interacting with Redmine (plus 1 operator tool exposed by REDMINE_MCP_EXPOSE_ADMIN_TOOLS=true, for a maximum of 52). 6 of the 51 are plugin-gated and activate via env vars. For full documentation of every tool, see the Tool Reference.

Core tools (45, always available): Project Management (9), Issue Operations (13), Time Tracking (4), Discovery / Enumeration (7), Search & Wiki (2), File Operations (4), Gantt (1), Interactive Apps (4), Meta (1).

Plugin-gated tools (6, opt in via env var): Checklists (3), Products (1), Contacts / CRM (1), Documents / DMSF (1). Each requires the matching Redmine plugin installed and its env flag set; they appear in tools/list either way but return a feature-disabled error until enabled.

Operator tools (1, admin-gated): cleanup_attachment_files, registered only when REDMINE_MCP_EXPOSE_ADMIN_TOOLS=true.

<details> <summary><strong>Full tool list with descriptions</strong></summary>

Core tools (45, always available)

These tools require only a Redmine instance and credentials, with no extra plugins or feature flags.

  • Project Management (9 tools)

  • Issue Operations (13 tools)

    • get_redmine_issue - Retrieve detailed issue information (supports journal pagination, watchers, relations, children)
    • list_redmine_issues - List issues with flexible filtering (project, status, assignee, etc.)
    • search_redmine_issues - Search issues by text query
    • create_redmine_issue - Create new issues, with optional file attachments via the uploads parameter
    • update_redmine_issue - Update existing issues, with optional file attachments via the uploads parameter (combine with notes to attach files to a journal note)
    • delete_redmine_issue - Hard-delete an issue with required confirmation flags and a cascade-impact preview before irreversible deletion.
    • copy_issue - Duplicate an existing issue with optional field overrides
    • list_subtasks - List subtasks (child issues) of a given parent
    • get_private_notes - Retrieve private notes on an issue
    • manage_issue_relation - List, create, or delete issue relations
    • manage_issue_watcher - Add or remove a watcher on an issue
    • manage_issue_note - Edit a journal note's text or toggle its privacy
    • manage_issue_category - List, create, update, or delete issue categories
    • Note: get_redmine_issue can include custom_fields and update_redmine_issue can update custom fields by name (for example {"size": "S"}).
  • Time Tracking (4 tools)

  • Discovery / Enumeration (7 tools): help LLMs find valid IDs before calling create/update tools

  • Search & Wiki (2 tools)

  • File Operations (4 tools)

    • list_files - List files uploaded to a project's Files section
    • upload_file - Upload a new file to a project (from base64 content, a URL, or a server-side file_path), optionally tied to a version
    • delete_file - Delete a file from a project
    • get_redmine_attachment - Download an attachment (works in both HTTP and stdio mode)
  • Gantt (1 tool)

    • get_gantt_chart - Retrieve project timeline data: issues with dates, dependencies, and milestones
  • Interactive Apps (4 tools): render live UI in the chat via the MCP Apps extension (requires a client that supports it)

    • show_triage_board - Render a project's issues as an interactive Kanban board grouped by status, with drag-to-change-status write-back
    • get_triage_board_data - Board data source backing the board's Refresh action
    • show_project_dashboard - Render a live project snapshot (open/closed, overdue, due this week, open-by-priority, recent activity) as an interactive dashboard, with click-through drill-ins to matching issue lists
    • get_project_dashboard_data - App-only data source backing the dashboard's Refresh action
  • Meta (1 tool)

    • get_mcp_server_info - Report server version, auth mode, read-only state, the authenticated user (current_user), and which plugin-gated tool families are enabled. Use to detect deployment lag before relying on a recently-shipped fix, or to confirm who assigned_to_id="me" resolves to.

Plugin-gated tools (6, opt in via env var)

These tools require a corresponding Redmine plugin installed on the server and the matching environment variable set to true on the MCP server. They appear in tools/list either way, but return a feature-disabled error until their flag is set.

Operator tools (1, admin-gated)

Hidden from tools/list by default. Set REDMINE_MCP_EXPOSE_ADMIN_TOOLS=true to register them on the MCP surface. The underlying background tasks run regardless of this flag; exposing them only adds the option to drive them through MCP.

  • cleanup_attachment_files - Manually trigger cleanup of expired attachment files (the background cleanup task runs automatically regardless)
</details>

Docker Deployment

Quick Start with Docker

# Configure environment
cp .env.docker.example .env.docker
# Edit .env.docker with your Redmine settings

# Run with docker-compose
docker-compose up --build

# Or run directly
docker build -t redmine-mcp-server .
docker run -p 8000:8000 --env-file .env.docker redmine-mcp-server

Use the Published Image

Prebuilt multi-architecture images (linux/amd64, linux/arm64) are published to the GitHub Container Registry on each release, so you can run the server without building it yourself:

docker pull ghcr.io/jztan/redmine-mcp-server:latest
docker run -p 8000:8000 --env-file .env.docker ghcr.io/jztan/redmine-mcp-server:latest

Pin to an exact version (e.g. ghcr.io/jztan/redmine-mcp-server:2.2.0) or track a minor series (e.g. :2.2). Published images are available starting from the next release.

Production Deployment

Use the automated deployment script:

chmod +x deploy.sh
./deploy.sh

Troubleshooting

If you run into any issues, checkout our troubleshooting guide.

Roadmap

See the roadmap for planned features and future development.

Contributing

Contributions are welcome! Please see our contributing guide for details.

Contributors

Thank you to everyone who has helped improve this project through code, reviews, testing, and feature requests:

<!-- contributors:start -->

@sebastianelsner · @mihajlovicjj · @timcomport · @aadnehovda · @Vitexus · @Bricklou · @martindglaser · @LaurensRietveld · @pdostal · @stevehollis-orderflow · @knasiotis · @azelcs · @fionnb · @goizper

<!-- contributors:end --> <a href="https://github.com/jztan/redmine-mcp-server/graphs/contributors"> <img src="https://contrib.rocks/image?repo=jztan/redmine-mcp-server" alt="Contributors" /> </a>

Per-release contributor credits are listed in the Changelog.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Blog posts

The story behind the releases. Building this server keeps surprising me: full API access that turned out to be a mistake, 69 tools that had to become 43, an OAuth scope bug that only surfaced when a contributor ran the flow against a real Redmine 6 instance. Plenty of the sharpest lessons arrived from other people's deployments rather than mine. I write about that thinking in The Dispatch. Come along if that's your kind of thing.

Background, design notes, and postmortems from building this server:

Getting started

Tool design & architecture

Production

Related MCP servers

Surgical PDF access for AI agents: hybrid search, selective reading, tables, OCR, and corpus tools without context overflow.

116
Python
MIT
View repository →

Offline MCP server for local Qt 4.8, Qt 5, and Qt 6 documentation with full-text search.

3
Python
MIT
View repository →

JPL-referenced Human Design charts for AI agents: bodygraph, transit, composite, Penta, DreamRave.

Model Context Protocol server that lets LLMs collaboratively drive tmux

0
JavaScript
AGPL-3.0
View repository →

Creates compliant French e-invoices locally: Factur-X PDF/A-3 with EN 16931 CII XML, legal numbering

5
Go
AGPL-3.0
View repository →

Inspect, validate, edit, and revert Power Automate flows with AI agents using browser-backed auth and local snapshots.

22
TypeScript
MIT
View repository →