mcp-adr-analysis-server 2.0.9 → 2.0.11

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.
Files changed (90) hide show
  1. package/README.md +1 -1
  2. package/dist/src/index.d.ts +8 -1
  3. package/dist/src/index.d.ts.map +1 -1
  4. package/dist/src/index.js +573 -348
  5. package/dist/src/index.js.map +1 -1
  6. package/dist/src/prompts/adr-suggestion-prompts.d.ts.map +1 -1
  7. package/dist/src/prompts/adr-suggestion-prompts.js +2 -0
  8. package/dist/src/prompts/adr-suggestion-prompts.js.map +1 -1
  9. package/dist/src/resources/index.d.ts.map +1 -1
  10. package/dist/src/resources/index.js +71 -1
  11. package/dist/src/resources/index.js.map +1 -1
  12. package/dist/src/tools/adr-suggestion-tool.d.ts +16 -0
  13. package/dist/src/tools/adr-suggestion-tool.d.ts.map +1 -1
  14. package/dist/src/tools/adr-suggestion-tool.js +55 -2
  15. package/dist/src/tools/adr-suggestion-tool.js.map +1 -1
  16. package/dist/src/tools/smart-git-push-tool.d.ts +21 -1
  17. package/dist/src/tools/smart-git-push-tool.d.ts.map +1 -1
  18. package/dist/src/tools/smart-git-push-tool.js +181 -28
  19. package/dist/src/tools/smart-git-push-tool.js.map +1 -1
  20. package/dist/src/tools/smart-score-tool.d.ts +173 -0
  21. package/dist/src/tools/smart-score-tool.d.ts.map +1 -0
  22. package/dist/src/tools/smart-score-tool.js +681 -0
  23. package/dist/src/tools/smart-score-tool.js.map +1 -0
  24. package/dist/src/tools/todo-management-tool-v2.d.ts +329 -0
  25. package/dist/src/tools/todo-management-tool-v2.d.ts.map +1 -0
  26. package/dist/src/tools/todo-management-tool-v2.js +644 -0
  27. package/dist/src/tools/todo-management-tool-v2.js.map +1 -0
  28. package/dist/src/tools/tool-chain-orchestrator.d.ts +126 -0
  29. package/dist/src/tools/tool-chain-orchestrator.d.ts.map +1 -0
  30. package/dist/src/tools/tool-chain-orchestrator.js +550 -0
  31. package/dist/src/tools/tool-chain-orchestrator.js.map +1 -0
  32. package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts +150 -0
  33. package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts.map +1 -0
  34. package/dist/src/tools/troubleshoot-guided-workflow-tool.js +520 -0
  35. package/dist/src/tools/troubleshoot-guided-workflow-tool.js.map +1 -0
  36. package/dist/src/types/conversation-context.d.ts +6 -0
  37. package/dist/src/types/conversation-context.d.ts.map +1 -1
  38. package/dist/src/types/conversation-context.js +9 -1
  39. package/dist/src/types/conversation-context.js.map +1 -1
  40. package/dist/src/types/knowledge-graph-schemas.d.ts +773 -0
  41. package/dist/src/types/knowledge-graph-schemas.d.ts.map +1 -0
  42. package/dist/src/types/knowledge-graph-schemas.js +87 -0
  43. package/dist/src/types/knowledge-graph-schemas.js.map +1 -0
  44. package/dist/src/types/todo-json-schemas.d.ts +663 -0
  45. package/dist/src/types/todo-json-schemas.d.ts.map +1 -0
  46. package/dist/src/types/todo-json-schemas.js +113 -0
  47. package/dist/src/types/todo-json-schemas.js.map +1 -0
  48. package/dist/src/utils/chain-of-thought-template.d.ts.map +1 -1
  49. package/dist/src/utils/chain-of-thought-template.js.map +1 -1
  50. package/dist/src/utils/json-safe.d.ts +38 -0
  51. package/dist/src/utils/json-safe.d.ts.map +1 -0
  52. package/dist/src/utils/json-safe.js +86 -0
  53. package/dist/src/utils/json-safe.js.map +1 -0
  54. package/dist/src/utils/knowledge-graph-manager.d.ts +65 -0
  55. package/dist/src/utils/knowledge-graph-manager.d.ts.map +1 -0
  56. package/dist/src/utils/knowledge-graph-manager.js +358 -0
  57. package/dist/src/utils/knowledge-graph-manager.js.map +1 -0
  58. package/dist/src/utils/mcp-response-validator.d.ts +30 -0
  59. package/dist/src/utils/mcp-response-validator.d.ts.map +1 -0
  60. package/dist/src/utils/mcp-response-validator.js +197 -0
  61. package/dist/src/utils/mcp-response-validator.js.map +1 -0
  62. package/dist/src/utils/project-health-scoring.d.ts +177 -0
  63. package/dist/src/utils/project-health-scoring.d.ts.map +1 -0
  64. package/dist/src/utils/project-health-scoring.js +370 -0
  65. package/dist/src/utils/project-health-scoring.js.map +1 -0
  66. package/dist/src/utils/release-readiness-detector.d.ts +2 -0
  67. package/dist/src/utils/release-readiness-detector.d.ts.map +1 -1
  68. package/dist/src/utils/release-readiness-detector.js +2 -0
  69. package/dist/src/utils/release-readiness-detector.js.map +1 -1
  70. package/dist/src/utils/todo-file-watcher.d.ts +26 -0
  71. package/dist/src/utils/todo-file-watcher.d.ts.map +1 -0
  72. package/dist/src/utils/todo-file-watcher.js +163 -0
  73. package/dist/src/utils/todo-file-watcher.js.map +1 -0
  74. package/dist/src/utils/todo-json-manager.d.ts +71 -0
  75. package/dist/src/utils/todo-json-manager.d.ts.map +1 -0
  76. package/dist/src/utils/todo-json-manager.js +394 -0
  77. package/dist/src/utils/todo-json-manager.js.map +1 -0
  78. package/dist/src/utils/todo-markdown-converter.d.ts +16 -0
  79. package/dist/src/utils/todo-markdown-converter.d.ts.map +1 -0
  80. package/dist/src/utils/todo-markdown-converter.js +362 -0
  81. package/dist/src/utils/todo-markdown-converter.js.map +1 -0
  82. package/dist/src/utils/todo-migration.d.ts +47 -0
  83. package/dist/src/utils/todo-migration.d.ts.map +1 -0
  84. package/dist/src/utils/todo-migration.js +261 -0
  85. package/dist/src/utils/todo-migration.js.map +1 -0
  86. package/package.json +1 -1
  87. package/dist/src/tools/todo-management-tool.d.ts +0 -166
  88. package/dist/src/tools/todo-management-tool.d.ts.map +0 -1
  89. package/dist/src/tools/todo-management-tool.js +0 -472
  90. package/dist/src/tools/todo-management-tool.js.map +0 -1
@@ -0,0 +1,358 @@
1
+ import * as fs from 'fs/promises';
2
+ import path from 'path';
3
+ import crypto from 'crypto';
4
+ import { TodoSyncStateSchema, KnowledgeGraphSnapshotSchema } from '../types/knowledge-graph-schemas.js';
5
+ import { loadConfig } from './config.js';
6
+ import { ProjectHealthScoring } from './project-health-scoring.js';
7
+ export class KnowledgeGraphManager {
8
+ cacheDir;
9
+ snapshotsFile;
10
+ syncStateFile;
11
+ healthScoring;
12
+ constructor() {
13
+ const config = loadConfig();
14
+ this.cacheDir = path.join(config.projectPath, '.mcp-adr-cache');
15
+ this.snapshotsFile = path.join(this.cacheDir, 'knowledge-graph-snapshots.json');
16
+ this.syncStateFile = path.join(this.cacheDir, 'todo-sync-state.json');
17
+ this.healthScoring = new ProjectHealthScoring(config.projectPath);
18
+ }
19
+ async ensureCacheDirectory() {
20
+ try {
21
+ await fs.access(this.cacheDir);
22
+ }
23
+ catch {
24
+ await fs.mkdir(this.cacheDir, { recursive: true });
25
+ }
26
+ }
27
+ async loadKnowledgeGraph() {
28
+ await this.ensureCacheDirectory();
29
+ try {
30
+ const data = await fs.readFile(this.snapshotsFile, 'utf-8');
31
+ const parsed = JSON.parse(data);
32
+ return KnowledgeGraphSnapshotSchema.parse(parsed);
33
+ }
34
+ catch {
35
+ const defaultSyncState = await this.getDefaultSyncState();
36
+ const defaultSnapshot = {
37
+ version: '1.0.0',
38
+ timestamp: new Date().toISOString(),
39
+ intents: [],
40
+ todoSyncState: defaultSyncState,
41
+ analytics: {
42
+ totalIntents: 0,
43
+ completedIntents: 0,
44
+ activeIntents: 0,
45
+ averageGoalCompletion: 0,
46
+ mostUsedTools: [],
47
+ successfulPatterns: []
48
+ },
49
+ scoreHistory: []
50
+ };
51
+ await this.saveKnowledgeGraph(defaultSnapshot);
52
+ // Also create the separate sync state file
53
+ await fs.writeFile(this.syncStateFile, JSON.stringify(defaultSyncState, null, 2));
54
+ return defaultSnapshot;
55
+ }
56
+ }
57
+ async saveKnowledgeGraph(snapshot) {
58
+ await this.ensureCacheDirectory();
59
+ await fs.writeFile(this.snapshotsFile, JSON.stringify(snapshot, null, 2));
60
+ }
61
+ async createIntent(humanRequest, parsedGoals, priority = 'medium') {
62
+ const intentId = crypto.randomUUID();
63
+ const timestamp = new Date().toISOString();
64
+ // Get current score as baseline
65
+ const currentScore = await this.healthScoring.getProjectHealthScore();
66
+ const intent = {
67
+ intentId,
68
+ humanRequest,
69
+ parsedGoals,
70
+ priority,
71
+ timestamp,
72
+ toolChain: [],
73
+ currentStatus: 'planning',
74
+ todoMdSnapshot: '',
75
+ scoreTracking: {
76
+ initialScore: currentScore.overall,
77
+ currentScore: currentScore.overall,
78
+ componentScores: {
79
+ taskCompletion: currentScore.taskCompletion,
80
+ deploymentReadiness: currentScore.deploymentReadiness,
81
+ architectureCompliance: currentScore.architectureCompliance,
82
+ securityPosture: currentScore.securityPosture,
83
+ codeQuality: currentScore.codeQuality
84
+ },
85
+ lastScoreUpdate: timestamp
86
+ }
87
+ };
88
+ const kg = await this.loadKnowledgeGraph();
89
+ kg.intents.push(intent);
90
+ kg.analytics.totalIntents = kg.intents.length;
91
+ kg.analytics.activeIntents = kg.intents.filter(i => i.currentStatus !== 'completed').length;
92
+ // Add score history entry
93
+ if (!kg.scoreHistory)
94
+ kg.scoreHistory = [];
95
+ kg.scoreHistory.push({
96
+ timestamp,
97
+ intentId,
98
+ overallScore: currentScore.overall,
99
+ componentScores: {
100
+ taskCompletion: currentScore.taskCompletion,
101
+ deploymentReadiness: currentScore.deploymentReadiness,
102
+ architectureCompliance: currentScore.architectureCompliance,
103
+ securityPosture: currentScore.securityPosture,
104
+ codeQuality: currentScore.codeQuality
105
+ },
106
+ triggerEvent: `Intent created: ${humanRequest.substring(0, 100)}...`,
107
+ confidence: currentScore.confidence
108
+ });
109
+ await this.saveKnowledgeGraph(kg);
110
+ return intentId;
111
+ }
112
+ async addToolExecution(intentId, toolName, parameters, result, success, todoTasksCreated = [], todoTasksModified = [], error) {
113
+ const kg = await this.loadKnowledgeGraph();
114
+ const intent = kg.intents.find(i => i.intentId === intentId);
115
+ if (!intent) {
116
+ throw new Error(`Intent ${intentId} not found`);
117
+ }
118
+ // Capture before score
119
+ const beforeScore = await this.healthScoring.getProjectHealthScore();
120
+ const execution = {
121
+ toolName,
122
+ parameters,
123
+ result,
124
+ todoTasksCreated,
125
+ todoTasksModified,
126
+ executionTime: new Date().toISOString(),
127
+ success,
128
+ error
129
+ };
130
+ intent.toolChain.push(execution);
131
+ intent.currentStatus = success ? 'executing' : 'failed';
132
+ // Update scores after tool execution and capture impact
133
+ await this.updateScoreTracking(intentId, toolName, beforeScore, execution);
134
+ this.updateAnalytics(kg);
135
+ await this.saveKnowledgeGraph(kg);
136
+ }
137
+ async updateIntentStatus(intentId, status) {
138
+ const kg = await this.loadKnowledgeGraph();
139
+ const intent = kg.intents.find(i => i.intentId === intentId);
140
+ if (!intent) {
141
+ throw new Error(`Intent ${intentId} not found`);
142
+ }
143
+ intent.currentStatus = status;
144
+ this.updateAnalytics(kg);
145
+ await this.saveKnowledgeGraph(kg);
146
+ }
147
+ async updateTodoSnapshot(intentId, todoContent) {
148
+ const kg = await this.loadKnowledgeGraph();
149
+ const intent = kg.intents.find(i => i.intentId === intentId);
150
+ if (!intent) {
151
+ throw new Error(`Intent ${intentId} not found`);
152
+ }
153
+ intent.todoMdSnapshot = todoContent;
154
+ await this.saveKnowledgeGraph(kg);
155
+ }
156
+ async getSyncState() {
157
+ try {
158
+ const data = await fs.readFile(this.syncStateFile, 'utf-8');
159
+ const parsed = JSON.parse(data);
160
+ return TodoSyncStateSchema.parse(parsed);
161
+ }
162
+ catch {
163
+ return this.getDefaultSyncState();
164
+ }
165
+ }
166
+ async updateSyncState(updates) {
167
+ const current = await this.getSyncState();
168
+ const updated = { ...current, ...updates };
169
+ await fs.writeFile(this.syncStateFile, JSON.stringify(updated, null, 2));
170
+ const kg = await this.loadKnowledgeGraph();
171
+ kg.todoSyncState = updated;
172
+ await this.saveKnowledgeGraph(kg);
173
+ }
174
+ async getIntentById(intentId) {
175
+ const kg = await this.loadKnowledgeGraph();
176
+ return kg.intents.find(i => i.intentId === intentId) || null;
177
+ }
178
+ async getActiveIntents() {
179
+ const kg = await this.loadKnowledgeGraph();
180
+ return kg.intents.filter(i => i.currentStatus !== 'completed' && i.currentStatus !== 'failed');
181
+ }
182
+ async getIntentsByStatus(status) {
183
+ const kg = await this.loadKnowledgeGraph();
184
+ return kg.intents.filter(i => i.currentStatus === status);
185
+ }
186
+ async getDefaultSyncState() {
187
+ return {
188
+ lastSyncTimestamp: new Date().toISOString(),
189
+ todoMdHash: '',
190
+ knowledgeGraphHash: '',
191
+ syncStatus: 'synced',
192
+ lastModifiedBy: 'tool',
193
+ version: 1
194
+ };
195
+ }
196
+ updateAnalytics(kg) {
197
+ const intents = kg.intents;
198
+ kg.analytics.totalIntents = intents.length;
199
+ kg.analytics.completedIntents = intents.filter(i => i.currentStatus === 'completed').length;
200
+ kg.analytics.activeIntents = intents.filter(i => i.currentStatus !== 'completed' && i.currentStatus !== 'failed').length;
201
+ if (kg.analytics.totalIntents > 0) {
202
+ kg.analytics.averageGoalCompletion = kg.analytics.completedIntents / kg.analytics.totalIntents;
203
+ }
204
+ const toolUsage = new Map();
205
+ intents.forEach(intent => {
206
+ intent.toolChain.forEach(execution => {
207
+ toolUsage.set(execution.toolName, (toolUsage.get(execution.toolName) || 0) + 1);
208
+ });
209
+ });
210
+ kg.analytics.mostUsedTools = Array.from(toolUsage.entries())
211
+ .map(([toolName, usageCount]) => ({ toolName, usageCount }))
212
+ .sort((a, b) => b.usageCount - a.usageCount)
213
+ .slice(0, 10);
214
+ }
215
+ async calculateTodoMdHash(todoPath) {
216
+ try {
217
+ const content = await fs.readFile(todoPath, 'utf-8');
218
+ return crypto.createHash('sha256').update(content).digest('hex');
219
+ }
220
+ catch {
221
+ return '';
222
+ }
223
+ }
224
+ async detectTodoChanges(todoPath) {
225
+ const syncState = await this.getSyncState();
226
+ const currentHash = await this.calculateTodoMdHash(todoPath);
227
+ return {
228
+ hasChanges: currentHash !== syncState.todoMdHash,
229
+ currentHash,
230
+ lastHash: syncState.todoMdHash
231
+ };
232
+ }
233
+ /**
234
+ * Update score tracking for an intent after tool execution
235
+ */
236
+ async updateScoreTracking(intentId, toolName, beforeScore, execution) {
237
+ const kg = await this.loadKnowledgeGraph();
238
+ const intent = kg.intents.find(i => i.intentId === intentId);
239
+ if (!intent)
240
+ return;
241
+ // Get current score after tool execution
242
+ const afterScore = await this.healthScoring.getProjectHealthScore();
243
+ // Calculate score impact
244
+ const scoreImpact = {
245
+ beforeScore: beforeScore.overall,
246
+ afterScore: afterScore.overall,
247
+ componentImpacts: {
248
+ taskCompletion: afterScore.taskCompletion - beforeScore.taskCompletion,
249
+ deploymentReadiness: afterScore.deploymentReadiness - beforeScore.deploymentReadiness,
250
+ architectureCompliance: afterScore.architectureCompliance - beforeScore.architectureCompliance,
251
+ securityPosture: afterScore.securityPosture - beforeScore.securityPosture,
252
+ codeQuality: afterScore.codeQuality - beforeScore.codeQuality
253
+ },
254
+ scoreConfidence: afterScore.confidence
255
+ };
256
+ // Update execution with score impact
257
+ execution.scoreImpact = scoreImpact;
258
+ // Update intent score tracking
259
+ if (intent.scoreTracking) {
260
+ intent.scoreTracking.currentScore = afterScore.overall;
261
+ intent.scoreTracking.componentScores = {
262
+ taskCompletion: afterScore.taskCompletion,
263
+ deploymentReadiness: afterScore.deploymentReadiness,
264
+ architectureCompliance: afterScore.architectureCompliance,
265
+ securityPosture: afterScore.securityPosture,
266
+ codeQuality: afterScore.codeQuality
267
+ };
268
+ intent.scoreTracking.lastScoreUpdate = new Date().toISOString();
269
+ // Calculate progress if we have initial score
270
+ if (intent.scoreTracking.initialScore !== undefined) {
271
+ const initialScore = intent.scoreTracking.initialScore;
272
+ const targetScore = intent.scoreTracking.targetScore || 100;
273
+ const currentScore = afterScore.overall;
274
+ // Calculate progress as percentage of improvement toward target
275
+ const totalPossibleImprovement = targetScore - initialScore;
276
+ const actualImprovement = currentScore - initialScore;
277
+ intent.scoreTracking.scoreProgress = totalPossibleImprovement > 0
278
+ ? Math.min(100, (actualImprovement / totalPossibleImprovement) * 100)
279
+ : 0;
280
+ }
281
+ }
282
+ // Add to score history
283
+ if (!kg.scoreHistory)
284
+ kg.scoreHistory = [];
285
+ kg.scoreHistory.push({
286
+ timestamp: new Date().toISOString(),
287
+ intentId,
288
+ overallScore: afterScore.overall,
289
+ componentScores: {
290
+ taskCompletion: afterScore.taskCompletion,
291
+ deploymentReadiness: afterScore.deploymentReadiness,
292
+ architectureCompliance: afterScore.architectureCompliance,
293
+ securityPosture: afterScore.securityPosture,
294
+ codeQuality: afterScore.codeQuality
295
+ },
296
+ triggerEvent: `Tool executed: ${toolName}`,
297
+ confidence: afterScore.confidence
298
+ });
299
+ // Keep only last 100 score history entries
300
+ if (kg.scoreHistory.length > 100) {
301
+ kg.scoreHistory = kg.scoreHistory.slice(-100);
302
+ }
303
+ }
304
+ /**
305
+ * Get score trends for an intent
306
+ */
307
+ async getIntentScoreTrends(intentId) {
308
+ const kg = await this.loadKnowledgeGraph();
309
+ const intent = kg.intents.find(i => i.intentId === intentId);
310
+ if (!intent?.scoreTracking) {
311
+ throw new Error(`Intent ${intentId} not found or has no score tracking`);
312
+ }
313
+ const scoreHistory = kg.scoreHistory?.filter(h => h.intentId === intentId) || [];
314
+ return {
315
+ initialScore: intent.scoreTracking.initialScore || 0,
316
+ currentScore: intent.scoreTracking.currentScore || 0,
317
+ progress: intent.scoreTracking.scoreProgress || 0,
318
+ componentTrends: intent.scoreTracking.componentScores || {},
319
+ scoreHistory: scoreHistory.map(h => ({
320
+ timestamp: h.timestamp,
321
+ score: h.overallScore,
322
+ triggerEvent: h.triggerEvent
323
+ }))
324
+ };
325
+ }
326
+ /**
327
+ * Get overall project score trends
328
+ */
329
+ async getProjectScoreTrends() {
330
+ const kg = await this.loadKnowledgeGraph();
331
+ const currentScore = await this.healthScoring.getProjectHealthScore();
332
+ const scoreHistory = kg.scoreHistory || [];
333
+ const intentImpacts = kg.intents
334
+ .filter(i => i.scoreTracking?.initialScore !== undefined && i.scoreTracking?.currentScore !== undefined)
335
+ .map(i => ({
336
+ intentId: i.intentId,
337
+ humanRequest: i.humanRequest,
338
+ scoreImprovement: (i.scoreTracking.currentScore - i.scoreTracking.initialScore)
339
+ }))
340
+ .sort((a, b) => b.scoreImprovement - a.scoreImprovement)
341
+ .slice(0, 5);
342
+ const averageImprovement = intentImpacts.length > 0
343
+ ? intentImpacts.reduce((sum, i) => sum + i.scoreImprovement, 0) / intentImpacts.length
344
+ : 0;
345
+ return {
346
+ currentScore: currentScore.overall,
347
+ scoreHistory: scoreHistory.map(h => ({
348
+ timestamp: h.timestamp,
349
+ score: h.overallScore,
350
+ triggerEvent: h.triggerEvent,
351
+ ...(h.intentId && { intentId: h.intentId })
352
+ })),
353
+ averageImprovement,
354
+ topImpactingIntents: intentImpacts
355
+ };
356
+ }
357
+ }
358
+ //# sourceMappingURL=knowledge-graph-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-graph-manager.js","sourceRoot":"","sources":["../../../src/utils/knowledge-graph-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * MCP Response Validator
3
+ *
4
+ * Validates and sanitizes MCP tool responses to prevent JSON-RPC 2.0 parse errors
5
+ */
6
+ export interface McpToolResponse {
7
+ content: Array<{
8
+ type: 'text' | 'image' | 'resource';
9
+ text?: string;
10
+ data?: string;
11
+ mimeType?: string;
12
+ }>;
13
+ isError?: boolean;
14
+ }
15
+ /**
16
+ * Validate and sanitize an MCP tool response
17
+ */
18
+ export declare function validateMcpResponse(response: any): McpToolResponse;
19
+ /**
20
+ * Validate that a response can be safely serialized as JSON-RPC 2.0
21
+ */
22
+ export declare function validateJsonRpcSerialization(response: any): {
23
+ valid: boolean;
24
+ error?: string;
25
+ };
26
+ /**
27
+ * Safe wrapper for MCP tool functions
28
+ */
29
+ export declare function safeMcpToolWrapper<T extends any[], R>(toolFunction: (...args: T) => Promise<R>, toolName: string): (...args: T) => Promise<McpToolResponse>;
30
+ //# sourceMappingURL=mcp-response-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-response-validator.d.ts","sourceRoot":"","sources":["../../../src/utils/mcp-response-validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;QACpC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,GAAG,GAAG,eAAe,CAuClE;AAsHD;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,GAAG,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA0B9F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EACnD,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EACxC,QAAQ,EAAE,MAAM,IAEF,GAAG,MAAM,CAAC,KAAG,OAAO,CAAC,eAAe,CAAC,CAkBpD"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * MCP Response Validator
3
+ *
4
+ * Validates and sanitizes MCP tool responses to prevent JSON-RPC 2.0 parse errors
5
+ */
6
+ /**
7
+ * Validate and sanitize an MCP tool response
8
+ */
9
+ export function validateMcpResponse(response) {
10
+ try {
11
+ // Ensure response has the correct structure
12
+ if (!response || typeof response !== 'object') {
13
+ return createErrorResponse('Invalid response structure');
14
+ }
15
+ // Ensure content array exists
16
+ if (!Array.isArray(response.content)) {
17
+ return createErrorResponse('Response must have content array');
18
+ }
19
+ // Validate and sanitize each content item
20
+ const sanitizedContent = response.content.map((item, index) => {
21
+ try {
22
+ return sanitizeContentItem(item, index);
23
+ }
24
+ catch (error) {
25
+ console.error(`Error sanitizing content item ${index}:`, error);
26
+ return {
27
+ type: 'text',
28
+ text: `[Error: Could not render content item ${index}]`
29
+ };
30
+ }
31
+ });
32
+ // Test JSON serialization
33
+ const testSerialization = JSON.stringify({ content: sanitizedContent });
34
+ // Verify it can be parsed back
35
+ JSON.parse(testSerialization);
36
+ return {
37
+ content: sanitizedContent,
38
+ isError: response.isError || false
39
+ };
40
+ }
41
+ catch (error) {
42
+ console.error('Response validation failed:', error);
43
+ return createErrorResponse(`Response validation failed: ${error instanceof Error ? error.message : String(error)}`);
44
+ }
45
+ }
46
+ /**
47
+ * Sanitize a single content item
48
+ */
49
+ function sanitizeContentItem(item, index) {
50
+ if (!item || typeof item !== 'object') {
51
+ throw new Error(`Content item ${index} is not an object`);
52
+ }
53
+ const type = item.type;
54
+ if (!type || !['text', 'image', 'resource'].includes(type)) {
55
+ throw new Error(`Content item ${index} has invalid type: ${type}`);
56
+ }
57
+ switch (type) {
58
+ case 'text':
59
+ return {
60
+ type: 'text',
61
+ text: sanitizeTextContent(item.text || '')
62
+ };
63
+ case 'image':
64
+ return {
65
+ type: 'image',
66
+ data: sanitizeBase64Content(item.data || ''),
67
+ mimeType: sanitizeMimeType(item.mimeType || 'image/png')
68
+ };
69
+ case 'resource':
70
+ return {
71
+ type: 'resource',
72
+ data: sanitizeTextContent(item.data || ''),
73
+ mimeType: sanitizeMimeType(item.mimeType || 'text/plain')
74
+ };
75
+ default:
76
+ throw new Error(`Unsupported content type: ${type}`);
77
+ }
78
+ }
79
+ /**
80
+ * Sanitize text content for JSON-RPC safety
81
+ */
82
+ function sanitizeTextContent(text) {
83
+ if (typeof text !== 'string') {
84
+ text = String(text);
85
+ }
86
+ // Remove or escape problematic characters
87
+ return text
88
+ // Escape backslashes first
89
+ .replace(/\\/g, '\\\\')
90
+ // Escape double quotes
91
+ .replace(/"/g, '\\"')
92
+ // Handle control characters
93
+ .replace(/\n/g, '\\n')
94
+ .replace(/\r/g, '\\r')
95
+ .replace(/\t/g, '\\t')
96
+ // Remove or escape other control characters
97
+ .replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F]/g, (char) => {
98
+ const code = char.charCodeAt(0);
99
+ switch (code) {
100
+ case 0x08: return '\\b';
101
+ case 0x0C: return '\\f';
102
+ default:
103
+ // Replace with safe placeholder for other control chars
104
+ return `[CTRL:${code.toString(16).padStart(2, '0')}]`;
105
+ }
106
+ })
107
+ // Limit length to prevent oversized responses
108
+ .slice(0, 1000000); // 1MB limit
109
+ }
110
+ /**
111
+ * Sanitize base64 content
112
+ */
113
+ function sanitizeBase64Content(data) {
114
+ if (typeof data !== 'string') {
115
+ return '';
116
+ }
117
+ // Validate base64 format and remove invalid characters
118
+ return data.replace(/[^A-Za-z0-9+/=]/g, '').slice(0, 10000000); // 10MB limit
119
+ }
120
+ /**
121
+ * Sanitize MIME type
122
+ */
123
+ function sanitizeMimeType(mimeType) {
124
+ if (typeof mimeType !== 'string') {
125
+ return 'text/plain';
126
+ }
127
+ // Only allow safe MIME types
128
+ const allowedMimeTypes = [
129
+ 'text/plain', 'text/html', 'text/markdown', 'text/css', 'text/javascript',
130
+ 'application/json', 'application/xml', 'application/yaml',
131
+ 'image/png', 'image/jpeg', 'image/gif', 'image/svg+xml', 'image/webp'
132
+ ];
133
+ const sanitized = mimeType.toLowerCase().trim();
134
+ return allowedMimeTypes.includes(sanitized) ? sanitized : 'text/plain';
135
+ }
136
+ /**
137
+ * Create a safe error response
138
+ */
139
+ function createErrorResponse(message) {
140
+ return {
141
+ content: [{
142
+ type: 'text',
143
+ text: sanitizeTextContent(`Error: ${message}`)
144
+ }],
145
+ isError: true
146
+ };
147
+ }
148
+ /**
149
+ * Validate that a response can be safely serialized as JSON-RPC 2.0
150
+ */
151
+ export function validateJsonRpcSerialization(response) {
152
+ try {
153
+ // Test full JSON-RPC 2.0 structure
154
+ const jsonRpcResponse = {
155
+ jsonrpc: '2.0',
156
+ id: 1,
157
+ result: response
158
+ };
159
+ const serialized = JSON.stringify(jsonRpcResponse);
160
+ // Verify it can be parsed back
161
+ const parsed = JSON.parse(serialized);
162
+ // Verify structure is preserved
163
+ if (!parsed.result || !Array.isArray(parsed.result.content)) {
164
+ return { valid: false, error: 'Structure not preserved after serialization' };
165
+ }
166
+ return { valid: true };
167
+ }
168
+ catch (error) {
169
+ return {
170
+ valid: false,
171
+ error: `JSON-RPC serialization failed: ${error instanceof Error ? error.message : String(error)}`
172
+ };
173
+ }
174
+ }
175
+ /**
176
+ * Safe wrapper for MCP tool functions
177
+ */
178
+ export function safeMcpToolWrapper(toolFunction, toolName) {
179
+ return async (...args) => {
180
+ try {
181
+ const result = await toolFunction(...args);
182
+ const validated = validateMcpResponse(result);
183
+ // Double-check JSON-RPC compatibility
184
+ const jsonRpcCheck = validateJsonRpcSerialization(validated);
185
+ if (!jsonRpcCheck.valid) {
186
+ console.error(`JSON-RPC validation failed for ${toolName}:`, jsonRpcCheck.error);
187
+ return createErrorResponse(`Tool response not JSON-RPC compatible: ${jsonRpcCheck.error}`);
188
+ }
189
+ return validated;
190
+ }
191
+ catch (error) {
192
+ console.error(`Error in ${toolName}:`, error);
193
+ return createErrorResponse(`Tool execution failed: ${error instanceof Error ? error.message : String(error)}`);
194
+ }
195
+ };
196
+ }
197
+ //# sourceMappingURL=mcp-response-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-response-validator.js","sourceRoot":"","sources":["../../../src/utils/mcp-response-validator.ts"],"names":[],"mappings":"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"}