# Reported issues for redmine-mcp-server

Pod holds 23 of 36 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to [redmine-mcp-server](/mcp/redmine-mcp-server).

## Most discussed

### get_redmine_issue throwing SSL errors even with verification disabled !?

### Bug Description

```
2026-08-03 17:53:37 WARNING  SSL verification is DISABLED - use only for development!
2026-08-03 17:53:37 ERROR    SSL error during fetching issue 56789: HTTPSConnectionPool(host='redmine.local', port=443): Max retries exceeded with url: /issues/56789.json?include=journals%2Cattachments (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1032)')))
```

### Steps to Rep

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/197) · 2026-08-03 · closed · external user · 5 comments

### OAuth token scopes are advertised but not enforced on MCP tool calls

### Bug Description

In `oauth` / `oauth-proxy` modes, Redmine Doorkeeper scopes are advertised (`scopes_supported` via `oauth_scopes.py`) and appear on the access token, but the MCP server does not enforce those scopes when listing or calling tools.

`IntrospectionTokenVerifier` is built with `required_scopes` unset. `_auth.py` documents per-tool enforcement as a follow-up. Any active Bearer token can therefore invoke any registered tool, including tools that need permissions absent from the to

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/185) · 2026-07-17 · closed · external user · 5 comments

### create_redmine_issue returns "Requested resource not found" on success, causing silent duplicate creation

### Bug Description

When calling create_redmine_issue, the tool returns an error response 
of "Requested resource not found" even though the issue was successfully 
created in Redmine. The caller has no way to distinguish a genuine 
failure from a successful creation, leading to unnecessary retries and 
risk of duplicate issues.

Note: This bug report was drafted by Claude AI (Anthropic) during an 
active development session. The observed behavior is real and 
reproducible. Root cause analysis 

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/146) · 2026-06-04 · closed · external user · 18 comments

### OAuth mode (v2.1.0): discovery metadata is internally inconsistent for a non-DCR upstream - client treats the MCP server as the authorization server

### Bug Description

In OAuth mode (v2.1.0, `RemoteAuthProvider` + introspection), the two discovery documents disagree about the identity of the authorization server, and a current MCP client (VS Code 1.122.1) consequently treats the MCP server itself as the authorization server. The browser is opened to `<mcp-base-url>/authorize` (which the MCP server does not serve) instead of Redmine's `/oauth/authorize`, and the flow fails with a 404.

The two documents:

- `/.well-known/oauth-protected-res

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/140) · 2026-06-01 · closed · external user · 9 comments

### OAuth discovery doc omits `scopes_supported`; tokens lack permissions for many tools

### Bug Description

When `REDMINE_AUTH_MODE=oauth`, the OAuth discovery endpoints (`/.well-known/oauth-protected-resource` and `/.well-known/oauth-authorization-server`) don't advertise a `scopes_supported` field. MCP clients therefore don't request specific scopes in the authorisation URL, and Redmine grants only Doorkeeper's default scopes (`view_project`, `search_project`, `view_members`).

Tools whose underlying Redmine endpoint requires any other permission then return 403, even when the u

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/130) · 2026-05-20 · closed · external user · 11 comments

### List Project Time Entry Activities

### Problem Statement

When trying to add a time entry on a project on redmine, each project might have unique IDs for said activities. Current functionality does not work and leads to failed rest requests towards redmine on issue creation, leading to increased context (and cost)

### Proposed Solution

```markdown
+The MCP `list_time_entry_activities` tool returns **global** IDs only — these differ from
          +project-specific ones and will cause `"Activity is not included in the list"` err

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/92) · 2026-04-16 · closed · outside contributor · 6 comments

### Support for the Agile plugin

### Problem Statement

We are using redmine boards and moving tickets through sprints. But redmine does not return the Sprint field as a custom field because it is part of the Agile plugin. Is there a way to add support for it?

### Proposed Solution

With the help of some AI, I saw that agile-related fields can be set and extracted with the following endpoints
`PUT /issues/:issue_id.json?key=<your_api_key>`
`GET /issues/:issue_id/agile_data.json`

### Use Case

It would enable the mcp server t

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/83) · 2026-04-09 · closed · outside contributor · 7 comments

### The result indicates an error occurred while fetching issue

Hi，你好。请大侠帮忙看看，以下的报错是什么原因？
----
I can use the get_redmine_issue tool to retrieve the details of issue 4730 and check its status.

redmine : get_redmine_issue
已完成

{
  "params": {
    "issue_id": 4730,
    "include_journals": false,
    "include_attachments": false
  },
  "response": {
    "content": [
      {
        "type": "text",
        "text": "{\n  \"error\": \"An error occurred while fetching issue 4730.\"\n}"
      }
    ],
    "structuredContent": {
      "result": {
        "error": "A

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/31) · 2025-07-24 · closed · external user · 6 comments

## Most recent

### `list_redmine_issues` cannot express Redmine's operator filter forms, and documents the `filters` route that can as not applying to them

## Bug Description

`list_redmine_issues` offers "find unassigned issues" in its own description and then refuses the only value that expresses it.

Redmine carries a filter's operator *inside* the value. `Query#add_short_filter` detects an operator prefix for the filter's type and splits the remainder on `|`, defaulting to `=` over the split list, so `"56|57"` is either tracker, `"!*"` is "none" and `"!4"` is "not 4". `tracker_id`, `priority_id` and `fixed_version_id` are typed `Optional[int]`,

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/250) · 2026-08-27 · closed · outside contributor · 0 comments

### `list_redmine_projects` cannot be narrowed or measured, drops six fields Redmine sends, and is documented as complete when it is active-only

## Problem Statement

`list_redmine_projects` cannot be narrowed, cannot be measured, and does not return most of what Redmine sends it — and its documentation describes none of that. The whole signature is one argument (`tools/projects.py`):

```python
def list_redmine_projects(
    include_custom_fields: bool = False,
) -> Union[List[Dict[str, Any]], Dict[str, Any]]:
```

The body calls `project.all()` unconditionally, hand-builds five keys per project, and returns a bare array. Four things fo

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/238) · 2026-08-24 · closed · outside contributor · 0 comments

### `get_current_user` cannot return the caller's memberships, so "which projects do I hold" costs one call per project

## Problem Statement

`get_current_user` cannot return the caller's project memberships, so there is no way to ask "which projects do I hold, and with which roles" in one call.

The tool takes no arguments (`tools/enumeration.py`), calls `user.get("current")` with no `include`, and hand-builds eight keys: `id`, `login`, `firstname`, `lastname`, `mail`, `admin`, `created_on`, `last_login_on`. Memberships are not among them and nothing else on the tool surface answers the question for the current 

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/236) · 2026-08-24 · closed · outside contributor · 0 comments

### `manage_contact` `list` returns no pagination metadata, discarding the `total_count` Redmine sent beside the contacts

## Problem Statement

`manage_contact` with `action="list"` returns a bare array and no pagination metadata at all — no total, no count, no pagination block. A caller cannot tell a complete read from a truncated one, and the only way to find the end of a collection is to keep paging until an empty page comes back, which costs an extra request to learn something the response could have stated.

`list_redmine_issues` already solves this, in the same codebase, with `include_pagination_info=True` re

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/234) · 2026-08-24 · closed · outside contributor · 0 comments

### `list_project_issue_custom_fields` invents six metadata keys Redmine never sends

## Bug Description

`list_project_issue_custom_fields` returns eight keys per field. Redmine sends two. The other six are `getattr` fallbacks, so the tool reports `field_format: ""`, `is_required: false`, `multiple: false`, `default_value: null`, `possible_values: []` and `trackers: []` for every custom field, always, on every deployment.

`is_required: false` is the sharp edge. It is byte-identical to a genuine "this field is optional", so a caller cannot detect that it was invented. It acts on

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/232) · 2026-08-24 · closed · outside contributor · 0 comments

### `list_redmine_projects` discards the project custom field values Redmine already sent

### Problem Statement

Nothing in the tool surface returns project custom field values. Not `list_redmine_projects`, not `get_project_dashboard_data`, not `get_project_modules`, not issue payloads (which carry only `project: {id, name}`), and `search_entire_redmine` does not accept projects as a scope.

Redmine does return them. `app/views/projects/index.api.rsb` calls `render_api_custom_values project.visible_custom_field_values, api` unconditionally — no `include` parameter needed. `list_redmi

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/230) · 2026-08-21 · closed · outside contributor · 1 comment

### `list_redmine_issues` discards the custom fields and relations Redmine already sent

### Problem Statement

Reading a custom field value, or a relation, across a set of issues costs one API request per issue — even though Redmine already returns that data in the list response the server just made and then discards.

`list_redmine_issues` drops it twice over:

- It serializes through `_issue_to_dict_selective`, which delegates to `_issue_to_dict` with `include_custom_fields=False`, so no `custom_fields` key is ever emitted. Naming `custom_fields` in the `fields` parameter does no

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/228) · 2026-08-21 · closed · outside contributor · 1 comment

### `manage_contact` drops contact fields the CRM API returns, and discards eight of its own `list` parameters

`manage_contact` builds its output from a fixed dict of key names, and several of those names differ from the ones the RedmineUP CRM API actually sends. The affected fields come back empty for every contact no matter how populated the record is, and three fields are dropped outright. Separately, `list` accepts eight parameters that its handler never forwards, so filtering on them silently returns every contact.

Verified against a Redmine running RedmineUP CRM, reading the raw API responses alon

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/226) · 2026-08-21 · closed · outside contributor · 1 comment

### Add a manage_deal tool for RedmineUP CRM deals

## Problem Statement

The RedmineUP CRM plugin exposes two resources over its REST API, contacts and deals. `manage_contact` covers contacts. Nothing covers deals, so a pipeline is only reachable by calling `/deals.json` directly, outside this server.

Deals are the half of the plugin that carries the commercial state — amount, currency, probability, close date, stage — so the gap tends to land on exactly the questions a CRM gets asked.

There is a second, less obvious half. Even with a tool, de

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/224) · 2026-08-20 · closed · outside contributor · 1 comment

### include=relations is discarded and re-fetched per issue, requiring manage_issue_relations

### Bug Description

`get_redmine_issue(include_relations=True)`, `get_gantt_chart` and `delete_redmine_issue` all ask Redmine for `include=relations` and then read the result with `getattr(issue, "relations")`. That attribute never reads the include payload.

python-redmine lists `relations` in **both** `Issue._includes` and `Issue._relations` (`redminelib/resources/standard.py`), and `BaseResource.__getattr__` tests `_relations` first, so the attribute returns a lazy `ResourceSet` that issues 

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/222) · 2026-08-20 · closed · outside contributor · 1 comment

### manage_contact is denied for every action in OAuth mode: CRM permissions are never advertised as scopes

### Bug Description

`manage_contact` is denied by Redmine for **every** action in `oauth` and `oauth-proxy` mode, even with `REDMINE_CRM_ENABLED=true`, the RedmineUP CRM plugin installed, the Contacts module enabled on the project, and a user whose Redmine role grants the CRM permissions.

The cause is that the CRM permissions are never advertised as scopes, so no access token can carry them — and Redmine intersects a token's scopes with the user's role permissions:

- `Role#allowed_permissions

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/220) · 2026-08-20 · closed · outside contributor · 2 comments

### Call to `get_redmine_issue` hangs the mcp server

### Bug Description

If a call the server makes to the Redmine REST API never gets a response back (Redmine is slow, a connection drops silently, etc.), the server waits for it forever - there is no timeout configured anywhere. Because this wait blocks the server's single request-handling thread, it doesn't just affect the one request: the entire server stops responding to anything, including its own `/health` endpoint, until the process is killed and restarted.

### Steps to Reproduce

1. A `ge

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/214) · 2026-08-11 · closed · external user · 2 comments

### Add MCP ToolAnnotations so clients can distinguish read-only tools

## Problem statement

The tools exposed by `redmine-mcp-server` do not currently include MCP
`ToolAnnotations`. In particular, pure read tools such as
`list_redmine_projects`, `get_redmine_issue`, and `search_entire_redmine` do
not advertise `readOnlyHint=true`.

Clients therefore have to treat every tool conservatively as potentially
mutating. For example, ChatGPT asks for approval before calling read-only
query tools.

This is reproducible with v2.10.0 and current `develop`: `tools/list` retur

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/204) · 2026-08-10 · closed · outside contributor · 5 comments

### manage_redmine_wiki_page has no `uploads` parameter

Title: manage_redmine_wiki_page has no `uploads` parameter (attachments work for issues, not wiki pages)

## Summary

`create_redmine_issue` / `update_redmine_issue` support an `uploads` parameter that lets a caller attach files by threading upload tokens through `_build_issue_uploads()` (in `files.py`) into `client.issue.create/update(...)`. Redmine's REST API supports the exact same `uploads` mechanism for wiki pages (`PUT /projects/:id/wiki/:title.json` with `wiki_page.uploads: [{token, filen

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/202) · 2026-08-07 · closed · external user · 3 comments

### update_redmine_issue ignores agile_sprint_id

### Bug Description

`update_redmine_issue` silently ignores `agile_sprint_id`, so an issue cannot be moved to
or removed from a sprint through the MCP server. With `REDMINE_AGILE_ENABLED=true`, the
function extracts and writes `story_points` to the RedmineUP Agile plugin, but no other
agile field is handled. Passing `agile_sprint_id` — either top-level or nested as
`fields={"agile_data_attributes": {"agile_sprint_id": <id>}}` — is dropped: the call
returns a success response while the sprint is

[Read the thread](https://github.com/jztan/redmine-mcp-server/issues/193) · 2026-07-27 · closed · outside contributor · 1 comment

The remaining reports are on [the project's issue tracker](https://github.com/jztan/redmine-mcp-server/issues).
