redmine-local-mcp
Allows interaction with a Redmine REST API server, providing tools for listing projects, searching and retrieving issues, and optionally creating issues and adding comments.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@redmine-local-mcpshow my assigned tickets"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
redmine-local-mcp
Redmine REST API を MCP ツールとして公開するローカル STDIO サーバーです。 Codex CLI / GitHub Copilot CLI などの MCP クライアントから、Redmine のプロジェクトやチケットを参照できます。
方針
Redmine は直接クラウド側へ公開せず、開発者 PC 上のローカル MCP サーバーから REST API に接続します。
API キーは専用ユーザーの最小権限キーを使います。
初期状態では読み取り中心です。書き込み系の
create_issue/add_issue_noteはREDMINE_ENABLE_WRITE=trueのときだけ動きます。
Related MCP server: Redmine MCP Server
機能
プロジェクト一覧の取得
チケット検索、チケット詳細取得、自分の担当チケット取得
明示的に有効化した場合のみ、チケット作成とコメント追加
セットアップ
git clone https://github.com/<owner>/redmine-local-mcp.git
cd redmine-local-mcp
npm install
npm run build.env.example を参考に、MCP クライアント側の環境変数として次の値を渡してください。
.env はローカル開発用で、Git にコミットしないでください。
REDMINE_URL=https://redmine.example.local
REDMINE_API_KEY=xxxxxxxxxxxxxxxx
REDMINE_ENABLE_WRITE=falseMCP クライアント設定
以下の例では、このリポジトリを /path/to/redmine-local-mcp に clone したものとして書いています。
実際の環境に合わせてパスを置き換えてください。
Codex CLI
[mcp_servers.redmine]
command = "node"
args = ["/path/to/redmine-local-mcp/dist/index.js"]
default_tools_approval_mode = "prompt"
[mcp_servers.redmine.env]
REDMINE_URL = "https://redmine.example.local"
REDMINE_API_KEY = "xxxxxxxxxxxxxxxx"
REDMINE_ENABLE_WRITE = "false"GitHub Copilot CLI
copilot mcp add redmine \
--env REDMINE_URL=https://redmine.example.local \
--env REDMINE_API_KEY=xxxxxxxxxxxxxxxx \
--env REDMINE_ENABLE_WRITE=false \
-- node /path/to/redmine-local-mcp/dist/index.jsAgent Skill
Redmine MCP の使い方や安全ルールをまとめた Agent Skill を同梱しています。 このリポジトリでは Skill の原本だけを管理し、使う環境のユーザープロファイルへ手動でコピーします。
Skill 本体:
agent-skills/redmine-workflows/SKILL.mdGitHub Copilot の個人用 Skill として使う場合のコピー例:
New-Item -ItemType Directory -Force "$env:USERPROFILE\.copilot\skills\redmine-workflows"
Copy-Item -Recurse -Force .\agent-skills\redmine-workflows\* "$env:USERPROFILE\.copilot\skills\redmine-workflows\".agents 配下で Skill を管理する環境では、コピー先を次のように置き換えます。
New-Item -ItemType Directory -Force "$env:USERPROFILE\.agents\skills\redmine-workflows"
Copy-Item -Recurse -Force .\agent-skills\redmine-workflows\* "$env:USERPROFILE\.agents\skills\redmine-workflows\"この Skill には API キーや Redmine URL は含めません。接続情報は MCP クライアント設定の環境変数で渡してください。
提供ツール
list_projects: プロジェクト一覧を取得します。search_issues: チケットを検索します。get_issue: チケット詳細を取得します。get_my_issues: 自分に割り当てられたチケットを取得します。create_issue: チケットを作成します。REDMINE_ENABLE_WRITE=trueが必要です。add_issue_note: チケットにコメントを追加します。REDMINE_ENABLE_WRITE=trueが必要です。
設計メモ
設計判断や拡張時の注意点は docs/code-guide.md にまとめています。
主なファイル:
src/index.ts: MCPツールを登録する入口です。src/redmineClient.ts: Redmine REST APIを呼び出す処理です。src/config.ts: 環境変数を読み込む処理です。tests/: 実Redmineへ接続せずに動作を確認するテストです。
書き込み系を有効にする
チケット作成やコメント追加を行う場合は、環境変数を次のように設定します。
REDMINE_ENABLE_WRITE=truecreate_issue の最小入力例:
{
"project_id": "sample-project",
"subject": "ログイン画面のエラーを確認する",
"description": "再現手順と期待結果を整理する。"
}add_issue_note の入力例:
{
"id": 1234,
"notes": "調査を開始しました。再現条件を確認中です。"
}開発
npm run typecheck
npm run build
npm testテストは実 Redmine へ接続せず、HTTP 呼び出しをモックします。
セキュリティ
REDMINE_API_KEYは専用ユーザーの最小権限キーを使ってください。.envや実 URL を含む MCP クライアント設定はコミットしないでください。書き込みツールは
REDMINE_ENABLE_WRITE=trueを明示した場合だけ有効です。脆弱性や秘密情報の混入を見つけた場合は、公開 issue ではなくリポジトリ管理者へ非公開で連絡してください。
公開前チェックリスト
.envが Git 管理対象になっていないことを確認する。README 内の
<owner>と/path/to/redmine-local-mcpを公開先に合わせる。Agent Skill に実 Redmine の URL、API キー、社内固有の非公開ルールが含まれていないことを確認する。
実 Redmine の URL、API キー、社内プロジェクト名が含まれていないことを確認する。
npm run typecheck、npm run build、npm testが通ることを確認する。
ライセンス
MIT License
Available Tools
6 toolsadd_issue_noteAdd Redmine Issue NoteB
Add a note/comment to a Redmine issue. Requires REDMINE_ENABLE_WRITE=true.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| notes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of disclosing behavior. It does disclose that the tool requires REDMINE_ENABLE_WRITE=true, which indicates a write operation. However, it does not mention side effects, error handling, or idempotency, leaving significant gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence. It includes the essential purpose and a critical prerequisite with no unnecessary words, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with only two clearly named parameters, and the description covers the core action and a key environment requirement. However, it does not explain what happens after the operation (e.g., return value, error responses), nor does it clarify whether notes are appended or replaced. For a write operation, this leaves some ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it does not. The parameter names 'id' and 'notes' are somewhat self-explanatory, and the schema provides constraints, but the description adds no explicit meaning about what these parameters represent or how they should be used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Add') and a specific resource ('a note/comment to a Redmine issue'). It distinguishes itself from the sibling tool create_issue by focusing on adding a note to an existing issue rather than creating a new one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus alternatives like create_issue. It mentions the REDMINE_ENABLE_WRITE requirement but does not explain the context in which this tool should be selected, nor does it state any exclusions or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_issueCreate Redmine IssueB
Create a Redmine issue. Requires REDMINE_ENABLE_WRITE=true.
| Name | Required | Description | Default |
|---|---|---|---|
| subject | Yes | ||
| due_date | No | ||
| status_id | No | ||
| done_ratio | No | ||
| project_id | Yes | ||
| start_date | No | ||
| tracker_id | No | ||
| description | No | ||
| priority_id | No | ||
| custom_fields | No | ||
| assigned_to_id | No | ||
| estimated_hours | No | ||
| parent_issue_id | No | ||
| fixed_version_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of disclosing behavior. It does disclose the write requirement (REDMINE_ENABLE_WRITE=true), which signals a mutating operation. However, it does not explain side effects, return values, or failure modes, leaving significant transparency gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states both the purpose and the critical prerequisite. It is minimal and avoids unnecessary elaboration, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (14 parameters, no output schema, no annotations), the description is far from complete. It omits expected return values, error semantics, parameter formatting, and context on how the write flag interacts with functionality, leaving the agent under-informed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for 14 parameters, and the description provides no parameter-level information. The agent must infer semantics solely from parameter names like 'project_id' and 'subject', which is insufficient for correct invocation of a complex create operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Create' and the resource 'Redmine issue', which is specific and distinguishes it from sibling tools like list_projects, search_issues, and add_issue_note. The verb+resource structure is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a prerequisite (REDMINE_ENABLE_WRITE=true) but does not explicitly state when to use this tool versus alternatives. Usage is implied by the tool name and the sibling context, but no when-not or alternative guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issueGet Redmine IssueA
Get a Redmine issue by id, optionally including journals, attachments, relations, children, or watchers.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| include | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It implies a read-only operation through the verb 'get' and lists optional data includes, but does not mention side effects, authentication needs, or limitations. This is adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the primary action and resource, then succinctly lists optional additions. Every word contributes to the meaning with no unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with 2 parameters and no output schema, the description covers the essential invocation details. It briefly mentions include functionality, but lacks any note on error handling or permissions. This is acceptable for a straightforward getter, though not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate for parameter meaning. It restates the include enum values and clarifies that id is the issue identifier, but it adds little beyond what the schema's enum names already imply. The meaning of each include option (e.g., what 'relations' entails) is not elaborated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action (get) on a specific resource (Redmine issue) identified by id. It naturally distinguishes from siblings like search_issues, which imply searching rather than direct retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys clear usage context by specifying retrieval by id and the option to include related data. However, it does not explicitly mention alternatives like search_issues or define when not to use this tool, so it lacks explicit exclusions or alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_issuesGet My Redmine IssuesB
Get issues assigned to the configured Redmine API user.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | updated_on:desc | |
| limit | No | ||
| offset | No | ||
| status_id | No | open | |
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for disclosing behavioral traits. It only states the basic action and does not mention sort ordering, pagination, status filtering, or that it returns a list. Without annotation support, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no redundancy or fluff. It is front-loaded and appropriately sized for a simple getter. It does not earn extra points for depth but is not under-specified to the point of tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, no annotations, and 5 parameters with no descriptions, the description needs to provide more context. It only explains what the tool does, not how to use the parameters or what to expect in the response. The tool is too complex (5 optional params) for such a minimal description to be fully adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description provides zero explanation of the 5 parameters. It does not clarify what sort, limit, offset, status_id, or project_id control beyond what the schema's types/defaults already show. The description completely fails to add value for parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb+resource+scope: 'Get issues assigned to the configured Redmine API user.' This distinguishes it from siblings like search_issues (broader search) and get_issue (specific issue). The wording is unambiguous and directly reflects the tool's name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving issues assigned to the configured user, providing clear context. However, it does not explicitly mention when not to use it or compare it to alternatives like search_issues. No exclusions or alternative guidance are given, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList Redmine ProjectsA
List projects visible to the configured Redmine API user.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. 'List' implies a read-only operation, and the scope is stated, but there is no explicit mention of no side effects, response format, or pagination behavior. It adds some context but not rich detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It communicates the essential purpose and scope clearly and efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with two optional parameters and no output schema, the description covers the core purpose and visibility scope. Combined with the schema's min/max/default values, an agent has enough to invoke it correctly, though it lacks explicit return format or pagination guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not mention the 'limit' or 'offset' parameters at all, and schema description coverage is 0%. The input schema provides basic type/default but no explanatory text. The description is of no help for understanding how to use or combine parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' and identifies the resource 'projects', with a clear scope of 'visible to the configured Redmine API user.' This distinguishes it from sibling tools, which are all issue-focused, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by specifying it lists projects visible to the user, implying use when needing to enumerate projects. It does not explicitly discuss when not to use or name alternatives, but since all siblings are issue tools, the usage boundary is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_issuesSearch Redmine IssuesA
Search Redmine issues by common filters. Optional text is applied client-side to subject and description.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | ||
| text | No | ||
| limit | No | ||
| offset | No | ||
| query_id | No | ||
| status_id | No | ||
| project_id | No | ||
| tracker_id | No | ||
| priority_id | No | ||
| assigned_to_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It discloses that text filtering is applied client-side to subject and description, which is a useful behavioral detail. However, it omits other important behaviors such as filter combination semantics, default sort, and pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loaded with the main purpose. Every word contributes; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters, no annotations, and no output schema, a two-sentence description is insufficient. It doesn't cover return format, filter behavior, or default settings, leaving significant ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only explains the 'text' parameter (client-side application to subject and description) and refers vaguely to 'common filters'. The remaining nine parameters (project_id, status_id, tracker_id, etc.) are left without semantic explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search'), names the resource ('Redmine issues'), and indicates the method ('by common filters'), clearly distinguishing it from sibling tools like get_issue or get_my_issues.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states a clear use case: searching Redmine issues with common filters. It doesn't explicitly exclude alternatives, but the context is sufficient for an agent to know when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
add_issue_note - First observed
create_issue - First observed
get_issue - First observed
get_my_issues - First observed
list_projects - First observed
search_issues
TDQS
Scored across 6 tools
Each tool targets a distinct resource and action: projects vs. issues, search vs. by-id, create vs. note. Even search_issues and get_my_issues are clearly differentiated by scope (all issues vs. assigned to the API user).
All tool names follow the consistent verb_noun pattern with lowercase and underscores: list_projects, search_issues, get_issue, get_my_issues, create_issue, add_issue_note. No mixed conventions or vague verbs.
Six tools is a well-scoped count for a Redmine MCP server, covering core read and write operations without superfluous entries. The set feels neither thin nor bloated.
The server covers project listing, issue search/retrieval, issue creation, and note addition, but lacks update and delete operations for issues. This is a notable gap for full lifecycle management, as agents cannot change status, assignee, or priority.
Maintenance
Related MCP Connectors
An MCP server that provides access to Testiny projects, test cases and test runs
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
MCP server for Linear project management and issue tracking
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceA stateless MCP server for Redmine that allows users to interact with issues, time entries, wiki, projects, and more via their own API keys.4MIT
- AlicenseBqualityDmaintenanceMCP server for Redmine project management, enabling tools for managing projects, issues, users, time entries, groups, memberships, versions, wiki, news, attachments, search, and Agile sprints via the Redmine REST API.8921 npm1MIT
- AlicenseCqualityAmaintenanceModel Context Protocol (MCP) server for Redmine that provides comprehensive access to the Redmine REST API. It allows you to operate Redmine from MCP clients such as Claude Desktop.90541 npm26MIT
- AlicenseBqualityBmaintenanceMCP server that provides access to the Redmine REST API, enabling issue tracking, project management, and more through natural language.268 npmMIT