@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # Local configuration and system credentials
2
2
 
3
- Version 0.3.0 stores a complete connection JSON in the operating system credential
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. Version 0.3.0 stores the complete connection JSON,
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 contains neither the URL
32
- nor the API token. Configure and run MCP under the same OS account.
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
- ## Upgrade and token rotation
93
+ ## MCP client configuration
46
94
 
47
- Older local configuration formats `1.0` and `2.0` require explicit migration:
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
- redmine-mcp migrate --config-dir /absolute/path/to/project
51
- redmine-mcp status --config-dir /absolute/path/to/project
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
- Migration supports plaintext legacy profiles, profiles with a local URL and UUID,
55
- and the earlier reference-only format using service `redmine-mcp-ro`. It writes
56
- format `3.0` and uses service `@martin4455/redmine-mcp-ro`. Historical-service entries
57
- are retained because another local installation may still use them. No plaintext
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
- After rotating the token in Redmine, run `configure` for the existing profile and
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-mcp configure --profile default --config-dir /absolute/path/to/project
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
- See [CONFIG.md](./CONFIG.md) for the file format, platform setup and migration details.
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
- ## MCP client configuration
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
- After configuring the directory, add a stdio server to your MCP client:
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
- Use an absolute executable path if the client does not inherit your terminal's
87
- PATH. A source checkout can use `node` with the absolute path to `dist/index.js`
88
- as the first argument. Windows JSON paths need escaped backslashes, for example
89
- `C:\\projects\\example`. No URL or token belongs in the MCP client's JSON.
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 an accessible system store; use
187
- `REDMINE_TEST_PORT=18080` if port 8080 is occupied. Unit tests use test doubles for
188
- credential storage and local HTTP fixtures.
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.0');
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.0')
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
@@ -21,7 +21,7 @@ export async function startServer(redmineConfig) {
21
21
  // Create MCP server
22
22
  const server = new Server({
23
23
  name: 'redmine-mcp-ro',
24
- version: '0.3.0',
24
+ version: '0.3.1',
25
25
  }, {
26
26
  capabilities: {
27
27
  tools: {},
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@martin4455/redmine-mcp-ro",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Model Context Protocol server for read-only access to Redmine REST API",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",