@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.
- package/CHANGELOG.md +34 -0
- package/README.de.md +28 -12
- package/README.md +28 -12
- package/dist/client.js +37 -23
- package/dist/config.js +41 -50
- package/dist/constants.js +12 -0
- package/dist/index.js +23 -13
- package/dist/prompts/index.js +112 -0
- package/dist/resources/index.js +29 -0
- package/dist/tools/config.js +44 -40
- package/dist/tools/issues.js +22 -6
- package/docs/cookbook.de.md +1664 -0
- package/docs/cookbook.md +1664 -0
- package/docs/examples.de.md +200 -0
- package/docs/examples.md +200 -0
- package/package.json +6 -2
- package/server.json +2 -2
- package/tests/client.test.ts +70 -0
- package/tests/config.test.ts +47 -37
- package/tests/helpers/mock-server.ts +61 -0
- package/tests/prompts/prompts.test.ts +242 -0
- package/tests/resources/resources.test.ts +192 -0
- package/tests/tools/issues.test.ts +26 -10
|
@@ -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
|
+
---
|