redmine-mcp
by yenpu
README.md
# redmine-mcp
MCP Server for the [Redmine](https://www.redmine.org/) REST API using Streamable HTTP transport.
Built with the [Model Context Protocol SDK](https://github.com/modelcontextprotocol/typescript-sdk), this server exposes 63 tools that let any MCP-compatible client (Claude Desktop, MCP Inspector, etc.) interact with a Redmine instance.
## Features
- **63 tools** covering issues, projects, users, time entries, wiki pages, attachments, and more
- **Streamable HTTP transport** — single `/mcp` endpoint (POST / GET / DELETE)
- **Per-client authentication** — each client supplies its own Redmine API key via `X-Redmine-API-Key` header
- **Session management** with configurable TTL and automatic eviction
- **Security** — Helmet headers, rate limiting, API key validation
## Prerequisites
- Node.js >= 18
- A Redmine instance with the REST API enabled
## Setup
```bash
git clone https://github.com/user/redmine-mcp.git
cd redmine-mcp
npm install
```
Copy the example environment file and fill in your values:
```bash
cp .env.example .env
```
### Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
| `REDMINE_BASE_URL` | Yes | — | URL of your Redmine instance |
| `PORT` | No | `3000` | Server port |
| `HOST` | No | `127.0.0.1` | Server host |
| `SESSION_TTL_MS` | No | `3600000` | Session TTL in milliseconds (1 hour) |
| `LOG_LEVEL` | No | `info` | `debug` \| `info` \| `warn` \| `error` |
> **Note:** There is no `REDMINE_API_KEY` in the server config — each MCP client supplies its own key via the `X-Redmine-API-Key` header.
## Usage
```bash
# Build
npm run build
# Start (production)
npm start
# Development (watch mode)
npm run dev
```
### Client Configuration
Add the server to your MCP client config (e.g. Claude Desktop `claude_desktop_config.json`):
```json
{
"mcpServers": {
"redmine": {
"type": "streamable-http",
"url": "http://localhost:3000/mcp",
"headers": {
"X-Redmine-API-Key": "<your-redmine-api-key>"
}
}
}
}
```
## Available Tools
### Issues (7)
`list_issues` · `get_issue` · `create_issue` · `update_issue` · `delete_issue` · `add_issue_watcher` · `remove_issue_watcher`
### Projects (7)
`list_projects` · `get_project` · `create_project` · `update_project` · `archive_project` · `unarchive_project` · `delete_project`
### Users (6)
`list_users` · `get_user` · `get_current_user` · `create_user` · `update_user` · `delete_user`
### Groups (7)
`list_groups` · `get_group` · `create_group` · `update_group` · `delete_group` · `add_group_member` · `remove_group_member`
### Time Entries (5)
`list_time_entries` · `get_time_entry` · `create_time_entry` · `update_time_entry` · `delete_time_entry`
### Versions (5)
`list_versions` · `get_version` · `create_version` · `update_version` · `delete_version`
### Memberships (5)
`list_memberships` · `get_membership` · `add_membership` · `update_membership` · `remove_membership`
### Wiki Pages (5)
`list_wiki_pages` · `get_wiki_page` · `create_wiki_page` · `update_wiki_page` · `delete_wiki_page`
### Issue Relations (4)
`list_issue_relations` · `create_issue_relation` · `delete_issue_relation` · `get_relation_type`
### Issue Categories (4)
`list_issue_categories` · `get_category` · `create_category` · `update_category` · `delete_category`
### Attachments (3)
`upload_file` · `get_attachment` · `delete_attachment`
### Other
`list_custom_fields` · `list_issue_statuses` · `list_trackers`
## Project Structure
```
src/
├── index.ts # Express server, session management
├── config.ts # Environment validation (zod)
├── client/
│ ├── redmine-client.ts # Axios wrapper for Redmine API
│ └── types.ts # Redmine API response types
├── middleware/ # Auth & session guards
├── tools/
│ ├── index.ts # Tool aggregator
│ ├── issues.ts
│ ├── projects.ts
│ └── ... # 14 tool modules
└── utils/
└── errors.ts # Error handling utilities
```
## License
ISCThis server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues