@dpesch/mantisbt-mcp-server 1.18.2 → 1.18.3

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/CHANGELOG.md CHANGED
@@ -11,6 +11,23 @@ This project adheres to [Semantic Versioning](https://semver.org/).
11
11
 
12
12
  ---
13
13
 
14
+ ## [1.18.3] – 2026-11-12
15
+
16
+ ### Documentation
17
+
18
+ - mcprush directory badge added to README.md and README.de.md
19
+ - New "Security considerations" section in the README (#8636): issue and note texts are untrusted input that a prompt injection can use to drive write tools. `MANTIS_UPLOAD_DIR` is now recommended in stdio mode as well and appears in the installation examples, because without it `upload_file`'s `file_path` can read any file the server process can read. The section also points to `MANTIS_TOOLSETS`, `MANTIS_DISABLE_DESTRUCTIVE` and the tool annotations.
20
+
21
+ ### Deprecated
22
+
23
+ - `upload_file`'s `file_path` without `MANTIS_UPLOAD_DIR` in stdio mode: starting with 2.0.0, `file_path` is disabled in stdio mode too unless `MANTIS_UPLOAD_DIR` is set (#8637). Uploads via `content` (Base64) are not affected.
24
+
25
+ ### Security
26
+
27
+ - Updated dependencies with known vulnerabilities: `@modelcontextprotocol/sdk` 1.32.2 and `zod` 4.6.7, and through the SDK `proxy-addr` 2.0.8, `body-parser`, `hono`, `@hono/node-server`, `fast-uri`, `ip-address` and `qs`. `npm audit` reports no vulnerabilities.
28
+
29
+ ---
30
+
14
31
  ## [1.18.2] – 2026-11-11
15
32
 
16
33
  ### Added
package/README.de.md CHANGED
@@ -4,6 +4,7 @@
4
4
  [![license](https://img.shields.io/npm/l/@dpesch/mantisbt-mcp-server)](LICENSE)
5
5
  [![MCP compatible](https://img.shields.io/badge/MCP-compatible-green.svg?style=flat-square)](https://modelcontextprotocol.io/)
6
6
  [![MCP Badge](https://lobehub.com/badge/mcp/dpesch-mantisbt-mcp-server)](https://lobehub.com/mcp/dpesch-mantisbt-mcp-server)
7
+ [![Mantisbt MCP on mcprush](https://mcprush.com/badge/mantisbt-mcp/score.svg)](https://mcprush.com/to/mantisbt-mcp?ref=badge)
7
8
  [![MantisBT MCP Server](https://glama.ai/mcp/servers/dpesch/mantisbt-mcp-server/badges/card.svg)](https://glama.ai/mcp/servers/dpesch/mantisbt-mcp-server)
8
9
 
9
10
  [English](README.md) · **Deutsch**
@@ -31,7 +32,8 @@ In `~/.claude/claude_desktop_config.json` (Claude Desktop) oder der lokalen
31
32
  "args": ["-y", "@dpesch/mantisbt-mcp-server"],
32
33
  "env": {
33
34
  "MANTIS_BASE_URL": "https://deine-mantis-instanz.example.com/api/rest",
34
- "MANTIS_API_KEY": "dein-api-token"
35
+ "MANTIS_API_KEY": "dein-api-token",
36
+ "MANTIS_UPLOAD_DIR": "/pfad/zu/mantis-uploads"
35
37
  }
36
38
  }
37
39
  }
@@ -55,13 +57,16 @@ npm run build
55
57
  "args": ["/pfad/zum/mantisbt-mcp-server/dist/index.js"],
56
58
  "env": {
57
59
  "MANTIS_BASE_URL": "https://deine-mantis-instanz.example.com/api/rest",
58
- "MANTIS_API_KEY": "dein-api-token"
60
+ "MANTIS_API_KEY": "dein-api-token",
61
+ "MANTIS_UPLOAD_DIR": "/pfad/zu/mantis-uploads"
59
62
  }
60
63
  }
61
64
  }
62
65
  }
63
66
  ```
64
67
 
68
+ `MANTIS_UPLOAD_DIR` ist optional, wird aber **auch im stdio-Modus empfohlen**: Die Variable beschränkt `upload_file` auf Dateien in diesem Verzeichnis, sodass eine Prompt Injection im Tickettext das Modell nicht dazu bringen kann, beliebige lokale Dateien anzuhängen. Ohne sie kann `file_path` jede Datei lesen, die der Server-Prozess lesen darf. Ab 2.0.0 ist `file_path` deaktiviert, solange die Variable nicht gesetzt ist. Siehe [Sicherheitshinweise](#sicherheitshinweise).
69
+
65
70
  ## Konfiguration
66
71
 
67
72
  ### Umgebungsvariablen
@@ -83,7 +88,7 @@ npm run build
83
88
  | `MANTIS_SEARCH_DIR` | – | `{MANTIS_CACHE_DIR}/<instanz>/search` | Basisverzeichnis für den Suchindex; auch ein ausdrücklich gesetzter Wert bekommt ein Unterverzeichnis pro Instanz und Konto (`{MANTIS_SEARCH_DIR}/<instanz>`) |
84
89
  | `MANTIS_SEARCH_MODEL` | – | `Xenova/paraphrase-multilingual-MiniLM-L12-v2` | Embedding-Modell (wird beim ersten Start einmalig heruntergeladen, ~80 MB). Nach einem Wechsel baut der nächste Sync den Index von selbst neu auf. |
85
90
  | `MANTIS_SEARCH_THREADS` | – | `1` | Anzahl der ONNX-Intra-Op-Threads für das Embedding-Modell. Standard ist 1, um CPU-Sättigung auf Mehrkernsystemen und in WSL zu verhindern. Auf Rechnern mit 4 oder mehr Kernen ist `4` ein guter Wert: Ein vollständiger Neuaufbau von 7.700 Issues dauerte damit 160 s statt 377 s mit 1 Thread. Die Einstellung beschleunigt vor allem das Indexieren; eine Suchanfrage ist ein einzelner kurzer Text und profitiert kaum. Wirksam ab 1.16.0 – frühere Versionen haben die Einstellung ignoriert und immer alle Kerne genutzt. |
86
- | `MANTIS_UPLOAD_DIR` | – | – | Schränkt den `file_path` von `upload_file` auf dieses Verzeichnis ein (Pfad-Traversal via `../` und symbolische Links, die nach außen führen, werden blockiert; das Verzeichnis sollte für weniger vertrauenswürdige Nutzer nicht beschreibbar sein, denn ein Link, der zwischen Prüfung und Lesen ausgetauscht wird, fällt nicht auf). Im **stdio-Modus** ist `file_path` ohne diese Variable unbeschränkt. Im **HTTP-Modus** liest `file_path` aus dem Dateisystem des Servers und ist deshalb **deaktiviert, sofern diese Variable nicht gesetzt ist** – HTTP-Clients sollten stattdessen den Parameter `content` (Base64) verwenden. |
91
+ | `MANTIS_UPLOAD_DIR` | – | – | Schränkt den `file_path` von `upload_file` auf dieses Verzeichnis ein (Pfad-Traversal via `../` und symbolische Links, die nach außen führen, werden blockiert; das Verzeichnis sollte für weniger vertrauenswürdige Nutzer nicht beschreibbar sein, denn ein Link, der zwischen Prüfung und Lesen ausgetauscht wird, fällt nicht auf). Im **stdio-Modus** ist `file_path` ohne diese Variable unbeschränkt – **das Setzen wird auch im stdio-Modus empfohlen** (siehe [Sicherheitshinweise](#sicherheitshinweise)); ab 2.0.0 ist `file_path` auch im stdio-Modus deaktiviert, solange sie nicht gesetzt ist. Im **HTTP-Modus** liest `file_path` aus dem Dateisystem des Servers und ist deshalb **deaktiviert, sofern diese Variable nicht gesetzt ist** – HTTP-Clients sollten stattdessen den Parameter `content` (Base64) verwenden. |
87
92
  | `MANTIS_TOOLSETS` | – | – (alle) | Kommagetrennte Liste der anzubietenden Tool-Gruppen: `issues`, `notes`, `links`, `files`, `projects`, `versions`, `meta`, `search` (Groß-/Kleinschreibung egal). Nicht gesetzt oder leer bedeutet alle Gruppen. Die Gruppe `search` erfordert zusätzlich `MANTIS_SEARCH_ENABLED=true`; ohne die Gruppe wird das Such-Modul gar nicht gestartet. Ein unbekannter Gruppenname stoppt den Server beim Start mit einer Meldung, die die gültigen Namen auflistet. Siehe [Angebotene Tools einschränken](#angebotene-tools-einschränken) und das [Cookbook](docs/cookbook.de.md#nur-bestimmte-tool-gruppen-anbieten). |
88
93
  | `MANTIS_DISABLE_DESTRUCTIVE` | – | `false` | Auf `true` setzen, um alle destruktiven Tools auszublenden – `delete_issue`, `delete_note`, `delete_version`, `remove_relationship`, `remove_monitor` – unabhängig von den aktiven Gruppen. Ausgeblendete Tools werden nicht aufgelistet und liefern »Tool … not found«, wenn sie aufgerufen werden. `update_issue` lehnt dann auch `remove_monitors` ab. |
89
94
 
@@ -326,6 +331,14 @@ Jede `/mcp`-Anfrage muss `Authorization: Bearer <token>` senden. Im HTTP-Modus i
326
331
 
327
332
  Healthcheck: `GET http://localhost:3456/health` (immer öffentlich, kein Token erforderlich)
328
333
 
334
+ ## Sicherheitshinweise
335
+
336
+ Ticketbeschreibungen, Notizen und Anhänge schreibt, wer in deinem MantisBT melden oder kommentieren darf – und das Modell liest sie. Behandle sie als **nicht vertrauenswürdige Eingaben**: Eine in einem Ticket versteckte Prompt Injection kann versuchen, das Modell zu schreibenden Tools wie `create_issue`, `update_issue` oder `upload_file` zu bewegen.
337
+
338
+ - **`MANTIS_UPLOAD_DIR` setzen – auch im stdio-Modus.** Ohne die Variable liest `upload_file` per `file_path` jede lokale Datei, die der Server-Prozess lesen darf. Eine eingeschleuste Anweisung könnte das Modell dazu bringen, etwa einen privaten SSH-Schlüssel an ein Ticket anzuhängen – sichtbar für alle, die das Ticket lesen können. Mit `MANTIS_UPLOAD_DIR` ist `file_path` auf dieses Verzeichnis beschränkt. Über HTTP ist `file_path` ohne die Variable bereits deaktiviert; ab 2.0.0 gilt das auch für stdio.
339
+ - **Nur die nötigen Tools anbieten.** `MANTIS_TOOLSETS` beschränkt die angebotenen Gruppen – `files` weglassen, wenn nie hochgeladen wird, oder für eine überwiegend lesende Triage nur `issues,meta` verwenden. `MANTIS_DISABLE_DESTRUCTIVE=true` blendet alle Lösch- und Entfern-Tools aus. Beides lohnt sich besonders dort, wo auch Personen außerhalb des eigenen Teams Tickets schreiben. Siehe [Angebotene Tools einschränken](#angebotene-tools-einschränken).
340
+ - **Schreibende Aufrufe vom Client bestätigen lassen.** Alle Tools tragen MCP-Annotationen (`readOnlyHint`, `destructiveHint`), sodass Clients, die sie unterstützen, vor ändernden Aufrufen nachfragen können.
341
+
329
342
  ## Dokumentation
330
343
 
331
344
  - [**Cookbook**](docs/cookbook.de.md) – Tool-orientierte Rezepte mit direkt verwendbaren Parameter-Beispielen für alle registrierten Tools
package/README.md CHANGED
@@ -4,6 +4,7 @@
4
4
  [![license](https://img.shields.io/npm/l/@dpesch/mantisbt-mcp-server)](LICENSE)
5
5
  [![MCP compatible](https://img.shields.io/badge/MCP-compatible-green.svg?style=flat-square)](https://modelcontextprotocol.io/)
6
6
  [![MCP Badge](https://lobehub.com/badge/mcp/dpesch-mantisbt-mcp-server)](https://lobehub.com/mcp/dpesch-mantisbt-mcp-server)
7
+ [![Mantisbt MCP on mcprush](https://mcprush.com/badge/mantisbt-mcp/score.svg)](https://mcprush.com/to/mantisbt-mcp?ref=badge)
7
8
  [![MantisBT MCP Server](https://glama.ai/mcp/servers/dpesch/mantisbt-mcp-server/badges/card.svg)](https://glama.ai/mcp/servers/dpesch/mantisbt-mcp-server)
8
9
 
9
10
  **English** · [Deutsch](README.de.md)
@@ -31,7 +32,8 @@ Add to `~/.claude/claude_desktop_config.json` (Claude Desktop) or your local
31
32
  "args": ["-y", "@dpesch/mantisbt-mcp-server"],
32
33
  "env": {
33
34
  "MANTIS_BASE_URL": "https://your-mantis.example.com/api/rest",
34
- "MANTIS_API_KEY": "your-api-token"
35
+ "MANTIS_API_KEY": "your-api-token",
36
+ "MANTIS_UPLOAD_DIR": "/path/to/mantis-uploads"
35
37
  }
36
38
  }
37
39
  }
@@ -55,13 +57,16 @@ npm run build
55
57
  "args": ["/path/to/mantisbt-mcp-server/dist/index.js"],
56
58
  "env": {
57
59
  "MANTIS_BASE_URL": "https://your-mantis.example.com/api/rest",
58
- "MANTIS_API_KEY": "your-api-token"
60
+ "MANTIS_API_KEY": "your-api-token",
61
+ "MANTIS_UPLOAD_DIR": "/path/to/mantis-uploads"
59
62
  }
60
63
  }
61
64
  }
62
65
  }
63
66
  ```
64
67
 
68
+ `MANTIS_UPLOAD_DIR` is optional, but **recommended in stdio mode as well**: it limits `upload_file` to files in that directory, so a prompt injection in issue text cannot make the model attach arbitrary local files. Without it, `file_path` can read any file the server process can read. Starting with 2.0.0, `file_path` will be disabled unless the variable is set. See [Security considerations](#security-considerations).
69
+
65
70
  ## Configuration
66
71
 
67
72
  ### Environment variables
@@ -83,7 +88,7 @@ npm run build
83
88
  | `MANTIS_SEARCH_DIR` | – | `{MANTIS_CACHE_DIR}/<instance>/search` | Base directory for the search index; an explicit value also gets a subdirectory per instance and account (`{MANTIS_SEARCH_DIR}/<instance>`) |
84
89
  | `MANTIS_SEARCH_MODEL` | – | `Xenova/paraphrase-multilingual-MiniLM-L12-v2` | Embedding model name (downloaded once on first use, ~80 MB). After a change the index is rebuilt automatically on the next sync. |
85
90
  | `MANTIS_SEARCH_THREADS` | – | `1` | Number of ONNX intra-op threads for the embedding model. Default is 1 to prevent CPU saturation on multi-core machines and WSL. On a machine with 4 or more cores, `4` is a good value: a full rebuild of 7,700 issues took 160 s instead of 377 s with 1 thread. The setting mainly speeds up indexing; a search query is a single short text and hardly benefits. Effective since 1.16.0 — earlier versions ignored this setting and always used every core. |
86
- | `MANTIS_UPLOAD_DIR` | – | – | Restrict `upload_file`'s `file_path` to files within this directory (path traversal via `../` and symbolic links that lead outside are blocked; keep the directory unwritable for less trusted users, as a link swapped in between check and read is not caught). In **stdio mode** `file_path` is unrestricted unless this is set. In **HTTP mode** `file_path` reads from the server's filesystem, so it is **disabled unless this variable is set** — HTTP clients should upload via the `content` (Base64) parameter instead. |
91
+ | `MANTIS_UPLOAD_DIR` | – | – | Restrict `upload_file`'s `file_path` to files within this directory (path traversal via `../` and symbolic links that lead outside are blocked; keep the directory unwritable for less trusted users, as a link swapped in between check and read is not caught). In **stdio mode** `file_path` is unrestricted unless this is set — **setting it is recommended in stdio mode as well** (see [Security considerations](#security-considerations)); starting with 2.0.0, `file_path` will be disabled in stdio mode too unless it is set. In **HTTP mode** `file_path` reads from the server's filesystem, so it is **disabled unless this variable is set** — HTTP clients should upload via the `content` (Base64) parameter instead. |
87
92
  | `MANTIS_TOOLSETS` | – | – (all) | Comma-separated list of tool groups to offer: `issues`, `notes`, `links`, `files`, `projects`, `versions`, `meta`, `search` (case-insensitive). Unset or empty means all groups. The `search` group additionally requires `MANTIS_SEARCH_ENABLED=true`; without the group the search module is not started at all. An unknown group name stops the server at startup with a message listing the valid names. See [Limit the offered tools](#limit-the-offered-tools) and the [cookbook](docs/cookbook.md#offer-only-some-tool-groups). |
88
93
  | `MANTIS_DISABLE_DESTRUCTIVE` | – | `false` | Set to `true` to hide every destructive tool — `delete_issue`, `delete_note`, `delete_version`, `remove_relationship`, `remove_monitor` — regardless of the active groups. Hidden tools are not listed and return "Tool … not found" when called. `update_issue` then also rejects `remove_monitors`. |
89
94
 
@@ -326,6 +331,14 @@ Every `/mcp` request must send `Authorization: Bearer <token>`. Over HTTP, `uplo
326
331
 
327
332
  Health check: `GET http://localhost:3456/health` (always public, no token required)
328
333
 
334
+ ## Security considerations
335
+
336
+ Issue descriptions, notes and attachments are written by whoever can report or comment in your MantisBT — and the model reads them. Treat them as **untrusted input**: a prompt injection hidden in an issue can try to make the model call write tools such as `create_issue`, `update_issue` or `upload_file`.
337
+
338
+ - **Set `MANTIS_UPLOAD_DIR` — in stdio mode as well.** Without it, `upload_file` reads any local file the server process can read via `file_path`. An injected instruction could get the model to attach, for example, a private SSH key to an issue, where everyone who can read the issue sees it. With `MANTIS_UPLOAD_DIR`, `file_path` is limited to that directory. Over HTTP, `file_path` is already disabled without it; starting with 2.0.0 the same applies to stdio.
339
+ - **Offer only the tools you need.** `MANTIS_TOOLSETS` limits the offered groups — leave out `files` if you never upload, or use only `issues,meta` for read-mostly triage. `MANTIS_DISABLE_DESTRUCTIVE=true` hides every delete and remove tool. Both are especially useful where people outside your team can write issues. See [Limit the offered tools](#limit-the-offered-tools).
340
+ - **Let your client confirm write calls.** Every tool carries MCP annotations (`readOnlyHint`, `destructiveHint`), so clients that support them can ask before a tool changes data.
341
+
329
342
  ## Documentation
330
343
 
331
344
  - [**Cookbook**](docs/cookbook.md) — tool-oriented recipes with copy-paste-ready parameter examples for all registered tools
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.18.2",
3
- "commit": "e491b79",
4
- "built_at": "2026-11-11T14:28:25.210Z"
2
+ "version": "1.18.3",
3
+ "commit": "759969d",
4
+ "built_at": "2026-11-12T11:13:36.433Z"
5
5
  }
@@ -1140,7 +1140,7 @@ Hängt eine Datei aus dem lokalen Dateisystem an ein Issue an.
1140
1140
 
1141
1141
  > **Hinweis:** Falls die MantisBT-Instanz keine Datei-Metadaten zurückgibt, lautet die Response `{ "success": true }`.
1142
1142
 
1143
- > **Hinweis:** Wenn `MANTIS_UPLOAD_DIR` gesetzt ist, muss `file_path` auf eine Datei innerhalb dieses Verzeichnisses zeigen. Pfade außerhalb des Verzeichnisses, Path-Traversal-Versuche (`../`) und symbolische Links, die nach außen führen, werden mit einem Fehler abgelehnt.
1143
+ > **Hinweis:** Wenn `MANTIS_UPLOAD_DIR` gesetzt ist, muss `file_path` auf eine Datei innerhalb dieses Verzeichnisses zeigen. Pfade außerhalb des Verzeichnisses, Path-Traversal-Versuche (`../`) und symbolische Links, die nach außen führen, werden mit einem Fehler abgelehnt. Das Setzen wird auch im stdio-Modus empfohlen, damit eine Prompt Injection im Tickettext das Modell nicht dazu bringen kann, beliebige lokale Dateien hochzuladen; ab 2.0.0 setzt `file_path` die Variable voraus. Siehe [Sicherheitshinweise](../README.de.md#sicherheitshinweise).
1144
1144
 
1145
1145
  ---
1146
1146
 
package/docs/cookbook.md CHANGED
@@ -1140,7 +1140,7 @@ Attaches a file from the local filesystem to an issue.
1140
1140
 
1141
1141
  > **Note:** If the MantisBT instance does not return file metadata, the response is `{ "success": true }`.
1142
1142
 
1143
- > **Note:** If `MANTIS_UPLOAD_DIR` is set, `file_path` must point to a file inside that directory. Paths outside the directory, path traversal attempts (`../`) and symbolic links that lead outside are rejected with an error.
1143
+ > **Note:** If `MANTIS_UPLOAD_DIR` is set, `file_path` must point to a file inside that directory. Paths outside the directory, path traversal attempts (`../`) and symbolic links that lead outside are rejected with an error. Setting it is recommended in stdio mode as well, so that a prompt injection in issue text cannot make the model upload arbitrary local files; starting with 2.0.0, `file_path` requires it. See [Security considerations](../README.md#security-considerations).
1144
1144
 
1145
1145
  ---
1146
1146
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dpesch/mantisbt-mcp-server",
3
- "version": "1.18.2",
3
+ "version": "1.18.3",
4
4
  "mcpName": "io.github.dpesch/mantisbt-mcp-server",
5
5
  "description": "MCP server for MantisBT REST API – read and manage bug tracker issues",
6
6
  "author": "Dominik Pesch",
@@ -53,10 +53,10 @@
53
53
  },
54
54
  "devDependencies": {
55
55
  "@types/node": "^22.20.4",
56
- "@vitest/coverage-v8": "^5.0.2",
56
+ "@vitest/coverage-v8": "^5.1.0",
57
57
  "tsx": "^4.23.15",
58
58
  "typescript": "^5.9.3",
59
- "vitest": "^5.0.2"
59
+ "vitest": "^5.1.0"
60
60
  },
61
61
  "engines": {
62
62
  "node": ">=22"
package/server.json CHANGED
@@ -3,12 +3,12 @@
3
3
  "name": "io.github.dpesch/mantisbt-mcp-server",
4
4
  "title": "MantisBT MCP Server",
5
5
  "description": "MantisBT MCP server – manage issues, notes, files, tags, and relationships. With semantic search.",
6
- "version": "1.18.2",
6
+ "version": "1.18.3",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@dpesch/mantisbt-mcp-server",
11
- "version": "1.18.2",
11
+ "version": "1.18.3",
12
12
  "runtimeHint": "npx",
13
13
  "transport": {
14
14
  "type": "stdio"