@dpesch/mantisbt-mcp-server 1.14.1 → 1.15.0

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.
@@ -6,10 +6,10 @@ Tool-orientierte Rezepte für den MantisBT MCP Server – jedes Rezept zeigt gen
6
6
 
7
7
  - [Verbindung einrichten](#verbindung-einrichten)
8
8
  - [Installation ohne URL-Rewriting anbinden](#installation-ohne-url-rewriting-anbinden)
9
+ - [Nur bestimmte Tool-Gruppen anbieten](#nur-bestimmte-tool-gruppen-anbieten)
9
10
  - [Die eigene Instanz erkunden](#die-eigene-instanz-erkunden)
10
11
  - [Alle Projekte abrufen](#alle-projekte-abrufen)
11
- - [Gültige Enum-Werte ermitteln (Schweregrad, Status, Priorität)](#gültige-enum-werte-ermitteln-schweregrad-status-priorität)
12
- - [Gültige Feldnamen für `select` ermitteln](#gültige-feldnamen-für-select-ermitteln)
12
+ - [Gültige select-Felder und Enum-Werte ermitteln](#gültige-select-felder-und-enum-werte-ermitteln)
13
13
  - [Issues](#issues)
14
14
  - [Einzelnes Issue abrufen](#einzelnes-issue-abrufen)
15
15
  - [Mehrere Issues in einem Aufruf abrufen](#mehrere-issues-in-einem-aufruf-abrufen)
@@ -18,6 +18,7 @@ Tool-orientierte Rezepte für den MantisBT MCP Server – jedes Rezept zeigt gen
18
18
  - [Nach Status filtern](#nach-status-filtern)
19
19
  - [Nach Bearbeiter oder Melder filtern](#nach-bearbeiter-oder-melder-filtern)
20
20
  - [Gespeicherten Filter anwenden](#gespeicherten-filter-anwenden)
21
+ - [Issues je Status, Bearbeiter, Priorität oder Kategorie zählen](#issues-je-status-bearbeiter-priorität-oder-kategorie-zählen)
21
22
  - [Issue erstellen](#issue-erstellen)
22
23
  - [Issue schließen (Status + Auflösung)](#issue-schließen-status--auflösung)
23
24
  - [Issue auflösen mit Begründungs-Notiz (ein Aufruf)](#issue-auflösen-mit-begründungs-notiz-ein-aufruf)
@@ -25,9 +26,11 @@ Tool-orientierte Rezepte für den MantisBT MCP Server – jedes Rezept zeigt gen
25
26
  - [Issue neu zuweisen](#issue-neu-zuweisen)
26
27
  - [Fix-Version setzen](#fix-version-setzen)
27
28
  - [Notizen](#notizen)
29
+ - [Notizen eines Issues abrufen](#notizen-eines-issues-abrufen)
28
30
  - [Öffentliche Notiz hinzufügen](#öffentliche-notiz-hinzufügen)
29
31
  - [Private Notiz hinzufügen](#private-notiz-hinzufügen)
30
32
  - [Notiz löschen](#notiz-löschen)
33
+ - [Notiz ändern](#notiz-ändern)
31
34
  - [Dateianhänge](#dateianhänge)
32
35
  - [Lokale Datei hochladen](#lokale-datei-hochladen)
33
36
  - [Dateiinhalt hochladen (Base64)](#dateiinhalt-hochladen-base64)
@@ -41,8 +44,9 @@ Tool-orientierte Rezepte für den MantisBT MCP Server – jedes Rezept zeigt gen
41
44
  - [Tags per Name anhängen](#tags-per-name-anhängen)
42
45
  - [Tag entfernen](#tag-entfernen)
43
46
  - [Monitore (Beobachter)](#monitore-beobachter)
44
- - [Beobachter hinzufügen](#beobachter-hinzufügen)
45
- - [Beobachter entfernen](#beobachter-entfernen)
47
+ - [Beobachter via update_issue ändern](#beobachter-via-update_issue-ändern)
48
+ - [Beobachter hinzufügen (veraltet)](#beobachter-hinzufügen-veraltet)
49
+ - [Beobachter entfernen (veraltet)](#beobachter-entfernen-veraltet)
46
50
  - [Semantische Suche](#semantische-suche)
47
51
  - [Initialen Index aufbauen](#initialen-index-aufbauen)
48
52
  - [Inkrementelles Index-Update](#inkrementelles-index-update)
@@ -50,18 +54,19 @@ Tool-orientierte Rezepte für den MantisBT MCP Server – jedes Rezept zeigt gen
50
54
  - [Nach Bedeutung suchen](#nach-bedeutung-suchen)
51
55
  - [Suche mit Felderweiterung](#suche-mit-felderweiterung)
52
56
  - [Projekte & Kategorien](#projekte--kategorien)
57
+ - [Projekt mit Kategorien, Nutzern und Versionen abrufen](#projekt-mit-kategorien-nutzern-und-versionen-abrufen)
53
58
  - [Projektkategorien auflisten](#projektkategorien-auflisten)
54
59
  - [Projektmitglied suchen](#projektmitglied-suchen)
55
60
  - [Projektversion erstellen](#projektversion-erstellen)
56
61
  - [Projektversion aktualisieren](#projektversion-aktualisieren)
57
- - [Version freigeben und nächsten Bugfix-Platzhalter erstellen](#version-freigeben-und-nächsten-bugfix-platzhalter-erstellen)
62
+ - [Version freigeben und nächsten Bugfix-Platzhalter erstellen (veraltet)](#version-freigeben-und-nächsten-bugfix-platzhalter-erstellen-veraltet)
58
63
  - [Projektversion löschen](#projektversion-löschen)
59
64
  - [Metadaten](#metadaten)
60
65
  - [Metadaten-Zusammenfassung abrufen](#metadaten-zusammenfassung-abrufen)
66
+ - [Metadaten-Cache aktualisieren](#metadaten-cache-aktualisieren)
61
67
  - [Vollständigen Metadaten-Cache abrufen](#vollständigen-metadaten-cache-abrufen)
62
68
  - [Version & Diagnose](#version--diagnose)
63
- - [MCP-Server-Version abrufen](#mcp-server-version-abrufen)
64
- - [MantisBT-Version abrufen](#mantisbt-version-abrufen)
69
+ - [Versionen abrufen (MCP-Server und MantisBT)](#versionen-abrufen-mcp-server-und-mantisbt)
65
70
  - [Aktuellen Benutzer abrufen](#aktuellen-benutzer-abrufen)
66
71
  - [Ressourcen](#ressourcen)
67
72
  - [Eigenes Benutzerprofil lesen](#eigenes-benutzerprofil-lesen)
@@ -109,42 +114,52 @@ Manche MantisBT-Installationen liefern die REST-API ausschließlich über ihren
109
114
 
110
115
  Endet `MANTIS_BASE_URL` auf `/api/rest/index.php`, wird das index.php-Routing automatisch aktiviert. Ein explizit gesetztes `MANTIS_USE_INDEX_PHP` hat immer Vorrang vor der Erkennung – steht es zusammen mit einer solchen URL auf `false`, wird das normale `/api/rest/`-Routing erzwungen und eine Warnung auf stderr ausgegeben.
111
116
 
112
- **Prüfen:** `get_mantis_version` aufrufen. Kommt eine Antwort zurück, stimmt das Routing.
117
+ **Prüfen:** `get_version` aufrufen. Kommt eine Antwort zurück, stimmt das Routing.
113
118
 
114
119
  ---
115
120
 
116
- ## Die eigene Instanz erkunden
117
-
118
- ### Alle Projekte abrufen
121
+ ### Nur bestimmte Tool-Gruppen anbieten
119
122
 
120
- Gibt die vollständige Liste der mit dem API-Key zugänglichen Projekte zurück.
123
+ Standardmäßig sind alle 41 Tools aktiv (Suche deaktiviert). Mit `MANTIS_TOOLSETS` lassen sich nur die benötigten Gruppen laden – das hält den Kontext des Modells kürzer. Mit `MANTIS_DISABLE_DESTRUCTIVE=true` werden alle destruktiven Tools ausgeblendet, unabhängig von den aktiven Gruppen.
121
124
 
122
- **Tool:** `list_projects`
123
-
124
- **Parameter:** _(keine)_
125
+ Gültige Gruppennamen: `issues`, `notes`, `links`, `files`, `projects`, `versions`, `meta`, `search`. Ein unbekannter Name stoppt den Server beim Start mit einer Meldung, die die gültigen Namen auflistet. Veraltete Tools gehören immer zur gleichen Gruppe wie ihr Ersatz. Die vollständige Zuordnung von Gruppe zu Tools findet sich unter [Angebotene Tools einschränken im README](../README.de.md#angebotene-tools-einschränken).
125
126
 
126
- **Request:**
127
+ **Beispiel A – Triage-Setup** (`issues`, `notes`, `meta`; keine destruktiven Operationen):
127
128
 
128
129
  ```json
129
- {}
130
+ {
131
+ "env": {
132
+ "MANTIS_BASE_URL": "https://mantis.example.com",
133
+ "MANTIS_API_KEY": "dein-api-token",
134
+ "MANTIS_TOOLSETS": "issues,notes,meta",
135
+ "MANTIS_DISABLE_DESTRUCTIVE": "true"
136
+ }
137
+ }
130
138
  ```
131
139
 
132
- **Response:**
140
+ **Beispiel B – alle Gruppen, nur Löschschutz** (36 von 41 Standard-Tools):
133
141
 
134
142
  ```json
135
- [
136
- { "id": 3, "name": "Webshop", "status": { "id": 10, "name": "development" }, "enabled": true },
137
- { "id": 5, "name": "Backend API", "status": { "id": 10, "name": "development" }, "enabled": true }
138
- ]
143
+ {
144
+ "env": {
145
+ "MANTIS_BASE_URL": "https://mantis.example.com",
146
+ "MANTIS_API_KEY": "dein-api-token",
147
+ "MANTIS_DISABLE_DESTRUCTIVE": "true"
148
+ }
149
+ }
139
150
  ```
140
151
 
152
+ Die Gruppe `search` erfordert zusätzlich `MANTIS_SEARCH_ENABLED=true`. Fehlt `search` in `MANTIS_TOOLSETS`, wird das Such-Modul – Index, Embedding-Modell, Hintergrund-Sync – gar nicht gestartet, auch wenn `MANTIS_SEARCH_ENABLED=true` gesetzt ist.
153
+
141
154
  ---
142
155
 
143
- ### Gültige Enum-Werte ermitteln (Schweregrad, Status, Priorität)
156
+ ## Die eigene Instanz erkunden
144
157
 
145
- Gibt die auf der eigenen MantisBT-Instanz konfigurierten Enum-Werte zurück. Vor dem Erstellen oder Aktualisieren von Issues aufrufen, um gültige Werte zu kennen.
158
+ ### Alle Projekte abrufen
146
159
 
147
- **Tool:** `get_issue_enums`
160
+ Gibt die vollständige Liste der mit dem API-Key zugänglichen Projekte zurück.
161
+
162
+ **Tool:** `list_projects`
148
163
 
149
164
  **Parameter:** _(keine)_
150
165
 
@@ -157,57 +172,27 @@ Gibt die auf der eigenen MantisBT-Instanz konfigurierten Enum-Werte zurück. Vor
157
172
  **Response:**
158
173
 
159
174
  ```json
160
- {
161
- "priorities": [
162
- { "id": 10, "name": "none" },
163
- { "id": 20, "name": "low" },
164
- { "id": 30, "name": "normal" },
165
- { "id": 40, "name": "high" },
166
- { "id": 50, "name": "urgent" },
167
- { "id": 60, "name": "immediate" }
168
- ],
169
- "severities": [
170
- { "id": 10, "name": "feature" },
171
- { "id": 20, "name": "trivial" },
172
- { "id": 50, "name": "major" },
173
- { "id": 60, "name": "crash" }
174
- // ...
175
- ],
176
- "statuses": [
177
- { "id": 10, "name": "new" },
178
- { "id": 50, "name": "assigned" },
179
- { "id": 80, "name": "resolved" },
180
- { "id": 90, "name": "closed" }
181
- // ...
182
- ],
183
- "resolutions": [
184
- { "id": 10, "name": "open" },
185
- { "id": 20, "name": "fixed" },
186
- { "id": 60, "name": "duplicate" }
187
- // ...
188
- ]
189
- }
175
+ [
176
+ { "id": 3, "name": "Webshop", "status": { "id": 10, "name": "development" }, "enabled": true },
177
+ { "id": 5, "name": "Backend API", "status": { "id": 10, "name": "development" }, "enabled": true }
178
+ ]
190
179
  ```
191
180
 
192
- > **Hinweis:** Auf lokalisierten Instanzen liefert `get_issue_enums()` im Feld `name` den lokalisierten Begriff und optional im Feld `canonical_name` den englischen Originalnamen. `create_issue` akzeptiert **beides** – sowohl den kanonischen englischen Namen (z.B. `minor`) als auch den lokalisierten Namen (z.B. `Unschönheit`). Der Server löst den Wert automatisch auf.
193
-
194
181
  ---
195
182
 
196
- ### Gültige Feldnamen für `select` ermitteln
183
+ ### Gültige select-Felder und Enum-Werte ermitteln
197
184
 
198
- Gibt alle Feldnamen zurück, die dem `select`-Parameter von `list_issues` übergeben werden können.
185
+ Gibt die gültigen `select`-Feldnamen und die Enum-Werte (severity, status, priority, resolution, reproducibility) für diesen MantisBT-Server in einem Aufruf zurück. Vor dem Aufbau eines `select`-Strings oder dem Setzen von Enum-Feldern in `create_issue` / `update_issue` aufrufen.
199
186
 
200
- **Tool:** `get_issue_fields`
187
+ **Tool:** `get_issue_schema`
201
188
 
202
189
  **Parameter:**
203
- - `project_id` – _(optional)_ auf Felder eines bestimmten Projekts beschränken
190
+ - `project_id` – _(optional)_ Feldermittlung auf ein bestimmtes Projekt einschränken
204
191
 
205
192
  **Request:**
206
193
 
207
194
  ```json
208
- {
209
- "project_id": 3
210
- }
195
+ {}
211
196
  ```
212
197
 
213
198
  **Response:**
@@ -221,10 +206,46 @@ Gibt alle Feldnamen zurück, die dem `select`-Parameter von `list_issues` überg
221
206
  "severity", "status", "summary", "tags", "target_version",
222
207
  "updated_at", "version", "view_state"
223
208
  ],
224
- "source": "live"
209
+ "fields_source": "live",
210
+ "enums": {
211
+ "severity": [
212
+ { "id": 10, "name": "feature" },
213
+ { "id": 20, "name": "trivial" },
214
+ { "id": 50, "name": "major" },
215
+ { "id": 60, "name": "crash" }
216
+ ],
217
+ "status": [
218
+ { "id": 10, "name": "new" },
219
+ { "id": 50, "name": "assigned" },
220
+ { "id": 80, "name": "resolved" },
221
+ { "id": 90, "name": "closed" }
222
+ ],
223
+ "priority": [
224
+ { "id": 10, "name": "none" },
225
+ { "id": 20, "name": "low" },
226
+ { "id": 30, "name": "normal" },
227
+ { "id": 40, "name": "high" },
228
+ { "id": 50, "name": "urgent" },
229
+ { "id": 60, "name": "immediate" }
230
+ ],
231
+ "resolution": [
232
+ { "id": 10, "name": "open" },
233
+ { "id": 20, "name": "fixed" },
234
+ { "id": 60, "name": "duplicate" }
235
+ ],
236
+ "reproducibility": [
237
+ { "id": 10, "name": "always" },
238
+ { "id": 30, "name": "sometimes" },
239
+ { "id": 70, "name": "have not tried" }
240
+ ]
241
+ }
225
242
  }
226
243
  ```
227
244
 
245
+ `fields_source` ist `"cache"`, `"live"` oder `"static"`. Auf lokalisierten Installationen kann jeder Enum-Eintrag ein `label` (lokalisiert) und einen `canonical_name` (englischer Standardname) enthalten. `create_issue` akzeptiert beides – kanonische englische Namen (z.B. `minor`) wie auch lokalisierte Namen; der Server löst den Wert automatisch auf.
246
+
247
+ > **Veraltet:** `get_issue_fields` (nur Felder) und `get_issue_enums` (nur Enums) werden durch `get_issue_schema` abgelöst – sie werden in 2.0.0 entfernt. Die Ressource `mantis://enums` bleibt erhalten.
248
+
228
249
  ---
229
250
 
230
251
  ## Issues
@@ -287,10 +308,11 @@ Kompakte Variante (nur die benötigten Felder):
287
308
 
288
309
  Ruft bis zu 50 Issues in einem einzigen MCP-Aufruf ab. Die Anfragen laufen parallel (max. 5 gleichzeitig). Nicht zugängliche IDs liefern `null` an ihrer Position – der Aufruf schlägt nie wegen einzelner fehlender IDs fehl.
289
310
 
290
- **Tool:** `get_issues`
311
+ **Tool:** `get_issue`
291
312
 
292
313
  **Parameter:**
293
314
  - `ids` – Array numerischer Issue-IDs (1–50)
315
+ - `select` – _(optional)_ kommagetrennte Feldliste
294
316
 
295
317
  **Request:**
296
318
 
@@ -327,6 +349,8 @@ Ruft bis zu 50 Issues in einem einzigen MCP-Aufruf ab. Die Anfragen laufen paral
327
349
 
328
350
  > **Hinweis:** `null`-Einträge zeigen IDs an, die nicht gefunden oder nicht zugänglich waren. `failed` gibt an, wie viele IDs nicht abgerufen werden konnten.
329
351
 
352
+ > **Veraltet:** `get_issues` bietet dieselbe Funktion, ist aber veraltet – stattdessen `get_issue` mit `ids` wie oben gezeigt verwenden; `get_issues` wird in 2.0.0 entfernt.
353
+
330
354
  ---
331
355
 
332
356
  ### Issues auflisten (paginiert)
@@ -412,7 +436,7 @@ Eine kommagetrennte Liste von Feldnamen übergeben, um nur die benötigten Felde
412
436
  }
413
437
  ```
414
438
 
415
- > **Hinweis:** Mit `get_issue_fields()` lassen sich alle verfügbaren Feldnamen anzeigen.
439
+ > **Hinweis:** Mit `get_issue_schema()` lassen sich alle verfügbaren Feldnamen anzeigen.
416
440
 
417
441
  > **Hinweis:** `view_url` ist in allen Issue-Responses immer vorhanden – es wird vom MCP-Server injiziert und wird durch den `select`-Parameter nicht beeinflusst.
418
442
 
@@ -553,6 +577,71 @@ Einen in MantisBT vorgespeicherten Filter anhand seiner ID verwenden. Dies ist d
553
577
 
554
578
  ---
555
579
 
580
+ ### Issues je Status, Bearbeiter, Priorität oder Kategorie zählen
581
+
582
+ Gibt die Anzahl der passenden Issues gruppiert nach einem einzelnen Feld zurück, anstatt einzelne Issues aufzulisten – deutlich weniger Tokens als das Lesen aller Seiten.
583
+
584
+ **Tool:** `list_issues`
585
+
586
+ **Parameter:**
587
+ - `project_id` – _(optional)_ numerische Projekt-ID
588
+ - `group_by` – `"status"`, `"handler"`, `"priority"` oder `"category"`
589
+ - `status`, `assigned_to`, `reporter_id`, Datumsfilter – _(optional)_ alle Filter greifen weiterhin; `page`, `page_size` und `select` werden ignoriert
590
+
591
+ **Request:**
592
+
593
+ ```json
594
+ {
595
+ "project_id": 3,
596
+ "group_by": "status"
597
+ }
598
+ ```
599
+
600
+ **Response:**
601
+
602
+ ```json
603
+ {
604
+ "group_by": "status",
605
+ "total": 604,
606
+ "groups": [
607
+ { "id": 80, "name": "resolved", "label": "erledigt", "count": 412 },
608
+ { "id": 50, "name": "assigned", "label": "zugewiesen", "count": 98 },
609
+ { "id": 40, "name": "confirmed", "label": "bestätigt", "count": 57 },
610
+ { "id": 20, "name": "feedback", "label": "Rückmeldung", "count": 37 }
611
+ ]
612
+ }
613
+ ```
614
+
615
+ Die Gruppen sind absteigend nach Anzahl, danach aufsteigend nach Name sortiert. Das Feld `label` enthält den lokalisierten Anzeigenamen und entfällt bei Gruppen ohne Label (z.B. Bearbeiter).
616
+
617
+ **Request (Bearbeiter, nur offene Issues):**
618
+
619
+ ```json
620
+ {
621
+ "project_id": 3,
622
+ "group_by": "handler",
623
+ "status": "open"
624
+ }
625
+ ```
626
+
627
+ **Response:**
628
+
629
+ ```json
630
+ {
631
+ "group_by": "handler",
632
+ "total": 185,
633
+ "groups": [
634
+ { "id": 7, "name": "jdoe", "count": 72 },
635
+ { "id": 4, "name": "jsmith", "count": 68 },
636
+ { "id": null, "name": "(unassigned)", "count": 45 }
637
+ ]
638
+ }
639
+ ```
640
+
641
+ > **Hinweis:** Der Server durchsucht alle passenden Issues bis zu einem Limit von 50.000. Wird das Limit erreicht, enthält die Antwort `"truncated": true` und die Zählwerte sind unvollständig. Das ist ein deutlich größerer Scan als das 500-Issue-Limit der clientseitigen Filter in `list_issues`.
642
+
643
+ ---
644
+
556
645
  ### Issue erstellen
557
646
 
558
647
  Legt ein neues Issue in MantisBT an.
@@ -564,8 +653,8 @@ Legt ein neues Issue in MantisBT an.
564
653
  - `project_id` – numerische Projekt-ID
565
654
  - `category` – Kategoriename als Zeichenkette
566
655
  - `description` – _(optional)_ ausführliche Beschreibung
567
- - `priority` – _(optional)_ Priorität: kanonischer englischer Name (`none`, `low`, `normal`, `high`, `urgent`, `immediate`) oder lokalisierter Begriff. Standard: `"normal"`. Alle verfügbaren Werte über `get_issue_enums()` ermitteln.
568
- - `severity` – _(optional)_ Schweregrad: kanonischer englischer Name (`feature`, `trivial`, `text`, `tweak`, `minor`, `major`, `crash`, `block`) oder lokalisierter Begriff. Standard: `"minor"`. Alle verfügbaren Werte über `get_issue_enums()` ermitteln.
656
+ - `priority` – _(optional)_ Priorität: kanonischer englischer Name (`none`, `low`, `normal`, `high`, `urgent`, `immediate`) oder lokalisierter Begriff. Standard: `"normal"`. Alle verfügbaren Werte über `get_issue_schema()` ermitteln.
657
+ - `severity` – _(optional)_ Schweregrad: kanonischer englischer Name (`feature`, `trivial`, `text`, `tweak`, `minor`, `major`, `crash`, `block`) oder lokalisierter Begriff. Standard: `"minor"`. Alle verfügbaren Werte über `get_issue_schema()` ermitteln.
569
658
  - `handler` – _(optional)_ Benutzername des Bearbeiters (wird automatisch in eine ID aufgelöst)
570
659
  - `handler_id` – _(optional)_ numerische Benutzer-ID des Bearbeiters (Alternative zu `handler`)
571
660
 
@@ -609,11 +698,11 @@ Legt ein neues Issue in MantisBT an.
609
698
 
610
699
  **Fehler: unbekannter Schweregrad oder unbekannte Priorität**
611
700
 
612
- Der Server prüft zuerst kanonische englische Namen und fällt dann auf einen Live-`get_issue_enums`-Lookup zurück. Ein Fehler wird nur zurückgegeben, wenn der Wert weder kanonisch noch lokalisiert erkannt wird:
701
+ Der Server prüft zuerst kanonische englische Namen und fällt dann auf einen Live-Enum-Lookup zurück. Ein Fehler wird nur zurückgegeben, wenn der Wert weder kanonisch noch lokalisiert erkannt wird:
613
702
 
614
- > Error: Invalid severity "xyz". Valid canonical names: feature, trivial, text, tweak, minor, major, crash, block. Call get_issue_enums to see localized labels.
703
+ > Error: Invalid severity "xyz". Valid canonical names: feature, trivial, text, tweak, minor, major, crash, block. Call get_issue_schema to see localized labels.
615
704
 
616
- Mit `get_issue_enums` lassen sich alle akzeptierten Werte ermitteln – sowohl kanonische als auch lokalisierte Namen funktionieren.
705
+ Mit `get_issue_schema` lassen sich alle akzeptierten Werte ermitteln – sowohl kanonische als auch lokalisierte Namen funktionieren.
617
706
 
618
707
  ---
619
708
 
@@ -655,7 +744,7 @@ Löst ein Issue auf und schließt es. **Immer beide Felder** `status` und `resol
655
744
  }
656
745
  ```
657
746
 
658
- > **Hinweis:** Auflösungs-ID 20 entspricht in einer Standard-MantisBT-Installation »behoben«. Mit `get_issue_enums()` die korrekte ID für die eigene Instanz prüfen.
747
+ > **Hinweis:** Auflösungs-ID 20 entspricht in einer Standard-MantisBT-Installation »behoben«. Mit `get_issue_schema()` die korrekte ID für die eigene Instanz prüfen.
659
748
 
660
749
  ---
661
750
 
@@ -710,7 +799,7 @@ Schreibt Custom-Field-Werte beim Anlegen oder Aktualisieren. Dasselbe `custom_fi
710
799
  }
711
800
  ```
712
801
 
713
- > **Hinweis:** Nur die aufgeführten Custom Fields werden geändert – alle anderen bleiben unangetastet. Verfügbare Felder pro Projekt mit `get_issue_fields()` oder `get_metadata()` ermitteln. Werte sind immer Strings.
802
+ > **Hinweis:** Nur die aufgeführten Custom Fields werden geändert – alle anderen bleiben unangetastet. Verfügbare Felder pro Projekt mit `get_issue_schema()` oder `get_metadata()` ermitteln. Werte sind immer Strings.
714
803
 
715
804
  ---
716
805
 
@@ -783,12 +872,54 @@ Setzt das Feld `fixed_in_version` eines Issues.
783
872
  }
784
873
  ```
785
874
 
786
- > **Hinweis:** Mit `get_project_versions(project_id)` lassen sich gültige Versionsnamen für ein Projekt auflisten.
875
+ > **Hinweis:** Mit `get_project` und `include: ["versions"]` lassen sich gültige Versionsnamen für ein Projekt auflisten.
787
876
 
788
877
  ---
789
878
 
790
879
  ## Notizen
791
880
 
881
+ ### Notizen eines Issues abrufen
882
+
883
+ Ruft nur die Notizen eines Issues über serverseitige Feldprojektion ab. Dies ist die bevorzugte Alternative zum veralteten `list_notes`-Tool.
884
+
885
+ **Tool:** `get_issue`
886
+
887
+ **Parameter:**
888
+ - `id` – numerische Issue-ID
889
+ - `select` – `"id,notes"` (`id` einschließen, damit `view_url` auch bei Projektionen immer gesetzt wird)
890
+
891
+ **Request:**
892
+
893
+ ```json
894
+ {
895
+ "id": 1042,
896
+ "select": "id,notes"
897
+ }
898
+ ```
899
+
900
+ **Response:**
901
+
902
+ ```json
903
+ {
904
+ "id": 1042,
905
+ "notes": [
906
+ {
907
+ "id": 88,
908
+ "reporter": { "id": 7, "name": "jdoe" },
909
+ "text": "In Version 2.0.3 reproduziert. Ursache in der Auth-Middleware identifiziert.",
910
+ "view_state": { "id": 10, "name": "public" },
911
+ "created_at": "2024-11-05T14:02:11+00:00",
912
+ "view_url": "https://mantis.example.com/view.php?id=1042#bugnote88"
913
+ }
914
+ ],
915
+ "view_url": "https://mantis.example.com/view.php?id=1042"
916
+ }
917
+ ```
918
+
919
+ > **Veraltet:** `list_notes` wird in 2.0.0 entfernt – stattdessen `get_issue` mit `select: "id,notes"` wie oben gezeigt verwenden.
920
+
921
+ ---
922
+
792
923
  ### Öffentliche Notiz hinzufügen
793
924
 
794
925
  Fügt eine öffentlich sichtbare Notiz zu einem Issue hinzu.
@@ -868,7 +999,7 @@ Entfernt eine Notiz dauerhaft von einem Issue.
868
999
 
869
1000
  **Parameter:**
870
1001
  - `issue_id` – numerische Issue-ID
871
- - `note_id` – numerische Notiz-ID (aus `list_notes` oder `get_issue`)
1002
+ - `note_id` – numerische Notiz-ID (aus `get_issue`)
872
1003
 
873
1004
  **Request:**
874
1005
 
@@ -889,6 +1020,51 @@ Entfernt eine Notiz dauerhaft von einem Issue.
889
1020
 
890
1021
  ---
891
1022
 
1023
+ ### Notiz ändern
1024
+
1025
+ Bearbeitet Text und/oder Sichtbarkeit einer bestehenden Notiz über `update_issue`. Die Notiz-ID stammt aus `get_issue`. Mindestens eines von `text` oder `view_state` muss angegeben werden. Mehrere Notizen können in einem Aufruf bearbeitet werden.
1026
+
1027
+ **Tool:** `update_issue`
1028
+
1029
+ **Parameter:**
1030
+ - `id` – numerische Issue-ID
1031
+ - `fields.notes` – Array von Notiz-Änderungen: `{ id, text?, view_state? }`; ein weggelassenes `view_state` behält die aktuelle Sichtbarkeit der Notiz
1032
+
1033
+ **Request:** _(nur Text ändern)_
1034
+
1035
+ ```json
1036
+ {
1037
+ "id": 1042,
1038
+ "fields": {
1039
+ "notes": [
1040
+ { "id": 88, "text": "Auf Version 2.0.4 reproduziert – Null-Check in der Auth-Middleware fehlt." }
1041
+ ]
1042
+ }
1043
+ }
1044
+ ```
1045
+
1046
+ **Response:**
1047
+
1048
+ ```json
1049
+ {
1050
+ "id": 1042,
1051
+ "summary": "Login-Button reagiert auf Mobile Safari nicht",
1052
+ "notes": [
1053
+ {
1054
+ "id": 88,
1055
+ "text": "Auf Version 2.0.4 reproduziert – Null-Check in der Auth-Middleware fehlt.",
1056
+ "view_state": { "id": 10, "name": "public" },
1057
+ "updated_at": "2024-11-06T12:00:00+00:00"
1058
+ }
1059
+ ],
1060
+ "view_url": "https://mantis.example.com/view.php?id=1042"
1061
+ }
1062
+ ```
1063
+
1064
+ > **Hinweis:** Unbekannte Notiz-IDs werden vor dem Schreiben abgelehnt. Hat MantisBT eine Änderung nicht übernommen, enthält die Antwort `notes_error` mit Details statt den gesamten Aufruf abzubrechen – nur wenn die Notizbearbeitung die einzige angeforderte Änderung war, wird ein Fehler zurückgegeben. Zum Hinzufügen einer neuen Notiz den `note`-Parameter oder `add_note` verwenden.
1065
+
1066
+ ---
1067
+
892
1068
  ## Dateianhänge
893
1069
 
894
1070
  ### Lokale Datei hochladen
@@ -969,36 +1145,45 @@ Hängt eine Datei an, indem ihr base64-kodierter Inhalt direkt übergeben wird.
969
1145
 
970
1146
  ### Anhänge auflisten
971
1147
 
972
- Gibt alle Dateianhänge eines Issues zurück.
1148
+ Gibt alle Dateianhänge eines Issues über serverseitige Feldprojektion zurück. Jeder Anhang enthält eine `download_url`, die über den MantisBT-File-Download-Endpoint aufgebaut wird.
973
1149
 
974
- **Tool:** `list_issue_files`
1150
+ **Tool:** `get_issue`
975
1151
 
976
1152
  **Parameter:**
977
- - `issue_id` – numerische Issue-ID
1153
+ - `id` – numerische Issue-ID
1154
+ - `select` – `"id,attachments"`
978
1155
 
979
1156
  **Request:**
980
1157
 
981
1158
  ```json
982
1159
  {
983
- "issue_id": 1042
1160
+ "id": 1042,
1161
+ "select": "id,attachments"
984
1162
  }
985
1163
  ```
986
1164
 
987
1165
  **Response:**
988
1166
 
989
1167
  ```json
990
- [
991
- {
992
- "id": 23,
993
- "filename": "login-error.png",
994
- "size": 42318,
995
- "content_type": "image/png",
996
- "description": "Login error on mobile Safari",
997
- "created_at": "2024-11-05T15:30:00+00:00"
998
- }
999
- ]
1168
+ {
1169
+ "id": 1042,
1170
+ "attachments": [
1171
+ {
1172
+ "id": 23,
1173
+ "filename": "login-error.png",
1174
+ "size": 42318,
1175
+ "content_type": "image/png",
1176
+ "created_at": "2024-11-05T15:30:00+00:00",
1177
+ "reporter": { "id": 4, "name": "jsmith" },
1178
+ "download_url": "https://mantis.example.com/file_download.php?file_id=23&type=bug"
1179
+ }
1180
+ ],
1181
+ "view_url": "https://mantis.example.com/view.php?id=1042"
1182
+ }
1000
1183
  ```
1001
1184
 
1185
+ > **Veraltet:** `list_issue_files` wird in 2.0.0 entfernt – stattdessen `get_issue` mit `select: "id,attachments"` wie oben gezeigt verwenden.
1186
+
1002
1187
  ---
1003
1188
 
1004
1189
  ## Verknüpfungen
@@ -1261,7 +1446,70 @@ Entfernt einen Tag von einem Issue. Erfordert die numerische Tag-ID.
1261
1446
 
1262
1447
  ## Monitore (Beobachter)
1263
1448
 
1264
- ### Beobachter hinzufügen
1449
+ ### Beobachter via update_issue ändern
1450
+
1451
+ Fügt Beobachter (Monitore) eines Issues hinzu und/oder entfernt sie in einem einzigen `update_issue`-Aufruf. `fields` darf entfallen – es genügt `add_monitors`, `remove_monitors` oder beides. Namen werden ohne Rücksicht auf Groß-/Kleinschreibung abgeglichen.
1452
+
1453
+ **Tool:** `update_issue`
1454
+
1455
+ **Parameter:**
1456
+ - `id` – numerische Issue-ID
1457
+ - `add_monitors` – _(optional)_ Array von MantisBT-Login-Namen, die als Beobachter eingetragen werden sollen
1458
+ - `remove_monitors` – _(optional)_ Array von MantisBT-Login-Namen, die aus den Beobachtern entfernt werden sollen; Namen, die das Issue nicht beobachten, werden still übergangen
1459
+ - Ein Name in beiden Arrays wird abgelehnt.
1460
+
1461
+ **Request:** _(einen Beobachter hinzufügen)_
1462
+
1463
+ ```json
1464
+ {
1465
+ "id": 1042,
1466
+ "add_monitors": ["jsmith"]
1467
+ }
1468
+ ```
1469
+
1470
+ **Response:**
1471
+
1472
+ ```json
1473
+ {
1474
+ "id": 1042,
1475
+ "view_url": "https://mantis.example.com/view.php?id=1042",
1476
+ "monitors": {
1477
+ "added": ["jsmith"],
1478
+ "current": ["asmith", "jsmith"]
1479
+ }
1480
+ }
1481
+ ```
1482
+
1483
+ **Request:** _(einen Beobachter entfernen)_
1484
+
1485
+ ```json
1486
+ {
1487
+ "id": 1042,
1488
+ "remove_monitors": ["jsmith"]
1489
+ }
1490
+ ```
1491
+
1492
+ **Response:**
1493
+
1494
+ ```json
1495
+ {
1496
+ "id": 1042,
1497
+ "view_url": "https://mantis.example.com/view.php?id=1042",
1498
+ "monitors": {
1499
+ "removed": ["jsmith"],
1500
+ "not_monitoring": [],
1501
+ "current": ["asmith"]
1502
+ }
1503
+ }
1504
+ ```
1505
+
1506
+ `monitors.current` listet stets alle verbleibenden Beobachter. `monitors.added` enthält erfolgreich hinzugefügte, `monitors.removed` erfolgreich entfernte Namen; `monitors.not_monitoring` enthält Namen, die das Issue nicht beobachtet haben und daher übersprungen wurden. Andere Benutzer hinzuzufügen oder zu entfernen erfordert die Zugriffsstufe `monitor_add_others_bug_threshold` bzw. `monitor_delete_others_bug_threshold`. Die Schritte laufen nacheinander – `fields`, Beobachter, `note`. Sobald einer davon geklappt hat, wird ein späterer Fehler in der Antwort als `monitors_error` bzw. `note_error` gemeldet (nichts wird zurückgenommen); nur wenn alle angeforderten Schritte fehlschlagen, liefert der Aufruf einen Fehler.
1507
+
1508
+ ---
1509
+
1510
+ ### Beobachter hinzufügen (veraltet)
1511
+
1512
+ > **Veraltet:** stattdessen `update_issue` mit `add_monitors` verwenden – `add_monitor` wird in 2.0.0 entfernt.
1265
1513
 
1266
1514
  Abonniert einen Benutzer für Benachrichtigungen zu einem Issue.
1267
1515
 
@@ -1269,7 +1517,7 @@ Abonniert einen Benutzer für Benachrichtigungen zu einem Issue.
1269
1517
 
1270
1518
  **Parameter:**
1271
1519
  - `issue_id` – numerische Issue-ID
1272
- - `username` – Benutzername als Zeichenkette
1520
+ - `username` – MantisBT-Login-Name
1273
1521
 
1274
1522
  **Request:**
1275
1523
 
@@ -1283,12 +1531,19 @@ Abonniert einen Benutzer für Benachrichtigungen zu einem Issue.
1283
1531
  **Response:**
1284
1532
 
1285
1533
  ```json
1286
- { "success": true }
1534
+ {
1535
+ "success": true,
1536
+ "monitors": ["asmith", "jsmith"]
1537
+ }
1287
1538
  ```
1288
1539
 
1540
+ `monitors` listet alle Benutzer, die das Issue jetzt beobachten. Ist der Benutzer bereits Beobachter, ändert sich nichts, und der Aufruf gelingt trotzdem. Andere Benutzer hinzuzufügen erfordert die Zugriffsstufe `monitor_add_others_bug_threshold`.
1541
+
1289
1542
  ---
1290
1543
 
1291
- ### Beobachter entfernen
1544
+ ### Beobachter entfernen (veraltet)
1545
+
1546
+ > **Veraltet:** stattdessen `update_issue` mit `remove_monitors` verwenden – `remove_monitor` wird in 2.0.0 entfernt.
1292
1547
 
1293
1548
  Deabonniert einen Benutzer von Benachrichtigungen zu einem Issue.
1294
1549
 
@@ -1296,7 +1551,7 @@ Deabonniert einen Benutzer von Benachrichtigungen zu einem Issue.
1296
1551
 
1297
1552
  **Parameter:**
1298
1553
  - `issue_id` – numerische Issue-ID
1299
- - `username` – Benutzername als Zeichenkette
1554
+ - `username` – MantisBT-Login-Name (Groß-/Kleinschreibung egal)
1300
1555
 
1301
1556
  **Request:**
1302
1557
 
@@ -1310,9 +1565,15 @@ Deabonniert einen Benutzer von Benachrichtigungen zu einem Issue.
1310
1565
  **Response:**
1311
1566
 
1312
1567
  ```json
1313
- { "success": true }
1568
+ {
1569
+ "success": true,
1570
+ "removed": true,
1571
+ "monitors": ["asmith"]
1572
+ }
1314
1573
  ```
1315
1574
 
1575
+ `monitors` listet die Benutzer, die das Issue weiterhin beobachten. War `jsmith` gar kein Beobachter, ändert sich nichts, und die Antwort enthält `"removed": false` sowie eine `message`. Andere Benutzer zu entfernen erfordert die Zugriffsstufe `monitor_delete_others_bug_threshold`; fehlt sie, liefert das Tool einen Fehler.
1576
+
1316
1577
  ---
1317
1578
 
1318
1579
  ## Semantische Suche
@@ -1386,7 +1647,7 @@ Es synchronisiert immer nur ein Serverprozess den gemeinsamen Index. Läuft bere
1386
1647
 
1387
1648
  Gibt die Anzahl der indizierten Issues, die Gesamtanzahl der Issues und den Zeitstempel der letzten Synchronisation zurück. `last_synced_at` ist das jüngste `updated_at`, das der MantisBT-Server bei dieser Synchronisation gemeldet hat (Serverzeit), und kann daher vor dem tatsächlichen Zeitpunkt der Synchronisation liegen.
1388
1649
 
1389
- **Tool:** `get_search_index_status`
1650
+ **Tool:** `get_metadata`
1390
1651
 
1391
1652
  **Parameter:** _(keine)_
1392
1653
 
@@ -1396,18 +1657,27 @@ Gibt die Anzahl der indizierten Issues, die Gesamtanzahl der Issues und den Zeit
1396
1657
  {}
1397
1658
  ```
1398
1659
 
1399
- **Response:**
1660
+ **Response (relevanter Ausschnitt):**
1400
1661
 
1401
1662
  ```json
1402
1663
  {
1403
- "summary": "312/312 (100 %)",
1404
- "indexed": 312,
1405
- "total": 312,
1406
- "percent": 100,
1407
- "last_synced_at": "2024-11-05T14:00:00+01:00"
1664
+ "projects": 24,
1665
+ "tags": 15,
1666
+ "byProject": { "3": { "name": "Webshop", "users": 8, "versions": 12, "categories": 4 } },
1667
+ "cached_at": "2026-03-27T09:00:00.000Z",
1668
+ "ttl_seconds": 82800,
1669
+ "search_index": {
1670
+ "summary": "312/312 (100 %)",
1671
+ "indexed": 312,
1672
+ "total": 312,
1673
+ "percent": 100,
1674
+ "last_synced_at": "2024-11-05T14:00:00+01:00"
1675
+ }
1408
1676
  }
1409
1677
  ```
1410
1678
 
1679
+ > **Veraltet:** `get_search_index_status` wird in 2.0.0 entfernt – stattdessen `get_metadata` (Feld `search_index`) wie oben gezeigt verwenden.
1680
+
1411
1681
  ---
1412
1682
 
1413
1683
  ### Nach Bedeutung suchen
@@ -1542,68 +1812,159 @@ Zeigt, welcher Teil eines Issues mit der Suchanfrage übereinstimmt. Jedes Ergeb
1542
1812
 
1543
1813
  ## Projekte & Kategorien
1544
1814
 
1815
+ ### Projekt mit Kategorien, Nutzern und Versionen abrufen
1816
+
1817
+ Ruft die Stammdaten eines Projekts sowie beliebige Kombinationen von Kategorien, Nutzern und Versionen in einem Aufruf ab. Kategorienamen werden ohne das Prefix `[All Projects]` geliefert und können direkt in `create_issue` verwendet werden. `member_query` filtert Nutzer per Teilstring-Suche in Login-Name, Realname und E-Mail und liefert alle Treffer.
1818
+
1819
+ **Tool:** `get_project`
1820
+
1821
+ **Parameter:**
1822
+ - `project_id` – numerische Projekt-ID (mit `list_projects` ermitteln)
1823
+ - `include` – _(optional)_ Array aus `"categories"`, `"users"`, `"versions"` (beliebige Kombination)
1824
+ - `access_level` – _(optional)_ nur Nutzer ab dieser Zugriffsstufe (10=Betrachter, 25=Reporter, 40=Bearbeiter, 55=Entwickler, 70=Manager, 90=Administrator); impliziert `"users"`
1825
+ - `member_query` – _(optional)_ Teilstring für die Nutzersuche; impliziert `"users"`, liefert alle Treffer
1826
+ - `obsolete` – _(optional)_ veraltete Versionen einschließen; impliziert `"versions"`
1827
+ - `inherit` – _(optional)_ Versionen des Elternprojekts einschließen; impliziert `"versions"`
1828
+
1829
+ **Request:** _(Stammdaten + Kategorien + Nutzer + Versionen)_
1830
+
1831
+ ```json
1832
+ {
1833
+ "project_id": 3,
1834
+ "include": ["categories", "users", "versions"]
1835
+ }
1836
+ ```
1837
+
1838
+ **Response:**
1839
+
1840
+ ```json
1841
+ {
1842
+ "id": 3,
1843
+ "name": "Webshop",
1844
+ "description": "Kundenportal",
1845
+ "status": { "id": 10, "name": "development" },
1846
+ "enabled": true,
1847
+ "view_state": { "id": 10, "name": "public" },
1848
+ "categories": [
1849
+ { "id": 1, "name": "General" },
1850
+ { "id": 2, "name": "UI" },
1851
+ { "id": 3, "name": "Backend" }
1852
+ ],
1853
+ "users": [
1854
+ { "id": 4, "name": "jsmith", "real_name": "John Smith", "email": "jsmith@example.com", "access_level": { "id": 55, "name": "developer" } },
1855
+ { "id": 7, "name": "jdoe", "real_name": "Jane Doe", "email": "jdoe@example.com", "access_level": { "id": 70, "name": "manager" } }
1856
+ ],
1857
+ "versions": [
1858
+ { "id": 42, "name": "1.2.0", "released": false, "obsolete": false, "timestamp": "2026-10-31T00:00:00+00:00" },
1859
+ { "id": 43, "name": "1.2.1", "released": false, "obsolete": false, "timestamp": "2026-10-31T00:00:00+00:00" }
1860
+ ]
1861
+ }
1862
+ ```
1863
+
1864
+ **Request:** _(Mitgliedersuche)_
1865
+
1866
+ ```json
1867
+ {
1868
+ "project_id": 3,
1869
+ "member_query": "smith"
1870
+ }
1871
+ ```
1872
+
1873
+ **Response:**
1874
+
1875
+ ```json
1876
+ {
1877
+ "id": 3,
1878
+ "name": "Webshop",
1879
+ "status": { "id": 10, "name": "development" },
1880
+ "enabled": true,
1881
+ "users": [
1882
+ { "id": 4, "name": "jsmith", "real_name": "John Smith", "email": "jsmith@example.com", "access_level": { "id": 55, "name": "developer" } },
1883
+ { "id": 11, "name": "asmith", "real_name": "Alice Smith", "email": "asmith@example.com", "access_level": { "id": 40, "name": "updater" } }
1884
+ ]
1885
+ }
1886
+ ```
1887
+
1888
+ > **Hinweis:** `get_project_categories`, `get_project_users`, `get_project_versions` und `find_project_member` sind zugunsten von `get_project` mit `include` bzw. `member_query` veraltet und werden in 2.0.0 entfernt.
1889
+
1890
+ ---
1891
+
1545
1892
  ### Projektkategorien auflisten
1546
1893
 
1547
1894
  Gibt alle verfügbaren Kategorien eines MantisBT-Projekts zurück. Die zurückgegebenen Namen können direkt beim Erstellen von Issues verwendet werden.
1548
1895
 
1549
- **Tool:** `get_project_categories`
1896
+ **Tool:** `get_project`
1550
1897
 
1551
1898
  **Parameter:**
1552
1899
  - `project_id` – numerische Projekt-ID
1900
+ - `include` – `["categories"]`
1553
1901
 
1554
1902
  **Request:**
1555
1903
 
1556
1904
  ```json
1557
1905
  {
1558
- "project_id": 3
1906
+ "project_id": 3,
1907
+ "include": ["categories"]
1559
1908
  }
1560
1909
  ```
1561
1910
 
1562
1911
  **Response:**
1563
1912
 
1564
1913
  ```json
1565
- [
1566
- { "id": 1, "name": "General" },
1567
- { "id": 2, "name": "UI" },
1568
- { "id": 3, "name": "Backend" }
1569
- ]
1914
+ {
1915
+ "id": 3,
1916
+ "name": "Webshop",
1917
+ "status": { "id": 10, "name": "development" },
1918
+ "enabled": true,
1919
+ "categories": [
1920
+ { "id": 1, "name": "General" },
1921
+ { "id": 2, "name": "UI" },
1922
+ { "id": 3, "name": "Backend" }
1923
+ ]
1924
+ }
1570
1925
  ```
1571
1926
 
1572
1927
  > **Hinweis:** Kategorienamen mit dem Prefix `[All Projects]` (aus dem globalen Projekt geerbt) werden in der Antwort automatisch ohne diesen Prefix zurückgegeben.
1573
1928
 
1929
+ > **Veraltet:** `get_project_categories` wird in 2.0.0 entfernt – stattdessen `get_project` mit `include: ["categories"]` wie oben gezeigt verwenden.
1930
+
1574
1931
  ---
1575
1932
 
1576
1933
  ### Projektmitglied suchen
1577
1934
 
1578
- Sucht Projektmitglieder nach Name, Realname oder E-Mail. Die Suche ist Groß-/Kleinschreibungsunabhängig und findet Teilstrings. Ergebnisse werden bevorzugt aus dem Metadaten-Cache geliefert; bei leerem Cache wird die live API verwendet.
1935
+ Sucht Projektmitglieder nach Name, Realname oder E-Mail. Die Suche ist Groß-/Kleinschreibungsunabhängig und findet Teilstrings. Alle Treffer werden zurückgegeben – es gibt kein `limit`.
1579
1936
 
1580
- **Tool:** `find_project_member`
1937
+ **Tool:** `get_project`
1581
1938
 
1582
1939
  **Parameter:**
1583
1940
  - `project_id` – numerische Projekt-ID
1584
- - `query` – _(optional)_ Suchbegriff für `name`, `real_name` oder `email`
1585
- - `limit` – _(optional)_ maximale Trefferanzahl, Standard 10, max. 100
1941
+ - `member_query` – Suchbegriff für `name`, `real_name` oder `email`
1586
1942
 
1587
1943
  **Request:**
1588
1944
 
1589
1945
  ```json
1590
1946
  {
1591
1947
  "project_id": 3,
1592
- "query": "smith",
1593
- "limit": 5
1948
+ "member_query": "smith"
1594
1949
  }
1595
1950
  ```
1596
1951
 
1597
1952
  **Response:**
1598
1953
 
1599
1954
  ```json
1600
- [
1601
- { "id": 4, "name": "jsmith", "real_name": "John Smith", "email": "jsmith@example.com", "access_level": { "id": 55, "name": "developer" } },
1602
- { "id": 11, "name": "asmith", "real_name": "Alice Smith", "email": "asmith@example.com", "access_level": { "id": 40, "name": "reporter" } }
1603
- ]
1955
+ {
1956
+ "id": 3,
1957
+ "name": "Webshop",
1958
+ "status": { "id": 10, "name": "development" },
1959
+ "enabled": true,
1960
+ "users": [
1961
+ { "id": 4, "name": "jsmith", "real_name": "John Smith", "email": "jsmith@example.com", "access_level": { "id": 55, "name": "developer" } },
1962
+ { "id": 11, "name": "asmith", "real_name": "Alice Smith", "email": "asmith@example.com", "access_level": { "id": 40, "name": "updater" } }
1963
+ ]
1964
+ }
1604
1965
  ```
1605
1966
 
1606
- > **Tipp:** `query` weglassen, um alle Mitglieder des Projekts aufzulisten (bis zu `limit`).
1967
+ > **Veraltet:** `find_project_member` wird in 2.0.0 entfernt – stattdessen `get_project` mit `member_query` wie oben gezeigt verwenden. Anders als `find_project_member` hat `get_project` kein `limit` und gibt alle Treffer zurück.
1607
1968
 
1608
1969
  ---
1609
1970
 
@@ -1658,12 +2019,13 @@ Aktualisiert eine bestehende Version eines MantisBT-Projekts. Es werden nur die
1658
2019
 
1659
2020
  **Parameter:**
1660
2021
  - `project_id` – numerische Projekt-ID
1661
- - `version_id` – numerische Versions-ID (mit `get_project_versions` ermittelbar)
2022
+ - `version_id` – numerische Versions-ID (mit `get_project` und `include: ["versions"]` ermittelbar)
1662
2023
  - `name` – _(optional)_ neuer Versionsname (muss im Projekt eindeutig sein)
1663
2024
  - `description` – _(optional)_ neue Versionsbeschreibung
1664
2025
  - `released` – _(optional)_ Veröffentlichungs-Flag
1665
2026
  - `obsolete` – _(optional)_ Veraltet-Flag
1666
2027
  - `timestamp` – _(optional)_ Versionsdatum als ISO-8601-String
2028
+ - `next_version` – _(optional, nur zusammen mit `released: true`)_ Name der Folgeversion, die als unveröffentlichter Platzhalter angelegt wird, z.B. `"1.2.1"`; wird unverändert übernommen – keine automatische Nummerierung
1667
2029
 
1668
2030
  **Request:** _(Version als veraltet markieren)_
1669
2031
 
@@ -1687,9 +2049,46 @@ Aktualisiert eine bestehende Version eines MantisBT-Projekts. Es werden nur die
1687
2049
  }
1688
2050
  ```
1689
2051
 
2052
+ **Request:** _(Version freigeben und Folgeversion anlegen)_
2053
+
2054
+ ```json
2055
+ {
2056
+ "project_id": 3,
2057
+ "version_id": 42,
2058
+ "released": true,
2059
+ "timestamp": "2026-10-31",
2060
+ "next_version": "1.2.1"
2061
+ }
2062
+ ```
2063
+
2064
+ **Response:**
2065
+
2066
+ ```json
2067
+ {
2068
+ "version": {
2069
+ "id": 42,
2070
+ "name": "1.2.0",
2071
+ "released": true,
2072
+ "obsolete": false,
2073
+ "timestamp": "2026-10-31T00:00:00+00:00"
2074
+ },
2075
+ "next_version": {
2076
+ "id": 43,
2077
+ "name": "1.2.1",
2078
+ "released": false,
2079
+ "obsolete": false,
2080
+ "timestamp": "2026-10-31T00:00:00+00:00"
2081
+ }
2082
+ }
2083
+ ```
2084
+
2085
+ Das Setzen von `released=true` ändert das Versionsdatum nicht – `timestamp` mit dem Freigabedatum immer mitübergeben. Schlägt das Anlegen der Folgeversion fehl, bleibt der Update wirksam und der Fehler wird als `next_version_error` in der Antwort gemeldet.
2086
+
1690
2087
  ---
1691
2088
 
1692
- ### Version freigeben und nächsten Bugfix-Platzhalter erstellen
2089
+ ### Version freigeben und nächsten Bugfix-Platzhalter erstellen (veraltet)
2090
+
2091
+ > **Veraltet:** stattdessen `update_version` mit `released: true`, `timestamp` und optional `next_version` verwenden – `release_version` wird in 2.0.0 entfernt. Das Ersatzrezept steht unter [Projektversion aktualisieren](#projektversion-aktualisieren).
1693
2092
 
1694
2093
  Markiert eine Version als veröffentlicht (mit Datumsangabe) und erstellt im selben Aufruf optional eine Folgeversion als Platzhalter. Der Name der Folgeversion wird unverändert übernommen – keine automatische Nummerierung. Schlägt das Erstellen der Folgeversion fehl, bleibt die Freigabe wirksam und der Fehler wird in `next_version_error` gemeldet.
1695
2094
 
@@ -1735,7 +2134,7 @@ Markiert eine Version als veröffentlicht (mit Datumsangabe) und erstellt im sel
1735
2134
  }
1736
2135
  ```
1737
2136
 
1738
- > **Hinweis:** Das Setzen von `released=true` via `update_version` ändert das Versionsdatum nicht – `release_version` verwenden, wenn beides in einem Schritt erledigt werden soll.
2137
+ > **Hinweis:** Das Setzen von `released=true` via `update_version` ändert das Versionsdatum nicht – `timestamp` mit dem Freigabedatum immer mitübergeben. Mit `next_version` lässt sich die Folgeversion im selben Aufruf anlegen.
1739
2138
 
1740
2139
  ---
1741
2140
 
@@ -1776,9 +2175,11 @@ Gibt eine kompakte Übersicht aller gecachten Metadaten zurück: Gesamtzahl der
1776
2175
 
1777
2176
  **Tool:** `get_metadata`
1778
2177
 
1779
- **Parameter:** _(keine)_
2178
+ **Parameter:**
2179
+ - `detail` – _(optional)_ `"summary"` (Standard) für Zählwerte; `"full"` für den vollständigen rohen Cache
2180
+ - `refresh` – _(optional)_ `true`, um alle Metadaten vor der Antwort von MantisBT neu zu laden; Standard `false`
1780
2181
 
1781
- **Request:**
2182
+ **Request:** _(Zusammenfassung, aus Cache)_
1782
2183
 
1783
2184
  ```json
1784
2185
  {}
@@ -1799,36 +2200,75 @@ Gibt eine kompakte Übersicht aller gecachten Metadaten zurück: Gesamtzahl der
1799
2200
  }
1800
2201
  ```
1801
2202
 
1802
- > **Hinweis:** Für vollständige Listen `list_projects`, `get_project_users`, `get_project_versions`, `get_project_categories`, `list_tags` oder `get_metadata_full` verwenden.
2203
+ Mit `MANTIS_SEARCH_ENABLED=true` enthält die Antwort zusätzlich einen `search_index`-Block:
2204
+
2205
+ ```json
2206
+ {
2207
+ "projects": 24,
2208
+ "tags": 15,
2209
+ "byProject": { "3": { "name": "Webshop", "users": 8, "versions": 12, "categories": 4 } },
2210
+ "cached_at": "2026-03-27T09:00:00.000Z",
2211
+ "ttl_seconds": 82800,
2212
+ "search_index": {
2213
+ "summary": "312/312 (100 %)",
2214
+ "indexed": 312,
2215
+ "total": 312,
2216
+ "percent": 100,
2217
+ "last_synced_at": "2026-03-27T08:55:00+01:00"
2218
+ }
2219
+ }
2220
+ ```
2221
+
2222
+ > **Hinweis:** Für vollständige Listen `list_projects`, `get_project` (mit `include`) oder `list_tags` verwenden.
2223
+
2224
+ ---
2225
+
2226
+ ### Metadaten-Cache aktualisieren
2227
+
2228
+ Erzwingt einen Neu-Abruf aller Metadaten von MantisBT, bevor die Zusammenfassung zurückgegeben wird.
2229
+
2230
+ **Tool:** `get_metadata`
2231
+
2232
+ **Parameter:**
2233
+ - `refresh` – `true`
2234
+
2235
+ **Request:**
2236
+
2237
+ ```json
2238
+ { "refresh": true }
2239
+ ```
2240
+
2241
+ **Response:** gleiche Struktur wie die Zusammenfassung oben, mit aktualisiertem `cached_at`.
1803
2242
 
1804
2243
  ---
1805
2244
 
1806
2245
  ### Vollständigen Metadaten-Cache abrufen
1807
2246
 
1808
- Gibt den vollständigen rohen Metadaten-Cache als minifiziertes JSON zurück. Enthält alle Projekte mit vollständigen Feldern sowie Benutzer, Versionen und Kategorien je Projekt und alle Tags. Geeignet, wenn alle Daten in einem einzigen Aufruf benötigt werden.
2247
+ Gibt den vollständigen rohen Metadaten-Cache als minifiziertes JSON zurück. Die Cache-Struktur lautet `{ timestamp, projects, byProject: {"<id>": { users, versions, categories }}, tags }`.
1809
2248
 
1810
- **Tool:** `get_metadata_full`
2249
+ **Tool:** `get_metadata`
1811
2250
 
1812
- **Parameter:** _(keine)_
2251
+ **Parameter:**
2252
+ - `detail` – `"full"`
1813
2253
 
1814
2254
  **Request:**
1815
2255
 
1816
2256
  ```json
1817
- {}
2257
+ { "detail": "full" }
1818
2258
  ```
1819
2259
 
1820
2260
  **Response:**
1821
2261
 
1822
2262
  ```json
1823
2263
  {
2264
+ "timestamp": 1743066000000,
1824
2265
  "projects": [
1825
- {
1826
- "id": 3,
1827
- "name": "Webshop",
1828
- "status": { "id": 10, "name": "development" },
1829
- "enabled": true,
2266
+ { "id": 3, "name": "Webshop", "status": { "id": 10, "name": "development" }, "enabled": true }
2267
+ ],
2268
+ "byProject": {
2269
+ "3": {
1830
2270
  "users": [
1831
- { "id": 4, "name": "jsmith", "real_name": "John Smith", "email": "jsmith@example.com", "access_level": { "id": 55, "name": "developer" } }
2271
+ { "id": 4, "name": "jsmith", "real_name": "John Smith", "email": "jsmith@example.com" }
1832
2272
  ],
1833
2273
  "versions": [
1834
2274
  { "id": 21, "name": "2.4.0", "released": false, "obsolete": false }
@@ -1838,81 +2278,57 @@ Gibt den vollständigen rohen Metadaten-Cache als minifiziertes JSON zurück. En
1838
2278
  { "id": 2, "name": "UI" }
1839
2279
  ]
1840
2280
  }
1841
- ],
2281
+ },
1842
2282
  "tags": [
1843
2283
  { "id": 1, "name": "regression" },
1844
2284
  { "id": 2, "name": "hotfix" }
1845
- ],
1846
- "cached_at": "2026-03-27T09:00:00.000Z"
2285
+ ]
1847
2286
  }
1848
2287
  ```
1849
2288
 
1850
- > **Tipp:** `get_metadata` liefert dieselben Daten als kompakte Zusammenfassung (nur Zählwerte). `get_metadata_full` verwenden, wenn die eigentlichen Arrays benötigt werden.
2289
+ > **Veraltet:** `get_metadata_full` wird in 2.0.0 entfernt – stattdessen `get_metadata` mit `detail: "full"` wie oben gezeigt verwenden.
1851
2290
 
1852
2291
  ---
1853
2292
 
1854
2293
  ## Version & Diagnose
1855
2294
 
1856
- ### MCP-Server-Version abrufen
1857
-
1858
- Gibt die Version dieser mantisbt-mcp-server-Instanz zurück.
1859
-
1860
- **Tool:** `get_mcp_version`
1861
-
1862
- **Parameter:** _(keine)_
1863
-
1864
- **Request:**
1865
-
1866
- ```json
1867
- {}
1868
- ```
1869
-
1870
- **Response:**
1871
-
1872
- ```json
1873
- {
1874
- "version": "1.5.8"
1875
- }
1876
- ```
1877
-
1878
- ---
2295
+ ### Versionen abrufen (MCP-Server und MantisBT)
1879
2296
 
1880
- ### MantisBT-Version abrufen
2297
+ Gibt die Version dieses mantisbt-mcp-servers und der verbundenen MantisBT-Installation in einer Antwort zurück. Mit `check_latest: true` (Standard) wird die MantisBT-Version mit dem neuesten Release auf GitHub verglichen (ausgehende HTTPS-Verbindung, max. 5 s). Ist MantisBT nicht erreichbar, enthält `mantis` ein `error`-Feld; die MCP-Server-Version wird trotzdem zurückgegeben.
1881
2298
 
1882
- Gibt die Version der verbundenen MantisBT-Installation zurück und vergleicht sie optional mit dem neuesten offiziellen Release auf GitHub.
1883
-
1884
- **Tool:** `get_mantis_version`
2299
+ **Tool:** `get_version`
1885
2300
 
1886
2301
  **Parameter:**
1887
- - `check_latest` – _(optional)_ ob gegen das neueste GitHub-Release verglichen werden soll; Standard `true`
2302
+ - `check_latest` – _(optional)_ MantisBT gegen das neueste GitHub-Release vergleichen; Standard `true`
1888
2303
 
1889
2304
  **Request:**
1890
2305
 
1891
2306
  ```json
1892
- {
1893
- "check_latest": true
1894
- }
2307
+ {}
1895
2308
  ```
1896
2309
 
1897
2310
  **Response:**
1898
2311
 
1899
2312
  ```json
1900
2313
  {
1901
- "installed_version": "2.27.0",
1902
- "latest_version": "2.27.1",
1903
- "status": "update-available"
2314
+ "mcp_server": { "version": "1.15.0" },
2315
+ "mantis": {
2316
+ "installed_version": "2.27.0",
2317
+ "latest_version": "2.27.1",
2318
+ "status": "update-available"
2319
+ }
1904
2320
  }
1905
2321
  ```
1906
2322
 
1907
- Mögliche Werte für `status`: `up-to-date`, `update-available`, `newer-than-release`, `unknown`.
2323
+ Mögliche Werte für `status`: `up-to-date`, `update-available`, `newer-than-release`, `unknown`. Mit `check_latest: false` den GitHub-Vergleich überspringen.
1908
2324
 
1909
- > **Hinweis:** Der GitHub-Vergleich erfordert eine ausgehende HTTPS-Verbindung. Mit `check_latest: false` lässt er sich überspringen.
2325
+ > **Veraltet:** `get_mcp_version` und `get_mantis_version` werden in 2.0.0 entfernt – stattdessen `get_version` wie oben gezeigt verwenden.
1910
2326
 
1911
2327
  ---
1912
2328
 
1913
2329
  ### Aktuellen Benutzer abrufen
1914
2330
 
1915
- Gibt das Profil des Benutzers zurück, der dem konfigurierten API-Key zugeordnet ist. Nützlich, um die Verbindung zu prüfen und das verwendete Konto zu bestätigen.
2331
+ Gibt das Profil des Benutzers zurück, der dem konfigurierten API-Key zugeordnet ist. Nützlich, um die Verbindung zu prüfen und das verwendete Konto zu bestätigen. Das Feld `language` gibt die MantisBT-Sprache des Benutzers an – als Hinweis, in welcher Sprache Issue-Texte und Notizen verfasst werden sollten und welche Sprache die lokalisierten Enum-Bezeichnungen haben.
1916
2332
 
1917
2333
  **Tool:** `get_current_user`
1918
2334
 
@@ -1932,6 +2348,7 @@ Gibt das Profil des Benutzers zurück, der dem konfigurierten API-Key zugeordnet
1932
2348
  "name": "jsmith",
1933
2349
  "real_name": "John Smith",
1934
2350
  "email": "jsmith@example.com",
2351
+ "language": "german",
1935
2352
  "access_level": { "id": 55, "name": "developer" }
1936
2353
  }
1937
2354
  ```
@@ -1974,7 +2391,7 @@ Gibt alle MantisBT-Projekte zurück, auf die der konfigurierte API-Key Zugriff h
1974
2391
 
1975
2392
  **Ressource-URI:** `mantis://projects`
1976
2393
 
1977
- **Abrufverhalten:** Wird aus dem MetadataCache bedient (Standard-TTL 24 h). Fällt auf einen Live-API-Aufruf zurück, wenn der Cache leer ist. `sync_metadata` aufrufen, um eine Aktualisierung zu erzwingen.
2394
+ **Abrufverhalten:** Wird aus dem MetadataCache bedient (Standard-TTL 24 h). Fällt auf einen Live-API-Aufruf zurück, wenn der Cache leer ist. `get_metadata` mit `refresh: true` aufrufen, um eine Aktualisierung zu erzwingen.
1978
2395
 
1979
2396
  **Response:**
1980
2397
 
@@ -2064,7 +2481,7 @@ Gibt gültige ID/Name-Paare für alle Issue-Enum-Felder zurück (Severity, Prior
2064
2481
  }
2065
2482
  ```
2066
2483
 
2067
- > **Tipp:** Das Tool `get_issue_enums` liefert dieselben Daten für Clients ohne Ressourcen-Unterstützung.
2484
+ > **Tipp:** Das Tool `get_issue_schema` liefert Enum-Werte für Clients ohne Ressourcen-Unterstützung (und gibt zusätzlich die gültigen `select`-Felder zurück).
2068
2485
 
2069
2486
  ---
2070
2487
 
@@ -2090,7 +2507,7 @@ Sammelt strukturierte Bug-Daten und ruft `create_issue` auf.
2090
2507
  - `actual` – tatsächliches (beobachtetes) Verhalten
2091
2508
  - `environment` – Umgebungsangaben (Betriebssystem, Browser, Version usw.)
2092
2509
 
2093
- **Ablauf:** Der Prompt liefert eine Nachricht, die den LLM anweist, zunächst `get_issue_enums` aufzurufen (um gültige Schweregrad- und Prioritätswerte zu ermitteln) und anschließend `create_issue` mit den übergebenen Daten auszuführen.
2510
+ **Ablauf:** Der Prompt liefert eine Nachricht, die den LLM anweist, zunächst `get_issue_schema` aufzurufen (um gültige Schweregrad- und Prioritätswerte zu ermitteln) und anschließend `create_issue` mit den übergebenen Daten auszuführen.
2094
2511
 
2095
2512
  **Beispielaufruf:**
2096
2513
 
@@ -2184,6 +2601,8 @@ Listet alle Issues eines Projekts auf und erstellt einen Status-Report nach Schw
2184
2601
 
2185
2602
  ## Destruktive Operationen
2186
2603
 
2604
+ > Um alle destruktiven Tools auf einmal auszublenden – etwa für eine Sitzung, die nie etwas löschen soll –, `MANTIS_DISABLE_DESTRUCTIVE=true` setzen; siehe [Nur bestimmte Tool-Gruppen anbieten](#nur-bestimmte-tool-gruppen-anbieten).
2605
+
2187
2606
  ### Issue löschen
2188
2607
 
2189
2608
  Löscht ein MantisBT-Issue dauerhaft. Diese Aktion kann nicht rückgängig gemacht werden.