wopee-mcp 1.0.1
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/INTEGRATION.md +441 -0
- package/LICENSE +200 -0
- package/QUICK_START.md +50 -0
- package/README.md +658 -0
- package/dist/config.d.ts +48 -0
- package/dist/config.js +165 -0
- package/dist/config.js.map +1 -0
- package/dist/graphql/client.d.ts +34 -0
- package/dist/graphql/client.js +75 -0
- package/dist/graphql/client.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +672 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/wopee_dispatch_agent.d.ts +8 -0
- package/dist/tools/wopee_dispatch_agent.js +41 -0
- package/dist/tools/wopee_dispatch_agent.js.map +1 -0
- package/dist/tools/wopee_dispatch_analysis.d.ts +8 -0
- package/dist/tools/wopee_dispatch_analysis.js +50 -0
- package/dist/tools/wopee_dispatch_analysis.js.map +1 -0
- package/dist/tools/wopee_fetch_analysis_suites.d.ts +8 -0
- package/dist/tools/wopee_fetch_analysis_suites.js +81 -0
- package/dist/tools/wopee_fetch_analysis_suites.js.map +1 -0
- package/dist/tools/wopee_generate_app_context.d.ts +8 -0
- package/dist/tools/wopee_generate_app_context.js +62 -0
- package/dist/tools/wopee_generate_app_context.js.map +1 -0
- package/dist/tools/wopee_generate_general_user_stories.d.ts +8 -0
- package/dist/tools/wopee_generate_general_user_stories.js +62 -0
- package/dist/tools/wopee_generate_general_user_stories.js.map +1 -0
- package/dist/tools/wopee_generate_test_cases.d.ts +8 -0
- package/dist/tools/wopee_generate_test_cases.js +74 -0
- package/dist/tools/wopee_generate_test_cases.js.map +1 -0
- package/dist/tools/wopee_generate_user_stories.d.ts +8 -0
- package/dist/tools/wopee_generate_user_stories.js +74 -0
- package/dist/tools/wopee_generate_user_stories.js.map +1 -0
- package/dist/tools/wopee_get_app_context.d.ts +8 -0
- package/dist/tools/wopee_get_app_context.js +41 -0
- package/dist/tools/wopee_get_app_context.js.map +1 -0
- package/dist/tools/wopee_get_test_cases.d.ts +9 -0
- package/dist/tools/wopee_get_test_cases.js +43 -0
- package/dist/tools/wopee_get_test_cases.js.map +1 -0
- package/dist/tools/wopee_get_user_stories.d.ts +8 -0
- package/dist/tools/wopee_get_user_stories.js +41 -0
- package/dist/tools/wopee_get_user_stories.js.map +1 -0
- package/dist/types/index.d.ts +425 -0
- package/dist/types/index.js +143 -0
- package/dist/types/index.js.map +1 -0
- package/env.example +7 -0
- package/package.json +117 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,672 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { configManager } from './config.js';
|
|
6
|
+
import { wopee_dispatch_analysis } from './tools/wopee_dispatch_analysis.js';
|
|
7
|
+
import { wopee_dispatch_agent } from './tools/wopee_dispatch_agent.js';
|
|
8
|
+
import { wopee_generate_app_context } from './tools/wopee_generate_app_context.js';
|
|
9
|
+
import { wopee_generate_general_user_stories } from './tools/wopee_generate_general_user_stories.js';
|
|
10
|
+
import { wopee_generate_user_stories } from './tools/wopee_generate_user_stories.js';
|
|
11
|
+
import { wopee_generate_test_cases } from './tools/wopee_generate_test_cases.js';
|
|
12
|
+
import { wopee_get_app_context } from './tools/wopee_get_app_context.js';
|
|
13
|
+
import { wopee_get_user_stories } from './tools/wopee_get_user_stories.js';
|
|
14
|
+
import { wopee_get_test_cases } from './tools/wopee_get_test_cases.js';
|
|
15
|
+
import { wopee_fetch_analysis_suites } from './tools/wopee_fetch_analysis_suites.js';
|
|
16
|
+
/**
|
|
17
|
+
* Wopee MCP Server
|
|
18
|
+
*
|
|
19
|
+
* This server provides tools for interacting with the Wopee testing platform
|
|
20
|
+
* including starting analysis, generating app context, user stories, tests,
|
|
21
|
+
* and running test executions.
|
|
22
|
+
*/
|
|
23
|
+
class WopeeMCPServer {
|
|
24
|
+
server;
|
|
25
|
+
constructor() {
|
|
26
|
+
this.server = new Server({
|
|
27
|
+
name: 'wopee-mcp',
|
|
28
|
+
version: '1.0.0',
|
|
29
|
+
}, {
|
|
30
|
+
capabilities: {
|
|
31
|
+
tools: {},
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
this.setupToolHandlers();
|
|
35
|
+
this.setupErrorHandling();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Setup tool handlers for all Wopee tools
|
|
39
|
+
*/
|
|
40
|
+
setupToolHandlers() {
|
|
41
|
+
// List available tools
|
|
42
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
43
|
+
return {
|
|
44
|
+
tools: [
|
|
45
|
+
{
|
|
46
|
+
name: 'wopee_dispatch_analysis',
|
|
47
|
+
description: 'Dispatch a new analysis for the given project to understand the application structure and behavior',
|
|
48
|
+
inputSchema: {
|
|
49
|
+
type: 'object',
|
|
50
|
+
properties: {
|
|
51
|
+
projectUuid: {
|
|
52
|
+
type: 'string',
|
|
53
|
+
description: 'UUID of the project to analyze',
|
|
54
|
+
},
|
|
55
|
+
iterations: {
|
|
56
|
+
type: 'number',
|
|
57
|
+
description: 'Number of iterations for the analysis',
|
|
58
|
+
},
|
|
59
|
+
suiteAnalysisConfig: {
|
|
60
|
+
type: 'object',
|
|
61
|
+
description: 'Configuration for the analysis suite',
|
|
62
|
+
properties: {
|
|
63
|
+
username: {
|
|
64
|
+
type: 'string',
|
|
65
|
+
description: 'Username for authentication',
|
|
66
|
+
},
|
|
67
|
+
password: {
|
|
68
|
+
type: 'string',
|
|
69
|
+
description: 'Password for authentication',
|
|
70
|
+
},
|
|
71
|
+
cookiesPreference: {
|
|
72
|
+
type: 'string',
|
|
73
|
+
enum: ['ACCEPT_ALL', 'DECLINE_ALL', 'IGNORE'],
|
|
74
|
+
description: 'Cookie preference for the analysis',
|
|
75
|
+
},
|
|
76
|
+
additionalInstructions: {
|
|
77
|
+
type: 'string',
|
|
78
|
+
description: 'Additional instructions for the analysis',
|
|
79
|
+
},
|
|
80
|
+
additionalVariables: {
|
|
81
|
+
type: 'string',
|
|
82
|
+
description: 'Additional variables for the analysis',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
rerun: {
|
|
87
|
+
type: 'object',
|
|
88
|
+
description: 'Rerun configuration',
|
|
89
|
+
properties: {
|
|
90
|
+
suiteUuid: {
|
|
91
|
+
type: 'string',
|
|
92
|
+
description: 'UUID of the suite to rerun',
|
|
93
|
+
},
|
|
94
|
+
analysisIdentifier: {
|
|
95
|
+
type: 'string',
|
|
96
|
+
description: 'Identifier for the analysis',
|
|
97
|
+
},
|
|
98
|
+
mode: {
|
|
99
|
+
type: 'string',
|
|
100
|
+
enum: ['FULL', 'CRAWLING'],
|
|
101
|
+
description: 'Rerun mode',
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
required: ['suiteUuid', 'analysisIdentifier', 'mode'],
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
required: ['projectUuid'],
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'wopee_dispatch_agent',
|
|
112
|
+
description: 'Dispatch agent to run tests for the given project and suite',
|
|
113
|
+
inputSchema: {
|
|
114
|
+
type: 'object',
|
|
115
|
+
properties: {
|
|
116
|
+
projectUuid: {
|
|
117
|
+
type: 'string',
|
|
118
|
+
description: 'UUID of the project',
|
|
119
|
+
},
|
|
120
|
+
suiteUuid: {
|
|
121
|
+
type: 'string',
|
|
122
|
+
description: 'UUID of the test suite',
|
|
123
|
+
},
|
|
124
|
+
analysisIdentifier: {
|
|
125
|
+
type: 'string',
|
|
126
|
+
description: 'Identifier for the analysis',
|
|
127
|
+
},
|
|
128
|
+
testCases: {
|
|
129
|
+
type: 'array',
|
|
130
|
+
description: 'Array of selected test cases to run',
|
|
131
|
+
items: {
|
|
132
|
+
type: 'object',
|
|
133
|
+
properties: {
|
|
134
|
+
testCaseId: {
|
|
135
|
+
type: 'string',
|
|
136
|
+
description: 'ID of the test case',
|
|
137
|
+
},
|
|
138
|
+
userStoryId: {
|
|
139
|
+
type: 'string',
|
|
140
|
+
description: 'ID of the user story',
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
required: ['testCaseId', 'userStoryId'],
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
skipRateLimitCheck: {
|
|
147
|
+
type: 'boolean',
|
|
148
|
+
description: 'Whether to skip rate limit check',
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
required: ['projectUuid', 'suiteUuid', 'analysisIdentifier'],
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: 'wopee_generate_app_context',
|
|
156
|
+
description: 'Generate application context based on analysis results to understand the app structure',
|
|
157
|
+
inputSchema: {
|
|
158
|
+
type: 'object',
|
|
159
|
+
properties: {
|
|
160
|
+
projectUuid: {
|
|
161
|
+
type: 'string',
|
|
162
|
+
description: 'UUID of the project',
|
|
163
|
+
},
|
|
164
|
+
suiteUuid: {
|
|
165
|
+
type: 'string',
|
|
166
|
+
description: 'UUID of the test suite',
|
|
167
|
+
},
|
|
168
|
+
extraPrompt: {
|
|
169
|
+
type: 'string',
|
|
170
|
+
description: 'Additional prompt to modify the app context generation',
|
|
171
|
+
},
|
|
172
|
+
selectedUserStories: {
|
|
173
|
+
type: 'array',
|
|
174
|
+
items: {
|
|
175
|
+
type: 'string',
|
|
176
|
+
},
|
|
177
|
+
description: 'Array of selected user story IDs',
|
|
178
|
+
},
|
|
179
|
+
suiteAnalysisConfig: {
|
|
180
|
+
type: 'object',
|
|
181
|
+
description: 'Configuration for the analysis suite',
|
|
182
|
+
properties: {
|
|
183
|
+
username: {
|
|
184
|
+
type: 'string',
|
|
185
|
+
description: 'Username for authentication',
|
|
186
|
+
},
|
|
187
|
+
password: {
|
|
188
|
+
type: 'string',
|
|
189
|
+
description: 'Password for authentication',
|
|
190
|
+
},
|
|
191
|
+
cookiesPreference: {
|
|
192
|
+
type: 'string',
|
|
193
|
+
enum: ['ACCEPT_ALL', 'DECLINE_ALL', 'IGNORE'],
|
|
194
|
+
description: 'Cookie preference for the analysis',
|
|
195
|
+
},
|
|
196
|
+
additionalInstructions: {
|
|
197
|
+
type: 'string',
|
|
198
|
+
description: 'Additional instructions for the analysis',
|
|
199
|
+
},
|
|
200
|
+
additionalVariables: {
|
|
201
|
+
type: 'string',
|
|
202
|
+
description: 'Additional variables for the analysis',
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
continueGeneration: {
|
|
207
|
+
type: 'boolean',
|
|
208
|
+
description: 'Whether to continue generation from previous state',
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
required: ['projectUuid', 'suiteUuid'],
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: 'wopee_generate_general_user_stories',
|
|
216
|
+
description: 'Generate general user stories based on analysis results to understand user workflows',
|
|
217
|
+
inputSchema: {
|
|
218
|
+
type: 'object',
|
|
219
|
+
properties: {
|
|
220
|
+
projectUuid: {
|
|
221
|
+
type: 'string',
|
|
222
|
+
description: 'UUID of the project',
|
|
223
|
+
},
|
|
224
|
+
suiteUuid: {
|
|
225
|
+
type: 'string',
|
|
226
|
+
description: 'UUID of the test suite',
|
|
227
|
+
},
|
|
228
|
+
extraPrompt: {
|
|
229
|
+
type: 'string',
|
|
230
|
+
description: 'Additional prompt to modify the user story generation',
|
|
231
|
+
},
|
|
232
|
+
selectedUserStories: {
|
|
233
|
+
type: 'array',
|
|
234
|
+
items: {
|
|
235
|
+
type: 'string',
|
|
236
|
+
},
|
|
237
|
+
description: 'Array of selected user story IDs',
|
|
238
|
+
},
|
|
239
|
+
suiteAnalysisConfig: {
|
|
240
|
+
type: 'object',
|
|
241
|
+
description: 'Configuration for the analysis suite',
|
|
242
|
+
properties: {
|
|
243
|
+
username: {
|
|
244
|
+
type: 'string',
|
|
245
|
+
description: 'Username for authentication',
|
|
246
|
+
},
|
|
247
|
+
password: {
|
|
248
|
+
type: 'string',
|
|
249
|
+
description: 'Password for authentication',
|
|
250
|
+
},
|
|
251
|
+
cookiesPreference: {
|
|
252
|
+
type: 'string',
|
|
253
|
+
enum: ['ACCEPT_ALL', 'DECLINE_ALL', 'IGNORE'],
|
|
254
|
+
description: 'Cookie preference for the analysis',
|
|
255
|
+
},
|
|
256
|
+
additionalInstructions: {
|
|
257
|
+
type: 'string',
|
|
258
|
+
description: 'Additional instructions for the analysis',
|
|
259
|
+
},
|
|
260
|
+
additionalVariables: {
|
|
261
|
+
type: 'string',
|
|
262
|
+
description: 'Additional variables for the analysis',
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
continueGeneration: {
|
|
267
|
+
type: 'boolean',
|
|
268
|
+
description: 'Whether to continue generation from previous state',
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
required: ['projectUuid', 'suiteUuid'],
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
name: 'wopee_generate_user_stories',
|
|
276
|
+
description: 'Generate user stories based on analysis results to understand user workflows',
|
|
277
|
+
inputSchema: {
|
|
278
|
+
type: 'object',
|
|
279
|
+
properties: {
|
|
280
|
+
projectUuid: {
|
|
281
|
+
type: 'string',
|
|
282
|
+
description: 'UUID of the project',
|
|
283
|
+
},
|
|
284
|
+
suiteUuid: {
|
|
285
|
+
type: 'string',
|
|
286
|
+
description: 'UUID of the test suite',
|
|
287
|
+
},
|
|
288
|
+
extraPrompt: {
|
|
289
|
+
type: 'string',
|
|
290
|
+
description: 'Additional prompt to modify the user story generation',
|
|
291
|
+
},
|
|
292
|
+
selectedUserStories: {
|
|
293
|
+
type: 'array',
|
|
294
|
+
items: {
|
|
295
|
+
type: 'string',
|
|
296
|
+
},
|
|
297
|
+
description: 'Array of selected user story IDs',
|
|
298
|
+
},
|
|
299
|
+
suiteAnalysisConfig: {
|
|
300
|
+
type: 'object',
|
|
301
|
+
description: 'Configuration for the analysis suite',
|
|
302
|
+
properties: {
|
|
303
|
+
username: {
|
|
304
|
+
type: 'string',
|
|
305
|
+
description: 'Username for authentication',
|
|
306
|
+
},
|
|
307
|
+
password: {
|
|
308
|
+
type: 'string',
|
|
309
|
+
description: 'Password for authentication',
|
|
310
|
+
},
|
|
311
|
+
cookiesPreference: {
|
|
312
|
+
type: 'string',
|
|
313
|
+
enum: ['ACCEPT_ALL', 'DECLINE_ALL', 'IGNORE'],
|
|
314
|
+
description: 'Cookie preference for the analysis',
|
|
315
|
+
},
|
|
316
|
+
additionalInstructions: {
|
|
317
|
+
type: 'string',
|
|
318
|
+
description: 'Additional instructions for the analysis',
|
|
319
|
+
},
|
|
320
|
+
additionalVariables: {
|
|
321
|
+
type: 'string',
|
|
322
|
+
description: 'Additional variables for the analysis',
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
continueGeneration: {
|
|
327
|
+
type: 'boolean',
|
|
328
|
+
description: 'Whether to continue generation from previous state',
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
required: ['projectUuid', 'suiteUuid'],
|
|
332
|
+
},
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
name: 'wopee_generate_test_cases',
|
|
336
|
+
description: 'Generate test cases based on analysis results and user stories',
|
|
337
|
+
inputSchema: {
|
|
338
|
+
type: 'object',
|
|
339
|
+
properties: {
|
|
340
|
+
projectUuid: {
|
|
341
|
+
type: 'string',
|
|
342
|
+
description: 'UUID of the project',
|
|
343
|
+
},
|
|
344
|
+
suiteUuid: {
|
|
345
|
+
type: 'string',
|
|
346
|
+
description: 'UUID of the test suite',
|
|
347
|
+
},
|
|
348
|
+
extraPrompt: {
|
|
349
|
+
type: 'string',
|
|
350
|
+
description: 'Additional prompt to modify the test case generation',
|
|
351
|
+
},
|
|
352
|
+
selectedUserStories: {
|
|
353
|
+
type: 'array',
|
|
354
|
+
items: {
|
|
355
|
+
type: 'string',
|
|
356
|
+
},
|
|
357
|
+
description: 'Array of selected user story IDs',
|
|
358
|
+
},
|
|
359
|
+
suiteAnalysisConfig: {
|
|
360
|
+
type: 'object',
|
|
361
|
+
description: 'Configuration for the analysis suite',
|
|
362
|
+
properties: {
|
|
363
|
+
username: {
|
|
364
|
+
type: 'string',
|
|
365
|
+
description: 'Username for authentication',
|
|
366
|
+
},
|
|
367
|
+
password: {
|
|
368
|
+
type: 'string',
|
|
369
|
+
description: 'Password for authentication',
|
|
370
|
+
},
|
|
371
|
+
cookiesPreference: {
|
|
372
|
+
type: 'string',
|
|
373
|
+
enum: ['ACCEPT_ALL', 'DECLINE_ALL', 'IGNORE'],
|
|
374
|
+
description: 'Cookie preference for the analysis',
|
|
375
|
+
},
|
|
376
|
+
additionalInstructions: {
|
|
377
|
+
type: 'string',
|
|
378
|
+
description: 'Additional instructions for the analysis',
|
|
379
|
+
},
|
|
380
|
+
additionalVariables: {
|
|
381
|
+
type: 'string',
|
|
382
|
+
description: 'Additional variables for the analysis',
|
|
383
|
+
},
|
|
384
|
+
},
|
|
385
|
+
},
|
|
386
|
+
continueGeneration: {
|
|
387
|
+
type: 'boolean',
|
|
388
|
+
description: 'Whether to continue generation from previous state',
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
required: ['projectUuid', 'suiteUuid'],
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
name: 'wopee_get_app_context',
|
|
396
|
+
description: 'Get existing app context for the given project and suite',
|
|
397
|
+
inputSchema: {
|
|
398
|
+
type: 'object',
|
|
399
|
+
properties: {
|
|
400
|
+
projectUuid: {
|
|
401
|
+
type: 'string',
|
|
402
|
+
description: 'UUID of the project',
|
|
403
|
+
},
|
|
404
|
+
suiteUuid: {
|
|
405
|
+
type: 'string',
|
|
406
|
+
description: 'UUID of the test suite',
|
|
407
|
+
},
|
|
408
|
+
},
|
|
409
|
+
required: ['projectUuid', 'suiteUuid'],
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
name: 'wopee_get_user_stories',
|
|
414
|
+
description: 'Get existing user stories for the given project and suite',
|
|
415
|
+
inputSchema: {
|
|
416
|
+
type: 'object',
|
|
417
|
+
properties: {
|
|
418
|
+
projectUuid: {
|
|
419
|
+
type: 'string',
|
|
420
|
+
description: 'UUID of the project',
|
|
421
|
+
},
|
|
422
|
+
suiteUuid: {
|
|
423
|
+
type: 'string',
|
|
424
|
+
description: 'UUID of the test suite',
|
|
425
|
+
},
|
|
426
|
+
},
|
|
427
|
+
required: ['projectUuid', 'suiteUuid'],
|
|
428
|
+
},
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
name: 'wopee_get_test_cases',
|
|
432
|
+
description: 'Get existing test cases for the given project and suite',
|
|
433
|
+
inputSchema: {
|
|
434
|
+
type: 'object',
|
|
435
|
+
properties: {
|
|
436
|
+
projectUuid: {
|
|
437
|
+
type: 'string',
|
|
438
|
+
description: 'UUID of the project',
|
|
439
|
+
},
|
|
440
|
+
suiteUuid: {
|
|
441
|
+
type: 'string',
|
|
442
|
+
description: 'UUID of the test suite',
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
required: ['projectUuid', 'suiteUuid'],
|
|
446
|
+
},
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
name: 'wopee_fetch_analysis_suites',
|
|
450
|
+
description: 'Fetch all analysis suites for a given project',
|
|
451
|
+
inputSchema: {
|
|
452
|
+
type: 'object',
|
|
453
|
+
properties: {
|
|
454
|
+
projectUuid: {
|
|
455
|
+
type: 'string',
|
|
456
|
+
description: 'UUID of the project',
|
|
457
|
+
},
|
|
458
|
+
},
|
|
459
|
+
required: ['projectUuid'],
|
|
460
|
+
},
|
|
461
|
+
},
|
|
462
|
+
],
|
|
463
|
+
};
|
|
464
|
+
});
|
|
465
|
+
// Handle tool calls
|
|
466
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
467
|
+
const { name, arguments: args } = request.params;
|
|
468
|
+
try {
|
|
469
|
+
switch (name) {
|
|
470
|
+
case 'wopee_dispatch_analysis':
|
|
471
|
+
return {
|
|
472
|
+
content: [
|
|
473
|
+
{
|
|
474
|
+
type: 'text',
|
|
475
|
+
text: JSON.stringify(await wopee_dispatch_analysis(args), null, 2),
|
|
476
|
+
},
|
|
477
|
+
],
|
|
478
|
+
};
|
|
479
|
+
case 'wopee_dispatch_agent':
|
|
480
|
+
return {
|
|
481
|
+
content: [
|
|
482
|
+
{
|
|
483
|
+
type: 'text',
|
|
484
|
+
text: JSON.stringify(await wopee_dispatch_agent(args), null, 2),
|
|
485
|
+
},
|
|
486
|
+
],
|
|
487
|
+
};
|
|
488
|
+
case 'wopee_generate_app_context':
|
|
489
|
+
return {
|
|
490
|
+
content: [
|
|
491
|
+
{
|
|
492
|
+
type: 'text',
|
|
493
|
+
text: JSON.stringify(await wopee_generate_app_context(args), null, 2),
|
|
494
|
+
},
|
|
495
|
+
],
|
|
496
|
+
};
|
|
497
|
+
case 'wopee_generate_general_user_stories':
|
|
498
|
+
return {
|
|
499
|
+
content: [
|
|
500
|
+
{
|
|
501
|
+
type: 'text',
|
|
502
|
+
text: JSON.stringify(await wopee_generate_general_user_stories(args), null, 2),
|
|
503
|
+
},
|
|
504
|
+
],
|
|
505
|
+
};
|
|
506
|
+
case 'wopee_generate_user_stories':
|
|
507
|
+
return {
|
|
508
|
+
content: [
|
|
509
|
+
{
|
|
510
|
+
type: 'text',
|
|
511
|
+
text: JSON.stringify(await wopee_generate_user_stories(args), null, 2),
|
|
512
|
+
},
|
|
513
|
+
],
|
|
514
|
+
};
|
|
515
|
+
case 'wopee_generate_test_cases':
|
|
516
|
+
return {
|
|
517
|
+
content: [
|
|
518
|
+
{
|
|
519
|
+
type: 'text',
|
|
520
|
+
text: JSON.stringify(await wopee_generate_test_cases(args), null, 2),
|
|
521
|
+
},
|
|
522
|
+
],
|
|
523
|
+
};
|
|
524
|
+
case 'wopee_get_app_context':
|
|
525
|
+
return {
|
|
526
|
+
content: [
|
|
527
|
+
{
|
|
528
|
+
type: 'text',
|
|
529
|
+
text: JSON.stringify(await wopee_get_app_context(args), null, 2),
|
|
530
|
+
},
|
|
531
|
+
],
|
|
532
|
+
};
|
|
533
|
+
case 'wopee_get_user_stories':
|
|
534
|
+
return {
|
|
535
|
+
content: [
|
|
536
|
+
{
|
|
537
|
+
type: 'text',
|
|
538
|
+
text: JSON.stringify(await wopee_get_user_stories(args), null, 2),
|
|
539
|
+
},
|
|
540
|
+
],
|
|
541
|
+
};
|
|
542
|
+
case 'wopee_get_test_cases':
|
|
543
|
+
return {
|
|
544
|
+
content: [
|
|
545
|
+
{
|
|
546
|
+
type: 'text',
|
|
547
|
+
text: JSON.stringify(await wopee_get_test_cases(args), null, 2),
|
|
548
|
+
},
|
|
549
|
+
],
|
|
550
|
+
};
|
|
551
|
+
case 'wopee_fetch_analysis_suites':
|
|
552
|
+
return {
|
|
553
|
+
content: [
|
|
554
|
+
{
|
|
555
|
+
type: 'text',
|
|
556
|
+
text: JSON.stringify(await wopee_fetch_analysis_suites(args), null, 2),
|
|
557
|
+
},
|
|
558
|
+
],
|
|
559
|
+
};
|
|
560
|
+
default:
|
|
561
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
catch (error) {
|
|
565
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
566
|
+
return {
|
|
567
|
+
content: [
|
|
568
|
+
{
|
|
569
|
+
type: 'text',
|
|
570
|
+
text: JSON.stringify({
|
|
571
|
+
success: false,
|
|
572
|
+
error: `Tool execution failed: ${errorMessage}`,
|
|
573
|
+
}, null, 2),
|
|
574
|
+
},
|
|
575
|
+
],
|
|
576
|
+
isError: true,
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* Setup error handling for the server
|
|
583
|
+
*/
|
|
584
|
+
setupErrorHandling() {
|
|
585
|
+
this.server.onerror = (error) => {
|
|
586
|
+
console.error('[MCP Error]', error);
|
|
587
|
+
};
|
|
588
|
+
process.on('SIGINT', async () => {
|
|
589
|
+
await this.server.close();
|
|
590
|
+
process.exit(0);
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Start the MCP server
|
|
595
|
+
*/
|
|
596
|
+
async start() {
|
|
597
|
+
// Validate configuration before starting
|
|
598
|
+
try {
|
|
599
|
+
const config = configManager.getInstance().getConfig();
|
|
600
|
+
console.log(`[Wopee MCP] Starting server with API URL: ${config.apiUrl}`);
|
|
601
|
+
}
|
|
602
|
+
catch (error) {
|
|
603
|
+
console.error('[Wopee MCP] Configuration error:', error);
|
|
604
|
+
process.exit(1);
|
|
605
|
+
}
|
|
606
|
+
const transport = new StdioServerTransport();
|
|
607
|
+
await this.server.connect(transport);
|
|
608
|
+
console.log('[Wopee MCP] Server started successfully');
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
// Start the server if this file is run directly
|
|
612
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
613
|
+
// Check for help flag
|
|
614
|
+
if (process.argv.includes('--help') || process.argv.includes('-h')) {
|
|
615
|
+
console.log(`
|
|
616
|
+
Wopee MCP Server - Autonomous Testing Platform Integration
|
|
617
|
+
|
|
618
|
+
USAGE:
|
|
619
|
+
wopee-mcp [options]
|
|
620
|
+
|
|
621
|
+
OPTIONS:
|
|
622
|
+
-h, --help Show this help message
|
|
623
|
+
-v, --version Show version information
|
|
624
|
+
|
|
625
|
+
ENVIRONMENT VARIABLES:
|
|
626
|
+
WOPEE_API_KEY Your Wopee API key (required)
|
|
627
|
+
WOPEE_PROJECT_UUID Your Wopee project UUID (required)
|
|
628
|
+
WOPEE_API_URL Wopee API endpoint (optional, defaults to https://api.wopee.io/)
|
|
629
|
+
|
|
630
|
+
AVAILABLE TOOLS:
|
|
631
|
+
wopee_dispatch_analysis Dispatch analysis for a project
|
|
632
|
+
wopee_dispatch_agent Dispatch agent to run tests
|
|
633
|
+
wopee_generate_app_context Generate application context from analysis
|
|
634
|
+
wopee_generate_general_user_stories Generate general user stories from analysis
|
|
635
|
+
wopee_generate_user_stories Generate user stories from analysis
|
|
636
|
+
wopee_generate_test_cases Generate test cases from analysis and user stories
|
|
637
|
+
wopee_get_app_context Get existing app context for a project and suite
|
|
638
|
+
wopee_get_user_stories Get existing user stories for a project and suite
|
|
639
|
+
wopee_get_test_cases Get existing test cases for a project and suite
|
|
640
|
+
wopee_fetch_analysis_suites Fetch all analysis suites for a project
|
|
641
|
+
|
|
642
|
+
DOCUMENTATION:
|
|
643
|
+
README.md - Complete documentation
|
|
644
|
+
INTEGRATION.md - VS Code & Cursor integration guide
|
|
645
|
+
QUICK_START.md - Quick start guide
|
|
646
|
+
|
|
647
|
+
EXAMPLES:
|
|
648
|
+
# Start the MCP server
|
|
649
|
+
wopee-mcp
|
|
650
|
+
|
|
651
|
+
# Show version
|
|
652
|
+
wopee-mcp --version
|
|
653
|
+
|
|
654
|
+
# Show help
|
|
655
|
+
wopee-mcp --help
|
|
656
|
+
|
|
657
|
+
For more information, visit: https://github.com/autonomous-testing/wopee-mcp
|
|
658
|
+
`);
|
|
659
|
+
process.exit(0);
|
|
660
|
+
}
|
|
661
|
+
// Check for version flag
|
|
662
|
+
if (process.argv.includes('--version') || process.argv.includes('-v')) {
|
|
663
|
+
console.log('1.0.0');
|
|
664
|
+
process.exit(0);
|
|
665
|
+
}
|
|
666
|
+
const server = new WopeeMCPServer();
|
|
667
|
+
server.start().catch((error) => {
|
|
668
|
+
console.error('[Wopee MCP] Failed to start server:', error);
|
|
669
|
+
process.exit(1);
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
//# sourceMappingURL=index.js.map
|