@specforge/mcp 1.1.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/README.md +345 -0
- package/bin/specforge-mcp +3 -0
- package/dist/client/api-client.d.ts +110 -0
- package/dist/client/api-client.d.ts.map +1 -0
- package/dist/client/api-client.js +170 -0
- package/dist/client/api-client.js.map +1 -0
- package/dist/config/index.d.ts +71 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +120 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +100 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/index.d.ts +79 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +1622 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types/index.d.ts +329 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/validation/index.d.ts +86 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +442 -0
- package/dist/validation/index.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Utilities for MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Provides comprehensive input validation and error handling for all MCP tools.
|
|
5
|
+
* Validation is run before each tool call to ensure proper argument types and formats.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Custom error class for validation failures
|
|
9
|
+
* Includes field name and error code for structured error handling
|
|
10
|
+
*/
|
|
11
|
+
export class ValidationError extends Error {
|
|
12
|
+
field;
|
|
13
|
+
code;
|
|
14
|
+
constructor(message, field, code) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.field = field;
|
|
17
|
+
this.code = code;
|
|
18
|
+
this.name = 'ValidationError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* API Error class for handling HTTP errors from the backend
|
|
23
|
+
*/
|
|
24
|
+
export class ApiError extends Error {
|
|
25
|
+
statusCode;
|
|
26
|
+
errorCode;
|
|
27
|
+
constructor(message, statusCode, errorCode) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.statusCode = statusCode;
|
|
30
|
+
this.errorCode = errorCode;
|
|
31
|
+
this.name = 'ApiError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Basic Validators
|
|
36
|
+
// ============================================================================
|
|
37
|
+
/**
|
|
38
|
+
* Validate that a value is present (not null, undefined, or empty string)
|
|
39
|
+
*/
|
|
40
|
+
export function validateRequired(value, fieldName) {
|
|
41
|
+
if (value === undefined || value === null || value === '') {
|
|
42
|
+
throw new ValidationError(`${fieldName} is required`, fieldName, 'REQUIRED');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validate that a value is a valid UUID format
|
|
47
|
+
*/
|
|
48
|
+
export function validateUUID(value, fieldName) {
|
|
49
|
+
validateRequired(value, fieldName);
|
|
50
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
51
|
+
if (!uuidRegex.test(value)) {
|
|
52
|
+
throw new ValidationError(`${fieldName} must be a valid UUID`, fieldName, 'INVALID_UUID');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Validate that a value is one of the allowed enum values
|
|
57
|
+
*/
|
|
58
|
+
export function validateEnum(value, fieldName, allowedValues) {
|
|
59
|
+
validateRequired(value, fieldName);
|
|
60
|
+
if (!allowedValues.includes(value)) {
|
|
61
|
+
throw new ValidationError(`${fieldName} must be one of: ${allowedValues.join(', ')}`, fieldName, 'INVALID_ENUM');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Validate that a number is within a range
|
|
66
|
+
*/
|
|
67
|
+
export function validateRange(value, fieldName, min, max) {
|
|
68
|
+
if (typeof value !== 'number' || isNaN(value)) {
|
|
69
|
+
throw new ValidationError(`${fieldName} must be a number`, fieldName, 'INVALID_NUMBER');
|
|
70
|
+
}
|
|
71
|
+
if (value < min || value > max) {
|
|
72
|
+
throw new ValidationError(`${fieldName} must be between ${min} and ${max}`, fieldName, 'OUT_OF_RANGE');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Validate that a value is an array, with optional item validation
|
|
77
|
+
*/
|
|
78
|
+
export function validateArray(value, fieldName, itemValidator) {
|
|
79
|
+
if (!Array.isArray(value)) {
|
|
80
|
+
throw new ValidationError(`${fieldName} must be an array`, fieldName, 'INVALID_ARRAY');
|
|
81
|
+
}
|
|
82
|
+
if (itemValidator) {
|
|
83
|
+
value.forEach((item, index) => {
|
|
84
|
+
try {
|
|
85
|
+
itemValidator(item, index);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
89
|
+
throw new ValidationError(`${fieldName}[${index}]: ${message}`, `${fieldName}[${index}]`, 'INVALID_ITEM');
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Validate a 40-character hex SHA
|
|
96
|
+
*/
|
|
97
|
+
export function validateSha(value, fieldName = 'sha') {
|
|
98
|
+
validateRequired(value, fieldName);
|
|
99
|
+
if (!/^[a-f0-9]{40}$/i.test(value)) {
|
|
100
|
+
throw new ValidationError(`${fieldName} must be a 40-character hex string`, fieldName, 'INVALID_SHA');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Validate an ISO 8601 date string
|
|
105
|
+
*/
|
|
106
|
+
export function validateDate(value, fieldName) {
|
|
107
|
+
validateRequired(value, fieldName);
|
|
108
|
+
const date = new Date(value);
|
|
109
|
+
if (isNaN(date.getTime())) {
|
|
110
|
+
throw new ValidationError(`${fieldName} must be a valid ISO 8601 date`, fieldName, 'INVALID_DATE');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Validate a string length
|
|
115
|
+
*/
|
|
116
|
+
export function validateStringLength(value, fieldName, minLength, maxLength) {
|
|
117
|
+
if (typeof value !== 'string') {
|
|
118
|
+
throw new ValidationError(`${fieldName} must be a string`, fieldName, 'INVALID_STRING');
|
|
119
|
+
}
|
|
120
|
+
if (value.length < minLength || value.length > maxLength) {
|
|
121
|
+
throw new ValidationError(`${fieldName} must be between ${minLength} and ${maxLength} characters`, fieldName, 'INVALID_LENGTH');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Validators for each tool
|
|
126
|
+
* These are applied before the tool handler is called
|
|
127
|
+
*/
|
|
128
|
+
export const toolValidators = {
|
|
129
|
+
// Core Operations - Projects
|
|
130
|
+
list_projects: () => {
|
|
131
|
+
// No required arguments
|
|
132
|
+
},
|
|
133
|
+
get_project: (args) => {
|
|
134
|
+
validateRequired(args.projectId, 'projectId');
|
|
135
|
+
},
|
|
136
|
+
// Core Operations - Specifications
|
|
137
|
+
list_specifications: (args) => {
|
|
138
|
+
validateRequired(args.projectId, 'projectId');
|
|
139
|
+
if (args.status !== undefined) {
|
|
140
|
+
validateArray(args.status, 'status', (item) => {
|
|
141
|
+
validateEnum(item, 'status item', ['draft', 'planning', 'ready', 'in_progress', 'completed']);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
get_specification: (args) => {
|
|
146
|
+
validateRequired(args.specificationId, 'specificationId');
|
|
147
|
+
},
|
|
148
|
+
// Core Operations - Epics
|
|
149
|
+
list_epics: (args) => {
|
|
150
|
+
validateRequired(args.specificationId, 'specificationId');
|
|
151
|
+
if (args.status !== undefined) {
|
|
152
|
+
validateEnum(args.status, 'status', ['todo', 'in_progress', 'completed']);
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
get_epic: (args) => {
|
|
156
|
+
validateRequired(args.epicId, 'epicId');
|
|
157
|
+
},
|
|
158
|
+
// Core Operations - Tickets
|
|
159
|
+
list_tickets: (args) => {
|
|
160
|
+
validateRequired(args.epicId, 'epicId');
|
|
161
|
+
if (args.status !== undefined) {
|
|
162
|
+
validateArray(args.status, 'status', (item) => {
|
|
163
|
+
validateEnum(item, 'status item', ['todo', 'queue', 'in_progress', 'blocked', 'done']);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
get_ticket: (args) => {
|
|
168
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
169
|
+
},
|
|
170
|
+
// Dependencies
|
|
171
|
+
get_ticket_dependencies: (args) => {
|
|
172
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
173
|
+
},
|
|
174
|
+
// Context & AI Tools
|
|
175
|
+
get_implementation_context: (args) => {
|
|
176
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
177
|
+
},
|
|
178
|
+
get_next_actionable_tickets: (args) => {
|
|
179
|
+
validateRequired(args.specificationId, 'specificationId');
|
|
180
|
+
if (args.limit !== undefined) {
|
|
181
|
+
validateRange(args.limit, 'limit', 1, 100);
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
get_blocked_tickets: (args) => {
|
|
185
|
+
validateRequired(args.specificationId, 'specificationId');
|
|
186
|
+
},
|
|
187
|
+
get_critical_path: (args) => {
|
|
188
|
+
validateRequired(args.specificationId, 'specificationId');
|
|
189
|
+
},
|
|
190
|
+
get_patterns: (args) => {
|
|
191
|
+
validateRequired(args.specificationId, 'specificationId');
|
|
192
|
+
},
|
|
193
|
+
// Workflow & Tracking
|
|
194
|
+
start_work_session: (args) => {
|
|
195
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
196
|
+
},
|
|
197
|
+
complete_work_session: (args) => {
|
|
198
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
199
|
+
validateRequired(args.summary, 'summary');
|
|
200
|
+
if (args.summary) {
|
|
201
|
+
validateStringLength(args.summary, 'summary', 1, 10000);
|
|
202
|
+
}
|
|
203
|
+
if (args.filesModified !== undefined) {
|
|
204
|
+
validateArray(args.filesModified, 'filesModified');
|
|
205
|
+
}
|
|
206
|
+
if (args.filesCreated !== undefined) {
|
|
207
|
+
validateArray(args.filesCreated, 'filesCreated');
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
report_progress: (args) => {
|
|
211
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
212
|
+
validateRequired(args.progress, 'progress');
|
|
213
|
+
validateRange(args.progress, 'progress', 0, 100);
|
|
214
|
+
},
|
|
215
|
+
get_work_summary: (args) => {
|
|
216
|
+
validateRequired(args.scope, 'scope');
|
|
217
|
+
validateEnum(args.scope, 'scope', ['epic', 'specification', 'project', 'user']);
|
|
218
|
+
if (args.scope !== 'user' && args.scopeId !== undefined) {
|
|
219
|
+
validateRequired(args.scopeId, 'scopeId');
|
|
220
|
+
}
|
|
221
|
+
if (args.startDate !== undefined) {
|
|
222
|
+
validateDate(args.startDate, 'startDate');
|
|
223
|
+
}
|
|
224
|
+
if (args.endDate !== undefined) {
|
|
225
|
+
validateDate(args.endDate, 'endDate');
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
// Testing Tools
|
|
229
|
+
report_test_results: (args) => {
|
|
230
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
231
|
+
validateRequired(args.passed, 'passed');
|
|
232
|
+
validateRequired(args.testType, 'testType');
|
|
233
|
+
validateEnum(args.testType, 'testType', ['unit', 'integration', 'e2e', 'manual']);
|
|
234
|
+
if (args.output !== undefined && typeof args.output === 'string') {
|
|
235
|
+
validateStringLength(args.output, 'output', 0, 50000);
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
get_ticket_test_status: (args) => {
|
|
239
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
240
|
+
},
|
|
241
|
+
validate_ticket_completion: (args) => {
|
|
242
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
243
|
+
},
|
|
244
|
+
// Discovery Tools
|
|
245
|
+
report_discovery: (args) => {
|
|
246
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
247
|
+
validateRequired(args.type, 'type');
|
|
248
|
+
validateRequired(args.title, 'title');
|
|
249
|
+
validateEnum(args.type, 'type', ['bug', 'requirement', 'improvement', 'question']);
|
|
250
|
+
if (args.title) {
|
|
251
|
+
validateStringLength(args.title, 'title', 1, 500);
|
|
252
|
+
}
|
|
253
|
+
if (args.description !== undefined) {
|
|
254
|
+
validateStringLength(args.description, 'description', 0, 10000);
|
|
255
|
+
}
|
|
256
|
+
if (args.priority !== undefined) {
|
|
257
|
+
validateEnum(args.priority, 'priority', ['low', 'medium', 'high', 'critical']);
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
get_pending_discoveries: () => {
|
|
261
|
+
// No required arguments
|
|
262
|
+
},
|
|
263
|
+
resolve_discovery: (args) => {
|
|
264
|
+
validateRequired(args.discoveryId, 'discoveryId');
|
|
265
|
+
validateRequired(args.resolution, 'resolution');
|
|
266
|
+
validateEnum(args.resolution, 'resolution', ['created', 'dismissed']);
|
|
267
|
+
if (args.resolution === 'created' && !args.createdTicketId) {
|
|
268
|
+
throw new ValidationError('createdTicketId is required when resolution is "created"', 'createdTicketId', 'REQUIRED_CONDITIONAL');
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
// Status & Analytics
|
|
272
|
+
get_specification_status: (args) => {
|
|
273
|
+
validateRequired(args.specificationId, 'specificationId');
|
|
274
|
+
},
|
|
275
|
+
get_epic_status: (args) => {
|
|
276
|
+
validateRequired(args.epicId, 'epicId');
|
|
277
|
+
},
|
|
278
|
+
get_implementation_summary: () => {
|
|
279
|
+
// No required arguments
|
|
280
|
+
},
|
|
281
|
+
get_time_report: (args) => {
|
|
282
|
+
validateRequired(args.scope, 'scope');
|
|
283
|
+
validateRequired(args.scopeId, 'scopeId');
|
|
284
|
+
validateEnum(args.scope, 'scope', ['epic', 'specification', 'project']);
|
|
285
|
+
},
|
|
286
|
+
get_blockers_report: () => {
|
|
287
|
+
// No required arguments
|
|
288
|
+
},
|
|
289
|
+
// Search Tools
|
|
290
|
+
search_tickets: (args) => {
|
|
291
|
+
validateRequired(args.query, 'query');
|
|
292
|
+
if (args.query) {
|
|
293
|
+
validateStringLength(args.query, 'query', 1, 500);
|
|
294
|
+
}
|
|
295
|
+
if (args.limit !== undefined) {
|
|
296
|
+
validateRange(args.limit, 'limit', 1, 100);
|
|
297
|
+
}
|
|
298
|
+
if (args.offset !== undefined) {
|
|
299
|
+
validateRange(args.offset, 'offset', 0, 10000);
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
find_tickets_by_file: (args) => {
|
|
303
|
+
validateRequired(args.filePath, 'filePath');
|
|
304
|
+
if (args.filePath) {
|
|
305
|
+
validateStringLength(args.filePath, 'filePath', 1, 1000);
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
find_tickets_by_tag: (args) => {
|
|
309
|
+
validateRequired(args.tags, 'tags');
|
|
310
|
+
validateArray(args.tags, 'tags', (item) => {
|
|
311
|
+
if (typeof item !== 'string' || item.length === 0) {
|
|
312
|
+
throw new ValidationError('Each tag must be a non-empty string', 'tags', 'INVALID_TAG');
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
},
|
|
316
|
+
find_related_tickets: (args) => {
|
|
317
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
318
|
+
if (args.limit !== undefined) {
|
|
319
|
+
validateRange(args.limit, 'limit', 1, 50);
|
|
320
|
+
}
|
|
321
|
+
},
|
|
322
|
+
// Git Integration
|
|
323
|
+
link_commit: (args) => {
|
|
324
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
325
|
+
validateRequired(args.sha, 'sha');
|
|
326
|
+
validateSha(args.sha, 'sha');
|
|
327
|
+
if (args.message !== undefined) {
|
|
328
|
+
validateStringLength(args.message, 'message', 0, 1000);
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
link_pull_request: (args) => {
|
|
332
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
333
|
+
if (!args.prNumber && !args.prUrl) {
|
|
334
|
+
throw new ValidationError('Either prNumber or prUrl must be provided', 'prNumber', 'REQUIRED_ONE_OF');
|
|
335
|
+
}
|
|
336
|
+
if (args.prNumber !== undefined && typeof args.prNumber !== 'number') {
|
|
337
|
+
throw new ValidationError('prNumber must be a number', 'prNumber', 'INVALID_NUMBER');
|
|
338
|
+
}
|
|
339
|
+
if (args.prUrl !== undefined) {
|
|
340
|
+
const url = args.prUrl;
|
|
341
|
+
if (!url.includes('github.com') && !url.includes('gitlab.com') && !url.includes('bitbucket.org')) {
|
|
342
|
+
throw new ValidationError('prUrl must be a valid GitHub, GitLab, or Bitbucket URL', 'prUrl', 'INVALID_URL');
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
get_ticket_commits: (args) => {
|
|
347
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
348
|
+
if (args.limit !== undefined) {
|
|
349
|
+
validateRange(args.limit, 'limit', 1, 100);
|
|
350
|
+
}
|
|
351
|
+
if (args.offset !== undefined) {
|
|
352
|
+
validateRange(args.offset, 'offset', 0, 10000);
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
get_ticket_prs: (args) => {
|
|
356
|
+
validateRequired(args.ticketId, 'ticketId');
|
|
357
|
+
if (args.limit !== undefined) {
|
|
358
|
+
validateRange(args.limit, 'limit', 1, 100);
|
|
359
|
+
}
|
|
360
|
+
if (args.offset !== undefined) {
|
|
361
|
+
validateRange(args.offset, 'offset', 0, 10000);
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
/**
|
|
366
|
+
* Transform an error into MCP error response format
|
|
367
|
+
*/
|
|
368
|
+
export function formatMCPError(error) {
|
|
369
|
+
let message = error.message;
|
|
370
|
+
if (error instanceof ValidationError) {
|
|
371
|
+
message = `Validation error for '${error.field}': ${error.message} (${error.code})`;
|
|
372
|
+
}
|
|
373
|
+
else if (error instanceof ApiError) {
|
|
374
|
+
message = formatApiErrorMessage(error);
|
|
375
|
+
}
|
|
376
|
+
return {
|
|
377
|
+
content: [
|
|
378
|
+
{
|
|
379
|
+
type: 'text',
|
|
380
|
+
text: message,
|
|
381
|
+
},
|
|
382
|
+
],
|
|
383
|
+
isError: true,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Format API error message based on status code
|
|
388
|
+
*/
|
|
389
|
+
function formatApiErrorMessage(error) {
|
|
390
|
+
switch (error.statusCode) {
|
|
391
|
+
case 400:
|
|
392
|
+
return `Bad request: ${error.message}`;
|
|
393
|
+
case 401:
|
|
394
|
+
return 'Authentication failed. Check your API key.';
|
|
395
|
+
case 403:
|
|
396
|
+
return 'Permission denied. Your API key may lack required permissions.';
|
|
397
|
+
case 404:
|
|
398
|
+
return `Resource not found: ${error.message}`;
|
|
399
|
+
case 429:
|
|
400
|
+
return 'Rate limit exceeded. Please wait before retrying.';
|
|
401
|
+
case 500:
|
|
402
|
+
case 502:
|
|
403
|
+
case 503:
|
|
404
|
+
case 504:
|
|
405
|
+
return 'Server error. Please try again later.';
|
|
406
|
+
default:
|
|
407
|
+
return error.message;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Transform HTTP/network errors into ApiError
|
|
412
|
+
*/
|
|
413
|
+
export function transformError(error) {
|
|
414
|
+
if (error instanceof ValidationError || error instanceof ApiError) {
|
|
415
|
+
return error;
|
|
416
|
+
}
|
|
417
|
+
if (error instanceof Error) {
|
|
418
|
+
// Network errors
|
|
419
|
+
if (error.message.includes('ECONNREFUSED')) {
|
|
420
|
+
return new ApiError('Unable to connect to SpecForge API. Check your network connection.', 0, 'NETWORK_ERROR');
|
|
421
|
+
}
|
|
422
|
+
if (error.message.includes('ETIMEDOUT')) {
|
|
423
|
+
return new ApiError('Request timed out. Please try again.', 0, 'TIMEOUT');
|
|
424
|
+
}
|
|
425
|
+
if (error.message.includes('ECONNRESET')) {
|
|
426
|
+
return new ApiError('Connection was reset. Please try again.', 0, 'CONNECTION_RESET');
|
|
427
|
+
}
|
|
428
|
+
return error;
|
|
429
|
+
}
|
|
430
|
+
return new Error(String(error));
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Run validation for a specific tool
|
|
434
|
+
* @throws ValidationError if validation fails
|
|
435
|
+
*/
|
|
436
|
+
export function validateToolArgs(toolName, args) {
|
|
437
|
+
const validator = toolValidators[toolName];
|
|
438
|
+
if (validator) {
|
|
439
|
+
validator(args);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@specforge/mcp",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "MCP server for SpecForge - AI agent integration",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"specforge-mcp": "./bin/specforge-mcp"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"dev": "tsx src/index.ts",
|
|
15
|
+
"test": "vitest run",
|
|
16
|
+
"test:watch": "vitest",
|
|
17
|
+
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
18
|
+
"test:coverage": "vitest run --coverage"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^20.0.0",
|
|
25
|
+
"typescript": "^5.0.0",
|
|
26
|
+
"tsx": "^4.7.0",
|
|
27
|
+
"vitest": "^1.2.0",
|
|
28
|
+
"@vitest/coverage-v8": "^1.2.0"
|
|
29
|
+
},
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=18.0.0"
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist",
|
|
35
|
+
"bin"
|
|
36
|
+
],
|
|
37
|
+
"keywords": [
|
|
38
|
+
"mcp",
|
|
39
|
+
"specforge",
|
|
40
|
+
"ai",
|
|
41
|
+
"claude",
|
|
42
|
+
"cursor",
|
|
43
|
+
"copilot"
|
|
44
|
+
],
|
|
45
|
+
"license": "MIT"
|
|
46
|
+
}
|