Skip to main content
Glama
NobuoTsukamoto

redmine-local-mcp

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_noteREDMINE_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=false

MCP クライアント設定

以下の例では、このリポジトリを /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.js

Agent Skill

Redmine MCP の使い方や安全ルールをまとめた Agent Skill を同梱しています。 このリポジトリでは Skill の原本だけを管理し、使う環境のユーザープロファイルへ手動でコピーします。

Skill 本体:

agent-skills/redmine-workflows/SKILL.md

GitHub 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=true

create_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 typechecknpm run buildnpm test が通ることを確認する。

ライセンス

MIT License

Available Tools

6 tools
add_issue_noteAdd Redmine Issue NoteB

Add a note/comment to a Redmine issue. Requires REDMINE_ENABLE_WRITE=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
notesYes

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
subjectYes
due_dateNo
status_idNo
done_ratioNo
project_idYes
start_dateNo
tracker_idNo
descriptionNo
priority_idNo
custom_fieldsNo
assigned_to_idNo
estimated_hoursNo
parent_issue_idNo
fixed_version_idNo

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
includeNo

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoupdated_on:desc
limitNo
offsetNo
status_idNoopen
project_idNo

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNo
textNo
limitNo
offsetNo
query_idNo
status_idNo
project_idNo
tracker_idNo
priority_idNo
assigned_to_idNo

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv0.1.0
    • First observedadd_issue_note
    • First observedcreate_issue
    • First observedget_issue
    • First observedget_my_issues
    • First observedlist_projects
    • First observedsearch_issues

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation5/5

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

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    A stateless MCP server for Redmine that allows users to interact with issues, time entries, wiki, projects, and more via their own API keys.
    4
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    MCP 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.
    89
    21 npm
    1
    MIT
  • A
    license
    C
    quality
    A
    maintenance
    Model 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.
    90
    541 npm
    26
    MIT