@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.
@@ -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?«
@@ -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.7",
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.7",
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.7",
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: { name: "minor" } by default when no severity is provided', async () => {
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({ name: 'minor' });
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({ name: 'crash' });
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 });