@archlinter/mcp-server 0.6.0-alpha.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.
- package/dist/cache.d.ts +20 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +54 -0
- package/dist/cache.js.map +1 -0
- package/dist/constants.d.ts +18 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +17 -0
- package/dist/constants.js.map +1 -0
- package/dist/formatters.d.ts +7 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +80 -0
- package/dist/formatters.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas.d.ts +67 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +41 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +24 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/cache_tool.d.ts +8 -0
- package/dist/tools/cache_tool.d.ts.map +1 -0
- package/dist/tools/cache_tool.js +29 -0
- package/dist/tools/cache_tool.js.map +1 -0
- package/dist/tools/detectors.d.ts +8 -0
- package/dist/tools/detectors.d.ts.map +1 -0
- package/dist/tools/detectors.js +15 -0
- package/dist/tools/detectors.js.map +1 -0
- package/dist/tools/help.d.ts +7 -0
- package/dist/tools/help.d.ts.map +1 -0
- package/dist/tools/help.js +47 -0
- package/dist/tools/help.js.map +1 -0
- package/dist/tools/scan.d.ts +8 -0
- package/dist/tools/scan.d.ts.map +1 -0
- package/dist/tools/scan.js +37 -0
- package/dist/tools/scan.js.map +1 -0
- package/dist/tools/smells.d.ts +8 -0
- package/dist/tools/smells.d.ts.map +1 -0
- package/dist/tools/smells.js +50 -0
- package/dist/tools/smells.js.map +1 -0
- package/dist/tools/stats.d.ts +8 -0
- package/dist/tools/stats.d.ts.map +1 -0
- package/dist/tools/stats.js +20 -0
- package/dist/tools/stats.js.map +1 -0
- package/package.json +38 -0
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { JsScanResult } from '@archlinter/core';
|
|
2
|
+
export interface CacheKeyOptions {
|
|
3
|
+
detectors?: string[];
|
|
4
|
+
excludeDetectors?: string[];
|
|
5
|
+
minSeverity?: string;
|
|
6
|
+
}
|
|
7
|
+
declare class McpCache {
|
|
8
|
+
private readonly cache;
|
|
9
|
+
private readonly MAX_SIZE;
|
|
10
|
+
private readonly DELIMITER;
|
|
11
|
+
private generateKey;
|
|
12
|
+
get(path: string, options?: CacheKeyOptions): JsScanResult | undefined;
|
|
13
|
+
set(path: string, result: JsScanResult, options?: CacheKeyOptions): void;
|
|
14
|
+
delete(path: string): void;
|
|
15
|
+
getAllPaths(): string[];
|
|
16
|
+
clear(): void;
|
|
17
|
+
}
|
|
18
|
+
export declare const mcpCache: McpCache;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,cAAM,QAAQ;IACZ,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IACzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAO;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAElC,OAAO,CAAC,WAAW;IAMnB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,YAAY,GAAG,SAAS;IAWtE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IAcxE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS1B,WAAW,IAAI,MAAM,EAAE;IAQvB,KAAK,IAAI,IAAI;CAGd;AAED,eAAO,MAAM,QAAQ,UAAiB,CAAC"}
|
package/dist/cache.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
class McpCache {
|
|
2
|
+
cache = new Map();
|
|
3
|
+
MAX_SIZE = 100;
|
|
4
|
+
DELIMITER = '\0';
|
|
5
|
+
generateKey(path, options) {
|
|
6
|
+
const { detectors = [], excludeDetectors = [], minSeverity = '' } = options || {};
|
|
7
|
+
const optsKey = `${[...detectors].sort().join(',')}|${[...excludeDetectors].sort().join(',')}|${minSeverity}`;
|
|
8
|
+
return `${path}${this.DELIMITER}${optsKey}`;
|
|
9
|
+
}
|
|
10
|
+
get(path, options) {
|
|
11
|
+
const key = this.generateKey(path, options);
|
|
12
|
+
const result = this.cache.get(key);
|
|
13
|
+
if (result) {
|
|
14
|
+
// Refresh order for LRU
|
|
15
|
+
this.cache.delete(key);
|
|
16
|
+
this.cache.set(key, result);
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
set(path, result, options) {
|
|
21
|
+
const key = this.generateKey(path, options);
|
|
22
|
+
if (this.cache.has(key)) {
|
|
23
|
+
this.cache.delete(key);
|
|
24
|
+
}
|
|
25
|
+
else if (this.cache.size >= this.MAX_SIZE) {
|
|
26
|
+
// Evict oldest (first inserted)
|
|
27
|
+
const oldestKey = this.cache.keys().next().value;
|
|
28
|
+
if (oldestKey !== undefined) {
|
|
29
|
+
this.cache.delete(oldestKey);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
this.cache.set(key, result);
|
|
33
|
+
}
|
|
34
|
+
delete(path) {
|
|
35
|
+
// Delete all keys starting with this path
|
|
36
|
+
for (const key of this.cache.keys()) {
|
|
37
|
+
if (key === path || key.startsWith(`${path}${this.DELIMITER}`)) {
|
|
38
|
+
this.cache.delete(key);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
getAllPaths() {
|
|
43
|
+
const paths = new Set();
|
|
44
|
+
for (const key of this.cache.keys()) {
|
|
45
|
+
paths.add(key.split(this.DELIMITER)[0]);
|
|
46
|
+
}
|
|
47
|
+
return Array.from(paths);
|
|
48
|
+
}
|
|
49
|
+
clear() {
|
|
50
|
+
this.cache.clear();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export const mcpCache = new McpCache();
|
|
54
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const SERVER_NAME = "archlint-mcp";
|
|
2
|
+
export declare const SERVER_VERSION = "0.4.1";
|
|
3
|
+
export declare const SEVERITY_ORDER: {
|
|
4
|
+
readonly critical: 0;
|
|
5
|
+
readonly high: 1;
|
|
6
|
+
readonly medium: 2;
|
|
7
|
+
readonly low: 3;
|
|
8
|
+
readonly info: 4;
|
|
9
|
+
};
|
|
10
|
+
export declare const SMELL_SCORES: {
|
|
11
|
+
readonly critical: 10;
|
|
12
|
+
readonly high: 5;
|
|
13
|
+
readonly medium: 2;
|
|
14
|
+
readonly low: 1;
|
|
15
|
+
readonly info: 0;
|
|
16
|
+
};
|
|
17
|
+
export type Severity = keyof typeof SEVERITY_ORDER;
|
|
18
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAC1C,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,eAAO,MAAM,cAAc;;;;;;CAMjB,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;CAMf,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,cAAc,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const SERVER_NAME = 'archlint-mcp';
|
|
2
|
+
export const SERVER_VERSION = '0.4.1';
|
|
3
|
+
export const SEVERITY_ORDER = {
|
|
4
|
+
critical: 0,
|
|
5
|
+
high: 1,
|
|
6
|
+
medium: 2,
|
|
7
|
+
low: 3,
|
|
8
|
+
info: 4,
|
|
9
|
+
};
|
|
10
|
+
export const SMELL_SCORES = {
|
|
11
|
+
critical: 10,
|
|
12
|
+
high: 5,
|
|
13
|
+
medium: 2,
|
|
14
|
+
low: 1,
|
|
15
|
+
info: 0,
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACC,CAAC;AAEX,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { JsScanResult, JsSmellWithExplanation, JsDetectorInfo } from '@archlinter/core';
|
|
2
|
+
export declare function formatResult<T>(data: T, format: 'json' | 'markdown', markdownFormatter: (data: T) => string): string;
|
|
3
|
+
export declare function formatScanResultMd(result: JsScanResult): string;
|
|
4
|
+
export declare function formatSmellsMd(smells: JsSmellWithExplanation[], total: number, offset: number, limit: number): string;
|
|
5
|
+
export declare function formatStatsMd(result: JsScanResult): string;
|
|
6
|
+
export declare function formatDetectorsMd(detectors: JsDetectorInfo[]): string;
|
|
7
|
+
//# sourceMappingURL=formatters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAExF,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,MAAM,GAAG,UAAU,EAC3B,iBAAiB,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,UAMvC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA4B/D;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,sBAAsB,EAAE,EAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAkBR;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAwB1D;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,CASrE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export function formatResult(data, format, markdownFormatter) {
|
|
2
|
+
if (format === 'json') {
|
|
3
|
+
return JSON.stringify(data, null, 2);
|
|
4
|
+
}
|
|
5
|
+
return markdownFormatter(data);
|
|
6
|
+
}
|
|
7
|
+
export function formatScanResultMd(result) {
|
|
8
|
+
let md = `# archlint Scan Result\n\n`;
|
|
9
|
+
md += `**Project Path:** \`${result.projectPath}\`\n`;
|
|
10
|
+
md += `**Architecture Grade:** ${result.grade.level} (${result.grade.score}/100)\n\n`;
|
|
11
|
+
md += `## Summary\n`;
|
|
12
|
+
md += `- Files Analyzed: ${result.summary.filesAnalyzed}\n`;
|
|
13
|
+
md += `- Total Smells: ${result.summary.totalSmells}\n`;
|
|
14
|
+
md += `- Cyclic Dependencies: ${result.summary.cyclicDependencies}\n`;
|
|
15
|
+
md += `- God Modules: ${result.summary.godModules}\n`;
|
|
16
|
+
md += `- Dead Code: ${result.summary.deadCode}\n\n`;
|
|
17
|
+
md += `## Top Smells\n`;
|
|
18
|
+
const topSmells = result.smells.slice(0, 10);
|
|
19
|
+
topSmells.forEach((s, i) => {
|
|
20
|
+
md += `${i + 1}. **${s.smell.smellType}** [${s.smell.severity}]\n`;
|
|
21
|
+
md += ` - Problem: ${s.explanation.problem}\n`;
|
|
22
|
+
const rec = s.explanation.recommendations[0] || 'No specific recommendation';
|
|
23
|
+
md += ` - Recommendation: ${rec}\n`;
|
|
24
|
+
const filesList = s.smell.files.map((f) => `\`${f}\``).join(', ');
|
|
25
|
+
md += ` - Files: ${filesList}\n\n`;
|
|
26
|
+
});
|
|
27
|
+
if (result.smells.length > 10) {
|
|
28
|
+
md += `*...and ${result.smells.length - 10} more smells. Use \`archlint_get_smells\` to see them all.*\n`;
|
|
29
|
+
}
|
|
30
|
+
return md;
|
|
31
|
+
}
|
|
32
|
+
export function formatSmellsMd(smells, total, offset, limit) {
|
|
33
|
+
let md = `## archlint Smells (${offset + 1}-${Math.min(offset + limit, total)} of ${total})\n\n`;
|
|
34
|
+
if (smells.length === 0) {
|
|
35
|
+
md += 'No smells found matching your filters.\n';
|
|
36
|
+
return md;
|
|
37
|
+
}
|
|
38
|
+
smells.forEach((s, i) => {
|
|
39
|
+
md += `### ${offset + i + 1}. ${s.smell.smellType} [${s.smell.severity}]\n`;
|
|
40
|
+
md += `- **Problem:** ${s.explanation.problem}\n`;
|
|
41
|
+
md += `- **Reason:** ${s.explanation.reason}\n`;
|
|
42
|
+
md += `- **Recommendation:** ${s.explanation.recommendations.join('; ')}\n`;
|
|
43
|
+
const filesList = s.smell.files.map((f) => `\`${f}\``).join(', ');
|
|
44
|
+
md += `- **Files:** ${filesList}\n\n`;
|
|
45
|
+
});
|
|
46
|
+
return md;
|
|
47
|
+
}
|
|
48
|
+
export function formatStatsMd(result) {
|
|
49
|
+
let md = `## archlint Statistics\n\n`;
|
|
50
|
+
md += `**Grade:** ${result.grade.level} (${result.grade.score}/100)\n`;
|
|
51
|
+
const density = typeof result.grade.density === 'number' ? result.grade.density.toFixed(4) : '0.0000';
|
|
52
|
+
md += `**Density:** ${density} smells per file\n\n`;
|
|
53
|
+
md += `| Metric | Value |\n`;
|
|
54
|
+
md += `|--------|-------|\n`;
|
|
55
|
+
md += `| Files Analyzed | ${result.summary.filesAnalyzed} |\n`;
|
|
56
|
+
md += `| Total Smells | ${result.summary.totalSmells} |\n`;
|
|
57
|
+
md += `| Cyclic Dependencies | ${result.summary.cyclicDependencies} |\n`;
|
|
58
|
+
md += `| Cycle Clusters | ${result.summary.cycleClusters} |\n`;
|
|
59
|
+
md += `| Files In Cycles | ${result.summary.filesInCycles} |\n`;
|
|
60
|
+
md += `| God Modules | ${result.summary.godModules} |\n`;
|
|
61
|
+
md += `| Dead Code | ${result.summary.deadCode} |\n`;
|
|
62
|
+
md += `| Dead Symbols | ${result.summary.deadSymbols} |\n`;
|
|
63
|
+
md += `| High Complexity Functions | ${result.summary.highComplexityFunctions} |\n`;
|
|
64
|
+
md += `| Unstable Interfaces | ${result.summary.unstableInterfaces} |\n`;
|
|
65
|
+
md += `| Feature Envy | ${result.summary.featureEnvy} |\n`;
|
|
66
|
+
md += `| Shotgun Surgery | ${result.summary.shotgunSurgery} |\n`;
|
|
67
|
+
md += `| Hub Dependencies | ${result.summary.hubDependencies} |\n`;
|
|
68
|
+
return md;
|
|
69
|
+
}
|
|
70
|
+
export function formatDetectorsMd(detectors) {
|
|
71
|
+
let md = `## Available archlint Detectors\n\n`;
|
|
72
|
+
md += `| ID | Name | Deep | Default |\n`;
|
|
73
|
+
md += `|----|------|------|---------|\n`;
|
|
74
|
+
detectors.forEach((d) => {
|
|
75
|
+
md += `| \`${d.id}\` | ${d.name} | ${d.isDeep ? '✅' : '❌'} | ${d.defaultEnabled ? '✅' : '❌'} |\n`;
|
|
76
|
+
md += `| | *${d.description}* | | |\n`;
|
|
77
|
+
});
|
|
78
|
+
return md;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=formatters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { createServer } from './server.js';
|
|
4
|
+
async function main() {
|
|
5
|
+
const server = createServer();
|
|
6
|
+
const transport = new StdioServerTransport();
|
|
7
|
+
await server.connect(transport);
|
|
8
|
+
// eslint-disable-next-line no-console
|
|
9
|
+
console.error('archlint MCP server running on stdio');
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
await main();
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
// eslint-disable-next-line no-console
|
|
16
|
+
console.error('Fatal error in MCP server:', error);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,IAAI,CAAC;IACH,MAAM,IAAI,EAAE,CAAC;AACf,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const FormatSchema: z.ZodDefault<z.ZodEnum<{
|
|
3
|
+
json: "json";
|
|
4
|
+
markdown: "markdown";
|
|
5
|
+
}>>;
|
|
6
|
+
export declare const ScanInputSchema: z.ZodObject<{
|
|
7
|
+
path: z.ZodString;
|
|
8
|
+
detectors: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
9
|
+
excludeDetectors: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
10
|
+
minSeverity: z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
info: "info";
|
|
12
|
+
low: "low";
|
|
13
|
+
medium: "medium";
|
|
14
|
+
high: "high";
|
|
15
|
+
critical: "critical";
|
|
16
|
+
}>>;
|
|
17
|
+
force: z.ZodOptional<z.ZodBoolean>;
|
|
18
|
+
format: z.ZodDefault<z.ZodEnum<{
|
|
19
|
+
json: "json";
|
|
20
|
+
markdown: "markdown";
|
|
21
|
+
}>>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
export declare const GetSmellsInputSchema: z.ZodObject<{
|
|
24
|
+
path: z.ZodString;
|
|
25
|
+
types: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
26
|
+
severity: z.ZodOptional<z.ZodEnum<{
|
|
27
|
+
info: "info";
|
|
28
|
+
low: "low";
|
|
29
|
+
medium: "medium";
|
|
30
|
+
high: "high";
|
|
31
|
+
critical: "critical";
|
|
32
|
+
}>>;
|
|
33
|
+
file: z.ZodOptional<z.ZodString>;
|
|
34
|
+
minScore: z.ZodOptional<z.ZodNumber>;
|
|
35
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
36
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
37
|
+
format: z.ZodDefault<z.ZodEnum<{
|
|
38
|
+
json: "json";
|
|
39
|
+
markdown: "markdown";
|
|
40
|
+
}>>;
|
|
41
|
+
}, z.core.$strip>;
|
|
42
|
+
export declare const GetStatsInputSchema: z.ZodObject<{
|
|
43
|
+
path: z.ZodString;
|
|
44
|
+
format: z.ZodDefault<z.ZodEnum<{
|
|
45
|
+
json: "json";
|
|
46
|
+
markdown: "markdown";
|
|
47
|
+
}>>;
|
|
48
|
+
}, z.core.$strip>;
|
|
49
|
+
export declare const ListDetectorsInputSchema: z.ZodObject<{
|
|
50
|
+
format: z.ZodDefault<z.ZodEnum<{
|
|
51
|
+
json: "json";
|
|
52
|
+
markdown: "markdown";
|
|
53
|
+
}>>;
|
|
54
|
+
}, z.core.$strip>;
|
|
55
|
+
export declare const ClearCacheInputSchema: z.ZodObject<{
|
|
56
|
+
path: z.ZodOptional<z.ZodString>;
|
|
57
|
+
level: z.ZodDefault<z.ZodEnum<{
|
|
58
|
+
mcp: "mcp";
|
|
59
|
+
full: "full";
|
|
60
|
+
}>>;
|
|
61
|
+
}, z.core.$strip>;
|
|
62
|
+
export type ScanInput = z.infer<typeof ScanInputSchema>;
|
|
63
|
+
export type GetSmellsInput = z.infer<typeof GetSmellsInputSchema>;
|
|
64
|
+
export type GetStatsInput = z.infer<typeof GetStatsInputSchema>;
|
|
65
|
+
export type ListDetectorsInput = z.infer<typeof ListDetectorsInputSchema>;
|
|
66
|
+
export type ClearCacheInput = z.infer<typeof ClearCacheInputSchema>;
|
|
67
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;GAA+C,CAAC;AAEzE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;iBAU1B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;iBAY/B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;iBAG9B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;iBAEnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;iBAMhC,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
package/dist/schemas.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const FormatSchema = z.enum(['json', 'markdown']).default('json');
|
|
3
|
+
export const ScanInputSchema = z.object({
|
|
4
|
+
path: z.string().describe('Path to the project to scan'),
|
|
5
|
+
detectors: z.array(z.string()).optional().describe('Only run these detectors (by ID)'),
|
|
6
|
+
excludeDetectors: z.array(z.string()).optional().describe('Exclude these detectors (by ID)'),
|
|
7
|
+
minSeverity: z
|
|
8
|
+
.enum(['info', 'low', 'medium', 'high', 'critical'])
|
|
9
|
+
.optional()
|
|
10
|
+
.describe('Minimum severity to report'),
|
|
11
|
+
force: z.boolean().optional().describe('Force re-scan and ignore MCP cache'),
|
|
12
|
+
format: FormatSchema,
|
|
13
|
+
});
|
|
14
|
+
export const GetSmellsInputSchema = z.object({
|
|
15
|
+
path: z.string().describe('Path to the project'),
|
|
16
|
+
types: z.array(z.string()).optional().describe('Filter smells by type'),
|
|
17
|
+
severity: z
|
|
18
|
+
.enum(['info', 'low', 'medium', 'high', 'critical'])
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('Minimum severity to report'),
|
|
21
|
+
file: z.string().optional().describe('Filter smells by file path'),
|
|
22
|
+
minScore: z.number().optional().describe('Filter smells by minimum score'),
|
|
23
|
+
offset: z.number().int().min(0).default(0).describe('Pagination: offset'),
|
|
24
|
+
limit: z.number().int().min(1).max(500).default(50).describe('Pagination: limit'),
|
|
25
|
+
format: FormatSchema,
|
|
26
|
+
});
|
|
27
|
+
export const GetStatsInputSchema = z.object({
|
|
28
|
+
path: z.string().describe('Path to the project'),
|
|
29
|
+
format: FormatSchema,
|
|
30
|
+
});
|
|
31
|
+
export const ListDetectorsInputSchema = z.object({
|
|
32
|
+
format: FormatSchema,
|
|
33
|
+
});
|
|
34
|
+
export const ClearCacheInputSchema = z.object({
|
|
35
|
+
path: z.string().optional().describe('Path to the project (optional, if omitted clears all)'),
|
|
36
|
+
level: z
|
|
37
|
+
.enum(['mcp', 'full'])
|
|
38
|
+
.default('mcp')
|
|
39
|
+
.describe('Cache level to clear: mcp (memory) or full (mcp + rust disk cache)'),
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgBpE,wBAAgB,YAAY,cA6C3B"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { SERVER_NAME, SERVER_VERSION } from './constants.js';
|
|
3
|
+
import { ScanInputSchema, GetSmellsInputSchema, GetStatsInputSchema, ListDetectorsInputSchema, ClearCacheInputSchema, } from './schemas.js';
|
|
4
|
+
import { archlintScan } from './tools/scan.js';
|
|
5
|
+
import { archlintGetSmells } from './tools/smells.js';
|
|
6
|
+
import { archlintGetStats } from './tools/stats.js';
|
|
7
|
+
import { archlintListDetectors } from './tools/detectors.js';
|
|
8
|
+
import { archlintClearCache } from './tools/cache_tool.js';
|
|
9
|
+
import { archlintHelp } from './tools/help.js';
|
|
10
|
+
export function createServer() {
|
|
11
|
+
const server = new McpServer({
|
|
12
|
+
name: SERVER_NAME,
|
|
13
|
+
version: SERVER_VERSION,
|
|
14
|
+
});
|
|
15
|
+
// Register Tools
|
|
16
|
+
server.tool('archlint_scan', 'Perform a full architectural scan of a project', ScanInputSchema.shape, archlintScan);
|
|
17
|
+
server.tool('archlint_get_smells', 'Get detailed architectural smells with filtering and pagination', GetSmellsInputSchema.shape, archlintGetSmells);
|
|
18
|
+
server.tool('archlint_get_stats', 'Get project architectural statistics and grade', GetStatsInputSchema.shape, archlintGetStats);
|
|
19
|
+
server.tool('archlint_list_detectors', 'List all available archlint detectors', ListDetectorsInputSchema.shape, archlintListDetectors);
|
|
20
|
+
server.tool('archlint_clear_cache', 'Clear archlint caches', ClearCacheInputSchema.shape, archlintClearCache);
|
|
21
|
+
server.tool('archlint_help', 'Get help and usage guide for archlint MCP tools', {}, archlintHelp);
|
|
22
|
+
return server;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,iBAAiB;IACjB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,gDAAgD,EAChD,eAAe,CAAC,KAAK,EACrB,YAAY,CACb,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,iEAAiE,EACjE,oBAAoB,CAAC,KAAK,EAC1B,iBAAiB,CAClB,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,gDAAgD,EAChD,mBAAmB,CAAC,KAAK,EACzB,gBAAgB,CACjB,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,uCAAuC,EACvC,wBAAwB,CAAC,KAAK,EAC9B,qBAAqB,CACtB,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,CAAC,KAAK,EAC3B,kBAAkB,CACnB,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,iDAAiD,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC;IAElG,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache_tool.d.ts","sourceRoot":"","sources":["../../src/tools/cache_tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CA0BxD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { clearCache } from '@archlinter/core';
|
|
2
|
+
import { mcpCache } from '../cache.js';
|
|
3
|
+
export async function archlintClearCache(input) {
|
|
4
|
+
const { path, level } = input;
|
|
5
|
+
if (path) {
|
|
6
|
+
mcpCache.delete(path);
|
|
7
|
+
if (level === 'full') {
|
|
8
|
+
clearCache(path);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
if (level === 'full') {
|
|
13
|
+
const paths = mcpCache.getAllPaths();
|
|
14
|
+
for (const p of paths) {
|
|
15
|
+
clearCache(p);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
mcpCache.clear();
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
content: [
|
|
22
|
+
{
|
|
23
|
+
type: 'text',
|
|
24
|
+
text: JSON.stringify({ cleared: true, path: path || 'all', level }, null, 2),
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=cache_tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache_tool.js","sourceRoot":"","sources":["../../src/tools/cache_tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAsB;IAEtB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAE9B,IAAI,IAAI,EAAE,CAAC;QACT,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;YACrC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,UAAU,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aAC7E;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectors.d.ts","sourceRoot":"","sources":["../../src/tools/detectors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CAYxD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { getDetectors } from '@archlinter/core';
|
|
2
|
+
import { formatResult, formatDetectorsMd } from '../formatters.js';
|
|
3
|
+
export async function archlintListDetectors(input) {
|
|
4
|
+
const { format } = input;
|
|
5
|
+
const detectors = getDetectors();
|
|
6
|
+
return {
|
|
7
|
+
content: [
|
|
8
|
+
{
|
|
9
|
+
type: 'text',
|
|
10
|
+
text: formatResult(detectors, format, formatDetectorsMd),
|
|
11
|
+
},
|
|
12
|
+
],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=detectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../src/tools/detectors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAyB;IAEzB,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACzB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC;aACzD;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/tools/help.ts"],"names":[],"mappings":"AAAA,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CA8C3F"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export async function archlintHelp() {
|
|
2
|
+
const helpText = `
|
|
3
|
+
# archlint MCP Server Usage Guide
|
|
4
|
+
|
|
5
|
+
This server allows you to analyze TypeScript/JavaScript project architecture and detect "smells" (architectural issues).
|
|
6
|
+
|
|
7
|
+
## Available Tools
|
|
8
|
+
|
|
9
|
+
### 1. archlint_scan
|
|
10
|
+
Performs a full architectural scan of the project.
|
|
11
|
+
- **path**: (required) Absolute path to the project.
|
|
12
|
+
- **force**: (optional) Set to true to ignore caches and re-scan.
|
|
13
|
+
|
|
14
|
+
### 2. archlint_get_stats
|
|
15
|
+
Get a summary of architectural health (grade, counts of issues).
|
|
16
|
+
- **path**: (required) Absolute path to the project.
|
|
17
|
+
|
|
18
|
+
### 3. archlint_get_smells
|
|
19
|
+
Get detailed information about detected smells with filtering and pagination.
|
|
20
|
+
- **path**: (required) Absolute path to the project.
|
|
21
|
+
- **types**: (optional) Filter by smell type (e.g., ["CyclicDependency", "GodModule"]).
|
|
22
|
+
- **severity**: (optional) Minimum severity (info, low, medium, high, critical).
|
|
23
|
+
- **file**: (optional) Filter smells by file path.
|
|
24
|
+
- **minScore**: (optional) Filter smells by minimum score.
|
|
25
|
+
- **limit/offset**: (optional) For pagination.
|
|
26
|
+
|
|
27
|
+
### 4. archlint_list_detectors
|
|
28
|
+
List all available detectors with their descriptions.
|
|
29
|
+
|
|
30
|
+
### 5. archlint_clear_cache
|
|
31
|
+
Clear the MCP memory cache or full cache.
|
|
32
|
+
|
|
33
|
+
## Workflow Tips
|
|
34
|
+
- Use \`archlint_scan\` first to get an overview of a project.
|
|
35
|
+
- Use \`archlint_get_smells\` to deep dive into specific issue types or high-severity problems.
|
|
36
|
+
- Always provide the absolute path to the project root.
|
|
37
|
+
`;
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: 'text',
|
|
42
|
+
text: helpText,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/tools/help.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmClB,CAAC;IAEA,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,QAAQ;aACf;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/tools/scan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI1C,wBAAsB,YAAY,CAChC,KAAK,EAAE,SAAS,GACf,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CAqCxD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { scan } from '@archlinter/core';
|
|
2
|
+
import { mcpCache } from '../cache.js';
|
|
3
|
+
import { formatResult, formatScanResultMd } from '../formatters.js';
|
|
4
|
+
export async function archlintScan(input) {
|
|
5
|
+
const { path, detectors, excludeDetectors, minSeverity, force, format } = input;
|
|
6
|
+
if (force) {
|
|
7
|
+
mcpCache.delete(path);
|
|
8
|
+
}
|
|
9
|
+
// Check MCP cache first if not forced
|
|
10
|
+
const cached = mcpCache.get(path, { detectors, excludeDetectors, minSeverity });
|
|
11
|
+
if (cached && !force) {
|
|
12
|
+
return {
|
|
13
|
+
content: [
|
|
14
|
+
{
|
|
15
|
+
type: 'text',
|
|
16
|
+
text: formatResult(cached, format, formatScanResultMd),
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const result = await scan(path, {
|
|
22
|
+
detectors,
|
|
23
|
+
excludeDetectors,
|
|
24
|
+
minSeverity,
|
|
25
|
+
cache: !force, // Use Rust cache unless forced
|
|
26
|
+
});
|
|
27
|
+
mcpCache.set(path, result, { detectors, excludeDetectors, minSeverity });
|
|
28
|
+
return {
|
|
29
|
+
content: [
|
|
30
|
+
{
|
|
31
|
+
type: 'text',
|
|
32
|
+
text: formatResult(result, format, formatScanResultMd),
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/tools/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAgB;IAEhB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAEhF,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,sCAAsC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;IAChF,IAAI,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,kBAAkB,CAAC;iBACvD;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;QAC9B,SAAS;QACT,gBAAgB;QAChB,WAAW;QACX,KAAK,EAAE,CAAC,KAAK,EAAE,+BAA+B;KAC/C,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;IAEzE,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,kBAAkB,CAAC;aACvD;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smells.d.ts","sourceRoot":"","sources":["../../src/tools/smells.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAK/C,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CAuDxD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { scan } from '@archlinter/core';
|
|
2
|
+
import { mcpCache } from '../cache.js';
|
|
3
|
+
import { formatResult, formatSmellsMd } from '../formatters.js';
|
|
4
|
+
import { SEVERITY_ORDER, SMELL_SCORES } from '../constants.js';
|
|
5
|
+
export async function archlintGetSmells(input) {
|
|
6
|
+
const { path, types, severity, file, minScore, offset, limit, format } = input;
|
|
7
|
+
let result = mcpCache.get(path, {}); // Use empty options for "full" result
|
|
8
|
+
if (!result) {
|
|
9
|
+
result = await scan(path);
|
|
10
|
+
mcpCache.set(path, result, {});
|
|
11
|
+
}
|
|
12
|
+
let filteredSmells = result.smells;
|
|
13
|
+
if (types && types.length > 0) {
|
|
14
|
+
filteredSmells = filteredSmells.filter((s) => types.includes(s.smell.smellType));
|
|
15
|
+
}
|
|
16
|
+
if (severity) {
|
|
17
|
+
const minSevValue = SEVERITY_ORDER[severity];
|
|
18
|
+
filteredSmells = filteredSmells.filter((s) => {
|
|
19
|
+
const sev = s.smell.severity.toLowerCase();
|
|
20
|
+
return SEVERITY_ORDER[sev] <= minSevValue;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
if (file) {
|
|
24
|
+
filteredSmells = filteredSmells.filter((s) => s.smell.files.some((f) => f.includes(file)));
|
|
25
|
+
}
|
|
26
|
+
if (minScore !== undefined) {
|
|
27
|
+
filteredSmells = filteredSmells.filter((s) => {
|
|
28
|
+
const score = SMELL_SCORES[s.smell.severity.toLowerCase()] || 0;
|
|
29
|
+
return score >= minScore;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const total = filteredSmells.length;
|
|
33
|
+
const paginatedSmells = filteredSmells.slice(offset, offset + limit);
|
|
34
|
+
const outputData = {
|
|
35
|
+
smells: paginatedSmells,
|
|
36
|
+
total,
|
|
37
|
+
offset,
|
|
38
|
+
limit,
|
|
39
|
+
hasMore: offset + limit < total,
|
|
40
|
+
};
|
|
41
|
+
return {
|
|
42
|
+
content: [
|
|
43
|
+
{
|
|
44
|
+
type: 'text',
|
|
45
|
+
text: formatResult(outputData, format, (data) => formatSmellsMd(data.smells, data.total, data.offset, data.limit)),
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=smells.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smells.js","sourceRoot":"","sources":["../../src/tools/smells.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/tools/stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI9C,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CAiBxD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { scan } from '@archlinter/core';
|
|
2
|
+
import { mcpCache } from '../cache.js';
|
|
3
|
+
import { formatResult, formatStatsMd } from '../formatters.js';
|
|
4
|
+
export async function archlintGetStats(input) {
|
|
5
|
+
const { path, format } = input;
|
|
6
|
+
let result = mcpCache.get(path, {}); // Use empty options for "full" result
|
|
7
|
+
if (!result) {
|
|
8
|
+
result = await scan(path);
|
|
9
|
+
mcpCache.set(path, result, {});
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
content: [
|
|
13
|
+
{
|
|
14
|
+
type: 'text',
|
|
15
|
+
text: formatResult(result, format, formatStatsMd),
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/tools/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAoB;IAEpB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAE/B,IAAI,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,sCAAsC;IAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC;aAClD;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@archlinter/mcp-server",
|
|
3
|
+
"version": "0.6.0-alpha.1",
|
|
4
|
+
"description": "Model Context Protocol (MCP) server for archlint",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/archlinter/archlint.git",
|
|
9
|
+
"directory": "packages/mcp-server"
|
|
10
|
+
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"bin": {
|
|
13
|
+
"archlint-mcp": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"main": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"dev": "tsc --watch",
|
|
23
|
+
"clean": "rm -rf dist"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@archlinter/core": "0.6.0-alpha.1",
|
|
27
|
+
"@modelcontextprotocol/sdk": "^1.25.1",
|
|
28
|
+
"zod": "^4.2.1"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"typescript": "^5.4.0",
|
|
32
|
+
"vitest": "^1.4.0",
|
|
33
|
+
"@types/node": "^20.0.0"
|
|
34
|
+
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18"
|
|
37
|
+
}
|
|
38
|
+
}
|