mcp redmine
Connects Claude Desktop to Redmine for seamless project and issue management, including searching, creating, updating, and tracking tasks using Redmine's API.
Connects Claude Desktop to Redmine for seamless project and issue management, including searching, creating, updating, and tracking tasks using Redmine's API.
Status: Works great and is in daily use without any known bugs.
Let Claude be your Redmine assistant! MCP Redmine connects Claude Desktop to your Redmine instance, allowing it to:
Uses httpx for API requests and integrates with the Redmine OpenAPI specification for comprehensive API coverage.
The openapi specification used is for redmine 5.0, tested on Redmine 6.0.3, but will likely work with older versions as well.
Returns a YAML string containing a list of path templates:
- /issues.json
- /projects.json
- /time_entries.json
...
redmine_paths_info
path_templates
(list of strings)Returns YAML string containing API specifications for the requested paths:
/issues.json:
get:
operationId: getIssues
parameters:
- $ref: '#/components/parameters/format'
...
redmine_request
path
(string): API endpoint path (e.g. '/issues.json')method
(string, optional): HTTP method to use (default: 'get')data
(object, optional): Dictionary for request body (for POST/PUT)params
(object, optional): Dictionary for query parametersReturns YAML string containing response status code, body and error message:
status_code: 200
body:
issues:
- id: 1
subject: "Fix login page"
...
error: ""
redmine_upload
file_path
(string): Fully qualified path to the file to uploaddescription
(string, optional): Optional description for the fileReturns YAML string with the same format as redmine_request, including upload token:
status_code: 201
body:
upload:
id: 7
token: "7.ed32257a2ab0f7526c0d72c32994c58b131bb2c0775f7aa84aae01ea8397ea54"
error: ""
redmine_download
attachment_id
(integer): The ID of the attachment to downloadsave_path
(string): Fully qualified path where the file should be savedfilename
(string, optional): Optional filename to use (determined automatically if not provided)status_code: 200
body:
saved_to: "/path/to/downloaded/file.pdf"
filename: "file.pdf"
error: ""
Add to your claude_desktop_config.json
:
{
"mcpServers": {
"redmine": {
"command": "uv",
"args": ["--directory", "/path/to/mcp-redmine", "run", "server.py"],
"env": {
"REDMINE_URL": "https://your-redmine-instance.example.com",
"REDMINE_API_KEY": "your-api-key",
"REDMINE_REQUEST_INSTRUCTIONS": "/path/to/instructions.md"
}
}
}
}
Environment Variables:
REDMINE_URL
: URL of your Redmine instance (required)REDMINE_API_KEY
: Your Redmine API key (required, see below for how to get it)REDMINE_REQUEST_INSTRUCTIONS
: Path to a file containing additional instructions for the redmine_request tool (optional)Clone repository:
git clone https://github.com/runekaagaard/mcp-redmine.git
Ensure you have uv
# Install uv if you haven't already
curl -LsSf https://astral.sh/uv/install.sh | sh
Add Redmine configuration to claude_desktop_config.json (see above)
Let's create a new bug report in the "Website" project:
1. Title: "Homepage not loading on mobile devices"
2. Description: "When accessing the homepage from iOS or Android devices, the loading spinner appears but the content never loads. This issue started after the last deployment."
3. Priority: High
4. Assign to: John Smith
Can you find all high priority issues in the "Website" project that are currently unassigned?
Please mark issue #123 as "In Progress" and add a comment: "I've started working on this issue. Expect it to be completed by Friday."
Log 3.5 hours against issue #456 for "Implementing user authentication" done today.
Contributions are warmly welcomed! Whether it's bug reports, feature requests, documentation improvements, or code contributions - all input is valuable. Feel free to:
The goal is to make Redmine project management with Claude even better, and your insights and contributions help achieve that.
This project builds on the excellent work of others:
Mozilla Public License Version 2.0
[
{
"description": "nMake a request to the Redmine APInnArgs:n path: API endpoint path (e.g. '/issues.json')n method: HTTP method to use (default: 'get')n data: Dictionary for request body (for POST/PUT)n params: Dictionary for query parametersnnReturns:n str: YAML string containing response status code, body and error messagen",
"inputSchema": {
"properties": {
"data": {
"default": {
"path": "uv.lock",
"type": "blob"
},
"title": "Data",
"type": "object"
},
"method": {
"default": "get",
"title": "Method",
"type": "string"
},
"params": {
"default": {
"path": "uv.lock",
"type": "blob"
},
"title": "Params",
"type": "object"
},
"path": {
"title": "Path",
"type": "string"
}
},
"required": [
"path"
],
"title": "redmine_requestArguments",
"type": "object"
},
"name": "redmine_request"
},
{
"description": "Return a list of available API paths from OpenAPI specnnRetrieves all endpoint paths defined in the Redmine OpenAPI specification. Remember that you can use thenredmine_paths_info tool to get the full specfication for a path.nnReturns:n str: YAML string containing a list of path templates (e.g. '/issues.json')n",
"inputSchema": {
"properties": {},
"title": "redmine_paths_listArguments",
"type": "object"
},
"name": "redmine_paths_list"
},
{
"description": "Get full path information for given path templatesnnArgs:n path_templates: List of path templates (e.g. ['/issues.json', '/projects.json'])n nReturns:n str: YAML string containing API specifications for the requested pathsn",
"inputSchema": {
"properties": {
"path_templates": {
"items": {},
"title": "Path Templates",
"type": "array"
}
},
"required": [
"path_templates"
],
"title": "redmine_paths_infoArguments",
"type": "object"
},
"name": "redmine_paths_info"
},
{
"description": "nUpload a file to Redmine and get a token for attachmentnnArgs:n file_path: Fully qualified path to the file to uploadn description: Optional description for the filen nReturns:n str: YAML string containing response status code, body and error messagen The body contains the attachment tokenn",
"inputSchema": {
"properties": {
"description": {
"default": {
"path": "uv.lock",
"type": "blob"
},
"title": "Description",
"type": "string"
},
"file_path": {
"title": "File Path",
"type": "string"
}
},
"required": [
"file_path"
],
"title": "redmine_uploadArguments",
"type": "object"
},
"name": "redmine_upload"
},
{
"description": "nDownload an attachment from Redmine and save it to a local filennArgs:n attachment_id: The ID of the attachment to downloadn save_path: Fully qualified path where the file should be saved ton filename: Optional filename to use for the attachment. If not provided, n will be determined from attachment data or URLn nReturns:n str: YAML string containing download status, file path, and any error messagesn",
"inputSchema": {
"properties": {
"attachment_id": {
"title": "Attachment Id",
"type": "integer"
},
"filename": {
"default": {
"path": "uv.lock",
"type": "blob"
},
"title": "Filename",
"type": "string"
},
"save_path": {
"title": "Save Path",
"type": "string"
}
},
"required": [
"attachment_id",
"save_path"
],
"title": "redmine_downloadArguments",
"type": "object"
},
"name": "redmine_download"
}
]