@dpesch/mantisbt-mcp-server 1.14.0 → 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
159
+
160
+ Gibt die vollständige Liste der mit dem API-Key zugänglichen Projekte zurück.
146
161
 
147
- **Tool:** `get_issue_enums`
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
@@ -1351,7 +1612,9 @@ Baut den vollständigen Vektor-Suchindex von Grund auf neu auf. Einmalig nach de
1351
1612
 
1352
1613
  ### Inkrementelles Index-Update
1353
1614
 
1354
- Aktualisiert den Index mit Issues, die seit dem letzten Aufbau hinzugekommen oder geändert wurden. Schneller als ein vollständiger Neuaufbau.
1615
+ Aktualisiert den Index mit Issues, die seit der letzten Synchronisation hinzugekommen oder geändert wurden. Schneller als ein vollständiger Neuaufbau: Nur die seitdem geänderten Issues werden abgerufen und neu eingebettet.
1616
+
1617
+ Es synchronisiert immer nur ein Serverprozess den gemeinsamen Index. Läuft bereits eine Synchronisation in einem anderen Prozess (etwa einer anderen Client-Sitzung), gibt das Tool einen Fehler zurück – nach deren Ende einfach erneut aufrufen. Eine auf `project_id` beschränkte Synchronisation verschiebt `last_synced_at` nicht, damit Änderungen in anderen Projekten beim nächsten Sync trotzdem erfasst werden.
1355
1618
 
1356
1619
  **Tool:** `rebuild_search_index`
1357
1620
 
@@ -1372,7 +1635,7 @@ Aktualisiert den Index mit Issues, die seit dem letzten Aufbau hinzugekommen ode
1372
1635
  ```json
1373
1636
  {
1374
1637
  "indexed": 14,
1375
- "skipped": 298,
1638
+ "skipped": 0,
1376
1639
  "total": 312,
1377
1640
  "duration_ms": 2104
1378
1641
  }
@@ -1382,9 +1645,9 @@ Aktualisiert den Index mit Issues, die seit dem letzten Aufbau hinzugekommen ode
1382
1645
 
1383
1646
  ### Index-Status prüfen
1384
1647
 
1385
- Gibt die Anzahl der indizierten Issues, die Gesamtanzahl der Issues und den Zeitstempel der letzten Synchronisation zurück.
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.
1386
1649
 
1387
- **Tool:** `get_search_index_status`
1650
+ **Tool:** `get_metadata`
1388
1651
 
1389
1652
  **Parameter:** _(keine)_
1390
1653
 
@@ -1394,18 +1657,27 @@ Gibt die Anzahl der indizierten Issues, die Gesamtanzahl der Issues und den Zeit
1394
1657
  {}
1395
1658
  ```
1396
1659
 
1397
- **Response:**
1660
+ **Response (relevanter Ausschnitt):**
1398
1661
 
1399
1662
  ```json
1400
1663
  {
1401
- "summary": "312/312 (100 %)",
1402
- "indexed": 312,
1403
- "total": 312,
1404
- "percent": 100,
1405
- "last_synced_at": "2024-11-05T14:00:00.000Z"
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
+ }
1406
1676
  }
1407
1677
  ```
1408
1678
 
1679
+ > **Veraltet:** `get_search_index_status` wird in 2.0.0 entfernt – stattdessen `get_metadata` (Feld `search_index`) wie oben gezeigt verwenden.
1680
+
1409
1681
  ---
1410
1682
 
1411
1683
  ### Nach Bedeutung suchen
@@ -1540,68 +1812,159 @@ Zeigt, welcher Teil eines Issues mit der Suchanfrage übereinstimmt. Jedes Ergeb
1540
1812
 
1541
1813
  ## Projekte & Kategorien
1542
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
+
1543
1892
  ### Projektkategorien auflisten
1544
1893
 
1545
1894
  Gibt alle verfügbaren Kategorien eines MantisBT-Projekts zurück. Die zurückgegebenen Namen können direkt beim Erstellen von Issues verwendet werden.
1546
1895
 
1547
- **Tool:** `get_project_categories`
1896
+ **Tool:** `get_project`
1548
1897
 
1549
1898
  **Parameter:**
1550
1899
  - `project_id` – numerische Projekt-ID
1900
+ - `include` – `["categories"]`
1551
1901
 
1552
1902
  **Request:**
1553
1903
 
1554
1904
  ```json
1555
1905
  {
1556
- "project_id": 3
1906
+ "project_id": 3,
1907
+ "include": ["categories"]
1557
1908
  }
1558
1909
  ```
1559
1910
 
1560
1911
  **Response:**
1561
1912
 
1562
1913
  ```json
1563
- [
1564
- { "id": 1, "name": "General" },
1565
- { "id": 2, "name": "UI" },
1566
- { "id": 3, "name": "Backend" }
1567
- ]
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
+ }
1568
1925
  ```
1569
1926
 
1570
1927
  > **Hinweis:** Kategorienamen mit dem Prefix `[All Projects]` (aus dem globalen Projekt geerbt) werden in der Antwort automatisch ohne diesen Prefix zurückgegeben.
1571
1928
 
1929
+ > **Veraltet:** `get_project_categories` wird in 2.0.0 entfernt – stattdessen `get_project` mit `include: ["categories"]` wie oben gezeigt verwenden.
1930
+
1572
1931
  ---
1573
1932
 
1574
1933
  ### Projektmitglied suchen
1575
1934
 
1576
- 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`.
1577
1936
 
1578
- **Tool:** `find_project_member`
1937
+ **Tool:** `get_project`
1579
1938
 
1580
1939
  **Parameter:**
1581
1940
  - `project_id` – numerische Projekt-ID
1582
- - `query` – _(optional)_ Suchbegriff für `name`, `real_name` oder `email`
1583
- - `limit` – _(optional)_ maximale Trefferanzahl, Standard 10, max. 100
1941
+ - `member_query` – Suchbegriff für `name`, `real_name` oder `email`
1584
1942
 
1585
1943
  **Request:**
1586
1944
 
1587
1945
  ```json
1588
1946
  {
1589
1947
  "project_id": 3,
1590
- "query": "smith",
1591
- "limit": 5
1948
+ "member_query": "smith"
1592
1949
  }
1593
1950
  ```
1594
1951
 
1595
1952
  **Response:**
1596
1953
 
1597
1954
  ```json
1598
- [
1599
- { "id": 4, "name": "jsmith", "real_name": "John Smith", "email": "jsmith@example.com", "access_level": { "id": 55, "name": "developer" } },
1600
- { "id": 11, "name": "asmith", "real_name": "Alice Smith", "email": "asmith@example.com", "access_level": { "id": 40, "name": "reporter" } }
1601
- ]
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
+ }
1602
1965
  ```
1603
1966
 
1604
- > **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.
1605
1968
 
1606
1969
  ---
1607
1970
 
@@ -1656,12 +2019,13 @@ Aktualisiert eine bestehende Version eines MantisBT-Projekts. Es werden nur die
1656
2019
 
1657
2020
  **Parameter:**
1658
2021
  - `project_id` – numerische Projekt-ID
1659
- - `version_id` – numerische Versions-ID (mit `get_project_versions` ermittelbar)
2022
+ - `version_id` – numerische Versions-ID (mit `get_project` und `include: ["versions"]` ermittelbar)
1660
2023
  - `name` – _(optional)_ neuer Versionsname (muss im Projekt eindeutig sein)
1661
2024
  - `description` – _(optional)_ neue Versionsbeschreibung
1662
2025
  - `released` – _(optional)_ Veröffentlichungs-Flag
1663
2026
  - `obsolete` – _(optional)_ Veraltet-Flag
1664
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
1665
2029
 
1666
2030
  **Request:** _(Version als veraltet markieren)_
1667
2031
 
@@ -1685,9 +2049,46 @@ Aktualisiert eine bestehende Version eines MantisBT-Projekts. Es werden nur die
1685
2049
  }
1686
2050
  ```
1687
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
+
1688
2087
  ---
1689
2088
 
1690
- ### 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).
1691
2092
 
1692
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.
1693
2094
 
@@ -1733,7 +2134,7 @@ Markiert eine Version als veröffentlicht (mit Datumsangabe) und erstellt im sel
1733
2134
  }
1734
2135
  ```
1735
2136
 
1736
- > **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.
1737
2138
 
1738
2139
  ---
1739
2140
 
@@ -1774,9 +2175,11 @@ Gibt eine kompakte Übersicht aller gecachten Metadaten zurück: Gesamtzahl der
1774
2175
 
1775
2176
  **Tool:** `get_metadata`
1776
2177
 
1777
- **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`
1778
2181
 
1779
- **Request:**
2182
+ **Request:** _(Zusammenfassung, aus Cache)_
1780
2183
 
1781
2184
  ```json
1782
2185
  {}
@@ -1797,36 +2200,75 @@ Gibt eine kompakte Übersicht aller gecachten Metadaten zurück: Gesamtzahl der
1797
2200
  }
1798
2201
  ```
1799
2202
 
1800
- > **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`.
1801
2242
 
1802
2243
  ---
1803
2244
 
1804
2245
  ### Vollständigen Metadaten-Cache abrufen
1805
2246
 
1806
- 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 }`.
1807
2248
 
1808
- **Tool:** `get_metadata_full`
2249
+ **Tool:** `get_metadata`
1809
2250
 
1810
- **Parameter:** _(keine)_
2251
+ **Parameter:**
2252
+ - `detail` – `"full"`
1811
2253
 
1812
2254
  **Request:**
1813
2255
 
1814
2256
  ```json
1815
- {}
2257
+ { "detail": "full" }
1816
2258
  ```
1817
2259
 
1818
2260
  **Response:**
1819
2261
 
1820
2262
  ```json
1821
2263
  {
2264
+ "timestamp": 1743066000000,
1822
2265
  "projects": [
1823
- {
1824
- "id": 3,
1825
- "name": "Webshop",
1826
- "status": { "id": 10, "name": "development" },
1827
- "enabled": true,
2266
+ { "id": 3, "name": "Webshop", "status": { "id": 10, "name": "development" }, "enabled": true }
2267
+ ],
2268
+ "byProject": {
2269
+ "3": {
1828
2270
  "users": [
1829
- { "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" }
1830
2272
  ],
1831
2273
  "versions": [
1832
2274
  { "id": 21, "name": "2.4.0", "released": false, "obsolete": false }
@@ -1836,81 +2278,57 @@ Gibt den vollständigen rohen Metadaten-Cache als minifiziertes JSON zurück. En
1836
2278
  { "id": 2, "name": "UI" }
1837
2279
  ]
1838
2280
  }
1839
- ],
2281
+ },
1840
2282
  "tags": [
1841
2283
  { "id": 1, "name": "regression" },
1842
2284
  { "id": 2, "name": "hotfix" }
1843
- ],
1844
- "cached_at": "2026-03-27T09:00:00.000Z"
2285
+ ]
1845
2286
  }
1846
2287
  ```
1847
2288
 
1848
- > **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.
1849
2290
 
1850
2291
  ---
1851
2292
 
1852
2293
  ## Version & Diagnose
1853
2294
 
1854
- ### MCP-Server-Version abrufen
1855
-
1856
- Gibt die Version dieser mantisbt-mcp-server-Instanz zurück.
1857
-
1858
- **Tool:** `get_mcp_version`
1859
-
1860
- **Parameter:** _(keine)_
1861
-
1862
- **Request:**
2295
+ ### Versionen abrufen (MCP-Server und MantisBT)
1863
2296
 
1864
- ```json
1865
- {}
1866
- ```
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.
1867
2298
 
1868
- **Response:**
1869
-
1870
- ```json
1871
- {
1872
- "version": "1.5.8"
1873
- }
1874
- ```
1875
-
1876
- ---
1877
-
1878
- ### MantisBT-Version abrufen
1879
-
1880
- Gibt die Version der verbundenen MantisBT-Installation zurück und vergleicht sie optional mit dem neuesten offiziellen Release auf GitHub.
1881
-
1882
- **Tool:** `get_mantis_version`
2299
+ **Tool:** `get_version`
1883
2300
 
1884
2301
  **Parameter:**
1885
- - `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`
1886
2303
 
1887
2304
  **Request:**
1888
2305
 
1889
2306
  ```json
1890
- {
1891
- "check_latest": true
1892
- }
2307
+ {}
1893
2308
  ```
1894
2309
 
1895
2310
  **Response:**
1896
2311
 
1897
2312
  ```json
1898
2313
  {
1899
- "installed_version": "2.27.0",
1900
- "latest_version": "2.27.1",
1901
- "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
+ }
1902
2320
  }
1903
2321
  ```
1904
2322
 
1905
- 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.
1906
2324
 
1907
- > **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.
1908
2326
 
1909
2327
  ---
1910
2328
 
1911
2329
  ### Aktuellen Benutzer abrufen
1912
2330
 
1913
- 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.
1914
2332
 
1915
2333
  **Tool:** `get_current_user`
1916
2334
 
@@ -1930,6 +2348,7 @@ Gibt das Profil des Benutzers zurück, der dem konfigurierten API-Key zugeordnet
1930
2348
  "name": "jsmith",
1931
2349
  "real_name": "John Smith",
1932
2350
  "email": "jsmith@example.com",
2351
+ "language": "german",
1933
2352
  "access_level": { "id": 55, "name": "developer" }
1934
2353
  }
1935
2354
  ```
@@ -1972,7 +2391,7 @@ Gibt alle MantisBT-Projekte zurück, auf die der konfigurierte API-Key Zugriff h
1972
2391
 
1973
2392
  **Ressource-URI:** `mantis://projects`
1974
2393
 
1975
- **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.
1976
2395
 
1977
2396
  **Response:**
1978
2397
 
@@ -2062,7 +2481,7 @@ Gibt gültige ID/Name-Paare für alle Issue-Enum-Felder zurück (Severity, Prior
2062
2481
  }
2063
2482
  ```
2064
2483
 
2065
- > **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).
2066
2485
 
2067
2486
  ---
2068
2487
 
@@ -2088,7 +2507,7 @@ Sammelt strukturierte Bug-Daten und ruft `create_issue` auf.
2088
2507
  - `actual` – tatsächliches (beobachtetes) Verhalten
2089
2508
  - `environment` – Umgebungsangaben (Betriebssystem, Browser, Version usw.)
2090
2509
 
2091
- **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.
2092
2511
 
2093
2512
  **Beispielaufruf:**
2094
2513
 
@@ -2182,6 +2601,8 @@ Listet alle Issues eines Projekts auf und erstellt einen Status-Report nach Schw
2182
2601
 
2183
2602
  ## Destruktive Operationen
2184
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
+
2185
2606
  ### Issue löschen
2186
2607
 
2187
2608
  Löscht ein MantisBT-Issue dauerhaft. Diese Aktion kann nicht rückgängig gemacht werden.