@stacksfinder/mcp-server 1.1.0 → 1.2.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.
Files changed (94) hide show
  1. package/LICENSE +16 -16
  2. package/README.md +92 -3
  3. package/dist/compatibility/index.d.ts +11 -0
  4. package/dist/compatibility/index.d.ts.map +1 -0
  5. package/dist/compatibility/index.js +13 -0
  6. package/dist/compatibility/index.js.map +1 -0
  7. package/dist/compatibility/rules.d.ts +29 -0
  8. package/dist/compatibility/rules.d.ts.map +1 -0
  9. package/dist/compatibility/rules.js +419 -0
  10. package/dist/compatibility/rules.js.map +1 -0
  11. package/dist/compatibility/scoring.d.ts +54 -0
  12. package/dist/compatibility/scoring.d.ts.map +1 -0
  13. package/dist/compatibility/scoring.js +209 -0
  14. package/dist/compatibility/scoring.js.map +1 -0
  15. package/dist/compatibility/types.d.ts +176 -0
  16. package/dist/compatibility/types.d.ts.map +1 -0
  17. package/dist/compatibility/types.js +26 -0
  18. package/dist/compatibility/types.js.map +1 -0
  19. package/dist/compatibility/utils.d.ts +82 -0
  20. package/dist/compatibility/utils.d.ts.map +1 -0
  21. package/dist/compatibility/utils.js +269 -0
  22. package/dist/compatibility/utils.js.map +1 -0
  23. package/dist/data/357/200/242/357/200/212cp H:bac_/303/240_guigui_v2stack_finderpackagesmcp-serversrcdatacompatibility_matrix.json H:bac_/303/240_guigui_v2stack_finderpackagesmcp-serverdistdata/357/200/242" +226 -0
  24. package/dist/http.d.ts +7 -0
  25. package/dist/http.d.ts.map +1 -0
  26. package/dist/http.js +69 -0
  27. package/dist/http.js.map +1 -0
  28. package/dist/lib/mcp-compatibility/index.d.ts +33 -0
  29. package/dist/lib/mcp-compatibility/index.d.ts.map +1 -0
  30. package/dist/lib/mcp-compatibility/index.js +35 -0
  31. package/dist/lib/mcp-compatibility/index.js.map +1 -0
  32. package/dist/lib/mcp-compatibility/rules.d.ts +29 -0
  33. package/dist/lib/mcp-compatibility/rules.d.ts.map +1 -0
  34. package/dist/lib/mcp-compatibility/rules.js +419 -0
  35. package/dist/lib/mcp-compatibility/rules.js.map +1 -0
  36. package/dist/lib/mcp-compatibility/scoring.d.ts +54 -0
  37. package/dist/lib/mcp-compatibility/scoring.d.ts.map +1 -0
  38. package/dist/lib/mcp-compatibility/scoring.js +209 -0
  39. package/dist/lib/mcp-compatibility/scoring.js.map +1 -0
  40. package/dist/lib/mcp-compatibility/types.d.ts +176 -0
  41. package/dist/lib/mcp-compatibility/types.d.ts.map +1 -0
  42. package/dist/lib/mcp-compatibility/types.js +26 -0
  43. package/dist/lib/mcp-compatibility/types.js.map +1 -0
  44. package/dist/lib/mcp-compatibility/utils.d.ts +82 -0
  45. package/dist/lib/mcp-compatibility/utils.d.ts.map +1 -0
  46. package/dist/lib/mcp-compatibility/utils.js +269 -0
  47. package/dist/lib/mcp-compatibility/utils.js.map +1 -0
  48. package/dist/server.d.ts.map +1 -1
  49. package/dist/server.js +296 -1
  50. package/dist/server.js.map +1 -1
  51. package/dist/tools/check-compatibility.d.ts +43 -0
  52. package/dist/tools/check-compatibility.d.ts.map +1 -0
  53. package/dist/tools/check-compatibility.js +133 -0
  54. package/dist/tools/check-compatibility.js.map +1 -0
  55. package/dist/tools/project-kit/analyze-repo.d.ts +50 -0
  56. package/dist/tools/project-kit/analyze-repo.d.ts.map +1 -0
  57. package/dist/tools/project-kit/analyze-repo.js +456 -0
  58. package/dist/tools/project-kit/analyze-repo.js.map +1 -0
  59. package/dist/tools/project-kit/detect-stack.d.ts +16 -0
  60. package/dist/tools/project-kit/detect-stack.d.ts.map +1 -0
  61. package/dist/tools/project-kit/detect-stack.js +572 -0
  62. package/dist/tools/project-kit/detect-stack.js.map +1 -0
  63. package/dist/tools/project-kit/execute-installation.d.ts +50 -0
  64. package/dist/tools/project-kit/execute-installation.d.ts.map +1 -0
  65. package/dist/tools/project-kit/execute-installation.js +440 -0
  66. package/dist/tools/project-kit/execute-installation.js.map +1 -0
  67. package/dist/tools/project-kit/generate.d.ts +70 -0
  68. package/dist/tools/project-kit/generate.d.ts.map +1 -0
  69. package/dist/tools/project-kit/generate.js +455 -0
  70. package/dist/tools/project-kit/generate.js.map +1 -0
  71. package/dist/tools/project-kit/index.d.ts +18 -0
  72. package/dist/tools/project-kit/index.d.ts.map +1 -0
  73. package/dist/tools/project-kit/index.js +21 -0
  74. package/dist/tools/project-kit/index.js.map +1 -0
  75. package/dist/tools/project-kit/installation-types.d.ts +147 -0
  76. package/dist/tools/project-kit/installation-types.d.ts.map +1 -0
  77. package/dist/tools/project-kit/installation-types.js +491 -0
  78. package/dist/tools/project-kit/installation-types.js.map +1 -0
  79. package/dist/tools/project-kit/match-mcps.d.ts +67 -0
  80. package/dist/tools/project-kit/match-mcps.d.ts.map +1 -0
  81. package/dist/tools/project-kit/match-mcps.js +497 -0
  82. package/dist/tools/project-kit/match-mcps.js.map +1 -0
  83. package/dist/tools/project-kit/prepare-installation.d.ts +54 -0
  84. package/dist/tools/project-kit/prepare-installation.d.ts.map +1 -0
  85. package/dist/tools/project-kit/prepare-installation.js +382 -0
  86. package/dist/tools/project-kit/prepare-installation.js.map +1 -0
  87. package/dist/tools/project-kit/types.d.ts +200 -0
  88. package/dist/tools/project-kit/types.d.ts.map +1 -0
  89. package/dist/tools/project-kit/types.js +76 -0
  90. package/dist/tools/project-kit/types.js.map +1 -0
  91. package/dist/tools/recommend.d.ts.map +1 -1
  92. package/dist/tools/recommend.js +26 -10
  93. package/dist/tools/recommend.js.map +1 -1
  94. package/package.json +8 -3
@@ -0,0 +1,456 @@
1
+ /**
2
+ * analyze_repo_mcps Tool
3
+ *
4
+ * Analyzes a repository to detect the tech stack and recommend
5
+ * appropriate MCP servers based on the detected technologies.
6
+ */
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import * as os from 'os';
10
+ import { z } from 'zod';
11
+ import { AnalyzeRepoMCPsInputSchema } from './types.js';
12
+ import { detectStackFromFiles } from './detect-stack.js';
13
+ import { matchMCPsForStack, generateInstallConfig } from './match-mcps.js';
14
+ import { debug, info, error } from '../../utils/logger.js';
15
+ import { initRulesIndex, getAllRules, generateReport, findRule, canonicalizeMcpId } from '../../lib/mcp-compatibility/index.js';
16
+ // ============================================================================
17
+ // INSTALLED MCP DETECTION
18
+ // ============================================================================
19
+ /**
20
+ * Common locations for MCP configuration files.
21
+ */
22
+ const MCP_CONFIG_LOCATIONS = [
23
+ // Claude Desktop (macOS)
24
+ '~/Library/Application Support/Claude/claude_desktop_config.json',
25
+ // Claude Desktop (Windows)
26
+ '%APPDATA%/Claude/claude_desktop_config.json',
27
+ // Claude Desktop (Linux)
28
+ '~/.config/claude/claude_desktop_config.json',
29
+ // Cursor
30
+ '.cursor/mcp.json',
31
+ // VS Code
32
+ '.vscode/mcp.json',
33
+ // Project-local
34
+ 'mcp.json',
35
+ '.mcp.json'
36
+ ];
37
+ /**
38
+ * Expand path with environment variables and home directory.
39
+ */
40
+ function expandPath(p) {
41
+ // Expand home directory
42
+ if (p.startsWith('~/')) {
43
+ p = path.join(os.homedir(), p.slice(2));
44
+ }
45
+ // Expand environment variables (Windows style)
46
+ p = p.replace(/%([^%]+)%/g, (_, envVar) => process.env[envVar] || '');
47
+ return p;
48
+ }
49
+ /**
50
+ * Parse MCP config file and extract installed server slugs.
51
+ */
52
+ async function parseConfigFile(configPath) {
53
+ try {
54
+ const content = await fs.readFile(configPath, 'utf-8');
55
+ const config = JSON.parse(content);
56
+ const servers = [];
57
+ // Handle mcpServers object format
58
+ if (config.mcpServers && typeof config.mcpServers === 'object') {
59
+ servers.push(...Object.keys(config.mcpServers));
60
+ }
61
+ // Handle servers array format
62
+ if (Array.isArray(config.servers)) {
63
+ for (const server of config.servers) {
64
+ if (server.name) {
65
+ servers.push(server.name);
66
+ }
67
+ }
68
+ }
69
+ return servers;
70
+ }
71
+ catch {
72
+ return [];
73
+ }
74
+ }
75
+ /**
76
+ * Detect installed MCPs from configuration files.
77
+ */
78
+ async function getInstalledMCPs(workspaceRoot, customConfigPath) {
79
+ const installedMcps = new Set();
80
+ // Check custom config path first
81
+ if (customConfigPath) {
82
+ const servers = await parseConfigFile(path.resolve(workspaceRoot, customConfigPath));
83
+ servers.forEach((s) => installedMcps.add(s));
84
+ }
85
+ // Check all common locations
86
+ for (const location of MCP_CONFIG_LOCATIONS) {
87
+ let configPath;
88
+ if (location.startsWith('~') || location.includes('%')) {
89
+ // Absolute/home paths
90
+ configPath = expandPath(location);
91
+ }
92
+ else {
93
+ // Relative to workspace
94
+ configPath = path.join(workspaceRoot, location);
95
+ }
96
+ const servers = await parseConfigFile(configPath);
97
+ servers.forEach((s) => installedMcps.add(s));
98
+ }
99
+ debug(`Found ${installedMcps.size} installed MCPs`);
100
+ return Array.from(installedMcps);
101
+ }
102
+ // ============================================================================
103
+ // COMPATIBILITY HELPERS
104
+ // ============================================================================
105
+ let rulesInitialized = false;
106
+ /**
107
+ * Ensure rules index is initialized.
108
+ */
109
+ function ensureRulesInitialized() {
110
+ if (!rulesInitialized) {
111
+ initRulesIndex(getAllRules());
112
+ rulesInitialized = true;
113
+ }
114
+ }
115
+ /**
116
+ * Convert CompatibilityReport to MCPCompatibilityResult.
117
+ */
118
+ function convertToCompatibilityResult(report) {
119
+ return {
120
+ score: report.summary.score,
121
+ grade: report.summary.grade,
122
+ conflicts: report.conflicts.map((c) => ({
123
+ mcpA: c.rule.mcpA,
124
+ mcpB: c.rule.mcpB,
125
+ reason: c.rule.reason,
126
+ severity: c.rule.severity
127
+ })),
128
+ redundancies: report.redundancies.map((r) => ({
129
+ mcpA: r.rule.mcpA,
130
+ mcpB: r.rule.mcpB,
131
+ reason: r.rule.reason,
132
+ severity: r.rule.severity
133
+ })),
134
+ synergies: report.synergies.map((s) => ({
135
+ mcpA: s.rule.mcpA,
136
+ mcpB: s.rule.mcpB,
137
+ reason: s.rule.reason
138
+ })),
139
+ suggestions: report.suggestions.map((s) => ({
140
+ mcp: s.mcp,
141
+ reason: s.reason,
142
+ basedOn: s.basedOn
143
+ }))
144
+ };
145
+ }
146
+ // ============================================================================
147
+ // TOOL IMPLEMENTATION
148
+ // ============================================================================
149
+ /**
150
+ * Analyze repository and recommend MCPs.
151
+ */
152
+ export async function analyzeRepo(input) {
153
+ const workspaceRoot = input.workspaceRoot || process.cwd();
154
+ info(`Analyzing repository at: ${workspaceRoot}`);
155
+ // Initialize compatibility rules
156
+ ensureRulesInitialized();
157
+ // Step 1: Detect installed MCPs
158
+ const installedMcps = await getInstalledMCPs(workspaceRoot, input.mcpConfigPath);
159
+ // Step 2: Detect stack from files
160
+ const { stack: detectedStack, filesAnalyzed } = await detectStackFromFiles(workspaceRoot);
161
+ // Log detection summary
162
+ const stackSummary = [
163
+ detectedStack.frontend && `frontend: ${detectedStack.frontend.name}`,
164
+ detectedStack.backend && `backend: ${detectedStack.backend.name}`,
165
+ detectedStack.database && `database: ${detectedStack.database.name}`,
166
+ detectedStack.orm && `orm: ${detectedStack.orm.name}`,
167
+ detectedStack.auth && `auth: ${detectedStack.auth.name}`,
168
+ detectedStack.hosting && `hosting: ${detectedStack.hosting.name}`,
169
+ detectedStack.payments && `payments: ${detectedStack.payments.name}`,
170
+ detectedStack.services.length > 0 &&
171
+ `services: ${detectedStack.services.map((s) => s.name).join(', ')}`
172
+ ]
173
+ .filter(Boolean)
174
+ .join(', ');
175
+ info(`Detected stack: ${stackSummary || 'none'}`);
176
+ // Step 3: Match MCPs for detected stack
177
+ const allRecommendedMcps = matchMCPsForStack(detectedStack, {
178
+ includeInstalled: input.includeInstalled,
179
+ installedMcps
180
+ });
181
+ // Step 4: Check compatibility between installed MCPs
182
+ const installedReport = generateReport(installedMcps, getAllRules());
183
+ const installedCompatibility = convertToCompatibilityResult(installedReport);
184
+ // Step 5: Check recommendations against installed MCPs for conflicts
185
+ const excludedRecommendations = [];
186
+ const recommendationConflicts = [];
187
+ const safeRecommendations = [];
188
+ for (const rec of allRecommendedMcps) {
189
+ const canonicalRec = canonicalizeMcpId(rec.slug);
190
+ let hasConflict = false;
191
+ for (const installed of installedMcps) {
192
+ const rule = findRule(canonicalRec, installed);
193
+ if (rule && rule.status === 'conflict') {
194
+ hasConflict = true;
195
+ excludedRecommendations.push({
196
+ mcp: rec.slug,
197
+ reason: rule.reason,
198
+ conflictsWith: installed
199
+ });
200
+ recommendationConflicts.push({
201
+ recommended: rec.slug,
202
+ conflictsWith: installed,
203
+ reason: rule.reason
204
+ });
205
+ debug(`Excluded ${rec.slug}: conflicts with installed ${installed}`);
206
+ break;
207
+ }
208
+ }
209
+ if (!hasConflict) {
210
+ safeRecommendations.push(rec);
211
+ }
212
+ }
213
+ info(`Recommended ${safeRecommendations.length} MCPs (${excludedRecommendations.length} excluded due to conflicts)`);
214
+ // Step 6: Generate install configs for safe recommendations only
215
+ const installConfig = generateInstallConfig(safeRecommendations);
216
+ return {
217
+ detectedStack,
218
+ installedMcps,
219
+ recommendedMcps: safeRecommendations,
220
+ excludedRecommendations,
221
+ compatibility: {
222
+ installed: installedCompatibility,
223
+ recommendationConflicts
224
+ },
225
+ installConfig,
226
+ metadata: {
227
+ filesAnalyzed,
228
+ analysisDate: new Date().toISOString()
229
+ }
230
+ };
231
+ }
232
+ // ============================================================================
233
+ // TOOL HANDLER
234
+ // ============================================================================
235
+ /**
236
+ * Tool definition for MCP server registration.
237
+ */
238
+ export const analyzeRepoMcpsTool = {
239
+ name: 'analyze_repo_mcps',
240
+ description: `Analyze your current repository to detect the tech stack and recommend relevant MCP servers.
241
+
242
+ This tool examines your project files (package.json, .env, config files, etc.) to:
243
+ 1. Detect frontend, backend, database, auth, hosting, and payment technologies
244
+ 2. Find already installed MCP servers
245
+ 3. Recommend new MCPs that would enhance your development workflow
246
+ 4. Generate ready-to-use install configurations for Cursor, Claude Desktop, and Windsurf
247
+
248
+ Example use cases:
249
+ - "What MCPs would help with my project?"
250
+ - "Analyze my repo and suggest useful MCP servers"
251
+ - "Which MCPs am I missing based on my tech stack?"`,
252
+ inputSchema: {
253
+ type: 'object',
254
+ properties: {
255
+ includeInstalled: {
256
+ type: 'boolean',
257
+ description: 'Include already installed MCPs in recommendations (default: false)',
258
+ default: false
259
+ },
260
+ mcpConfigPath: {
261
+ type: 'string',
262
+ description: 'Override path to MCP configuration file'
263
+ },
264
+ workspaceRoot: {
265
+ type: 'string',
266
+ description: 'Override workspace root directory (default: current directory)'
267
+ }
268
+ }
269
+ },
270
+ handler: async (params) => {
271
+ try {
272
+ const input = AnalyzeRepoMCPsInputSchema.parse(params);
273
+ const result = await analyzeRepo(input);
274
+ // Format output for display
275
+ const output = formatAnalysisOutput(result);
276
+ return {
277
+ content: [
278
+ {
279
+ type: 'text',
280
+ text: output
281
+ }
282
+ ]
283
+ };
284
+ }
285
+ catch (err) {
286
+ if (err instanceof z.ZodError) {
287
+ error('Invalid input:', err.errors);
288
+ return {
289
+ content: [
290
+ {
291
+ type: 'text',
292
+ text: `Invalid input: ${err.errors.map((e) => e.message).join(', ')}`
293
+ }
294
+ ],
295
+ isError: true
296
+ };
297
+ }
298
+ error('analyze_repo_mcps error:', err);
299
+ throw err;
300
+ }
301
+ }
302
+ };
303
+ // ============================================================================
304
+ // OUTPUT FORMATTING
305
+ // ============================================================================
306
+ /**
307
+ * Format analysis output for display.
308
+ */
309
+ function formatAnalysisOutput(result) {
310
+ const lines = [];
311
+ lines.push('# Repository Analysis\n');
312
+ // Detected Stack
313
+ lines.push('## Detected Technologies\n');
314
+ const stackItems = [
315
+ result.detectedStack.frontend &&
316
+ `- **Frontend**: ${result.detectedStack.frontend.name}${result.detectedStack.frontend.version ? ` (${result.detectedStack.frontend.version})` : ''}`,
317
+ result.detectedStack.backend &&
318
+ `- **Backend**: ${result.detectedStack.backend.name}${result.detectedStack.backend.version ? ` (${result.detectedStack.backend.version})` : ''}`,
319
+ result.detectedStack.database &&
320
+ `- **Database**: ${result.detectedStack.database.name}${result.detectedStack.database.version ? ` (${result.detectedStack.database.version})` : ''}`,
321
+ result.detectedStack.orm &&
322
+ `- **ORM**: ${result.detectedStack.orm.name}${result.detectedStack.orm.version ? ` (${result.detectedStack.orm.version})` : ''}`,
323
+ result.detectedStack.auth &&
324
+ `- **Auth**: ${result.detectedStack.auth.name}${result.detectedStack.auth.version ? ` (${result.detectedStack.auth.version})` : ''}`,
325
+ result.detectedStack.hosting &&
326
+ `- **Hosting**: ${result.detectedStack.hosting.name}${result.detectedStack.hosting.version ? ` (${result.detectedStack.hosting.version})` : ''}`,
327
+ result.detectedStack.payments &&
328
+ `- **Payments**: ${result.detectedStack.payments.name}${result.detectedStack.payments.version ? ` (${result.detectedStack.payments.version})` : ''}`
329
+ ].filter((item) => Boolean(item));
330
+ if (stackItems.length > 0) {
331
+ lines.push(...stackItems);
332
+ }
333
+ else {
334
+ lines.push('_No technologies detected from project files._');
335
+ }
336
+ if (result.detectedStack.services.length > 0) {
337
+ lines.push('\n**Services**:');
338
+ for (const service of result.detectedStack.services) {
339
+ lines.push(`- ${service.name}`);
340
+ }
341
+ }
342
+ lines.push('');
343
+ // Files Analyzed
344
+ lines.push('## Files Analyzed\n');
345
+ if (result.metadata.filesAnalyzed.length > 0) {
346
+ lines.push(result.metadata.filesAnalyzed.map((f) => `- \`${f}\``).join('\n'));
347
+ }
348
+ else {
349
+ lines.push('_No recognized configuration files found._');
350
+ }
351
+ lines.push('');
352
+ // Installed MCPs + Compatibility
353
+ if (result.installedMcps.length > 0) {
354
+ lines.push('## Already Installed MCPs\n');
355
+ lines.push(result.installedMcps.map((m) => `- ${m}`).join('\n'));
356
+ lines.push('');
357
+ // Compatibility Report for installed MCPs
358
+ const compat = result.compatibility.installed;
359
+ const gradeEmoji = compat.grade === 'A' ? '🟢' : compat.grade === 'B' ? '🔵' : compat.grade === 'C' ? '🟡' : '🔴';
360
+ lines.push('### Compatibility Check\n');
361
+ lines.push(`**Health Score**: ${compat.score}/100 (Grade ${compat.grade}) ${gradeEmoji}\n`);
362
+ if (compat.conflicts.length > 0) {
363
+ lines.push('#### 🔴 Conflicts\n');
364
+ for (const conflict of compat.conflicts) {
365
+ const severity = conflict.severity === 'critical' ? '⚠️ Critical' : '⚡ Warning';
366
+ lines.push(`- **${conflict.mcpA}** ↔ **${conflict.mcpB}** (${severity})`);
367
+ lines.push(` - ${conflict.reason}`);
368
+ }
369
+ lines.push('');
370
+ }
371
+ if (compat.redundancies.length > 0) {
372
+ lines.push('#### 🟡 Redundancies\n');
373
+ for (const redundancy of compat.redundancies) {
374
+ lines.push(`- **${redundancy.mcpA}** ↔ **${redundancy.mcpB}**`);
375
+ lines.push(` - ${redundancy.reason}`);
376
+ }
377
+ lines.push('');
378
+ }
379
+ if (compat.synergies.length > 0) {
380
+ lines.push('#### 🔵 Synergies\n');
381
+ for (const synergy of compat.synergies) {
382
+ lines.push(`- **${synergy.mcpA}** + **${synergy.mcpB}** ✨`);
383
+ lines.push(` - ${synergy.reason}`);
384
+ }
385
+ lines.push('');
386
+ }
387
+ if (compat.suggestions.length > 0) {
388
+ lines.push('#### 💡 Suggestions\n');
389
+ for (const suggestion of compat.suggestions) {
390
+ lines.push(`- Consider adding **${suggestion.mcp}**`);
391
+ lines.push(` - ${suggestion.reason} (pairs well with ${suggestion.basedOn})`);
392
+ }
393
+ lines.push('');
394
+ }
395
+ }
396
+ // Excluded Recommendations (due to conflicts)
397
+ if (result.excludedRecommendations.length > 0) {
398
+ lines.push('## Excluded Recommendations\n');
399
+ lines.push('_The following MCPs were not recommended due to conflicts with your installed MCPs:_\n');
400
+ for (const excluded of result.excludedRecommendations) {
401
+ lines.push(`- **${excluded.mcp}** conflicts with \`${excluded.conflictsWith}\``);
402
+ lines.push(` - ${excluded.reason}`);
403
+ }
404
+ lines.push('');
405
+ }
406
+ // Recommended MCPs
407
+ lines.push('## Recommended MCPs\n');
408
+ if (result.recommendedMcps.length === 0) {
409
+ lines.push('_No additional MCPs recommended. You have everything you need!_');
410
+ }
411
+ else {
412
+ // Group by priority
413
+ const highPriority = result.recommendedMcps.filter((m) => m.priority === 'high');
414
+ const mediumPriority = result.recommendedMcps.filter((m) => m.priority === 'medium');
415
+ const lowPriority = result.recommendedMcps.filter((m) => m.priority === 'low');
416
+ if (highPriority.length > 0) {
417
+ lines.push('### 🔴 High Priority\n');
418
+ for (const mcp of highPriority) {
419
+ lines.push(`**${mcp.name}** (\`${mcp.slug}\`)`);
420
+ lines.push(`- ${mcp.description}`);
421
+ lines.push(`- _Matched: ${mcp.matchedTech}_`);
422
+ lines.push('');
423
+ }
424
+ }
425
+ if (mediumPriority.length > 0) {
426
+ lines.push('### 🟡 Medium Priority\n');
427
+ for (const mcp of mediumPriority) {
428
+ lines.push(`**${mcp.name}** (\`${mcp.slug}\`)`);
429
+ lines.push(`- ${mcp.description}`);
430
+ lines.push(`- _Matched: ${mcp.matchedTech}_`);
431
+ lines.push('');
432
+ }
433
+ }
434
+ if (lowPriority.length > 0) {
435
+ lines.push('### 🟢 Low Priority\n');
436
+ for (const mcp of lowPriority) {
437
+ lines.push(`**${mcp.name}** (\`${mcp.slug}\`)`);
438
+ lines.push(`- ${mcp.description}`);
439
+ lines.push(`- _Matched: ${mcp.matchedTech}_`);
440
+ lines.push('');
441
+ }
442
+ }
443
+ }
444
+ // Quick Install
445
+ if (result.recommendedMcps.length > 0) {
446
+ lines.push('## Quick Install\n');
447
+ lines.push('Add to your Claude Desktop config (`claude_desktop_config.json`):\n');
448
+ lines.push('```json');
449
+ lines.push(JSON.stringify(result.installConfig.claudeDesktop, null, 2));
450
+ lines.push('```\n');
451
+ }
452
+ // Metadata
453
+ lines.push(`---\n_Analysis completed: ${result.metadata.analysisDate}_`);
454
+ return lines.join('\n');
455
+ }
456
+ //# sourceMappingURL=analyze-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-repo.js","sourceRoot":"","sources":["../../../src/tools/project-kit/analyze-repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Stack Detection Module
3
+ *
4
+ * Detects technologies from project files using pattern matching.
5
+ * Each detection rule parses a specific file type and returns detected technologies.
6
+ */
7
+ import type { DetectionRule, DetectedStack } from './types.js';
8
+ export declare const DETECTION_RULES: DetectionRule[];
9
+ /**
10
+ * Detect technologies from project files.
11
+ */
12
+ export declare function detectStackFromFiles(workspaceRoot: string): Promise<{
13
+ stack: DetectedStack;
14
+ filesAnalyzed: string[];
15
+ }>;
16
+ //# sourceMappingURL=detect-stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-stack.d.ts","sourceRoot":"","sources":["../../../src/tools/project-kit/detect-stack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAa,aAAa,EAAE,aAAa,EAA0B,MAAM,YAAY,CAAC;AAkclG,eAAO,MAAM,eAAe,EAAE,aAAa,EAgF1C,CAAC;AAMF;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1E,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC,CA0BD"}