@martin4455/redmine-mcp-ro 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONFIG.md +1 -1
- package/README.md +185 -29
- package/dist/cli.js +1 -1
- package/dist/index.js +1 -1
- package/dist/server.js +1 -1
- package/package.json +1 -1
package/CONFIG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Local configuration and system credentials
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Since version 0.3.0, the server stores a complete connection JSON in the operating system credential
|
|
4
4
|
store. The local configuration uses format `3.0` and holds references and optional
|
|
5
5
|
request limits and download settings. The package version, local file format and
|
|
6
6
|
protected JSON version are independent values.
|
package/README.md
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
# Redmine MCP Server (Read-Only)
|
|
2
2
|
|
|
3
3
|
`@martin4455/redmine-mcp-ro` provides MCP tools for reading the Redmine REST API
|
|
4
|
-
through the stdio transport.
|
|
4
|
+
through the stdio transport. Use it with Claude Code, Claude Desktop or Codex to
|
|
5
|
+
read issues, inspect logs and screenshots attached to them, and compare issue
|
|
6
|
+
requirements with your code or a pull request. Its Redmine operations are read-only:
|
|
7
|
+
it does not create, edit or delete issues or other Redmine resources.
|
|
8
|
+
|
|
9
|
+
Since version 0.3.0, the server stores the complete connection JSON,
|
|
5
10
|
including the Redmine URL and API token, in the operating system credential store.
|
|
6
11
|
|
|
7
12
|
## Requirements
|
|
@@ -15,8 +20,50 @@ Some endpoints require administrator permissions.
|
|
|
15
20
|
|
|
16
21
|
## Installation and configuration
|
|
17
22
|
|
|
23
|
+
### 1. Install the server
|
|
24
|
+
|
|
25
|
+
Check that Node.js and npm are available, then install the latest release:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
node -v
|
|
29
|
+
npm -v
|
|
30
|
+
npm install -g @martin4455/redmine-mcp-ro@latest
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
If Node.js is missing or outside the supported versions above, install a supported
|
|
34
|
+
version from [nodejs.org](https://nodejs.org/en/download). You also need the MCP
|
|
35
|
+
client you plan to use installed separately.
|
|
36
|
+
|
|
37
|
+
The package installs two commands: `redmine-mcp` configures credentials, and
|
|
38
|
+
`redmine-mcp-ro` runs the MCP server. The client launches the server for you;
|
|
39
|
+
you do not need to keep a separate server terminal open.
|
|
40
|
+
|
|
41
|
+
### 2. Configure Redmine in your project directory
|
|
42
|
+
|
|
43
|
+
Replace the example path with an existing directory containing your project:
|
|
44
|
+
|
|
45
|
+
If it already has a configuration from an older release, follow
|
|
46
|
+
[Upgrade and token rotation](#upgrade-and-token-rotation) instead of configuring
|
|
47
|
+
it again, then continue with step 3.
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
cd /absolute/path/to/project
|
|
51
|
+
redmine-mcp configure
|
|
52
|
+
redmine-mcp status
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
When prompted, choose a profile name (usually `default`), enter your Redmine base
|
|
56
|
+
URL, such as `https://redmine.example.com`, and paste your API key. In standard
|
|
57
|
+
Redmine, the key is on **My account** (`/my/account`), in the right-hand panel.
|
|
58
|
+
In Easy Redmine, look in **Profile > Edit profile > API key**; labels can vary by
|
|
59
|
+
installation. See [Redmine API authentication](https://www.redmine.org/projects/redmine/wiki/Rest_api#Authentication).
|
|
60
|
+
Accept the optional connection test to check the URL and token against Redmine.
|
|
61
|
+
`status` checks local configuration and credential-store access; it does not make
|
|
62
|
+
a request to Redmine.
|
|
63
|
+
|
|
64
|
+
You can select the same directory explicitly from any working directory:
|
|
65
|
+
|
|
18
66
|
```bash
|
|
19
|
-
npm install -g @martin4455/redmine-mcp-ro@0.3.0
|
|
20
67
|
redmine-mcp configure --config-dir /absolute/path/to/project
|
|
21
68
|
redmine-mcp status --config-dir /absolute/path/to/project
|
|
22
69
|
```
|
|
@@ -28,8 +75,9 @@ local reference. The URL appears in the interactive configuration prompt; `list`
|
|
|
28
75
|
and `status` do not display the URL or token.
|
|
29
76
|
|
|
30
77
|
The local `.redmine-mcp` file uses format `3.0` and contains profile names, random
|
|
31
|
-
credential identifiers, and optional request limits and download settings. It
|
|
32
|
-
nor the API token. Configure and run MCP under the same
|
|
78
|
+
credential identifiers, and optional request limits and download settings. It
|
|
79
|
+
contains neither the URL nor the API token. Configure and run MCP under the same
|
|
80
|
+
OS account.
|
|
33
81
|
|
|
34
82
|
On macOS, unlock the login Keychain and allow access for the Node.js executable
|
|
35
83
|
when prompted. Windows uses Credential Manager for the account running MCP.
|
|
@@ -42,40 +90,62 @@ current working directory. There is no parent-directory or home-directory search
|
|
|
42
90
|
The server does not load `.env` and does not use `REDMINE_URL` or `REDMINE_API_KEY`.
|
|
43
91
|
An unavailable system store stops the operation; there is no plaintext fallback.
|
|
44
92
|
|
|
45
|
-
##
|
|
93
|
+
## MCP client configuration
|
|
46
94
|
|
|
47
|
-
|
|
95
|
+
### 3. Add the server to your client
|
|
96
|
+
|
|
97
|
+
Choose one of the following clients. Replace `/absolute/path/to/project` with the
|
|
98
|
+
directory configured above; quote paths containing spaces. The explicit
|
|
99
|
+
`--config-dir` makes configuration selection independent of the client's working
|
|
100
|
+
directory. It selects a configuration file; it does not restrict which issues the
|
|
101
|
+
Redmine account can read.
|
|
102
|
+
|
|
103
|
+
#### Claude Code
|
|
104
|
+
|
|
105
|
+
Run this from your project directory to add a server private to you in that project:
|
|
48
106
|
|
|
49
107
|
```bash
|
|
50
|
-
|
|
51
|
-
redmine-mcp
|
|
108
|
+
cd /absolute/path/to/project
|
|
109
|
+
claude mcp add --transport stdio --scope local redmine-local -- npx -y @martin4455/redmine-mcp-ro@latest --config-dir /absolute/path/to/project
|
|
110
|
+
claude mcp list
|
|
52
111
|
```
|
|
53
112
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
backup is created. Existing backups and copies are not erased.
|
|
113
|
+
Start or restart `claude` in that project, then use `/mcp` to check the connection.
|
|
114
|
+
The first `npx` launch may take longer while npm downloads the package.
|
|
115
|
+
[Claude Code MCP documentation](https://code.claude.com/docs/en/mcp) explains the
|
|
116
|
+
client's scopes and connection management.
|
|
59
117
|
|
|
60
|
-
|
|
61
|
-
enter the replacement token. The command creates and verifies a new credential,
|
|
62
|
-
commits the reference, then deletes the previous entry. Restart the MCP client to
|
|
63
|
-
load the new connection. Copies of the old reference will need reconfiguration.
|
|
118
|
+
#### Codex CLI
|
|
64
119
|
|
|
65
120
|
```bash
|
|
66
|
-
redmine-
|
|
121
|
+
codex mcp add redmine-local -- npx -y @martin4455/redmine-mcp-ro@latest --config-dir /absolute/path/to/project
|
|
122
|
+
codex mcp list
|
|
67
123
|
```
|
|
68
124
|
|
|
69
|
-
|
|
125
|
+
Start or restart `codex`, then use `/mcp` to inspect active servers. Codex normally
|
|
126
|
+
stores this registration in `~/.codex/config.toml`, so adding it from a project
|
|
127
|
+
directory does not make it exclusive to that project. For a project-specific
|
|
128
|
+
registration, use the following in that project's `.codex/config.toml` instead of
|
|
129
|
+
the `codex mcp add` command above; project configuration requires a trusted project:
|
|
70
130
|
|
|
71
|
-
|
|
131
|
+
```toml
|
|
132
|
+
[mcp_servers.redmine-local]
|
|
133
|
+
command = "npx"
|
|
134
|
+
args = ["-y", "@martin4455/redmine-mcp-ro@latest", "--config-dir", "/absolute/path/to/project"]
|
|
135
|
+
```
|
|
72
136
|
|
|
73
|
-
|
|
137
|
+
See the [OpenAI MCP documentation](https://developers.openai.com/codex/mcp) for
|
|
138
|
+
client configuration and scope details.
|
|
139
|
+
|
|
140
|
+
#### Claude Desktop
|
|
141
|
+
|
|
142
|
+
Open **Settings > Developer > Edit Config** and merge this entry into
|
|
143
|
+
`claude_desktop_config.json`, preserving any existing servers:
|
|
74
144
|
|
|
75
145
|
```json
|
|
76
146
|
{
|
|
77
147
|
"mcpServers": {
|
|
78
|
-
"redmine": {
|
|
148
|
+
"redmine-local": {
|
|
79
149
|
"command": "redmine-mcp-ro",
|
|
80
150
|
"args": ["--config-dir", "/absolute/path/to/project"]
|
|
81
151
|
}
|
|
@@ -83,13 +153,98 @@ After configuring the directory, add a stdio server to your MCP client:
|
|
|
83
153
|
}
|
|
84
154
|
```
|
|
85
155
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
156
|
+
This uses the global installation from step 1. Fully quit and reopen Claude
|
|
157
|
+
Desktop after saving. See the [local MCP setup guide](https://modelcontextprotocol.io/docs/develop/connect-local-servers)
|
|
158
|
+
for the configuration editor and troubleshooting.
|
|
159
|
+
|
|
160
|
+
If the client cannot find the executable, locate it with `command -v redmine-mcp-ro`
|
|
161
|
+
on macOS/Linux or `where.exe redmine-mcp-ro` on Windows and use its absolute path.
|
|
162
|
+
Windows JSON paths need escaped backslashes, for example `C:\\projects\\example`.
|
|
163
|
+
On Windows, a client that cannot directly launch an npm `.cmd` shim can use
|
|
164
|
+
`"command": "cmd"` with arguments starting `["/c", "redmine-mcp-ro", ...]`.
|
|
165
|
+
No URL or token belongs in the MCP client's JSON.
|
|
166
|
+
|
|
167
|
+
After a global installation, the CLI examples can also launch `redmine-mcp-ro`
|
|
168
|
+
directly: replace `npx -y @martin4455/redmine-mcp-ro@latest` with `redmine-mcp-ro`.
|
|
169
|
+
To keep an exact release in an `npx` configuration, replace `@latest` with `@0.3.1`.
|
|
170
|
+
A source checkout can use `node` with the absolute path to `dist/index.js` as the
|
|
171
|
+
first argument.
|
|
90
172
|
|
|
91
173
|
This package implements stdio. It does not provide an HTTP MCP server.
|
|
92
174
|
|
|
175
|
+
### 4. Enable attachment downloads if needed
|
|
176
|
+
|
|
177
|
+
Reading issue text and fetching bounded attachment content works immediately.
|
|
178
|
+
Saving attachments to disk requires an explicit download directory in 0.3.0.
|
|
179
|
+
Create a dedicated directory outside your source project, for example
|
|
180
|
+
`/absolute/path/to/redmine-downloads`. In the project's `.redmine-mcp`, merge this
|
|
181
|
+
top-level `settings` member, keeping your existing `profiles`, `defaultProfile`,
|
|
182
|
+
`version` and other settings:
|
|
183
|
+
|
|
184
|
+
```json
|
|
185
|
+
{
|
|
186
|
+
"settings": {
|
|
187
|
+
"downloadDir": "/absolute/path/to/redmine-downloads"
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
This is a settings fragment, not a replacement for the whole configuration file.
|
|
193
|
+
Alternatively, set `REDMINE_DOWNLOAD_DIR` in the MCP server's launch environment.
|
|
194
|
+
Restart the MCP client after changing the setting. Tool calls may choose a relative
|
|
195
|
+
subdirectory such as `issue-12345`; absolute `output_dir` values are rejected.
|
|
196
|
+
See [attachment download settings](./CONFIG.md#local-attachment-downloads).
|
|
197
|
+
|
|
198
|
+
### 5. Check the connection and analyze an issue
|
|
199
|
+
|
|
200
|
+
In a new client session, ask:
|
|
201
|
+
|
|
202
|
+
> Use the redmine-local MCP server to fetch my current Redmine user and confirm
|
|
203
|
+
> that the connection works. Do not display any API keys.
|
|
204
|
+
|
|
205
|
+
Then try an issue you can access:
|
|
206
|
+
|
|
207
|
+
> Read Redmine issue 12345 and inspect its description, comments and attachments.
|
|
208
|
+
> Analyze the logs and screenshots, compare them with the code in this project,
|
|
209
|
+
> diagnose the problem and propose a fix.
|
|
210
|
+
|
|
211
|
+
Or ask for a review:
|
|
212
|
+
|
|
213
|
+
> Compare this pull request with the requirements in Redmine issue 12345.
|
|
214
|
+
> Identify missing behavior, regressions and tests that should be added.
|
|
215
|
+
|
|
216
|
+
The server retrieves issue data and attachment bytes. Image viewing, unpacking
|
|
217
|
+
archives, inspecting local source files and reviewing pull requests use the MCP
|
|
218
|
+
client's other tools and permissions. The server itself does not unpack archives
|
|
219
|
+
or execute downloaded files.
|
|
220
|
+
|
|
221
|
+
## Upgrade and token rotation
|
|
222
|
+
|
|
223
|
+
Older local configuration formats `1.0` and `2.0` require explicit migration:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
npm install -g @martin4455/redmine-mcp-ro@latest
|
|
227
|
+
redmine-mcp migrate --config-dir /absolute/path/to/project
|
|
228
|
+
redmine-mcp status --config-dir /absolute/path/to/project
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Migration supports plaintext legacy profiles, profiles with a local URL and UUID,
|
|
232
|
+
and the earlier reference-only format using service `redmine-mcp-ro`. It writes
|
|
233
|
+
format `3.0` and uses service `@martin4455/redmine-mcp-ro`. Historical-service entries
|
|
234
|
+
are retained because another local installation may still use them. No plaintext
|
|
235
|
+
backup is created. Existing backups and copies are not erased.
|
|
236
|
+
|
|
237
|
+
After rotating the token in Redmine, run `configure` for the existing profile and
|
|
238
|
+
enter the replacement token. The command creates and verifies a new credential,
|
|
239
|
+
commits the reference, then deletes the previous entry. Restart the MCP client to
|
|
240
|
+
load the new connection. Copies of the old reference will need reconfiguration.
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
redmine-mcp configure --profile default --config-dir /absolute/path/to/project
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
See [CONFIG.md](./CONFIG.md) for the file format, platform setup and migration details.
|
|
247
|
+
|
|
93
248
|
## Profiles
|
|
94
249
|
|
|
95
250
|
```bash
|
|
@@ -183,9 +338,10 @@ docker compose -f test/docker-compose.test.yml down --volumes
|
|
|
183
338
|
The native keyring test verifies persistence across processes, interactive CLI,
|
|
184
339
|
MCP authentication, migration, rotation and cleanup. Run it on each target OS to
|
|
185
340
|
verify native behavior. The Ubuntu test runs GNOME Keyring and D-Bus in Docker.
|
|
186
|
-
The Redmine integration suite requires Docker and
|
|
187
|
-
|
|
188
|
-
credential storage and local
|
|
341
|
+
The Redmine integration suite requires Docker and uses a credential-store test
|
|
342
|
+
double; it does not access the host keyring. Use `REDMINE_TEST_PORT=18080` if port
|
|
343
|
+
8080 is occupied. Unit tests use test doubles for credential storage and local
|
|
344
|
+
HTTP fixtures.
|
|
189
345
|
|
|
190
346
|
## License and project links
|
|
191
347
|
|
package/dist/cli.js
CHANGED
|
@@ -93,7 +93,7 @@ async function configure(options) {
|
|
|
93
93
|
}
|
|
94
94
|
report(await manager.configure(profileName, answers.url, answers.apiKey), `Profile reference saved to ${manager.configPath}. URL and API key stored together in the system credential store.`);
|
|
95
95
|
}
|
|
96
|
-
const program = new Command().name('redmine-mcp').description('Configure local Redmine profiles using the system credential store').version('0.3.
|
|
96
|
+
const program = new Command().name('redmine-mcp').description('Configure local Redmine profiles using the system credential store').version('0.3.1');
|
|
97
97
|
const command = (name, description) => program.command(name).description(description)
|
|
98
98
|
.option('-d, --config-dir <directory>', 'Directory containing .redmine-mcp (default: REDMINE_CONFIG_DIR or current directory)');
|
|
99
99
|
command('configure', 'Save the connection JSON in the system credential store')
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import { startServer } from './server.js';
|
|
|
6
6
|
const program = new Command()
|
|
7
7
|
.name('redmine-mcp-ro')
|
|
8
8
|
.description('Read-only Redmine MCP server using a local configuration and system credential store')
|
|
9
|
-
.version('0.3.
|
|
9
|
+
.version('0.3.1')
|
|
10
10
|
.option('-d, --config-dir <directory>', 'Directory containing .redmine-mcp (default: REDMINE_CONFIG_DIR or current directory)')
|
|
11
11
|
.option('-p, --profile <name>', 'Local profile (default: REDMINE_PROFILE or configured default)')
|
|
12
12
|
.parse();
|
package/dist/server.js
CHANGED