redmine-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| REDMINE_URL | No | Base URL of the Redmine instance, e.g. https://redmine.example.com | |
| REDMINE_API_KEY | No | Redmine API key of the user the server acts as (My account -> API access key) | |
| REDMINE_MCP_WRITE_ENABLED | No | Set to true to also expose the write tools; default false |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"subscribe": false,
"listChanged": true
} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| getAttachmentA | Retrieve and inspect one known issue attachment by downloading it to the server's local snapshot and extracting text from supported documents or archives. Use getIssue to discover attachment IDs; images and unsupported binaries return metadata and a local path without extracted text. |
| getBlockerChainA | Trace only blocks/blocked_by relations recursively in both directions, returning the full upstream and downstream blocking dependency chains. Use getIssueTree for parent/subtask hierarchy and other direct relation types. |
| getStaleIssuesA | Identify neglected open issues in one project by last-update age, ordered most stale first. Use listIssues for general field or status filters; this tool is for inactivity triage. |
| getIssueHistoryA | Build an interpreted change-history timeline for one issue, including field changes, notes and time aggregated per status. Use for history or status-duration analysis; getIssue returns the full issue context and journals instead. |
| getIssueTreeA | Explore structural context around one known issue: its parent chain to the root, subtasks down to the requested depth and direct relations. Use getBlockerChain for recursively traced blockers, or getIssue when only the single issue's full details are needed. |
| getIssueA | Retrieve complete context for one known issue ID: core and custom fields, subtasks, direct relations, journals, attachments and linked changesets, with focus modes controlling compression. Use getIssueTree for recursive structure, getIssueJournal for a journal omitted or shortened by compression, or getAttachment for file content. |
| getIssueJournalA | Retrieve one known issue journal entry in full, without response compression. Use after getIssue when its compression notes report a dropped or shortened journal and provide the journal ID. |
| getMyIssuesA | Browse issues assigned to the currently authenticated API-key user without first resolving their user ID. Use getUserWorkload for aggregated workload metrics or listIssues for another assignee. |
| listIssuesA | Browse issue summaries with structured Redmine filters, saved queries, custom-field filters, sorting and pagination. Use searchIssues when only free text is known, or getIssue for one known issue's complete context. |
| searchIssuesA | Find issue summaries by full-text query, optionally within one project. Use listIssues for exact field, saved-query or custom-field filtering, then getIssue to inspect a selected result. |
| getProjectA | Inspect one known project's configuration and metadata, including description, trackers and enabled modules. Use getProjectSummary for aggregated issue metrics, listProjectMembers for people or listVersions for milestones. |
| listProjectMembersA | Discover the users and groups that belong to one project, their IDs and assigned roles. Use when choosing or interpreting assignees; getUserWorkload analyzes a user's issues rather than membership. |
| listProjectsA | Discover accessible Redmine projects and their valid identifiers before project-scoped operations when the target project is unknown. Returns project summaries; use getProject for one project's details. |
| listVersionsA | Discover versions/milestones of one project and the IDs used by issue filters and release analytics. Returns milestone metadata, not issue scope or risk; use getVersionChangelog or getReleaseRisks for those. |
| listIssueCategoriesA | Discover issue category IDs and names configured for one known project. Reuse the IDs as categoryId in createIssue or updateIssue. |
| listPrioritiesA | Discover valid issue priority IDs and names before filtering, creating or updating issues. Reuse the IDs as priorityId in listIssues, createIssue or updateIssue. |
| listQueriesA | Discover saved Redmine issue queries (stored filters), especially filters involving custom fields. Returns query IDs and names rather than issue results; pass a selected queryId to listIssues. |
| listStatusesA | Discover valid Redmine issue status IDs and names for structured issue filtering or mutation. Reuse the IDs as statusId in listIssues, createIssue or updateIssue. |
| listTimeEntryActivitiesA | Discover valid time-entry activity IDs and names for interpreting logged hours or creating a time entry. Reuse an ID as activityId in createTimeEntry when the default activity is unsuitable. |
| listTrackersA | Discover valid tracker (issue type) IDs and names before filtering, creating or updating issues. Reuse the IDs as trackerId in listIssues, createIssue or updateIssue. |
| compareVersionsA | Compare the issue scope and completion of two known versions/milestones in one project. Returns issues unique to each, shared issues and closure percentages; use listVersions to discover IDs. |
| getProjectSummaryA | Summarize one project's issue health, optionally scoped to a milestone: complete open/closed totals plus status, tracker, priority and assignee distributions, overdue work and estimated versus spent hours for the analyzed open-issue set. Use listIssues when issue records are needed instead of aggregates. |
| getReleaseRisksA | Assess readiness risks for one known version/milestone: open blockers, overdue work, high-priority unresolved issues and unassigned tasks, with a risk score. Use getVersionChangelog for the milestone issue breakdown rather than risk triage. |
| getUserWorkloadA | Analyze one user's open-issue workload by project and priority, including overdue count, estimated versus spent hours and top issues; omitting userId selects the API-key user. This returns aggregates, not issue records; use getMyIssues for the current user or listIssues for a specified user. |
| getVersionChangelogA | Summarize the issue scope of one known version/milestone as open and closed counts with issues grouped by tracker. Use getReleaseRisks for readiness risks or listVersions to discover the version ID. |
| searchAllA | Search by free text across mixed Redmine content such as issues, wiki pages, news, documents, changesets, messages and projects. Use searchIssues for richer issue-only results or searchWikiPages for wiki-only discovery. |
| getMyTimeEntriesA | Browse actual time-entry records logged by the currently authenticated API-key user without first resolving their user ID. Use listTimeEntries for another user or broader administrative filtering. |
| listTimeEntriesA | Browse actual Redmine time-entry records using project, issue, user and date-range filters. Use getMyTimeEntries for the API-key user without looking up an ID; getUserWorkload returns aggregates instead. |
| getCurrentUserA | Retrieve the identity and user ID of the currently authenticated API-key user. Use the ID in assignee/user filters; getMyIssues, getMyTimeEntries and the default getUserWorkload do not require it. |
| getWikiPageA | Read the complete markup content and current version of one known project wiki page. Use listWikiPages or searchWikiPages to discover its title; the returned version is required by updateWikiPage. |
| listWikiPagesA | Discover wiki page titles in one known project without loading every page body. Use getWikiPage to read a selected title or searchWikiPages when only content terms are known. |
| searchWikiPagesA | Find project wiki pages by full-text content query, optionally across all accessible projects. Use getWikiPage to read a selected result or searchAll when non-wiki content should also match. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| incident-timeline | Build a chronological account of who did what and when for a Redmine incident. |
| incident-brief | Quick reconnaissance of a Redmine incident: issue metadata plus all attachments downloaded locally with short text previews. Use this when you need a fast situational read. |
| incident-implementation | Review the implementation context of a Redmine incident: required behaviour, human notes, attachment context, and linked changeset revisions. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 32 tools
Every tool targets a distinct resource or analytical use case. Overlapping areas such as getIssue versus getIssueTree, searchIssues versus searchAll, and version summary versus release risk are clearly differentiated by their descriptions.
All tool names follow a consistent lower_snake_case verb_noun pattern using get, list, search, or compare. There are no mixed casing conventions or vague generic verbs.
With 32 tools, this exceeds the 25+ threshold and feels heavy even for a broad Redmine integration. Several metadata-discovery tools such as listPriorities, listStatuses, listTrackers, and listTimeEntryActivities could be consolidated or grouped.
The read and analytics surface is extensive, but the tool descriptions repeatedly reference createIssue, updateIssue, createTimeEntry, and updateWikiPage, none of which are actually exposed. This creates significant dead ends and leaves the server without any write lifecycle coverage.