Skip to main content
Glama
redmine-mcp
by devyhan

redmine-mcp

MCP server connecting Redmine to AI assistants: issues, projects, users, time tracking, wiki, files, search, and saved queries over the Redmine REST API.

Sign-in happens in the system browser via OAuth 2.0 (authorization code + PKCE, Redmine 6.1+), with an encrypted local token cache and silent refresh. Pre-6.1 servers use an API-key binding instead.

Install

npm install -g @devyhan/redmine-mcp

Or run without installing:

npx -y @devyhan/redmine-mcp --redmine-url https://redmine.example.com

Straight from GitHub (tracks the default branch instead of a release):

npx -y github:devyhan/redmine-mcp --redmine-url https://redmine.example.com

Node 22.23.4+, 24.22.1+, or 26.12.1+ required (October 2026 security floor; Node 20 and below are EOL and unpatched).

Related MCP server: Redmine MCP Server

Quick start

  1. Register an OAuth2 application in Redmine (Administration → OAuth2 Applications) with redirect URI http://127.0.0.1:<port>/callback and the permission scopes you need (see permissions below).

  2. Sign in once:

    redmine-mcp --redmine-url https://redmine.example.com \
      --client-id <ID> --client-secret <SECRET> login

    Pre-6.1 servers (or no browser): set REDMINE_MCP_API_KEY and skip login entirely, or redmine-mcp --redmine-url … login --api-key <KEY> once.

  3. Add to your MCP client:

    {
      "mcpServers": {
        "redmine": {
          "command": "redmine-mcp",
          "args": ["--redmine-url", "https://redmine.example.com"]
        }
      }
    }
  4. In the conversation, call session_status first. If no session is signed in, call auth_begin_login, finish in the browser, then auth_login_status.

Commands

Command

What it does

serve (default)

Speak MCP over stdio

login [--scopes a,b] [--full] [--api-key KEY]

Sign in

logout

Clear the cached session

status

Session, reachability, consent checklist

permissions

Tool groups and the scopes they need

Every flag has a REDMINE_MCP_* environment fallback; flags win. See redmine-mcp --help and configuration.

Tools

9 groups, 55 tools (44 in the personal preset; admin needs --org-mode):

Group

Tools

issues

list, get, create, update, add_note, delete, list/create/delete_relation

projects

list, get, create, update, list_memberships, add/update/remove_member, list_categories

users

get_current, get, list, update_current

time

list_entries, log, update_entry, delete_entry, list_activities

wiki

list_pages, get_page, save_page, delete_page

files

get_attachment, download, upload, list_project_files, list_documents

search

query

queries

list, run

admin (--org-mode)

list_trackers/statuses/priorities/roles/groups/custom_fields/news, list/create/update/delete_version

generic (always on)

auth_begin_login, auth_login_status, session_status, redmine_list_permissions, redmine_request

Full reference: tools. Small-context clients: --discovery collapses the catalogue to discover_tools/call_tool plus the session tools.

Docs

Development

npm install
npm test        # typecheck + node:test suite (offline, stubbed network)
npm run contract  # live drift check against a Redmine (needs REDMINE_MCP_URL + creds)

License

MIT

Available Tools

44 tools
auth_begin_loginBegin browser sign-inA
Read-onlyIdempotent

Starts a Redmine OAuth2 sign-in in the system browser and returns immediately. Ask the user to finish there, then call auth_login_status. Never ask for credentials, an API key, or an authorization code in the conversation.

Inputs: scopes.

auth_login_statusCheck sign-in statusA
Read-onlyIdempotent

Reports where the background browser sign-in has got to: pending, signed in, or failed with the fix. Never returns a token.

Inputs: no named parameters.

files_downloadDownload a fileA
Read-onlyIdempotent

Downloads an attachment and returns base64 bytes plus metadata. Text files come back decoded as well. Refuses files over maxBytes with metadata only.

Inputs: id (required), maxBytes.

files_get_attachmentGet attachment metadataA
Read-onlyIdempotent

Returns one attachment metadata (filename, size, content type, download URL).

Inputs: id (required).

files_list_documentsList a project's documentsA
Read-onlyIdempotent

Lists the documents of a project's Documents module. Needs Redmine 7.1+.

Inputs: project_id (required).

files_list_project_filesList a project's filesC
Read-onlyIdempotent

Lists the files attached to a project's Files module.

Inputs: project_id (required).

files_uploadUpload a fileA

Uploads raw bytes and returns an upload token. Reference it from issues_create or issues_update via uploads: [{token, filename}]. Tokens expire with the session.

Inputs: filename (required), content_base64 (required), content_type.

issues_add_noteAdd an issue noteA

Appends a journal note to an issue without changing anything else.

Inputs: id (required), notes (required), private_notes.

issues_createCreate an issueB

Creates an issue in a project. Returns the created issue (with its id).

Inputs: subject (required), project_id (required), uploads, due_date, +13 more.

issues_create_relationCreate an issue relationC

Links two issues (relates, blocks, duplicates, precedes, …).

Inputs: issue_id (required), issue_to_id (required), delay, relation_type.

issues_deleteDelete an issueB
Destructive

Deletes an issue. This cannot be undone.

Inputs: id (required).

issues_delete_relationDelete an issue relationB
Destructive

Removes an issue relation by its relation id.

Inputs: id (required).

issues_getGet an issueA
Read-onlyIdempotent

Returns one issue by id, with optional associated data via include. A 403 means the issue sits in a project you cannot see or is private to someone else — call users_my_access to list what is visible instead of retrying the id.

Inputs: id (required), include. Returns: object

issues_listList issuesA
Read-onlyIdempotent

Lists issues with Redmine filters (project, tracker, status, assignee, saved query). Returns the page plus total_count; pass offset to walk further pages.

Inputs: sort, limit, offset, include, +6 more. Returns: issues, total_count

issues_list_relationsList issue relationsC
Read-onlyIdempotent

Lists the relations (blocks, duplicates, …) of an issue.

Inputs: issue_id (required).

issues_updateUpdate an issueB
Idempotent

Updates issue attributes; only the fields passed change. Pass notes to append a journal entry with the update.

Inputs: id (required), notes, subject, uploads, +13 more.

projects_add_memberAdd a project memberC
Idempotent

Adds a user to a project with the given roles.

Inputs: user_id (required), role_ids (required), project_id (required).

projects_createCreate a projectC

Creates a project. Returns the created project (with its id).

Inputs: name (required), identifier (required), homepage, is_public, +5 more.

projects_getGet a projectB
Read-onlyIdempotent

Returns one project by id or identifier, with optional associated data.

Inputs: id (required), include.

projects_listList projectsA
Read-onlyIdempotent

Lists visible projects. Returns the page plus total_count.

Inputs: limit, offset, include. Returns: projects, total_count

projects_list_categoriesList issue categoriesB
Read-onlyIdempotent

Lists the issue categories of a project with their ids and assignees.

Inputs: project_id (required).

projects_list_membershipsList project membershipsB
Read-onlyIdempotent

Lists the members of a project with their roles.

Inputs: project_id (required), limit, offset.

projects_remove_memberRemove a project memberB

Removes a project membership by its membership id.

Inputs: id (required).

projects_updateUpdate a projectC
Idempotent

Updates project attributes; only the fields passed change.

Inputs: id (required), name, homepage, is_public, +3 more.

projects_update_memberUpdate a project membershipB
Idempotent

Sets the roles of a project membership by its membership id.

Inputs: id (required), role_ids (required).

queries_listList saved queriesB
Read-onlyIdempotent

Lists the visible saved issue queries with their filters and columns.

Inputs: limit, offset.

queries_runRun a saved queryB
Read-onlyIdempotent

Runs a saved issue query and returns the matching issues plus total_count.

Inputs: query_id (required), limit, offset.

redmine_list_permissionsList permissionsA
Read-onlyIdempotent

Lists the tool groups, the Redmine permission scopes each needs, and which groups are enabled. The first call when something returns 403.

Inputs: no named parameters.

redmine_requestRaw Redmine requestA
Destructive

Escape hatch: any Redmine REST path with the signed-in credential. GET by default; write methods need --allow-generic-write. Prefer the typed tools: they page, project, and explain errors.

Inputs: path (required), body, query, method.

search_queryGlobal searchB
Read-onlyIdempotent

Searches across issues, wiki pages, documents, files, and news. Returns ranked results with type, title, and excerpt.

Inputs: q (required), limit, scope, offset.

session_statusSession statusA
Read-onlyIdempotent

Call once first. Reports the cached account, whether Redmine is reachable with a live GET /users/current.json, and the consent checklist for this configuration.

Inputs: no named parameters.

time_delete_entryDelete a time entryB
Destructive

Deletes a time entry. This cannot be undone.

Inputs: id (required).

time_list_activitiesList time activitiesB
Read-onlyIdempotent

Lists the time-tracking activities (Design, Development, …) with their ids.

Inputs: no named parameters.

time_list_entriesList time entriesA
Read-onlyIdempotent

Lists time entries filtered by issue, project, user, or date range.

Inputs: to, from, limit, offset, +3 more.

time_logLog timeB

Logs time on an issue or a project. Returns the created entry (with its id).

Inputs: hours (required), comments, issue_id, spent_on, +2 more.

time_update_entryUpdate a time entryC
Idempotent

Updates a time entry; only the fields passed change.

Inputs: id (required), hours, comments, spent_on, +1 more.

users_getGet a userB
Read-onlyIdempotent

Returns one user by id, with optional membership and group data.

Inputs: id (required), include.

users_get_currentGet the signed-in userA
Read-onlyIdempotent

Returns the signed-in account (id, login, name, mail, admin flag) from /users/current.json. The live identity check; session_status reports the cached copy.

Inputs: no named parameters.

users_my_accessShow my accessA
Read-onlyIdempotent

Answers "what can I see" before anything 403s: admin flag, group memberships, and every visible project with its roles. Check this before querying issues or users outside your projects — a 403 almost always means the object lives where this list does not reach, not that the call was malformed.

Inputs: no named parameters. Returns: admin, login, groups, projects

users_update_currentUpdate my accountB
Idempotent

Updates the signed-in account name or mail address.

Inputs: mail, lastname, firstname.

wiki_delete_pageDelete a wiki pageA
Destructive

Deletes a wiki page. This cannot be undone.

Inputs: title (required), project_id (required).

wiki_get_pageGet a wiki pageB
Read-onlyIdempotent

Returns one wiki page with its text and attachments.

Inputs: title (required), project_id (required), version.

wiki_list_pagesList wiki pagesB
Read-onlyIdempotent

Lists the wiki page index of a project.

Inputs: project_id (required).

wiki_save_pageCreate or update a wiki pageB
Idempotent

Creates the page when it does not exist, otherwise saves a new version.

Inputs: text (required), title (required), project_id (required), comments.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 44 tools

    Disambiguation4/5

    Most tools map cleanly to one resource+action (issues_*, projects_*, wiki_*, time_*, files_*), so selection is usually obvious. The only real confusion zone is the identity layer—session_status, users_get_current, auth_begin_login, auth_login_status, and users_my_access all touch 'who am I / am I signed in', and their descriptions have to explicitly cross-reference each other to sort it out. redmine_request also overlaps every typed tool, though it is clearly framed as a fallback.

    Naming Consistency4/5

    The dominant pattern is resource_verb_noun snake_case (issues_create, projects_remove_member, time_list_entries, wiki_get_page), which is predictable and readable. Deviations are minor: session_status and auth_login_status are noun-first with no verb, and redmine_list_permissions/redmine_request use a server-name prefix rather than a resource prefix. No mixed casing or chaotic verb styles.

    Tool Count3/5

    44 tools is heavy, but Redmine is genuinely a broad domain (projects, issues, wiki, files, time, users, queries, search), so most tools earn their place. Still, the set is larger than it needs to be: the five session/auth/identity tools and the generic redmine_request could be consolidated, and several list operations could be parameterized rather than split.

    Completeness4/5

    Coverage is strong: issues have full CRUD plus notes and relations, projects have list/get/create/update plus full membership management, wiki has list/get/save/delete, time entries are fully covered, and files/download/upload/search/queries are present. Gaps are minor but real—no users_list, no project delete, and no lookups for trackers/statuses/priorities that issue creation typically needs—though redmine_request serves as a workaround for all of them.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      B
      maintenance
      Enables AI assistants to interact with Redmine project management systems, providing comprehensive access to issues, projects, time tracking, users, and wiki pages through natural language commands.
      33
      24 npm
      1
      Apache 2.0
    • A
      license
      A
      quality
      C
      maintenance
      Enables AI agents to interact with Redmine API for managing tickets, projects, users, and time entries. Supports comprehensive operations including issue creation/updates, project management, time logging, and search with dual authentication (Basic Auth + API Key).
      14
      36 npm
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to interact with Redmine instances to manage issues, projects, and users. It provides comprehensive tools for issue tracking, project oversight, and user management through the Redmine REST API.
      13 npm
      MIT