@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.
@@ -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
+ }