@dpesch/mantisbt-mcp-server 1.5.7 → 1.5.9
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 +19 -0
- package/README.de.md +7 -1
- package/README.md +7 -1
- package/dist/constants.js +12 -0
- package/dist/tools/issues.js +22 -6
- package/docs/cookbook.de.md +1446 -0
- package/docs/cookbook.md +1446 -0
- package/docs/examples.de.md +158 -0
- package/docs/examples.md +158 -0
- package/package.json +5 -1
- package/server.json +2 -2
- package/tests/tools/issues.test.ts +26 -10
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Anwendungsbeispiele
|
|
2
|
+
|
|
3
|
+
Praktische Beispiele für die Interaktion mit MantisBT über Claude, sobald der MCP-Server verbunden ist. Einfach in natürlicher Sprache fragen — keine Tool-Namen oder Parameter erforderlich. Für exakte Tool-Aufrufe und Parameter siehe das [Cookbook](cookbook.de.md).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Alltägliche Anwendungsfälle
|
|
8
|
+
|
|
9
|
+
### Issues durchsuchen und filtern
|
|
10
|
+
|
|
11
|
+
> »Zeige mir alle offenen Issues im Projekt Webshop.«
|
|
12
|
+
|
|
13
|
+
> »Welche Bugs sind mir aktuell zugewiesen?«
|
|
14
|
+
|
|
15
|
+
> »Liste alle ungelösten Issues mit Priorität 'dringend' im Backend-Projekt.«
|
|
16
|
+
|
|
17
|
+
> »Was ist der Status von Issue #1042?«
|
|
18
|
+
|
|
19
|
+
> »Zeige mir alle Issues, die jsmith diesen Monat gemeldet hat.«
|
|
20
|
+
|
|
21
|
+
> »Welche Issues im Webshop-Projekt blockieren das Release 2.4.0?«
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
### Issues erstellen
|
|
26
|
+
|
|
27
|
+
> »Erstelle einen Bug-Report: Auf der Checkout-Seite wird die Bestellung doppelt abgeschickt, wenn man zweimal auf 'Bestellen' klickt. Kategorie: Shop, Schweregrad: schwerwiegend.«
|
|
28
|
+
|
|
29
|
+
> »Öffne ein neues Issue im API-Projekt — der Token-Refresh-Endpoint gibt 500 zurück, wenn das Refresh-Token abgelaufen ist. Dem Backend-Team zuweisen.«
|
|
30
|
+
|
|
31
|
+
> »Erstelle einen Feature-Request im Frontend-Projekt für einen Dunkelmodus in den Benutzereinstellungen. Niedrige Priorität, kein Fälligkeitsdatum.«
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
### Issues aktualisieren
|
|
36
|
+
|
|
37
|
+
> »Markiere Issue #1042 als gelöst.«
|
|
38
|
+
|
|
39
|
+
> »Weise Issue #887 an jdoe neu zu.«
|
|
40
|
+
|
|
41
|
+
> »Ändere den Schweregrad von #1099 auf 'schwerwiegend' und füge eine Notiz hinzu: auf Produktion reproduziert.«
|
|
42
|
+
|
|
43
|
+
> »Setze die Fix-Version von Issues #901 und #902 auf 2.4.1.«
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
### Notizen und Kommentare
|
|
48
|
+
|
|
49
|
+
> »Füge einen Kommentar zu #1042 hinzu: Fix auf Staging ausgerollt, warte auf QA-Freigabe.«
|
|
50
|
+
|
|
51
|
+
> »Zeige mir alle Notizen zu Issue #774.«
|
|
52
|
+
|
|
53
|
+
> »Füge eine private Notiz zu #512 hinzu: Kundenreferenz AC-2291, nicht weitergeben.«
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### Anhänge
|
|
58
|
+
|
|
59
|
+
> »Hänge die Datei /tmp/error.log an Issue #1042 an.«
|
|
60
|
+
|
|
61
|
+
> »Welche Dateien sind an Issue #930 angehängt?«
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
### Beziehungen
|
|
66
|
+
|
|
67
|
+
> »Markiere Issue #1044 als Duplikat von #1042.«
|
|
68
|
+
|
|
69
|
+
> »Verknüpfe #901 und #902 als verwandte Issues.«
|
|
70
|
+
|
|
71
|
+
> »Issue #1100 blockiert #1101 — bitte diese Beziehung anlegen.«
|
|
72
|
+
> *(Richtung ist entscheidend: #1100 ist das blockierende Issue)*
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
### Tags
|
|
77
|
+
|
|
78
|
+
> »Versehe Issue #1042 mit den Tags 'regression' und 'hotfix'.«
|
|
79
|
+
|
|
80
|
+
> »Entferne den Tag 'wontfix' von Issue #887.«
|
|
81
|
+
|
|
82
|
+
> »Welche Tags gibt es in dieser MantisBT-Instanz?«
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
### Projektmetadaten
|
|
87
|
+
|
|
88
|
+
> »Auf welche Projekte habe ich Zugriff?«
|
|
89
|
+
|
|
90
|
+
> »Welche Versionen sind im Webshop-Projekt definiert?«
|
|
91
|
+
|
|
92
|
+
> »Liste alle Kategorien im Backend-Projekt.«
|
|
93
|
+
|
|
94
|
+
> »Wer sind die Mitglieder des API-Projekts?«
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### Triage und Auswertung
|
|
99
|
+
|
|
100
|
+
> »Gib mir einen Überblick über alle kritischen und dringenden offenen Issues in allen Projekten.«
|
|
101
|
+
|
|
102
|
+
> »Welche Issues im Backend-Projekt sind seit mehr als 30 Tagen ohne Aktivität offen?«
|
|
103
|
+
|
|
104
|
+
> »Was sind die häufigsten Bug-Typen der letzten sechs Monate?«
|
|
105
|
+
|
|
106
|
+
> »Fasse die Notizen zu Issue #774 zusammen und schlage einen nächsten Schritt vor.«
|
|
107
|
+
|
|
108
|
+
> »Liste alle Issues mit dem Tag 'regression' und fasse zusammen, was schiefgelaufen ist.«
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Semantische Suche
|
|
113
|
+
|
|
114
|
+
Die semantische Suche versteht die *Bedeutung* deiner Frage — nicht nur einzelne Schlüsselwörter. Sie findet konzeptionell verwandte Issues, auch wenn die genaue Formulierung abweicht. Aktivierung mit `MANTIS_SEARCH_ENABLED=true`.
|
|
115
|
+
|
|
116
|
+
### Duplikaterkennung vor dem Anlegen
|
|
117
|
+
|
|
118
|
+
> »Bevor ich ein neues Issue anlege: Hat jemand schon ein Problem mit dem Login-Formular nach einem Passwort-Reset gemeldet?«
|
|
119
|
+
|
|
120
|
+
> »Gibt es bereits ein Ticket wegen langsamer PDF-Generierung bei großen Rechnungen?«
|
|
121
|
+
|
|
122
|
+
> »Suche nach Issues ähnlich wie: 'Die Benutzersitzung geht verloren, wenn man den Browser-Tab wechselt'.«
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
### Thematische Übersichten
|
|
127
|
+
|
|
128
|
+
> »Zeig mir relevante Issues rund um die Zahlungsabwicklung — projektübergreifend.«
|
|
129
|
+
|
|
130
|
+
> »Zeig mir Beispiele für gemeldete E-Mail-Zustellungsfehler.«
|
|
131
|
+
|
|
132
|
+
> »Welche Issues erwähnen Performance-Probleme auf Mobilgeräten?«
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
### Unscharfe / terminologieunabhängige Suche
|
|
137
|
+
|
|
138
|
+
> »Finde Issues zu 'doppelten Einträgen' — sie könnten auch als 'zweimal angezeigt', 'doppelte Datensätze' oder 'Phantom-Zeilen' beschrieben sein.«
|
|
139
|
+
|
|
140
|
+
> »Suche nach authentifizierungsbezogenen Issues — die Berichte verwenden möglicherweise 'Login', 'Anmeldung', 'Token', 'Session' oder 'Auth'.«
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### Projektübergreifende Recherche
|
|
145
|
+
|
|
146
|
+
> »Wurde der Bild-Upload-Bug, den wir im Webshop behoben haben, auch im Mobile-Projekt gemeldet?«
|
|
147
|
+
|
|
148
|
+
> »Welche Projekte haben offene Issues zu DSGVO oder Datenexport?«
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
### Einarbeitung und Wissenstransfer
|
|
153
|
+
|
|
154
|
+
> »Zeig mir Tickets, die erklären warum der Authentifizierungsfluss so gebaut wurde wie er ist.«
|
|
155
|
+
|
|
156
|
+
> »Gibt es bekannte Fallstricke beim Einrichten der Deployment-Pipeline?«
|
|
157
|
+
|
|
158
|
+
> »Welche Issues beschreiben Probleme, die beim ersten Einrichten der Entwicklungsumgebung auftreten?«
|
package/docs/examples.md
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Usage Examples
|
|
2
|
+
|
|
3
|
+
Practical examples of how to interact with MantisBT through Claude once the MCP server is connected. Just ask in natural language — no tool names or parameters required. For exact tool calls and parameters, see the [Cookbook](cookbook.md).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Everyday Use Cases
|
|
8
|
+
|
|
9
|
+
### Browsing and searching issues
|
|
10
|
+
|
|
11
|
+
> "Show me all open issues in the Webshop project."
|
|
12
|
+
|
|
13
|
+
> "What bugs are currently assigned to me?"
|
|
14
|
+
|
|
15
|
+
> "List the unresolved issues with priority 'urgent' in the Backend project."
|
|
16
|
+
|
|
17
|
+
> "What's the status of issue #1042?"
|
|
18
|
+
|
|
19
|
+
> "Show me all issues reported by jsmith this month."
|
|
20
|
+
|
|
21
|
+
> "Which issues in the Webshop project are blocking the 2.4.0 release?"
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
### Creating issues
|
|
26
|
+
|
|
27
|
+
> "Create a bug report: on the checkout page, clicking 'Place order' twice submits the order twice. Category: Shop, severity: major."
|
|
28
|
+
|
|
29
|
+
> "Open a new issue in the API project — the token refresh endpoint returns 500 when the refresh token has expired. Assign it to the backend team."
|
|
30
|
+
|
|
31
|
+
> "Create a feature request in the Frontend project for a dark mode in the user settings. Low priority, no due date."
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
### Updating issues
|
|
36
|
+
|
|
37
|
+
> "Mark issue #1042 as resolved."
|
|
38
|
+
|
|
39
|
+
> "Reassign issue #887 to jdoe."
|
|
40
|
+
|
|
41
|
+
> "Change the severity of #1099 to 'major' and add a note: reproduced on production."
|
|
42
|
+
|
|
43
|
+
> "Set the fix version of issues #901 and #902 to 2.4.1."
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
### Notes and comments
|
|
48
|
+
|
|
49
|
+
> "Add a comment to #1042: fix deployed to staging, awaiting QA sign-off."
|
|
50
|
+
|
|
51
|
+
> "Show me all notes on issue #774."
|
|
52
|
+
|
|
53
|
+
> "Add a private note to #512: customer reference AC-2291, do not disclose."
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### Attachments
|
|
58
|
+
|
|
59
|
+
> "Attach the file /tmp/error.log to issue #1042."
|
|
60
|
+
|
|
61
|
+
> "What files are attached to issue #930?"
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
### Relationships
|
|
66
|
+
|
|
67
|
+
> "Mark issue #1044 as a duplicate of #1042."
|
|
68
|
+
|
|
69
|
+
> "Link #901 and #902 as related issues."
|
|
70
|
+
|
|
71
|
+
> "Issue #1100 blocks #1101 — please create that relationship."
|
|
72
|
+
> *(direction matters: #1100 is the blocking issue)*
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
### Tags
|
|
77
|
+
|
|
78
|
+
> "Tag issue #1042 with 'regression' and 'hotfix'."
|
|
79
|
+
|
|
80
|
+
> "Remove the 'wontfix' tag from issue #887."
|
|
81
|
+
|
|
82
|
+
> "Which tags are available in this MantisBT instance?"
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
### Project metadata
|
|
87
|
+
|
|
88
|
+
> "Which projects do I have access to?"
|
|
89
|
+
|
|
90
|
+
> "What versions are defined in the Webshop project?"
|
|
91
|
+
|
|
92
|
+
> "List all categories in the Backend project."
|
|
93
|
+
|
|
94
|
+
> "Who are the members of the API project?"
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### Triage and reporting
|
|
99
|
+
|
|
100
|
+
> "Give me an overview of all critical and urgent open issues across all projects."
|
|
101
|
+
|
|
102
|
+
> "Which issues in the Backend project have been open for more than 30 days without any activity?"
|
|
103
|
+
|
|
104
|
+
> "What are the most common types of bugs reported in the last six months?"
|
|
105
|
+
|
|
106
|
+
> "Summarise the notes on issue #774 and suggest a next step."
|
|
107
|
+
|
|
108
|
+
> "List all issues tagged 'regression' and summarise what went wrong."
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Semantic Search
|
|
113
|
+
|
|
114
|
+
Semantic search understands the *meaning* of your question — not just keywords. It finds conceptually related issues even when the exact wording differs. Enable it with `MANTIS_SEARCH_ENABLED=true`.
|
|
115
|
+
|
|
116
|
+
### Duplicate detection before filing a report
|
|
117
|
+
|
|
118
|
+
> "Before I create a new issue: has anyone reported a problem with the login form after a password reset?"
|
|
119
|
+
|
|
120
|
+
> "Is there already a ticket about slow PDF generation for large invoices?"
|
|
121
|
+
|
|
122
|
+
> "Search for issues similar to: 'user session is lost when switching browser tabs'."
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
### Thematic overviews
|
|
127
|
+
|
|
128
|
+
> "Show me relevant issues related to payment processing — across all projects."
|
|
129
|
+
|
|
130
|
+
> "Show me examples of reported email delivery failures."
|
|
131
|
+
|
|
132
|
+
> "Which issues mention performance problems on mobile devices?"
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
### Fuzzy / terminology-independent search
|
|
137
|
+
|
|
138
|
+
> "Find issues about 'duplicate entries' — they might also be described as 'shown twice', 'double records', or 'phantom rows'."
|
|
139
|
+
|
|
140
|
+
> "Search for authentication-related issues — the reports might use 'login', 'sign-in', 'token', 'session', or 'auth'."
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### Cross-project research
|
|
145
|
+
|
|
146
|
+
> "Is the image upload bug we fixed in the Webshop also reported in the Mobile project?"
|
|
147
|
+
|
|
148
|
+
> "Which projects have open issues related to GDPR or data export?"
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
### Onboarding and knowledge transfer
|
|
153
|
+
|
|
154
|
+
> "Show me tickets that explain why the authentication flow was built this way."
|
|
155
|
+
|
|
156
|
+
> "Are there any known pitfalls when setting up the deployment pipeline?"
|
|
157
|
+
|
|
158
|
+
> "Which issues describe problems that occur during initial environment setup?"
|
package/package.json
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dpesch/mantisbt-mcp-server",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.9",
|
|
4
4
|
"mcpName": "io.github.dpesch/mantisbt-mcp-server",
|
|
5
5
|
"description": "MCP server for MantisBT REST API – read and manage bug tracker issues",
|
|
6
6
|
"author": "Dominik Pesch",
|
|
7
7
|
"license": "MIT",
|
|
8
|
+
"homepage": "https://codeberg.org/dpesch/mantisbt-mcp-server",
|
|
9
|
+
"bugs": {
|
|
10
|
+
"url": "https://codeberg.org/dpesch/mantisbt-mcp-server/issues"
|
|
11
|
+
},
|
|
8
12
|
"repository": {
|
|
9
13
|
"type": "git",
|
|
10
14
|
"url": "https://codeberg.org/dpesch/mantisbt-mcp-server"
|
package/server.json
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"name": "io.github.dpesch/mantisbt-mcp-server",
|
|
4
4
|
"title": "MantisBT MCP Server",
|
|
5
5
|
"description": "MantisBT MCP server – manage issues, notes, files, tags, and relationships. With semantic search.",
|
|
6
|
-
"version": "1.5.
|
|
6
|
+
"version": "1.5.9",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "npm",
|
|
10
10
|
"identifier": "@dpesch/mantisbt-mcp-server",
|
|
11
|
-
"version": "1.5.
|
|
11
|
+
"version": "1.5.9",
|
|
12
12
|
"runtimeHint": "npx",
|
|
13
13
|
"transport": {
|
|
14
14
|
"type": "stdio"
|
|
@@ -112,8 +112,10 @@ describe('create_issue', () => {
|
|
|
112
112
|
expect(mockServer.hasToolRegistered('create_issue')).toBe(true);
|
|
113
113
|
});
|
|
114
114
|
|
|
115
|
-
it('sends severity
|
|
115
|
+
it('sends severity as { id: 50 } (minor) by default when no severity is provided', async () => {
|
|
116
116
|
// Regression: omitting severity caused MantisBT to store 0 → displayed as "@0@".
|
|
117
|
+
// The server now resolves canonical English names to IDs so MantisBT language setting
|
|
118
|
+
// does not affect how the value is stored.
|
|
117
119
|
// validate: true ensures Zod defaults are applied before the handler runs.
|
|
118
120
|
vi.mocked(fetch).mockResolvedValue(
|
|
119
121
|
makeResponse(201, JSON.stringify({ issue: { id: 100, summary: 'Test' } }))
|
|
@@ -126,7 +128,7 @@ describe('create_issue', () => {
|
|
|
126
128
|
}, { validate: true });
|
|
127
129
|
|
|
128
130
|
const body = JSON.parse(vi.mocked(fetch).mock.calls[0]![1]!.body as string) as Record<string, unknown>;
|
|
129
|
-
expect(body.severity).toEqual({
|
|
131
|
+
expect(body.severity).toEqual({ id: 50 });
|
|
130
132
|
});
|
|
131
133
|
|
|
132
134
|
it('returns full issue object when API responds with complete issue', async () => {
|
|
@@ -137,7 +139,7 @@ describe('create_issue', () => {
|
|
|
137
139
|
|
|
138
140
|
const result = await mockServer.callTool('create_issue', {
|
|
139
141
|
summary: 'New issue', project_id: 1, category: 'General',
|
|
140
|
-
});
|
|
142
|
+
}, { validate: true });
|
|
141
143
|
|
|
142
144
|
expect(result.isError).toBeUndefined();
|
|
143
145
|
const parsed = JSON.parse(result.content[0]!.text) as typeof fullIssue;
|
|
@@ -155,7 +157,7 @@ describe('create_issue', () => {
|
|
|
155
157
|
|
|
156
158
|
const result = await mockServer.callTool('create_issue', {
|
|
157
159
|
summary: 'Created issue', project_id: 1, category: 'General',
|
|
158
|
-
});
|
|
160
|
+
}, { validate: true });
|
|
159
161
|
|
|
160
162
|
expect(result.isError).toBeUndefined();
|
|
161
163
|
const parsed = JSON.parse(result.content[0]!.text) as typeof fullIssue;
|
|
@@ -173,7 +175,7 @@ describe('create_issue', () => {
|
|
|
173
175
|
|
|
174
176
|
const result = await mockServer.callTool('create_issue', {
|
|
175
177
|
summary: 'Test', project_id: 1, category: 'General',
|
|
176
|
-
});
|
|
178
|
+
}, { validate: true });
|
|
177
179
|
|
|
178
180
|
expect(result.isError).toBeUndefined();
|
|
179
181
|
const parsed = JSON.parse(result.content[0]!.text) as { id: number };
|
|
@@ -193,7 +195,21 @@ describe('create_issue', () => {
|
|
|
193
195
|
}, { validate: true });
|
|
194
196
|
|
|
195
197
|
const body = JSON.parse(vi.mocked(fetch).mock.calls[0]![1]!.body as string) as Record<string, unknown>;
|
|
196
|
-
expect(body.severity).toEqual({
|
|
198
|
+
expect(body.severity).toEqual({ id: 70 });
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('returns an error for an unknown severity name', async () => {
|
|
202
|
+
const result = await mockServer.callTool('create_issue', {
|
|
203
|
+
summary: 'Test',
|
|
204
|
+
project_id: 1,
|
|
205
|
+
category: 'General',
|
|
206
|
+
severity: 'schwerer Fehler',
|
|
207
|
+
}, { validate: true });
|
|
208
|
+
|
|
209
|
+
expect(result.isError).toBe(true);
|
|
210
|
+
expect(result.content[0]!.text).toContain('schwerer Fehler');
|
|
211
|
+
expect(result.content[0]!.text).toContain('minor');
|
|
212
|
+
expect(fetch).not.toHaveBeenCalled();
|
|
197
213
|
});
|
|
198
214
|
});
|
|
199
215
|
|
|
@@ -213,7 +229,7 @@ describe('create_issue – handler username', () => {
|
|
|
213
229
|
|
|
214
230
|
await server.callTool('create_issue', {
|
|
215
231
|
summary: 'Test', project_id: 1, category: 'General', handler: 'dom',
|
|
216
|
-
});
|
|
232
|
+
}, { validate: true });
|
|
217
233
|
|
|
218
234
|
const body = JSON.parse(vi.mocked(fetch).mock.calls[0]![1]!.body as string) as { handler: { id: number } };
|
|
219
235
|
expect(body.handler).toEqual({ id: 7 });
|
|
@@ -230,7 +246,7 @@ describe('create_issue – handler username', () => {
|
|
|
230
246
|
|
|
231
247
|
await server.callTool('create_issue', {
|
|
232
248
|
summary: 'Test', project_id: 1, category: 'General', handler: 'John Doe',
|
|
233
|
-
});
|
|
249
|
+
}, { validate: true });
|
|
234
250
|
|
|
235
251
|
const body = JSON.parse(vi.mocked(fetch).mock.calls[0]![1]!.body as string) as { handler: { id: number } };
|
|
236
252
|
expect(body.handler).toEqual({ id: 9 });
|
|
@@ -247,7 +263,7 @@ describe('create_issue – handler username', () => {
|
|
|
247
263
|
|
|
248
264
|
await server.callTool('create_issue', {
|
|
249
265
|
summary: 'Test', project_id: 1, category: 'General', handler: 'alice',
|
|
250
|
-
});
|
|
266
|
+
}, { validate: true });
|
|
251
267
|
|
|
252
268
|
const projectUsersCall = vi.mocked(fetch).mock.calls[0]![0] as string;
|
|
253
269
|
expect(projectUsersCall).toContain('projects/1/users');
|
|
@@ -282,7 +298,7 @@ describe('create_issue – handler username', () => {
|
|
|
282
298
|
|
|
283
299
|
await server.callTool('create_issue', {
|
|
284
300
|
summary: 'Test', project_id: 1, category: 'General', handler_id: 99, handler: 'dom',
|
|
285
|
-
});
|
|
301
|
+
}, { validate: true });
|
|
286
302
|
|
|
287
303
|
const body = JSON.parse(vi.mocked(fetch).mock.calls[0]![1]!.body as string) as { handler: { id: number } };
|
|
288
304
|
expect(body.handler).toEqual({ id: 99 });
|