@dpesch/mantisbt-mcp-server 1.5.8 → 1.6.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.
@@ -0,0 +1,1664 @@
1
+ # Cookbook
2
+
3
+ Tool-orientierte Rezepte für den MantisBT MCP Server — jedes Rezept zeigt genau, welches Tool mit welchen Parametern aufgerufen wird. Beispiele mit natürlicher Sprache sind in [examples.de.md](examples.de.md) zu finden.
4
+
5
+ ---
6
+
7
+ - [Die eigene Instanz erkunden](#die-eigene-instanz-erkunden)
8
+ - [Alle Projekte abrufen](#alle-projekte-abrufen)
9
+ - [Gültige Enum-Werte ermitteln (Schweregrad, Status, Priorität)](#gültige-enum-werte-ermitteln-schweregrad-status-priorität)
10
+ - [Gültige Feldnamen für `select` ermitteln](#gültige-feldnamen-für-select-ermitteln)
11
+ - [Issues](#issues)
12
+ - [Einzelnes Issue abrufen](#einzelnes-issue-abrufen)
13
+ - [Issues auflisten (paginiert)](#issues-auflisten-paginiert)
14
+ - [Antwortgröße mit `select` reduzieren](#antwortgröße-mit-select-reduzieren)
15
+ - [Nach Status filtern](#nach-status-filtern)
16
+ - [Nach Bearbeiter oder Melder filtern](#nach-bearbeiter-oder-melder-filtern)
17
+ - [Gespeicherten Filter anwenden](#gespeicherten-filter-anwenden)
18
+ - [Issue erstellen](#issue-erstellen)
19
+ - [Issue schließen (Status + Auflösung)](#issue-schließen-status--auflösung)
20
+ - [Issue neu zuweisen](#issue-neu-zuweisen)
21
+ - [Fix-Version setzen](#fix-version-setzen)
22
+ - [Notizen](#notizen)
23
+ - [Öffentliche Notiz hinzufügen](#öffentliche-notiz-hinzufügen)
24
+ - [Private Notiz hinzufügen](#private-notiz-hinzufügen)
25
+ - [Notiz löschen](#notiz-löschen)
26
+ - [Dateianhänge](#dateianhänge)
27
+ - [Lokale Datei hochladen](#lokale-datei-hochladen)
28
+ - [Dateiinhalt hochladen (Base64)](#dateiinhalt-hochladen-base64)
29
+ - [Anhänge auflisten](#anhänge-auflisten)
30
+ - [Verknüpfungen](#verknüpfungen)
31
+ - [Als Duplikat markieren](#als-duplikat-markieren)
32
+ - [Als verwandt verknüpfen](#als-verwandt-verknüpfen)
33
+ - [Blockier-Verknüpfung setzen](#blockier-verknüpfung-setzen)
34
+ - [Verknüpfung entfernen](#verknüpfung-entfernen)
35
+ - [Tags](#tags)
36
+ - [Tags per Name anhängen](#tags-per-name-anhängen)
37
+ - [Tag entfernen](#tag-entfernen)
38
+ - [Monitore (Beobachter)](#monitore-beobachter)
39
+ - [Beobachter hinzufügen](#beobachter-hinzufügen)
40
+ - [Beobachter entfernen](#beobachter-entfernen)
41
+ - [Semantische Suche](#semantische-suche)
42
+ - [Initialen Index aufbauen](#initialen-index-aufbauen)
43
+ - [Inkrementelles Index-Update](#inkrementelles-index-update)
44
+ - [Index-Status prüfen](#index-status-prüfen)
45
+ - [Nach Bedeutung suchen](#nach-bedeutung-suchen)
46
+ - [Suche mit Felderweiterung](#suche-mit-felderweiterung)
47
+ - [Projekte & Kategorien](#projekte--kategorien)
48
+ - [Projektkategorien auflisten](#projektkategorien-auflisten)
49
+ - [Version & Diagnose](#version--diagnose)
50
+ - [MCP-Server-Version abrufen](#mcp-server-version-abrufen)
51
+ - [MantisBT-Version abrufen](#mantisbt-version-abrufen)
52
+ - [Aktuellen Benutzer abrufen](#aktuellen-benutzer-abrufen)
53
+ - [Ressourcen](#ressourcen)
54
+ - [Eigenes Benutzerprofil lesen](#eigenes-benutzerprofil-lesen)
55
+ - [Alle Projekte lesen](#alle-projekte-lesen)
56
+ - [Issue-Enum-Werte lesen](#issue-enum-werte-lesen)
57
+ - [Prompts](#prompts)
58
+ - [Bug-Report erstellen](#bug-report-erstellen)
59
+ - [Feature-Request erstellen](#feature-request-erstellen)
60
+ - [Issue zusammenfassen](#issue-zusammenfassen)
61
+ - [Projekt-Status-Report](#projekt-status-report)
62
+ - [Destruktive Operationen](#destruktive-operationen)
63
+ - [Issue löschen](#issue-löschen)
64
+
65
+ ---
66
+
67
+ ## Die eigene Instanz erkunden
68
+
69
+ ### Alle Projekte abrufen
70
+
71
+ Gibt die vollständige Liste der mit dem API-Key zugänglichen Projekte zurück.
72
+
73
+ **Tool:** `list_projects`
74
+
75
+ **Parameter:** _(keine)_
76
+
77
+ **Request:**
78
+
79
+ ```json
80
+ {}
81
+ ```
82
+
83
+ **Response:**
84
+
85
+ ```json
86
+ [
87
+ { "id": 3, "name": "Webshop", "status": { "id": 10, "name": "development" }, "enabled": true },
88
+ { "id": 5, "name": "Backend API", "status": { "id": 10, "name": "development" }, "enabled": true }
89
+ ]
90
+ ```
91
+
92
+ ---
93
+
94
+ ### Gültige Enum-Werte ermitteln (Schweregrad, Status, Priorität)
95
+
96
+ 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.
97
+
98
+ **Tool:** `get_issue_enums`
99
+
100
+ **Parameter:** _(keine)_
101
+
102
+ **Request:**
103
+
104
+ ```json
105
+ {}
106
+ ```
107
+
108
+ **Response:**
109
+
110
+ ```json
111
+ {
112
+ "priorities": [
113
+ { "id": 10, "name": "none" },
114
+ { "id": 20, "name": "low" },
115
+ { "id": 30, "name": "normal" },
116
+ { "id": 40, "name": "high" },
117
+ { "id": 50, "name": "urgent" },
118
+ { "id": 60, "name": "immediate" }
119
+ ],
120
+ "severities": [
121
+ { "id": 10, "name": "feature" },
122
+ { "id": 20, "name": "trivial" },
123
+ { "id": 50, "name": "major" },
124
+ { "id": 60, "name": "crash" }
125
+ // ...
126
+ ],
127
+ "statuses": [
128
+ { "id": 10, "name": "new" },
129
+ { "id": 50, "name": "assigned" },
130
+ { "id": 80, "name": "resolved" },
131
+ { "id": 90, "name": "closed" }
132
+ // ...
133
+ ],
134
+ "resolutions": [
135
+ { "id": 10, "name": "open" },
136
+ { "id": 20, "name": "fixed" },
137
+ { "id": 60, "name": "duplicate" }
138
+ // ...
139
+ ]
140
+ }
141
+ ```
142
+
143
+ > **Hinweis:** Die von `get_issue_enums()` zurückgegebenen Namen können lokalisiert sein. `create_issue` und `update_issue` erwarten für `severity` und `priority` **kanonische englische Namen** (z.B. `minor`, `major`, `normal`) — bei Unsicherheit das `canonical_name`-Feld in der Antwort prüfen.
144
+
145
+ ---
146
+
147
+ ### Gültige Feldnamen für `select` ermitteln
148
+
149
+ Gibt alle Feldnamen zurück, die dem `select`-Parameter von `list_issues` übergeben werden können.
150
+
151
+ **Tool:** `get_issue_fields`
152
+
153
+ **Parameter:**
154
+ - `project_id` — _(optional)_ auf Felder eines bestimmten Projekts beschränken
155
+
156
+ **Request:**
157
+
158
+ ```json
159
+ {
160
+ "project_id": 3
161
+ }
162
+ ```
163
+
164
+ **Response:**
165
+
166
+ ```json
167
+ {
168
+ "fields": [
169
+ "additional_information", "attachments", "category", "created_at",
170
+ "description", "fixed_in_version", "handler", "id", "notes",
171
+ "priority", "project", "relationships", "reporter", "resolution",
172
+ "severity", "status", "summary", "tags", "target_version",
173
+ "updated_at", "version", "view_state"
174
+ ],
175
+ "source": "live"
176
+ }
177
+ ```
178
+
179
+ ---
180
+
181
+ ## Issues
182
+
183
+ ### Einzelnes Issue abrufen
184
+
185
+ Ruft ein einzelnes Issue anhand seiner numerischen ID ab, inklusive Notizen, Anhängen, Tags und Verknüpfungen.
186
+
187
+ **Tool:** `get_issue`
188
+
189
+ **Parameter:**
190
+ - `id` — numerische Issue-ID
191
+
192
+ **Request:**
193
+
194
+ ```json
195
+ {
196
+ "id": 1042
197
+ }
198
+ ```
199
+
200
+ **Response:**
201
+
202
+ ```json
203
+ {
204
+ "id": 1042,
205
+ "summary": "Login button unresponsive on mobile Safari",
206
+ "description": "Tapping the login button on iPhone 14 / Safari 17 does nothing.",
207
+ "project": { "id": 3, "name": "Webshop" },
208
+ "category": { "id": 1, "name": "UI" },
209
+ "status": { "id": 50, "name": "assigned" },
210
+ "resolution": { "id": 10, "name": "open" },
211
+ "priority": { "id": 30, "name": "normal" },
212
+ "severity": { "id": 50, "name": "major" },
213
+ "reporter": { "id": 4, "name": "jsmith" },
214
+ "handler": { "id": 7, "name": "jdoe" },
215
+ "created_at": "2024-11-03T09:14:22+00:00",
216
+ "updated_at": "2024-11-05T14:02:11+00:00",
217
+ "tags": [],
218
+ "notes": [],
219
+ "attachments": [],
220
+ "relationships": []
221
+ }
222
+ ```
223
+
224
+ ---
225
+
226
+ ### Issues auflisten (paginiert)
227
+
228
+ Gibt eine paginierte Liste von Issues zurück, optional auf ein Projekt beschränkt.
229
+
230
+ **Tool:** `list_issues`
231
+
232
+ **Parameter:**
233
+ - `project_id` — _(optional)_ numerische Projekt-ID
234
+ - `page` — _(optional)_ Seitennummer, Standard 1
235
+ - `page_size` — _(optional)_ Issues pro Seite, Standard 50
236
+
237
+ **Request:**
238
+
239
+ ```json
240
+ {
241
+ "project_id": 3,
242
+ "page": 1,
243
+ "page_size": 25
244
+ }
245
+ ```
246
+
247
+ **Response:**
248
+
249
+ ```json
250
+ {
251
+ "issues": [
252
+ {
253
+ "id": 1042,
254
+ "summary": "Login button unresponsive on mobile Safari",
255
+ "status": { "id": 50, "name": "assigned" },
256
+ "handler": { "id": 7, "name": "jdoe" }
257
+ },
258
+ {
259
+ "id": 1041,
260
+ "summary": "Checkout total rounds incorrectly",
261
+ "status": { "id": 40, "name": "confirmed" },
262
+ "handler": { "id": 4, "name": "jsmith" }
263
+ }
264
+ // ...
265
+ ]
266
+ }
267
+ ```
268
+
269
+ ---
270
+
271
+ ### Antwortgröße mit `select` reduzieren
272
+
273
+ Eine kommagetrennte Liste von Feldnamen übergeben, um nur die benötigten Felder zu erhalten. Reduziert die Payload-Größe bei großen Listen erheblich.
274
+
275
+ **Tool:** `list_issues`
276
+
277
+ **Parameter:**
278
+ - `project_id` — _(optional)_ numerische Projekt-ID
279
+ - `select` — kommagetrennte Feldnamen
280
+
281
+ **Request:**
282
+
283
+ ```json
284
+ {
285
+ "project_id": 3,
286
+ "select": "id,summary,status,handler"
287
+ }
288
+ ```
289
+
290
+ **Response:**
291
+
292
+ ```json
293
+ {
294
+ "issues": [
295
+ {
296
+ "id": 1042,
297
+ "summary": "Login button unresponsive on mobile Safari",
298
+ "status": { "id": 50, "name": "assigned" },
299
+ "handler": { "id": 7, "name": "jdoe" }
300
+ }
301
+ // ...
302
+ ]
303
+ }
304
+ ```
305
+
306
+ > **Hinweis:** Mit `get_issue_fields()` lassen sich alle verfügbaren Feldnamen anzeigen.
307
+
308
+ ---
309
+
310
+ ### Nach Status filtern
311
+
312
+ Gibt nur Issues mit einem bestimmten Status zurück. Der Filter wird clientseitig angewendet — das Tool durchsucht intern bis zu 500 Issues.
313
+
314
+ **Tool:** `list_issues`
315
+
316
+ **Parameter:**
317
+ - `project_id` — _(optional)_ numerische Projekt-ID
318
+ - `status` — Status-Name als Zeichenkette (z. B. `"new"`, `"assigned"`, `"resolved"`)
319
+
320
+ **Request:**
321
+
322
+ ```json
323
+ {
324
+ "project_id": 3,
325
+ "status": "assigned"
326
+ }
327
+ ```
328
+
329
+ **Response:**
330
+
331
+ ```json
332
+ {
333
+ "issues": [
334
+ {
335
+ "id": 1042,
336
+ "summary": "Login button unresponsive on mobile Safari",
337
+ "status": { "id": 50, "name": "assigned" },
338
+ "handler": { "id": 7, "name": "jdoe" }
339
+ }
340
+ // ...
341
+ ]
342
+ }
343
+ ```
344
+
345
+ > **Hinweis:** Bei großen Projekten mit vielen Issues stattdessen einen vorgespeicherten MantisBT-Filter über `filter_id` verwenden — die clientseitige Filterung durchsucht nur die ersten 500 Issues (10 Seiten × 50).
346
+
347
+ ---
348
+
349
+ ### Nach Bearbeiter oder Melder filtern
350
+
351
+ Gibt Issues gefiltert nach dem zugewiesenen Benutzer oder dem Melder zurück. Beide Filter werden clientseitig angewendet.
352
+
353
+ **Tool:** `list_issues`
354
+
355
+ **Parameter:**
356
+ - `project_id` — _(optional)_ numerische Projekt-ID
357
+ - `assigned_to` — _(optional)_ numerische Benutzer-ID des Bearbeiters
358
+ - `reporter_id` — _(optional)_ numerische Benutzer-ID des Melders
359
+
360
+ **Request:**
361
+
362
+ ```json
363
+ {
364
+ "project_id": 3,
365
+ "assigned_to": 7
366
+ }
367
+ ```
368
+
369
+ **Response:**
370
+
371
+ ```json
372
+ {
373
+ "issues": [
374
+ {
375
+ "id": 1042,
376
+ "summary": "Login button unresponsive on mobile Safari",
377
+ "status": { "id": 50, "name": "assigned" },
378
+ "handler": { "id": 7, "name": "jdoe" }
379
+ }
380
+ // ...
381
+ ]
382
+ }
383
+ ```
384
+
385
+ ---
386
+
387
+ ### Gespeicherten Filter anwenden
388
+
389
+ Einen in MantisBT vorgespeicherten Filter anhand seiner ID verwenden. Dies ist die empfohlene Vorgehensweise bei großen Datenmengen.
390
+
391
+ **Schritt 1 — Verfügbare Filter auflisten:**
392
+
393
+ **Tool:** `list_filters`
394
+
395
+ **Request:**
396
+
397
+ ```json
398
+ {}
399
+ ```
400
+
401
+ **Response:**
402
+
403
+ ```json
404
+ [
405
+ { "id": 12, "name": "My open issues", "owner": { "id": 4, "name": "jsmith" } },
406
+ { "id": 15, "name": "Critical bugs", "owner": { "id": 4, "name": "jsmith" } }
407
+ ]
408
+ ```
409
+
410
+ **Schritt 2 — Issues mit der Filter-ID abrufen:**
411
+
412
+ **Tool:** `list_issues`
413
+
414
+ **Parameter:**
415
+ - `filter_id` — numerische Filter-ID aus Schritt 1
416
+
417
+ **Request:**
418
+
419
+ ```json
420
+ {
421
+ "filter_id": 12
422
+ }
423
+ ```
424
+
425
+ **Response:**
426
+
427
+ ```json
428
+ {
429
+ "issues": [
430
+ {
431
+ "id": 1042,
432
+ "summary": "Login button unresponsive on mobile Safari",
433
+ "status": { "id": 50, "name": "assigned" },
434
+ "handler": { "id": 7, "name": "jdoe" }
435
+ }
436
+ // ...
437
+ ]
438
+ }
439
+ ```
440
+
441
+ ---
442
+
443
+ ### Issue erstellen
444
+
445
+ Legt ein neues Issue in MantisBT an.
446
+
447
+ **Tool:** `create_issue`
448
+
449
+ **Parameter:**
450
+ - `summary` — Titel des Issues
451
+ - `project_id` — numerische Projekt-ID
452
+ - `category` — Kategoriename als Zeichenkette
453
+ - `description` — _(optional)_ ausführliche Beschreibung
454
+ - `priority` — _(optional)_ kanonischer englischer Prioritätsname: `none`, `low`, `normal`, `high`, `urgent`, `immediate` — lokalisierte Bezeichnungen über `get_issue_enums()` ermitteln
455
+ - `severity` — _(optional)_ kanonischer englischer Schweregrad-Name: `feature`, `trivial`, `text`, `tweak`, `minor`, `major`, `crash`, `block`; Standard ist `"minor"` — lokalisierte Bezeichnungen über `get_issue_enums()` ermitteln
456
+ - `handler` — _(optional)_ Benutzername des Bearbeiters (wird automatisch in eine ID aufgelöst)
457
+ - `handler_id` — _(optional)_ numerische Benutzer-ID des Bearbeiters (Alternative zu `handler`)
458
+
459
+ **Request:**
460
+
461
+ ```json
462
+ {
463
+ "summary": "Login-Button auf mobilem Safari reagiert nicht",
464
+ "project_id": 3,
465
+ "category": "UI",
466
+ "description": "Tippen auf den Login-Button auf iPhone 14 / Safari 17 hat keinen Effekt.",
467
+ "severity": "major",
468
+ "handler": "jsmith"
469
+ }
470
+ ```
471
+
472
+ **Response:**
473
+
474
+ ```json
475
+ {
476
+ "id": 1042,
477
+ "summary": "Login-Button auf mobilem Safari reagiert nicht",
478
+ "description": "Tippen auf den Login-Button auf iPhone 14 / Safari 17 hat keinen Effekt.",
479
+ "project": { "id": 3, "name": "Webshop" },
480
+ "category": { "id": 1, "name": "UI" },
481
+ "status": { "id": 10, "name": "new" },
482
+ "resolution": { "id": 10, "name": "open" },
483
+ "priority": { "id": 30, "name": "normal" },
484
+ "severity": { "id": 50, "name": "major" },
485
+ "reporter": { "id": 4, "name": "jsmith" },
486
+ "handler": { "id": 4, "name": "jsmith" },
487
+ "created_at": "2024-11-03T09:14:22+00:00",
488
+ "updated_at": "2024-11-03T09:14:22+00:00",
489
+ "tags": [],
490
+ "notes": [],
491
+ "attachments": [],
492
+ "relationships": []
493
+ }
494
+ ```
495
+
496
+ **Fehler: unbekannter Schweregrad oder unbekannte Priorität**
497
+
498
+ Wird ein nicht erkannter Name für `severity` oder `priority` übergeben, gibt der Server einen Fehler zurück, der die gültigen Werte auflistet:
499
+
500
+ > Error: Invalid severity "schwerer Fehler". Valid canonical names: feature, trivial, text, tweak, minor, major, crash, block. Call get_issue_enums to see localized labels.
501
+
502
+ Mit `get_issue_enums` lassen sich die kanonischen Namen ermitteln, die `create_issue` akzeptiert.
503
+
504
+ ---
505
+
506
+ ### Issue schließen (Status + Auflösung)
507
+
508
+ Löst ein Issue auf und schließt es. **Immer beide Felder** `status` und `resolution` setzen — wird nur der Status gesetzt, bleibt die Auflösung auf »offen«.
509
+
510
+ **Tool:** `update_issue`
511
+
512
+ **Parameter:**
513
+ - `id` — numerische Issue-ID
514
+ - `fields.status` — Status-Objekt mit Name
515
+ - `fields.resolution` — Auflösungs-Objekt mit ID
516
+
517
+ **Request:**
518
+
519
+ ```json
520
+ {
521
+ "id": 1042,
522
+ "fields": {
523
+ "status": { "name": "resolved" },
524
+ "resolution": { "id": 20 }
525
+ }
526
+ }
527
+ ```
528
+
529
+ **Response:**
530
+
531
+ ```json
532
+ {
533
+ "id": 1042,
534
+ "summary": "Login-Button auf mobilem Safari reagiert nicht",
535
+ "status": { "id": 80, "name": "resolved" },
536
+ "resolution": { "id": 20, "name": "fixed" },
537
+ "updated_at": "2024-11-06T10:30:00+00:00"
538
+ }
539
+ ```
540
+
541
+ > **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.
542
+
543
+ ---
544
+
545
+ ### Issue neu zuweisen
546
+
547
+ Ändert den Bearbeiter (Handler) eines bestehenden Issues.
548
+
549
+ **Tool:** `update_issue`
550
+
551
+ **Parameter:**
552
+ - `id` — numerische Issue-ID
553
+ - `fields.handler` — Benutzername (wird automatisch in eine ID aufgelöst)
554
+
555
+ **Request:**
556
+
557
+ ```json
558
+ {
559
+ "id": 1042,
560
+ "fields": {
561
+ "handler": "jdoe"
562
+ }
563
+ }
564
+ ```
565
+
566
+ **Response:**
567
+
568
+ ```json
569
+ {
570
+ "id": 1042,
571
+ "summary": "Login-Button auf mobilem Safari reagiert nicht",
572
+ "status": { "id": 50, "name": "assigned" },
573
+ "handler": { "id": 7, "name": "jdoe" },
574
+ "updated_at": "2024-11-06T11:00:00+00:00"
575
+ }
576
+ ```
577
+
578
+ ---
579
+
580
+ ### Fix-Version setzen
581
+
582
+ Setzt das Feld `fixed_in_version` eines Issues.
583
+
584
+ **Tool:** `update_issue`
585
+
586
+ **Parameter:**
587
+ - `id` — numerische Issue-ID
588
+ - `fields.fixed_in_version` — Versionsname als Zeichenkette
589
+
590
+ **Request:**
591
+
592
+ ```json
593
+ {
594
+ "id": 1042,
595
+ "fields": {
596
+ "fixed_in_version": "2.1.0"
597
+ }
598
+ }
599
+ ```
600
+
601
+ **Response:**
602
+
603
+ ```json
604
+ {
605
+ "id": 1042,
606
+ "summary": "Login-Button auf mobilem Safari reagiert nicht",
607
+ "fixed_in_version": { "name": "2.1.0" },
608
+ "updated_at": "2024-11-06T11:15:00+00:00"
609
+ }
610
+ ```
611
+
612
+ > **Hinweis:** Mit `get_project_versions(project_id)` lassen sich gültige Versionsnamen für ein Projekt auflisten.
613
+
614
+ ---
615
+
616
+ ## Notizen
617
+
618
+ ### Öffentliche Notiz hinzufügen
619
+
620
+ Fügt eine öffentlich sichtbare Notiz zu einem Issue hinzu.
621
+
622
+ **Tool:** `add_note`
623
+
624
+ **Parameter:**
625
+ - `issue_id` — numerische Issue-ID
626
+ - `text` — Inhalt der Notiz
627
+ - `view_state` — _(optional)_ `"public"` (Standard) oder `"private"`
628
+
629
+ **Request:**
630
+
631
+ ```json
632
+ {
633
+ "issue_id": 1042,
634
+ "text": "In Version 2.0.3 reproduziert. Ursache in der Auth-Middleware identifiziert."
635
+ }
636
+ ```
637
+
638
+ **Response:**
639
+
640
+ ```json
641
+ {
642
+ "id": 88,
643
+ "reporter": { "id": 7, "name": "jdoe" },
644
+ "text": "In Version 2.0.3 reproduziert. Ursache in der Auth-Middleware identifiziert.",
645
+ "view_state": { "id": 10, "name": "public" },
646
+ "created_at": "2024-11-05T14:02:11+00:00"
647
+ }
648
+ ```
649
+
650
+ ---
651
+
652
+ ### Private Notiz hinzufügen
653
+
654
+ Fügt eine Notiz hinzu, die nur für Entwickler und Manager sichtbar ist.
655
+
656
+ **Tool:** `add_note`
657
+
658
+ **Parameter:**
659
+ - `issue_id` — numerische Issue-ID
660
+ - `text` — Inhalt der Notiz
661
+ - `view_state` — `"private"`
662
+
663
+ **Request:**
664
+
665
+ ```json
666
+ {
667
+ "issue_id": 1042,
668
+ "text": "Intern: Ursache ist das nicht erneuerte Session-Token.",
669
+ "view_state": "private"
670
+ }
671
+ ```
672
+
673
+ **Response:**
674
+
675
+ ```json
676
+ {
677
+ "id": 89,
678
+ "reporter": { "id": 7, "name": "jdoe" },
679
+ "text": "Intern: Ursache ist das nicht erneuerte Session-Token.",
680
+ "view_state": { "id": 50, "name": "private" },
681
+ "created_at": "2024-11-05T14:05:00+00:00"
682
+ }
683
+ ```
684
+
685
+ ---
686
+
687
+ ### Notiz löschen
688
+
689
+ Entfernt eine Notiz dauerhaft von einem Issue.
690
+
691
+ **Tool:** `delete_note`
692
+
693
+ **Parameter:**
694
+ - `issue_id` — numerische Issue-ID
695
+ - `note_id` — numerische Notiz-ID (aus `list_notes` oder `get_issue`)
696
+
697
+ **Request:**
698
+
699
+ ```json
700
+ {
701
+ "issue_id": 1042,
702
+ "note_id": 88
703
+ }
704
+ ```
705
+
706
+ **Response:**
707
+
708
+ ```
709
+ "Note #88 deleted from issue #1042."
710
+ ```
711
+
712
+ > **Hinweis:** Diese Aktion ist dauerhaft und kann nicht rückgängig gemacht werden.
713
+
714
+ ---
715
+
716
+ ## Dateianhänge
717
+
718
+ ### Lokale Datei hochladen
719
+
720
+ Hängt eine Datei aus dem lokalen Dateisystem an ein Issue an.
721
+
722
+ **Tool:** `upload_file`
723
+
724
+ **Parameter:**
725
+ - `issue_id` — numerische Issue-ID
726
+ - `file_path` — absoluter Pfad zur Datei
727
+
728
+ **Request:**
729
+
730
+ ```json
731
+ {
732
+ "issue_id": 1042,
733
+ "file_path": "/home/user/screenshots/login-fehler.png"
734
+ }
735
+ ```
736
+
737
+ **Response:**
738
+
739
+ ```json
740
+ {
741
+ "id": 101,
742
+ "file_name": "login-fehler.png",
743
+ "size": 14523,
744
+ "content_type": "image/png"
745
+ }
746
+ ```
747
+
748
+ > **Hinweis:** Falls die MantisBT-Instanz keine Datei-Metadaten zurückgibt, lautet die Response `{ "success": true }`.
749
+
750
+ > **Hinweis:** Wenn `MANTIS_UPLOAD_DIR` gesetzt ist, muss `file_path` auf eine Datei innerhalb dieses Verzeichnisses zeigen. Pfade außerhalb des Verzeichnisses oder Path-Traversal-Versuche (`../`) werden mit einem Fehler abgelehnt.
751
+
752
+ ---
753
+
754
+ ### Dateiinhalt hochladen (Base64)
755
+
756
+ Hängt eine Datei an, indem ihr base64-kodierter Inhalt direkt übergeben wird. Verwenden, wenn die Datei nicht auf einem lokal zugänglichen Dateisystem liegt.
757
+
758
+ **Tool:** `upload_file`
759
+
760
+ **Parameter:**
761
+ - `issue_id` — numerische Issue-ID
762
+ - `content` — base64-kodierter Dateiinhalt
763
+ - `filename` — Dateiname inklusive Erweiterung (erforderlich bei Verwendung von `content`)
764
+ - `content_type` — _(optional)_ MIME-Typ
765
+ - `description` — _(optional)_ Beschreibung des Anhangs
766
+
767
+ **Request:**
768
+
769
+ ```json
770
+ {
771
+ "issue_id": 1042,
772
+ "content": "iVBORw0KGgoAAAANSUhEUgAA...",
773
+ "filename": "screenshot.png",
774
+ "content_type": "image/png",
775
+ "description": "Login-Fehler auf mobilem Safari"
776
+ }
777
+ ```
778
+
779
+ **Response:**
780
+
781
+ ```json
782
+ {
783
+ "id": 101,
784
+ "file_name": "screenshot.png",
785
+ "size": 14523,
786
+ "content_type": "image/png"
787
+ }
788
+ ```
789
+
790
+ > **Hinweis:** Falls die MantisBT-Instanz keine Datei-Metadaten zurückgibt, lautet die Response `{ "success": true }`.
791
+
792
+ ---
793
+
794
+ ### Anhänge auflisten
795
+
796
+ Gibt alle Dateianhänge eines Issues zurück.
797
+
798
+ **Tool:** `list_issue_files`
799
+
800
+ **Parameter:**
801
+ - `issue_id` — numerische Issue-ID
802
+
803
+ **Request:**
804
+
805
+ ```json
806
+ {
807
+ "issue_id": 1042
808
+ }
809
+ ```
810
+
811
+ **Response:**
812
+
813
+ ```json
814
+ [
815
+ {
816
+ "id": 23,
817
+ "filename": "login-error.png",
818
+ "size": 42318,
819
+ "content_type": "image/png",
820
+ "description": "Login error on mobile Safari",
821
+ "created_at": "2024-11-05T15:30:00+00:00"
822
+ }
823
+ ]
824
+ ```
825
+
826
+ ---
827
+
828
+ ## Verknüpfungen
829
+
830
+ ### Als Duplikat markieren
831
+
832
+ Verknüpft Issue A als Duplikat von Issue B.
833
+
834
+ **Tool:** `add_relationship`
835
+
836
+ **Parameter:**
837
+ - `issue_id` — ID des Duplikat-Issues (A)
838
+ - `target_id` — ID des ursprünglichen Issues (B)
839
+ - `type_name` — `"duplicate_of"`
840
+
841
+ **Request:**
842
+
843
+ ```json
844
+ {
845
+ "issue_id": 1055,
846
+ "target_id": 1042,
847
+ "type_name": "duplicate_of"
848
+ }
849
+ ```
850
+
851
+ **Response:**
852
+
853
+ ```json
854
+ {
855
+ "id": 5,
856
+ "issue": { "id": 1055 },
857
+ "type": { "id": 0, "name": "duplicate of" }
858
+ }
859
+ ```
860
+
861
+ ---
862
+
863
+ ### Als verwandt verknüpfen
864
+
865
+ Erstellt eine nicht-direktionale »verwandt mit«-Verknüpfung zwischen zwei Issues.
866
+
867
+ **Tool:** `add_relationship`
868
+
869
+ **Parameter:**
870
+ - `issue_id` — numerische Issue-ID
871
+ - `target_id` — numerische ID des verwandten Issues
872
+ - `type_name` — `"related_to"`
873
+
874
+ **Request:**
875
+
876
+ ```json
877
+ {
878
+ "issue_id": 1042,
879
+ "target_id": 1038,
880
+ "type_name": "related_to"
881
+ }
882
+ ```
883
+
884
+ **Response:**
885
+
886
+ ```json
887
+ {
888
+ "id": 6,
889
+ "issue": { "id": 1042 },
890
+ "type": { "id": 1, "name": "related to" }
891
+ }
892
+ ```
893
+
894
+ ---
895
+
896
+ ### Blockier-Verknüpfung setzen
897
+
898
+ Markiert Issue A als blockierend für Issue B (B kann nicht fortgeführt werden, bis A erledigt ist). Die Richtung ist entscheidend — sorgfältig lesen.
899
+
900
+ **Tool:** `add_relationship`
901
+
902
+ **Parameter:**
903
+ - `issue_id` — ID des blockierenden Issues (A)
904
+ - `target_id` — ID des blockierten Issues (B)
905
+ - `type_name` — `"parent_of"` (A blockiert B) oder `"child_of"` (A wird von B blockiert)
906
+
907
+ **Beispiel — A blockiert B:**
908
+
909
+ **Request:**
910
+
911
+ ```json
912
+ {
913
+ "issue_id": 1038,
914
+ "target_id": 1042,
915
+ "type_name": "parent_of"
916
+ }
917
+ ```
918
+
919
+ **Response:**
920
+
921
+ ```json
922
+ {
923
+ "id": 7,
924
+ "issue": { "id": 1038 },
925
+ "type": { "id": 2, "name": "parent of" }
926
+ }
927
+ ```
928
+
929
+ Akzeptierte Werte für `type_name`:
930
+ - `duplicate_of` / `has_duplicate`
931
+ - `related_to` / `related-to`
932
+ - `parent_of` / `parent-of` / `depends_on`
933
+ - `child_of` / `child-of` / `blocks`
934
+
935
+ > **Hinweis:** »A `child_of` B« bedeutet, dass A von B blockiert wird (A hängt von B ab). »A `parent_of` B« bedeutet, dass A B blockiert. Die Aliase `depends_on` (→ `parent_of`) und `blocks` (→ `child_of`) werden ebenfalls akzeptiert. Strich-Varianten (z.B. `related-to`, `parent-of`) funktionieren gleichermaßen. Eine falsche Richtung kehrt die Abhängigkeit um.
936
+
937
+ ---
938
+
939
+ ### Verknüpfung entfernen
940
+
941
+ Entfernt eine Verknüpfung von einem Issue.
942
+
943
+ **Schritt 1 — Verknüpfungs-ID ermitteln:**
944
+
945
+ **Tool:** `get_issue`
946
+
947
+ **Request:**
948
+
949
+ ```json
950
+ {
951
+ "id": 1042
952
+ }
953
+ ```
954
+
955
+ **Response:**
956
+
957
+ ```json
958
+ {
959
+ "id": 1042,
960
+ "summary": "Login-Button auf mobilem Safari reagiert nicht",
961
+ "relationships": [
962
+ { "id": 5, "type": { "id": 0, "name": "duplicate of" }, "issue": { "id": 1055 } }
963
+ ]
964
+ }
965
+ ```
966
+
967
+ `relationships[].id` aus der Antwort lesen.
968
+
969
+ **Schritt 2 — Verknüpfung entfernen:**
970
+
971
+ **Tool:** `remove_relationship`
972
+
973
+ **Parameter:**
974
+ - `issue_id` — numerische Issue-ID
975
+ - `relationship_id` — numerische Verknüpfungs-ID aus Schritt 1
976
+
977
+ **Request:**
978
+
979
+ ```json
980
+ {
981
+ "issue_id": 1042,
982
+ "relationship_id": 5
983
+ }
984
+ ```
985
+
986
+ **Response:**
987
+
988
+ ```json
989
+ { "success": true }
990
+ ```
991
+
992
+ > **Hinweis:** `relationship_id` ist die ID des Verknüpfungsdatensatzes selbst — nicht die Typ-ID und nicht die ID des Ziel-Issues.
993
+
994
+ ---
995
+
996
+ ## Tags
997
+
998
+ ### Tags per Name anhängen
999
+
1000
+ Hängt einen oder mehrere Tags per Name an ein Issue an. Unbekannte Tag-Namen werden automatisch angelegt.
1001
+
1002
+ **Tool:** `attach_tags`
1003
+
1004
+ **Parameter:**
1005
+ - `issue_id` — numerische Issue-ID
1006
+ - `tags` — Array von Tag-Objekten; `{name: "..."}` für Referenz per Name oder `{id: N}` für Referenz per ID
1007
+
1008
+ **Request:**
1009
+
1010
+ ```json
1011
+ {
1012
+ "issue_id": 1042,
1013
+ "tags": [
1014
+ { "name": "needs-review" },
1015
+ { "name": "regression" }
1016
+ ]
1017
+ }
1018
+ ```
1019
+
1020
+ **Response:**
1021
+
1022
+ ```
1023
+ "Tags successfully attached to issue #1042."
1024
+ ```
1025
+
1026
+ ---
1027
+
1028
+ ### Tag entfernen
1029
+
1030
+ Entfernt einen Tag von einem Issue. Erfordert die numerische Tag-ID.
1031
+
1032
+ **Schritt 1 — Tag-ID ermitteln:**
1033
+
1034
+ **Tool:** `get_issue`
1035
+
1036
+ **Request:**
1037
+
1038
+ ```json
1039
+ {
1040
+ "id": 1042
1041
+ }
1042
+ ```
1043
+
1044
+ **Response:**
1045
+
1046
+ ```json
1047
+ {
1048
+ "id": 1042,
1049
+ "summary": "Login-Button auf mobilem Safari reagiert nicht",
1050
+ "tags": [
1051
+ { "id": 14, "name": "needs-review" },
1052
+ { "id": 17, "name": "regression" }
1053
+ ]
1054
+ }
1055
+ ```
1056
+
1057
+ `tags[].id` aus der Antwort lesen.
1058
+
1059
+ **Schritt 2 — Tag entfernen:**
1060
+
1061
+ **Tool:** `detach_tag`
1062
+
1063
+ **Parameter:**
1064
+ - `issue_id` — numerische Issue-ID
1065
+ - `tag_id` — numerische Tag-ID aus Schritt 1
1066
+
1067
+ **Request:**
1068
+
1069
+ ```json
1070
+ {
1071
+ "issue_id": 1042,
1072
+ "tag_id": 14
1073
+ }
1074
+ ```
1075
+
1076
+ **Response:**
1077
+
1078
+ ```
1079
+ "Tag #14 successfully removed from issue #1042."
1080
+ ```
1081
+
1082
+ > **Hinweis:** `detach_tag` erfordert eine numerische ID, keinen Tag-Namen. Es gibt keine Suche per Name — die ID muss immer zuerst über `get_issue` oder `get_metadata` abgerufen werden.
1083
+
1084
+ ---
1085
+
1086
+ ## Monitore (Beobachter)
1087
+
1088
+ ### Beobachter hinzufügen
1089
+
1090
+ Abonniert einen Benutzer für Benachrichtigungen zu einem Issue.
1091
+
1092
+ **Tool:** `add_monitor`
1093
+
1094
+ **Parameter:**
1095
+ - `issue_id` — numerische Issue-ID
1096
+ - `username` — Benutzername als Zeichenkette
1097
+
1098
+ **Request:**
1099
+
1100
+ ```json
1101
+ {
1102
+ "issue_id": 1042,
1103
+ "username": "jsmith"
1104
+ }
1105
+ ```
1106
+
1107
+ **Response:**
1108
+
1109
+ ```json
1110
+ { "success": true }
1111
+ ```
1112
+
1113
+ ---
1114
+
1115
+ ### Beobachter entfernen
1116
+
1117
+ Deabonniert einen Benutzer von Benachrichtigungen zu einem Issue.
1118
+
1119
+ **Tool:** `remove_monitor`
1120
+
1121
+ **Parameter:**
1122
+ - `issue_id` — numerische Issue-ID
1123
+ - `username` — Benutzername als Zeichenkette
1124
+
1125
+ **Request:**
1126
+
1127
+ ```json
1128
+ {
1129
+ "issue_id": 1042,
1130
+ "username": "jsmith"
1131
+ }
1132
+ ```
1133
+
1134
+ **Response:**
1135
+
1136
+ ```json
1137
+ { "success": true }
1138
+ ```
1139
+
1140
+ ---
1141
+
1142
+ ## Semantische Suche
1143
+
1144
+ > **Hinweis:** Alle Tools in diesem Abschnitt erfordern `MANTIS_SEARCH_ENABLED=true` in der Server-Konfiguration.
1145
+
1146
+ ### Initialen Index aufbauen
1147
+
1148
+ Baut den vollständigen Vektor-Suchindex von Grund auf neu auf. Einmalig nach der Aktivierung der semantischen Suche ausführen.
1149
+
1150
+ **Tool:** `rebuild_search_index`
1151
+
1152
+ **Parameter:**
1153
+ - `full` — auf `true` setzen, um den bestehenden Index vor dem Aufbau zu leeren
1154
+
1155
+ **Request:**
1156
+
1157
+ ```json
1158
+ {
1159
+ "full": true
1160
+ }
1161
+ ```
1162
+
1163
+ **Response:**
1164
+
1165
+ ```json
1166
+ {
1167
+ "indexed": 312,
1168
+ "skipped": 0,
1169
+ "total": 312,
1170
+ "duration_ms": 48203
1171
+ }
1172
+ ```
1173
+
1174
+ ---
1175
+
1176
+ ### Inkrementelles Index-Update
1177
+
1178
+ Aktualisiert den Index mit Issues, die seit dem letzten Aufbau hinzugekommen oder geändert wurden. Schneller als ein vollständiger Neuaufbau.
1179
+
1180
+ **Tool:** `rebuild_search_index`
1181
+
1182
+ **Parameter:**
1183
+ - `project_id` — _(optional)_ auf ein einzelnes Projekt beschränken
1184
+ - `full` — weglassen oder auf `false` setzen für den inkrementellen Modus
1185
+
1186
+ **Request:**
1187
+
1188
+ ```json
1189
+ {
1190
+ "project_id": 3
1191
+ }
1192
+ ```
1193
+
1194
+ **Response:**
1195
+
1196
+ ```json
1197
+ {
1198
+ "indexed": 14,
1199
+ "skipped": 298,
1200
+ "total": 312,
1201
+ "duration_ms": 2104
1202
+ }
1203
+ ```
1204
+
1205
+ ---
1206
+
1207
+ ### Index-Status prüfen
1208
+
1209
+ Gibt die Anzahl der indizierten Issues, die Gesamtanzahl der Issues und den Zeitstempel der letzten Synchronisation zurück.
1210
+
1211
+ **Tool:** `get_search_index_status`
1212
+
1213
+ **Parameter:** _(keine)_
1214
+
1215
+ **Request:**
1216
+
1217
+ ```json
1218
+ {}
1219
+ ```
1220
+
1221
+ **Response:**
1222
+
1223
+ ```json
1224
+ {
1225
+ "summary": "312/312 (100 %)",
1226
+ "indexed": 312,
1227
+ "total": 312,
1228
+ "percent": 100,
1229
+ "last_synced_at": "2024-11-05T14:00:00.000Z"
1230
+ }
1231
+ ```
1232
+
1233
+ ---
1234
+
1235
+ ### Nach Bedeutung suchen
1236
+
1237
+ Findet Issues, die einem natürlichsprachigen Suchbegriff semantisch ähnlich sind. Gibt Issue-IDs und Relevanz-Scores zurück.
1238
+
1239
+ **Tool:** `search_issues`
1240
+
1241
+ **Parameter:**
1242
+ - `query` — Suchanfrage in natürlicher Sprache
1243
+ - `top_n` — _(optional)_ Anzahl zurückzugebender Ergebnisse; Standard 10
1244
+
1245
+ **Request:**
1246
+
1247
+ ```json
1248
+ {
1249
+ "query": "Authentifizierung schlägt nach Passwort-Reset fehl",
1250
+ "top_n": 5
1251
+ }
1252
+ ```
1253
+
1254
+ **Response:**
1255
+
1256
+ ```json
1257
+ [
1258
+ { "id": 1042, "score": 0.91 },
1259
+ { "id": 987, "score": 0.84 },
1260
+ { "id": 1015, "score": 0.79 }
1261
+ ]
1262
+ ```
1263
+
1264
+ > **Hinweis:** Die semantische Suche gibt die top-N ähnlichsten Issues zurück — vollständige Treffergarantie besteht nicht. Sie eignet sich nicht für Abfragen wie »alle Issues zu Thema X auflisten«.
1265
+
1266
+ ---
1267
+
1268
+ ### Suche mit Felderweiterung
1269
+
1270
+ Reichert Suchergebnisse mit bestimmten Feldern aus MantisBT an. Ohne `select` werden nur `id` und Score zurückgegeben.
1271
+
1272
+ **Tool:** `search_issues`
1273
+
1274
+ **Parameter:**
1275
+ - `query` — Suchanfrage in natürlicher Sprache
1276
+ - `top_n` — _(optional)_ Anzahl der Ergebnisse
1277
+ - `select` — kommagetrennte Feldnamen, die für jedes Ergebnis abgerufen werden
1278
+
1279
+ **Request:**
1280
+
1281
+ ```json
1282
+ {
1283
+ "query": "Authentifizierung schlägt nach Passwort-Reset fehl",
1284
+ "top_n": 10,
1285
+ "select": "id,summary,status,handler"
1286
+ }
1287
+ ```
1288
+
1289
+ **Response:**
1290
+
1291
+ ```json
1292
+ [
1293
+ {
1294
+ "id": 1042,
1295
+ "score": 0.91,
1296
+ "summary": "Login button unresponsive on mobile Safari",
1297
+ "status": { "id": 50, "name": "assigned" },
1298
+ "handler": { "id": 7, "name": "jdoe" }
1299
+ }
1300
+ // ...
1301
+ ]
1302
+ ```
1303
+
1304
+ > **Hinweis:** Die Verwendung von `select` löst für jedes Ergebnis zusätzliche API-Aufrufe an MantisBT aus. `top_n` bei Verwendung der Felderweiterung klein halten, um übermäßige Anfragen zu vermeiden.
1305
+
1306
+ ---
1307
+
1308
+ ## Projekte & Kategorien
1309
+
1310
+ ### Projektkategorien auflisten
1311
+
1312
+ Gibt alle verfügbaren Kategorien eines MantisBT-Projekts zurück. Die zurückgegebenen Namen können direkt beim Erstellen von Issues verwendet werden.
1313
+
1314
+ **Tool:** `get_project_categories`
1315
+
1316
+ **Parameter:**
1317
+ - `project_id` — numerische Projekt-ID
1318
+
1319
+ **Request:**
1320
+
1321
+ ```json
1322
+ {
1323
+ "project_id": 3
1324
+ }
1325
+ ```
1326
+
1327
+ **Response:**
1328
+
1329
+ ```json
1330
+ [
1331
+ { "id": 1, "name": "General" },
1332
+ { "id": 2, "name": "UI" },
1333
+ { "id": 3, "name": "Backend" }
1334
+ ]
1335
+ ```
1336
+
1337
+ > **Hinweis:** Kategorienamen mit dem Prefix `[All Projects]` (aus dem globalen Projekt geerbt) werden in der Antwort automatisch ohne diesen Prefix zurückgegeben.
1338
+
1339
+ ---
1340
+
1341
+ ## Version & Diagnose
1342
+
1343
+ ### MCP-Server-Version abrufen
1344
+
1345
+ Gibt die Version dieser mantisbt-mcp-server-Instanz zurück.
1346
+
1347
+ **Tool:** `get_mcp_version`
1348
+
1349
+ **Parameter:** _(keine)_
1350
+
1351
+ **Request:**
1352
+
1353
+ ```json
1354
+ {}
1355
+ ```
1356
+
1357
+ **Response:**
1358
+
1359
+ ```json
1360
+ {
1361
+ "version": "1.5.8"
1362
+ }
1363
+ ```
1364
+
1365
+ ---
1366
+
1367
+ ### MantisBT-Version abrufen
1368
+
1369
+ Gibt die Version der verbundenen MantisBT-Installation zurück und vergleicht sie optional mit dem neuesten offiziellen Release auf GitHub.
1370
+
1371
+ **Tool:** `get_mantis_version`
1372
+
1373
+ **Parameter:**
1374
+ - `check_latest` — _(optional)_ ob gegen das neueste GitHub-Release verglichen werden soll; Standard `true`
1375
+
1376
+ **Request:**
1377
+
1378
+ ```json
1379
+ {
1380
+ "check_latest": true
1381
+ }
1382
+ ```
1383
+
1384
+ **Response:**
1385
+
1386
+ ```json
1387
+ {
1388
+ "installed_version": "2.27.0",
1389
+ "latest_version": "2.27.1",
1390
+ "status": "update-available"
1391
+ }
1392
+ ```
1393
+
1394
+ Mögliche Werte für `status`: `up-to-date`, `update-available`, `newer-than-release`, `unknown`.
1395
+
1396
+ > **Hinweis:** Der GitHub-Vergleich erfordert eine ausgehende HTTPS-Verbindung. Mit `check_latest: false` lässt er sich überspringen.
1397
+
1398
+ ---
1399
+
1400
+ ### Aktuellen Benutzer abrufen
1401
+
1402
+ 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.
1403
+
1404
+ **Tool:** `get_current_user`
1405
+
1406
+ **Parameter:** _(keine)_
1407
+
1408
+ **Request:**
1409
+
1410
+ ```json
1411
+ {}
1412
+ ```
1413
+
1414
+ **Response:**
1415
+
1416
+ ```json
1417
+ {
1418
+ "id": 4,
1419
+ "name": "jsmith",
1420
+ "real_name": "John Smith",
1421
+ "email": "jsmith@example.com",
1422
+ "access_level": { "id": 55, "name": "developer" }
1423
+ }
1424
+ ```
1425
+
1426
+ ---
1427
+
1428
+ ## Ressourcen
1429
+
1430
+ MCP-Ressourcen sind URI-adressierbare, schreibgeschützte Daten. Clients, die Ressourcen unterstützen, können sie direkt per URI abrufen — kein Tool-Aufruf nötig. Hinweis: Ressourcen werden von MCP-Clients weniger breit unterstützt als Tools; bitte die Dokumentation des jeweiligen Clients prüfen.
1431
+
1432
+ > **Hinweis:** Ressourcen sind schreibgeschützt. Schreiboperationen sind über das Ressourcen-Primitiv nicht möglich — für Änderungen das entsprechende Tool verwenden (`create_issue`, `update_issue` usw.).
1433
+
1434
+ ### Eigenes Benutzerprofil lesen
1435
+
1436
+ Gibt das Profil des authentifizierten API-Benutzers zurück.
1437
+
1438
+ **Ressource-URI:** `mantis://me`
1439
+
1440
+ **Abrufverhalten:** Immer live — ruft bei jedem Zugriff `GET /users/me` auf.
1441
+
1442
+ **Response:**
1443
+
1444
+ ```json
1445
+ {
1446
+ "id": 4,
1447
+ "name": "jsmith",
1448
+ "real_name": "John Smith",
1449
+ "email": "jsmith@example.com",
1450
+ "access_level": { "id": 55, "name": "developer" }
1451
+ }
1452
+ ```
1453
+
1454
+ > **Tipp:** Das Tool `get_current_user` liefert dieselben Daten für Clients ohne Ressourcen-Unterstützung.
1455
+
1456
+ ---
1457
+
1458
+ ### Alle Projekte lesen
1459
+
1460
+ Gibt alle MantisBT-Projekte zurück, auf die der konfigurierte API-Key Zugriff hat.
1461
+
1462
+ **Ressource-URI:** `mantis://projects`
1463
+
1464
+ **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.
1465
+
1466
+ **Response:**
1467
+
1468
+ ```json
1469
+ [
1470
+ { "id": 3, "name": "Webshop", "status": { "id": 10, "name": "development" }, "enabled": true },
1471
+ { "id": 5, "name": "Backend API", "status": { "id": 10, "name": "development" }, "enabled": true }
1472
+ ]
1473
+ ```
1474
+
1475
+ > **Tipp:** Das Tool `list_projects` liefert dieselben Daten für Clients ohne Ressourcen-Unterstützung.
1476
+
1477
+ ---
1478
+
1479
+ ### Issue-Enum-Werte lesen
1480
+
1481
+ Gibt gültige ID/Name-Paare für alle Issue-Enum-Felder zurück (Severity, Priority, Status, Resolution, Reproducibility). Vor `create_issue` oder `update_issue` verwenden, um kanonische englische Namen nachzuschlagen.
1482
+
1483
+ **Ressource-URI:** `mantis://enums`
1484
+
1485
+ **Abrufverhalten:** Immer live — ruft bei jedem Zugriff den MantisBT-Config-Endpoint auf.
1486
+
1487
+ **Response:**
1488
+
1489
+ ```json
1490
+ {
1491
+ "priorities": [
1492
+ { "id": 10, "name": "none" },
1493
+ { "id": 20, "name": "low" },
1494
+ { "id": 30, "name": "normal" },
1495
+ { "id": 40, "name": "high" },
1496
+ { "id": 50, "name": "urgent" },
1497
+ { "id": 60, "name": "immediate" }
1498
+ ],
1499
+ "severities": [
1500
+ { "id": 10, "name": "feature" },
1501
+ { "id": 20, "name": "trivial" },
1502
+ { "id": 50, "name": "major" },
1503
+ { "id": 60, "name": "crash" }
1504
+ ],
1505
+ "statuses": [
1506
+ { "id": 10, "name": "new" },
1507
+ { "id": 50, "name": "assigned" },
1508
+ { "id": 80, "name": "resolved" },
1509
+ { "id": 90, "name": "closed" }
1510
+ ],
1511
+ "resolutions": [
1512
+ { "id": 10, "name": "open" },
1513
+ { "id": 20, "name": "fixed" },
1514
+ { "id": 60, "name": "duplicate" }
1515
+ ]
1516
+ }
1517
+ ```
1518
+
1519
+ > **Tipp:** Das Tool `get_issue_enums` liefert dieselben Daten für Clients ohne Ressourcen-Unterstützung.
1520
+
1521
+ ---
1522
+
1523
+ ## Prompts
1524
+
1525
+ MCP-Prompt-Templates starten eine geführte Unterhaltung — der Client sendet die Prompt-Argumente und der Server liefert eine vorgefertigte Nachricht, die den LLM anweist, die passenden Tools aufzurufen. Beispiele in natürlicher Sprache sind in [examples.de.md](examples.de.md) zu finden.
1526
+
1527
+ ### Bug-Report erstellen
1528
+
1529
+ Sammelt strukturierte Bug-Daten und ruft `create_issue` auf.
1530
+
1531
+ **Prompt:** `create-bug-report`
1532
+
1533
+ **Pflichtargumente:**
1534
+ - `project_id` — numerische Projekt-ID
1535
+ - `category` — Kategoriename
1536
+ - `summary` — Issue-Titel
1537
+ - `description` — detaillierte Fehlerbeschreibung
1538
+
1539
+ **Optionale Argumente:**
1540
+ - `steps_to_reproduce` — Schritte zur Reproduktion
1541
+ - `expected` — erwartetes Verhalten
1542
+ - `actual` — tatsächliches (beobachtetes) Verhalten
1543
+ - `environment` — Umgebungsangaben (Betriebssystem, Browser, Version usw.)
1544
+
1545
+ **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.
1546
+
1547
+ **Beispielaufruf:**
1548
+
1549
+ ```json
1550
+ {
1551
+ "project_id": 3,
1552
+ "category": "UI",
1553
+ "summary": "Login-Button reagiert auf Mobile Safari nicht",
1554
+ "description": "Ein Tipp auf den Login-Button auf einem iPhone 14 / Safari 17 bewirkt nichts.",
1555
+ "steps_to_reproduce": "1. Login-Seite auf iPhone 14 öffnen\n2. Auf 'Anmelden' tippen\n3. Nichts passiert",
1556
+ "expected": "Benutzer wird angemeldet und zum Dashboard weitergeleitet",
1557
+ "actual": "Die Seite bleibt auf dem Login-Formular, keine Fehlermeldung",
1558
+ "environment": "iPhone 14, iOS 17, Safari 17"
1559
+ }
1560
+ ```
1561
+
1562
+ ---
1563
+
1564
+ ### Feature-Request erstellen
1565
+
1566
+ Sammelt Feature-Details und ruft `create_issue` auf.
1567
+
1568
+ **Prompt:** `create-feature-request`
1569
+
1570
+ **Pflichtargumente:**
1571
+ - `project_id` — numerische Projekt-ID
1572
+ - `category` — Kategoriename
1573
+ - `summary` — Feature-Titel
1574
+ - `description` — detaillierte Beschreibung des Features
1575
+
1576
+ **Optionale Argumente:**
1577
+ - `use_case` — konkreter Anwendungsfall oder Motivation für das Feature
1578
+
1579
+ **Ablauf:** Der Prompt liefert eine Nachricht, die den LLM anweist, `create_issue` mit dem Schweregrad `feature` aufzurufen.
1580
+
1581
+ **Beispielaufruf:**
1582
+
1583
+ ```json
1584
+ {
1585
+ "project_id": 5,
1586
+ "category": "UX",
1587
+ "summary": "Dunkelmodus für Benutzereinstellungen",
1588
+ "description": "Einen Dunkelmodus-Schalter auf der Seite mit den Benutzereinstellungen hinzufügen.",
1589
+ "use_case": "Benutzer, die in schlecht beleuchteten Umgebungen arbeiten, berichten über Augenbelastung durch die aktuelle helle Benutzeroberfläche."
1590
+ }
1591
+ ```
1592
+
1593
+ ---
1594
+
1595
+ ### Issue zusammenfassen
1596
+
1597
+ Ruft ein einzelnes Issue ab und liefert eine prägnante Zusammenfassung.
1598
+
1599
+ **Prompt:** `summarize-issue`
1600
+
1601
+ **Pflichtargumente:**
1602
+ - `issue_id` — numerische Issue-ID
1603
+
1604
+ **Ablauf:** Der Prompt liefert eine Nachricht, die den LLM anweist, `get_issue` aufzurufen und das Ergebnis zusammenzufassen — inklusive Status, Priorität, aktueller Notizen und empfohlener nächster Schritte.
1605
+
1606
+ **Beispielaufruf:**
1607
+
1608
+ ```json
1609
+ {
1610
+ "issue_id": 1042
1611
+ }
1612
+ ```
1613
+
1614
+ ---
1615
+
1616
+ ### Projekt-Status-Report
1617
+
1618
+ Listet alle Issues eines Projekts auf und erstellt einen Status-Report nach Schweregrad.
1619
+
1620
+ **Prompt:** `project-status`
1621
+
1622
+ **Pflichtargumente:**
1623
+ - `project_id` — numerische Projekt-ID
1624
+
1625
+ **Ablauf:** Der Prompt liefert eine Nachricht, die den LLM anweist, `list_issues` für das Projekt aufzurufen und einen strukturierten Report zu erstellen: Anzahl offener Issues, Aufschlüsselung nach Schweregrad und eine Liste der kritischsten Einträge.
1626
+
1627
+ **Beispielaufruf:**
1628
+
1629
+ ```json
1630
+ {
1631
+ "project_id": 3
1632
+ }
1633
+ ```
1634
+
1635
+ ---
1636
+
1637
+ ## Destruktive Operationen
1638
+
1639
+ ### Issue löschen
1640
+
1641
+ Löscht ein MantisBT-Issue dauerhaft. Diese Aktion kann nicht rückgängig gemacht werden.
1642
+
1643
+ **Tool:** `delete_issue`
1644
+
1645
+ **Parameter:**
1646
+ - `id` — numerische Issue-ID
1647
+
1648
+ **Request:**
1649
+
1650
+ ```json
1651
+ {
1652
+ "id": 42
1653
+ }
1654
+ ```
1655
+
1656
+ **Response:**
1657
+
1658
+ ```
1659
+ "Issue #42 deleted successfully."
1660
+ ```
1661
+
1662
+ > **Warnung:** Diese Aktion ist dauerhaft und kann nicht rückgängig gemacht werden.
1663
+
1664
+ ---