@stacksfinder/mcp-server 1.1.0 → 1.2.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/LICENSE +16 -16
- package/README.md +92 -3
- package/dist/compatibility/index.d.ts +11 -0
- package/dist/compatibility/index.d.ts.map +1 -0
- package/dist/compatibility/index.js +13 -0
- package/dist/compatibility/index.js.map +1 -0
- package/dist/compatibility/rules.d.ts +29 -0
- package/dist/compatibility/rules.d.ts.map +1 -0
- package/dist/compatibility/rules.js +419 -0
- package/dist/compatibility/rules.js.map +1 -0
- package/dist/compatibility/scoring.d.ts +54 -0
- package/dist/compatibility/scoring.d.ts.map +1 -0
- package/dist/compatibility/scoring.js +209 -0
- package/dist/compatibility/scoring.js.map +1 -0
- package/dist/compatibility/types.d.ts +176 -0
- package/dist/compatibility/types.d.ts.map +1 -0
- package/dist/compatibility/types.js +26 -0
- package/dist/compatibility/types.js.map +1 -0
- package/dist/compatibility/utils.d.ts +82 -0
- package/dist/compatibility/utils.d.ts.map +1 -0
- package/dist/compatibility/utils.js +269 -0
- package/dist/compatibility/utils.js.map +1 -0
- 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
- package/dist/http.d.ts +7 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +69 -0
- package/dist/http.js.map +1 -0
- package/dist/lib/mcp-compatibility/index.d.ts +33 -0
- package/dist/lib/mcp-compatibility/index.d.ts.map +1 -0
- package/dist/lib/mcp-compatibility/index.js +35 -0
- package/dist/lib/mcp-compatibility/index.js.map +1 -0
- package/dist/lib/mcp-compatibility/rules.d.ts +29 -0
- package/dist/lib/mcp-compatibility/rules.d.ts.map +1 -0
- package/dist/lib/mcp-compatibility/rules.js +419 -0
- package/dist/lib/mcp-compatibility/rules.js.map +1 -0
- package/dist/lib/mcp-compatibility/scoring.d.ts +54 -0
- package/dist/lib/mcp-compatibility/scoring.d.ts.map +1 -0
- package/dist/lib/mcp-compatibility/scoring.js +209 -0
- package/dist/lib/mcp-compatibility/scoring.js.map +1 -0
- package/dist/lib/mcp-compatibility/types.d.ts +176 -0
- package/dist/lib/mcp-compatibility/types.d.ts.map +1 -0
- package/dist/lib/mcp-compatibility/types.js +26 -0
- package/dist/lib/mcp-compatibility/types.js.map +1 -0
- package/dist/lib/mcp-compatibility/utils.d.ts +82 -0
- package/dist/lib/mcp-compatibility/utils.d.ts.map +1 -0
- package/dist/lib/mcp-compatibility/utils.js +269 -0
- package/dist/lib/mcp-compatibility/utils.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +296 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/check-compatibility.d.ts +43 -0
- package/dist/tools/check-compatibility.d.ts.map +1 -0
- package/dist/tools/check-compatibility.js +133 -0
- package/dist/tools/check-compatibility.js.map +1 -0
- package/dist/tools/project-kit/analyze-repo.d.ts +50 -0
- package/dist/tools/project-kit/analyze-repo.d.ts.map +1 -0
- package/dist/tools/project-kit/analyze-repo.js +456 -0
- package/dist/tools/project-kit/analyze-repo.js.map +1 -0
- package/dist/tools/project-kit/detect-stack.d.ts +16 -0
- package/dist/tools/project-kit/detect-stack.d.ts.map +1 -0
- package/dist/tools/project-kit/detect-stack.js +572 -0
- package/dist/tools/project-kit/detect-stack.js.map +1 -0
- package/dist/tools/project-kit/execute-installation.d.ts +50 -0
- package/dist/tools/project-kit/execute-installation.d.ts.map +1 -0
- package/dist/tools/project-kit/execute-installation.js +440 -0
- package/dist/tools/project-kit/execute-installation.js.map +1 -0
- package/dist/tools/project-kit/generate.d.ts +70 -0
- package/dist/tools/project-kit/generate.d.ts.map +1 -0
- package/dist/tools/project-kit/generate.js +455 -0
- package/dist/tools/project-kit/generate.js.map +1 -0
- package/dist/tools/project-kit/index.d.ts +18 -0
- package/dist/tools/project-kit/index.d.ts.map +1 -0
- package/dist/tools/project-kit/index.js +21 -0
- package/dist/tools/project-kit/index.js.map +1 -0
- package/dist/tools/project-kit/installation-types.d.ts +147 -0
- package/dist/tools/project-kit/installation-types.d.ts.map +1 -0
- package/dist/tools/project-kit/installation-types.js +491 -0
- package/dist/tools/project-kit/installation-types.js.map +1 -0
- package/dist/tools/project-kit/match-mcps.d.ts +67 -0
- package/dist/tools/project-kit/match-mcps.d.ts.map +1 -0
- package/dist/tools/project-kit/match-mcps.js +497 -0
- package/dist/tools/project-kit/match-mcps.js.map +1 -0
- package/dist/tools/project-kit/prepare-installation.d.ts +54 -0
- package/dist/tools/project-kit/prepare-installation.d.ts.map +1 -0
- package/dist/tools/project-kit/prepare-installation.js +382 -0
- package/dist/tools/project-kit/prepare-installation.js.map +1 -0
- package/dist/tools/project-kit/types.d.ts +200 -0
- package/dist/tools/project-kit/types.d.ts.map +1 -0
- package/dist/tools/project-kit/types.js +76 -0
- package/dist/tools/project-kit/types.js.map +1 -0
- package/dist/tools/recommend.d.ts.map +1 -1
- package/dist/tools/recommend.js +9 -4
- package/dist/tools/recommend.js.map +1 -1
- 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"}
|