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. Text cut by the limits stays readable at each part's localPath. |
| 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 | Read an issue's chronological journal events and status intervals. Long text is shortened; use journalId with getIssueJournal for full text, and nextOffset to read any remaining events. |
| getIssueTreeA | Explore one issue's parent chain and subtasks down to the requested depth. Root and ancestors are compact; use getIssue for full details or relations and getBlockerChain for blockers. |
| 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 a journal ID from getIssue or getIssueHistory when exact text is needed. |
| 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. |
| addIssueNoteA | Append a new journal note to one existing Redmine issue without changing its fields. This is non-idempotent: retrying can add a duplicate note, and existing journal entries cannot be edited. |
| attachFileToIssueA | Upload a readable server-local file and attach it to one existing Redmine issue. This is non-idempotent and retries may create duplicate attachments; getAttachment performs the reverse read/download flow. |
| createIssueA | Create a new Redmine issue in a known project with core or custom fields. This writes as the API-key user and is not idempotent; use updateIssue when the issue already exists. |
| updateIssueA | Modify only the supplied fields of one existing Redmine issue; omitted fields remain unchanged. Use addIssueNote for a comment-only change; this tool does not edit existing journal entries. |
| 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. |
| createTimeEntryA | Record logged hours for the API-key user against exactly one issue or project. This is non-idempotent and retries can duplicate time; use listTimeEntryActivities when an activity ID is needed. |
| 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. |
| createWikiPageA | Create a new Redmine wiki page with its complete initial text and optional parent. This writes as the API-key user and fails if the title already exists; use updateWikiPage for an existing page. |
| updateWikiPageA | Replace the complete text of one existing Redmine wiki page; this is not a patch or append operation. Pass the current version from getWikiPage for optimistic locking, and use createWikiPage if absent. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| incident-timeline | Chronological account of who did what and when on an issue. |
| incident-brief | Quick issue overview: metadata plus every attachment downloaded locally with a short preview. |
| incident-implementation | Implementation context of an issue: required behaviour, human notes, relevant attachments and linked changeset revisions. |
| issue-remaining-work | What is still unfinished on an issue: open subtasks and siblings, blockers, agreements in notes and implementation evidence. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 39 tools
Each tool targets a distinct resource and action, and descriptions explicitly cross-reference alternatives (e.g., listIssues vs searchIssues vs getMyIssues, getIssue vs getIssueHistory). The surface is large but boundaries are clearly documented, leaving little true ambiguity.
Consistent camelCase verb_noun pattern throughout (listIssues, getIssue, createWikiPage, searchAll). Minor 'My' variants (getMyIssues, getMyTimeEntries) remain predictable and readable.
39 tools is excessive for a single MCP server; many list* metadata tools and specialized read tools could be consolidated or dynamically discovered, increasing selection burden.
Issue tracking and analytics are well covered, but notable gaps exist: no delete operations for issues, wiki pages, or time entries; no update/delete for time entries; no create/update for projects or versions.