@cognium-ai/mcp-server 4.16.4 → 4.17.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/CHANGELOG.md +1820 -0
- package/README.md +27 -257
- package/dist/deprecation.d.ts +5 -0
- package/dist/deprecation.d.ts.map +1 -0
- package/dist/deprecation.js +7 -0
- package/dist/deprecation.js.map +1 -0
- package/dist/index.d.ts +18 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -19
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +15 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +26 -31
- package/dist/server.js.map +1 -1
- package/package.json +6 -7
- package/dist/analysis.d.ts +0 -25
- package/dist/analysis.d.ts.map +0 -1
- package/dist/analysis.js +0 -45
- package/dist/analysis.js.map +0 -1
- package/dist/mappers.d.ts +0 -41
- package/dist/mappers.d.ts.map +0 -1
- package/dist/mappers.js +0 -69
- package/dist/mappers.js.map +0 -1
- package/dist/tools/check-license-compliance.d.ts +0 -11
- package/dist/tools/check-license-compliance.d.ts.map +0 -1
- package/dist/tools/check-license-compliance.js +0 -125
- package/dist/tools/check-license-compliance.js.map +0 -1
- package/dist/tools/find-credential-exposure.d.ts +0 -17
- package/dist/tools/find-credential-exposure.d.ts.map +0 -1
- package/dist/tools/find-credential-exposure.js +0 -185
- package/dist/tools/find-credential-exposure.js.map +0 -1
- package/dist/tools/find-excessive-permissions.d.ts +0 -16
- package/dist/tools/find-excessive-permissions.d.ts.map +0 -1
- package/dist/tools/find-excessive-permissions.js +0 -144
- package/dist/tools/find-excessive-permissions.js.map +0 -1
- package/dist/tools/find-install-script-risk.d.ts +0 -11
- package/dist/tools/find-install-script-risk.d.ts.map +0 -1
- package/dist/tools/find-install-script-risk.js +0 -115
- package/dist/tools/find-install-script-risk.js.map +0 -1
- package/dist/tools/find-pattern.d.ts +0 -13
- package/dist/tools/find-pattern.d.ts.map +0 -1
- package/dist/tools/find-pattern.js +0 -114
- package/dist/tools/find-pattern.js.map +0 -1
- package/dist/tools/find-spec-drift.d.ts +0 -10
- package/dist/tools/find-spec-drift.d.ts.map +0 -1
- package/dist/tools/find-spec-drift.js +0 -41
- package/dist/tools/find-spec-drift.js.map +0 -1
- package/dist/tools/find-stale-dependencies.d.ts +0 -14
- package/dist/tools/find-stale-dependencies.d.ts.map +0 -1
- package/dist/tools/find-stale-dependencies.js +0 -177
- package/dist/tools/find-stale-dependencies.js.map +0 -1
- package/dist/tools/find-typosquats.d.ts +0 -11
- package/dist/tools/find-typosquats.d.ts.map +0 -1
- package/dist/tools/find-typosquats.js +0 -141
- package/dist/tools/find-typosquats.js.map +0 -1
- package/dist/tools/layer-bom.d.ts +0 -15
- package/dist/tools/layer-bom.d.ts.map +0 -1
- package/dist/tools/layer-bom.js +0 -98
- package/dist/tools/layer-bom.js.map +0 -1
- package/dist/tools/verify-spec-conformance.d.ts +0 -9
- package/dist/tools/verify-spec-conformance.d.ts.map +0 -1
- package/dist/tools/verify-spec-conformance.js +0 -49
- package/dist/tools/verify-spec-conformance.js.map +0 -1
- package/dist/walk.d.ts +0 -33
- package/dist/walk.d.ts.map +0 -1
- package/dist/walk.js +0 -83
- package/dist/walk.js.map +0 -1
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* find_stale_dependencies MCP tool (Pillar I, Batch 2).
|
|
3
|
-
*
|
|
4
|
-
* Checks npm dependencies for:
|
|
5
|
-
* 1. Staleness: last publish date via npm registry
|
|
6
|
-
* 2. Known vulnerabilities: via OSV (Open Source Vulnerabilities) API
|
|
7
|
-
*
|
|
8
|
-
* npm package.json only (pypi/cargo/go deferred).
|
|
9
|
-
*
|
|
10
|
-
* @see https://github.com/cogniumhq/cognium-ai/issues/80
|
|
11
|
-
*/
|
|
12
|
-
import { z } from 'zod';
|
|
13
|
-
import { dependencyStalenessPass } from 'circle-ir-ai';
|
|
14
|
-
const MAX_FINDINGS = 500;
|
|
15
|
-
const SEVERITY_ORDER = {
|
|
16
|
-
info: 0,
|
|
17
|
-
low: 1,
|
|
18
|
-
medium: 2,
|
|
19
|
-
high: 3,
|
|
20
|
-
critical: 4,
|
|
21
|
-
};
|
|
22
|
-
const inputSchema = {
|
|
23
|
-
code_root: z.string().describe('Absolute path to the code root to scan'),
|
|
24
|
-
include_dev_deps: z.boolean().optional().default(false).describe('Include devDependencies (default: false)'),
|
|
25
|
-
severity_floor: z.enum(['info', 'low', 'medium', 'high', 'critical']).optional().default('low').describe('Minimum severity to report (default: low)'),
|
|
26
|
-
check_vulnerabilities: z.boolean().optional().default(true).describe('Check for known vulnerabilities via OSV database (default: true)'),
|
|
27
|
-
};
|
|
28
|
-
const outputSchema = {
|
|
29
|
-
findings: z.array(z.object({
|
|
30
|
-
kind: z.enum(['STALE_DEPENDENCY', 'VULNERABLE_DEPENDENCY']),
|
|
31
|
-
severity: z.enum(['low', 'medium', 'high', 'critical']),
|
|
32
|
-
location: z.object({
|
|
33
|
-
file: z.string(),
|
|
34
|
-
span: z.tuple([z.number(), z.number()]),
|
|
35
|
-
}),
|
|
36
|
-
evidence: z.object({
|
|
37
|
-
rule_id: z.string(),
|
|
38
|
-
dependency: z.string(),
|
|
39
|
-
current_version: z.string(),
|
|
40
|
-
latest_version: z.string().nullable(),
|
|
41
|
-
finding_type: z.enum(['staleness', 'maintainer', 'vulnerability']),
|
|
42
|
-
// Staleness fields
|
|
43
|
-
days_since_publish: z.number().optional(),
|
|
44
|
-
last_publish_date: z.string().optional(),
|
|
45
|
-
// Vulnerability fields
|
|
46
|
-
vuln_id: z.string().optional(),
|
|
47
|
-
cve: z.string().optional(),
|
|
48
|
-
cvss: z.number().optional(),
|
|
49
|
-
summary: z.string().optional(),
|
|
50
|
-
}),
|
|
51
|
-
suggested_action: z.string(),
|
|
52
|
-
})),
|
|
53
|
-
summary: z.object({
|
|
54
|
-
total: z.number(),
|
|
55
|
-
by_severity: z.object({
|
|
56
|
-
critical: z.number(),
|
|
57
|
-
high: z.number(),
|
|
58
|
-
medium: z.number(),
|
|
59
|
-
low: z.number(),
|
|
60
|
-
}),
|
|
61
|
-
by_finding_type: z.object({
|
|
62
|
-
staleness: z.number(),
|
|
63
|
-
maintainer: z.number(),
|
|
64
|
-
vulnerability: z.number(),
|
|
65
|
-
}),
|
|
66
|
-
truncated: z.boolean(),
|
|
67
|
-
}),
|
|
68
|
-
};
|
|
69
|
-
function trustFindingToMcp(f) {
|
|
70
|
-
const meta = f.meta;
|
|
71
|
-
const findingType = meta.findingType ?? 'staleness';
|
|
72
|
-
const days = meta.daysSincePublish ?? 0;
|
|
73
|
-
let action = 'Consider updating to the latest version.';
|
|
74
|
-
let kind = 'STALE_DEPENDENCY';
|
|
75
|
-
if (findingType === 'vulnerability') {
|
|
76
|
-
kind = 'VULNERABLE_DEPENDENCY';
|
|
77
|
-
const cve = meta.cve;
|
|
78
|
-
const vulnId = meta.vulnId;
|
|
79
|
-
const cvss = meta.cvss;
|
|
80
|
-
if (cvss && cvss >= 9.0) {
|
|
81
|
-
action = `CRITICAL vulnerability ${cve ?? vulnId}. Upgrade immediately or remove this dependency.`;
|
|
82
|
-
}
|
|
83
|
-
else if (cvss && cvss >= 7.0) {
|
|
84
|
-
action = `HIGH severity vulnerability ${cve ?? vulnId}. Upgrade to a patched version as soon as possible.`;
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
action = `Known vulnerability ${cve ?? vulnId}. Upgrade to a patched version when available.`;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
else if (findingType === 'maintainer') {
|
|
91
|
-
action = 'This package has zero maintainers on npm. High risk of abandonment - find an alternative.';
|
|
92
|
-
}
|
|
93
|
-
else if (days > 1095) {
|
|
94
|
-
action = 'This package has not been updated in over 3 years. Evaluate if it is still maintained or find an alternative.';
|
|
95
|
-
}
|
|
96
|
-
else if (days > 730) {
|
|
97
|
-
action = 'This package has not been updated in over 2 years. Check for security advisories and consider alternatives.';
|
|
98
|
-
}
|
|
99
|
-
else if (days > 365) {
|
|
100
|
-
action = 'This package has not been updated in over 1 year. Monitor for updates.';
|
|
101
|
-
}
|
|
102
|
-
return {
|
|
103
|
-
kind,
|
|
104
|
-
severity: f.severity === 'info' ? 'low' : f.severity,
|
|
105
|
-
location: {
|
|
106
|
-
file: f.location?.file ?? 'package.json',
|
|
107
|
-
span: [f.location?.line ?? 1, f.location?.line ?? 1],
|
|
108
|
-
},
|
|
109
|
-
evidence: {
|
|
110
|
-
rule_id: f.ruleId,
|
|
111
|
-
dependency: meta.dependency ?? 'unknown',
|
|
112
|
-
current_version: meta.currentVersion ?? 'unknown',
|
|
113
|
-
latest_version: meta.latestVersion ?? null,
|
|
114
|
-
finding_type: findingType,
|
|
115
|
-
// Staleness fields (only for staleness findings)
|
|
116
|
-
...(findingType === 'staleness' && {
|
|
117
|
-
days_since_publish: meta.daysSincePublish ?? 0,
|
|
118
|
-
last_publish_date: meta.lastPublishDate ?? '',
|
|
119
|
-
}),
|
|
120
|
-
// Vulnerability fields (only for vulnerability findings)
|
|
121
|
-
...(findingType === 'vulnerability' && {
|
|
122
|
-
vuln_id: meta.vulnId,
|
|
123
|
-
cve: meta.cve,
|
|
124
|
-
cvss: meta.cvss,
|
|
125
|
-
summary: meta.summary,
|
|
126
|
-
}),
|
|
127
|
-
},
|
|
128
|
-
suggested_action: action,
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
export function registerFindStaleDependencies(server) {
|
|
132
|
-
server.registerTool('find_stale_dependencies', {
|
|
133
|
-
title: 'Find Stale Dependencies',
|
|
134
|
-
description: 'Check npm dependencies for staleness and known vulnerabilities. ' +
|
|
135
|
-
'Staleness: flags packages not updated in >1 year (low), >2 years (medium), >3 years (high). ' +
|
|
136
|
-
'Vulnerabilities: queries OSV database for CVEs affecting your exact versions. ' +
|
|
137
|
-
'Also flags packages with zero maintainers. npm package.json only.',
|
|
138
|
-
inputSchema,
|
|
139
|
-
outputSchema,
|
|
140
|
-
}, async ({ code_root, include_dev_deps, severity_floor, check_vulnerabilities }) => {
|
|
141
|
-
const result = await dependencyStalenessPass(code_root, {
|
|
142
|
-
includeDevDeps: include_dev_deps,
|
|
143
|
-
checkVulnerabilities: check_vulnerabilities,
|
|
144
|
-
});
|
|
145
|
-
const floorValue = SEVERITY_ORDER[severity_floor ?? 'low'];
|
|
146
|
-
const filtered = result.findings.filter((f) => SEVERITY_ORDER[f.severity] >= floorValue);
|
|
147
|
-
const truncated = filtered.length > MAX_FINDINGS;
|
|
148
|
-
const findings = filtered.slice(0, MAX_FINDINGS).map(trustFindingToMcp);
|
|
149
|
-
// Count by finding type
|
|
150
|
-
const stalenessCount = filtered.filter((f) => f.meta?.findingType === 'staleness').length;
|
|
151
|
-
const maintainerCount = filtered.filter((f) => f.meta?.findingType === 'maintainer').length;
|
|
152
|
-
const vulnerabilityCount = filtered.filter((f) => f.meta?.findingType === 'vulnerability').length;
|
|
153
|
-
const output = {
|
|
154
|
-
findings,
|
|
155
|
-
summary: {
|
|
156
|
-
total: filtered.length,
|
|
157
|
-
by_severity: {
|
|
158
|
-
critical: filtered.filter((f) => f.severity === 'critical').length,
|
|
159
|
-
high: filtered.filter((f) => f.severity === 'high').length,
|
|
160
|
-
medium: filtered.filter((f) => f.severity === 'medium').length,
|
|
161
|
-
low: filtered.filter((f) => f.severity === 'low').length,
|
|
162
|
-
},
|
|
163
|
-
by_finding_type: {
|
|
164
|
-
staleness: stalenessCount,
|
|
165
|
-
maintainer: maintainerCount,
|
|
166
|
-
vulnerability: vulnerabilityCount,
|
|
167
|
-
},
|
|
168
|
-
truncated,
|
|
169
|
-
},
|
|
170
|
-
};
|
|
171
|
-
return {
|
|
172
|
-
content: [{ type: 'text', text: JSON.stringify(output) }],
|
|
173
|
-
structuredContent: output,
|
|
174
|
-
};
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
//# sourceMappingURL=find-stale-dependencies.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"find-stale-dependencies.js","sourceRoot":"","sources":["../../src/tools/find-stale-dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* find_typosquats MCP tool (Pillar I, Batch 2).
|
|
3
|
-
*
|
|
4
|
-
* Detects potential typosquat packages by comparing dependency names
|
|
5
|
-
* against popular npm packages using Levenshtein distance.
|
|
6
|
-
*
|
|
7
|
-
* @see https://github.com/cogniumhq/cognium-ai/issues/80
|
|
8
|
-
*/
|
|
9
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
10
|
-
export declare function registerFindTyposquats(server: McpServer): void;
|
|
11
|
-
//# sourceMappingURL=find-typosquats.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"find-typosquats.d.ts","sourceRoot":"","sources":["../../src/tools/find-typosquats.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgHzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2D9D"}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* find_typosquats MCP tool (Pillar I, Batch 2).
|
|
3
|
-
*
|
|
4
|
-
* Detects potential typosquat packages by comparing dependency names
|
|
5
|
-
* against popular npm packages using Levenshtein distance.
|
|
6
|
-
*
|
|
7
|
-
* @see https://github.com/cogniumhq/cognium-ai/issues/80
|
|
8
|
-
*/
|
|
9
|
-
import { z } from 'zod';
|
|
10
|
-
import { typosquatDetectionPass } from 'circle-ir-ai';
|
|
11
|
-
const MAX_FINDINGS = 500;
|
|
12
|
-
const SEVERITY_ORDER = {
|
|
13
|
-
info: 0,
|
|
14
|
-
low: 1,
|
|
15
|
-
medium: 2,
|
|
16
|
-
high: 3,
|
|
17
|
-
critical: 4,
|
|
18
|
-
};
|
|
19
|
-
const inputSchema = {
|
|
20
|
-
code_root: z.string().describe('Absolute path to the code root to scan'),
|
|
21
|
-
include_dev_deps: z.boolean().optional().default(false).describe('Include devDependencies (default: false)'),
|
|
22
|
-
severity_floor: z.enum(['info', 'low', 'medium', 'high', 'critical']).optional().default('low').describe('Minimum severity to report (default: low)'),
|
|
23
|
-
check_homoglyphs: z.boolean().optional().default(true).describe('Detect homoglyph attacks like "rn" vs "m" (default: true)'),
|
|
24
|
-
check_popularity: z.boolean().optional().default(false).describe('Query npm for download counts (slower, default: false)'),
|
|
25
|
-
};
|
|
26
|
-
const outputSchema = {
|
|
27
|
-
findings: z.array(z.object({
|
|
28
|
-
kind: z.literal('TYPOSQUAT_RISK'),
|
|
29
|
-
severity: z.enum(['medium', 'high']),
|
|
30
|
-
location: z.object({
|
|
31
|
-
file: z.string(),
|
|
32
|
-
span: z.tuple([z.number(), z.number()]),
|
|
33
|
-
}),
|
|
34
|
-
evidence: z.object({
|
|
35
|
-
rule_id: z.string(),
|
|
36
|
-
dependency: z.string(),
|
|
37
|
-
similar_to: z.string(),
|
|
38
|
-
detection_method: z.enum(['levenshtein', 'homoglyph']),
|
|
39
|
-
distance: z.number().optional(),
|
|
40
|
-
homoglyph: z.string().optional(),
|
|
41
|
-
target_downloads: z.number().optional(),
|
|
42
|
-
}),
|
|
43
|
-
suggested_action: z.string(),
|
|
44
|
-
})),
|
|
45
|
-
summary: z.object({
|
|
46
|
-
total: z.number(),
|
|
47
|
-
by_severity: z.object({
|
|
48
|
-
critical: z.number(),
|
|
49
|
-
high: z.number(),
|
|
50
|
-
medium: z.number(),
|
|
51
|
-
low: z.number(),
|
|
52
|
-
}),
|
|
53
|
-
by_detection_method: z.object({
|
|
54
|
-
levenshtein: z.number(),
|
|
55
|
-
homoglyph: z.number(),
|
|
56
|
-
}),
|
|
57
|
-
truncated: z.boolean(),
|
|
58
|
-
}),
|
|
59
|
-
};
|
|
60
|
-
function trustFindingToMcp(f) {
|
|
61
|
-
const meta = f.meta;
|
|
62
|
-
const dependency = meta.dependency ?? 'unknown';
|
|
63
|
-
const similarTo = meta.similarTo ?? 'unknown';
|
|
64
|
-
const detectionMethod = meta.detectionMethod ?? 'levenshtein';
|
|
65
|
-
const distance = meta.distance;
|
|
66
|
-
const homoglyph = meta.homoglyph;
|
|
67
|
-
const targetDownloads = meta.targetDownloads;
|
|
68
|
-
let action;
|
|
69
|
-
if (detectionMethod === 'homoglyph') {
|
|
70
|
-
action = `"${dependency}" uses visual deception (${homoglyph}) to mimic "${similarTo}". This is a high-confidence typosquat attack. Remove immediately.`;
|
|
71
|
-
}
|
|
72
|
-
else if (distance === 1) {
|
|
73
|
-
action = `"${dependency}" is 1 character away from "${similarTo}". Verify this is intentional and not a typosquat attack.`;
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
action = `"${dependency}" is similar to "${similarTo}". Verify this is the intended package.`;
|
|
77
|
-
}
|
|
78
|
-
return {
|
|
79
|
-
kind: 'TYPOSQUAT_RISK',
|
|
80
|
-
severity: f.severity === 'high' ? 'high' : 'medium',
|
|
81
|
-
location: {
|
|
82
|
-
file: f.location?.file ?? 'package.json',
|
|
83
|
-
span: [f.location?.line ?? 1, f.location?.line ?? 1],
|
|
84
|
-
},
|
|
85
|
-
evidence: {
|
|
86
|
-
rule_id: f.ruleId,
|
|
87
|
-
dependency,
|
|
88
|
-
similar_to: similarTo,
|
|
89
|
-
detection_method: detectionMethod,
|
|
90
|
-
...(distance !== undefined && { distance }),
|
|
91
|
-
...(homoglyph && { homoglyph }),
|
|
92
|
-
...(targetDownloads !== undefined && { target_downloads: targetDownloads }),
|
|
93
|
-
},
|
|
94
|
-
suggested_action: action,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
export function registerFindTyposquats(server) {
|
|
98
|
-
server.registerTool('find_typosquats', {
|
|
99
|
-
title: 'Find Typosquats',
|
|
100
|
-
description: 'Detect potential typosquat packages using Levenshtein distance and homoglyph detection. ' +
|
|
101
|
-
'Homoglyph attacks use visual deception (e.g., "rn" looks like "m", "1" looks like "l"). ' +
|
|
102
|
-
'Protects against attacks like "lodahs" (typo) or "rnaterial-ui" (homoglyph for "material-ui").',
|
|
103
|
-
inputSchema,
|
|
104
|
-
outputSchema,
|
|
105
|
-
}, async ({ code_root, include_dev_deps, severity_floor, check_homoglyphs, check_popularity }) => {
|
|
106
|
-
const result = await typosquatDetectionPass(code_root, {
|
|
107
|
-
includeDevDeps: include_dev_deps,
|
|
108
|
-
checkHomoglyphs: check_homoglyphs,
|
|
109
|
-
checkPopularity: check_popularity,
|
|
110
|
-
});
|
|
111
|
-
const floorValue = SEVERITY_ORDER[severity_floor ?? 'low'];
|
|
112
|
-
const filtered = result.findings.filter((f) => SEVERITY_ORDER[f.severity] >= floorValue);
|
|
113
|
-
const truncated = filtered.length > MAX_FINDINGS;
|
|
114
|
-
const findings = filtered.slice(0, MAX_FINDINGS).map(trustFindingToMcp);
|
|
115
|
-
// Count by detection method
|
|
116
|
-
const levenshteinCount = filtered.filter((f) => f.meta?.detectionMethod === 'levenshtein').length;
|
|
117
|
-
const homoglyphCount = filtered.filter((f) => f.meta?.detectionMethod === 'homoglyph').length;
|
|
118
|
-
const output = {
|
|
119
|
-
findings,
|
|
120
|
-
summary: {
|
|
121
|
-
total: filtered.length,
|
|
122
|
-
by_severity: {
|
|
123
|
-
critical: filtered.filter((f) => f.severity === 'critical').length,
|
|
124
|
-
high: filtered.filter((f) => f.severity === 'high').length,
|
|
125
|
-
medium: filtered.filter((f) => f.severity === 'medium').length,
|
|
126
|
-
low: filtered.filter((f) => f.severity === 'low').length,
|
|
127
|
-
},
|
|
128
|
-
by_detection_method: {
|
|
129
|
-
levenshtein: levenshteinCount,
|
|
130
|
-
homoglyph: homoglyphCount,
|
|
131
|
-
},
|
|
132
|
-
truncated,
|
|
133
|
-
},
|
|
134
|
-
};
|
|
135
|
-
return {
|
|
136
|
-
content: [{ type: 'text', text: JSON.stringify(output) }],
|
|
137
|
-
structuredContent: output,
|
|
138
|
-
};
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
//# sourceMappingURL=find-typosquats.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"find-typosquats.js","sourceRoot":"","sources":["../../src/tools/find-typosquats.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* layer_bom MCP tool (Conformis inventory primitive).
|
|
3
|
-
*
|
|
4
|
-
* Exposes the circle-ir-ai layer-BOM engine op — a 9-layer component inventory
|
|
5
|
-
* (L2 Runtime … L8 Integration/API) with the dependency BOM sorted into
|
|
6
|
-
* protocol/framework/data usage layers and a usage index (which of the repo's
|
|
7
|
-
* own files import each). This is an *engine primitive* (like verify_spec_
|
|
8
|
-
* conformance), not the Conformis campaign runner — the plan (conformis-
|
|
9
|
-
* execution-plan.md §7) explicitly exposes `bom` via CLI + /api/bom + MCP.
|
|
10
|
-
*
|
|
11
|
-
* @see https://github.com/cogniumhq/cognium-ai (Conformis A3-S2)
|
|
12
|
-
*/
|
|
13
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
14
|
-
export declare function registerLayerBom(server: McpServer): void;
|
|
15
|
-
//# sourceMappingURL=layer-bom.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layer-bom.d.ts","sourceRoot":"","sources":["../../src/tools/layer-bom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuEzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwBxD"}
|
package/dist/tools/layer-bom.js
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* layer_bom MCP tool (Conformis inventory primitive).
|
|
3
|
-
*
|
|
4
|
-
* Exposes the circle-ir-ai layer-BOM engine op — a 9-layer component inventory
|
|
5
|
-
* (L2 Runtime … L8 Integration/API) with the dependency BOM sorted into
|
|
6
|
-
* protocol/framework/data usage layers and a usage index (which of the repo's
|
|
7
|
-
* own files import each). This is an *engine primitive* (like verify_spec_
|
|
8
|
-
* conformance), not the Conformis campaign runner — the plan (conformis-
|
|
9
|
-
* execution-plan.md §7) explicitly exposes `bom` via CLI + /api/bom + MCP.
|
|
10
|
-
*
|
|
11
|
-
* @see https://github.com/cogniumhq/cognium-ai (Conformis A3-S2)
|
|
12
|
-
*/
|
|
13
|
-
import { z } from 'zod';
|
|
14
|
-
import { generateBom } from 'circle-ir-ai';
|
|
15
|
-
const inputSchema = {
|
|
16
|
-
code_root: z.string().describe('Absolute path to the repo root to inventory'),
|
|
17
|
-
usage: z.boolean().optional().default(true).describe('Build the usage index (import-site scan per classified component). Set false for a faster inventory-only BOM (default: true)'),
|
|
18
|
-
};
|
|
19
|
-
const componentSchema = z.object({
|
|
20
|
-
name: z.string(),
|
|
21
|
-
version: z.string().optional(),
|
|
22
|
-
layer: z.string(),
|
|
23
|
-
kind: z.string(),
|
|
24
|
-
ecosystem: z.string().optional(),
|
|
25
|
-
source: z.string(),
|
|
26
|
-
path: z.string().optional(),
|
|
27
|
-
direct: z.boolean().optional(),
|
|
28
|
-
usage_count: z.number().optional(),
|
|
29
|
-
});
|
|
30
|
-
const outputSchema = {
|
|
31
|
-
target: z.string(),
|
|
32
|
-
languages: z.array(z.string()),
|
|
33
|
-
layers: z.array(z.object({
|
|
34
|
-
layer: z.string(),
|
|
35
|
-
title: z.string(),
|
|
36
|
-
component_count: z.number(),
|
|
37
|
-
components: z.array(componentSchema),
|
|
38
|
-
})),
|
|
39
|
-
meta: z.object({
|
|
40
|
-
total_dependencies: z.number(),
|
|
41
|
-
total_components: z.number(),
|
|
42
|
-
populated_layers: z.array(z.string()),
|
|
43
|
-
}),
|
|
44
|
-
};
|
|
45
|
-
const LAYER_ORDER = ['L2', 'L3', 'L4', 'L5', 'L6', 'L7', 'L8', 'L9'];
|
|
46
|
-
const MAX_COMPONENTS_PER_LAYER = 500;
|
|
47
|
-
/** Map the RepoBom to a lean MCP output (drops verbose usageSites/usageIndex). */
|
|
48
|
-
function toOutput(bom) {
|
|
49
|
-
return {
|
|
50
|
-
target: bom.target,
|
|
51
|
-
languages: bom.languages,
|
|
52
|
-
layers: LAYER_ORDER.map((l) => {
|
|
53
|
-
const lb = bom.layers[l];
|
|
54
|
-
return {
|
|
55
|
-
layer: l,
|
|
56
|
-
title: lb.title,
|
|
57
|
-
component_count: lb.components.length,
|
|
58
|
-
components: lb.components.slice(0, MAX_COMPONENTS_PER_LAYER).map((c) => ({
|
|
59
|
-
name: c.name,
|
|
60
|
-
version: c.version,
|
|
61
|
-
layer: c.layer,
|
|
62
|
-
kind: c.kind,
|
|
63
|
-
ecosystem: c.ecosystem,
|
|
64
|
-
source: c.source,
|
|
65
|
-
path: c.path,
|
|
66
|
-
direct: c.direct,
|
|
67
|
-
usage_count: c.usageCount,
|
|
68
|
-
})),
|
|
69
|
-
};
|
|
70
|
-
}).filter((l) => l.component_count > 0),
|
|
71
|
-
meta: {
|
|
72
|
-
total_dependencies: bom.meta.totalDependencies,
|
|
73
|
-
total_components: bom.meta.totalComponents,
|
|
74
|
-
populated_layers: bom.meta.populatedLayers,
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
export function registerLayerBom(server) {
|
|
79
|
-
server.registerTool('layer_bom', {
|
|
80
|
-
title: 'Layer-BOM (9-layer inventory)',
|
|
81
|
-
description: 'Inventory a repo across the 9 canonical layers: L2 Runtime, L3 Protocols ' +
|
|
82
|
-
'(JWT/OAuth/gRPC/GraphQL/HTTP), L4 Supply-chain (direct + transitive deps), ' +
|
|
83
|
-
'L5 Framework (React/Expo/Spring/Django…), L6 Platform/Toolchain (Dockerfile/CI), ' +
|
|
84
|
-
'L7 Data (ORMs/drivers), L8 Integration/API (OpenAPI/GraphQL/proto specs). ' +
|
|
85
|
-
'Returns per-layer components plus a usage index (which of the repo\'s files ' +
|
|
86
|
-
'import each classified component). The Conformis inventory primitive.',
|
|
87
|
-
inputSchema,
|
|
88
|
-
outputSchema,
|
|
89
|
-
}, async ({ code_root, usage }) => {
|
|
90
|
-
const bom = await generateBom(code_root, { usage });
|
|
91
|
-
const output = toOutput(bom);
|
|
92
|
-
return {
|
|
93
|
-
content: [{ type: 'text', text: JSON.stringify(output) }],
|
|
94
|
-
structuredContent: output,
|
|
95
|
-
};
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=layer-bom.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layer-bom.js","sourceRoot":"","sources":["../../src/tools/layer-bom.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `verify_spec_conformance` MCP tool.
|
|
3
|
-
*
|
|
4
|
-
* Runs spec-gap analysis over a code root against a Specifica spec directory
|
|
5
|
-
* and reports an alignment score plus per-requirement coverage status.
|
|
6
|
-
*/
|
|
7
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
-
export declare function registerVerifySpecConformance(server: McpServer): void;
|
|
9
|
-
//# sourceMappingURL=verify-spec-conformance.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify-spec-conformance.d.ts","sourceRoot":"","sources":["../../src/tools/verify-spec-conformance.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8BzE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsBrE"}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `verify_spec_conformance` MCP tool.
|
|
3
|
-
*
|
|
4
|
-
* Runs spec-gap analysis over a code root against a Specifica spec directory
|
|
5
|
-
* and reports an alignment score plus per-requirement coverage status.
|
|
6
|
-
*/
|
|
7
|
-
import { z } from 'zod';
|
|
8
|
-
import { analyzeSpecGap } from 'circle-ir-ai';
|
|
9
|
-
import { loadCircleIR } from '../analysis.js';
|
|
10
|
-
import { toVerifyConformance } from '../mappers.js';
|
|
11
|
-
const inputSchema = {
|
|
12
|
-
spec_dir: z.string().describe('Path to the .specifica/ directory containing spec.md'),
|
|
13
|
-
code_root: z.string().describe('Path to the code root to analyze'),
|
|
14
|
-
};
|
|
15
|
-
const evidenceSchema = z
|
|
16
|
-
.object({
|
|
17
|
-
function: z.string().optional(),
|
|
18
|
-
file: z.string().optional(),
|
|
19
|
-
span: z.tuple([z.number(), z.number()]).optional(),
|
|
20
|
-
})
|
|
21
|
-
.passthrough();
|
|
22
|
-
const outputSchema = {
|
|
23
|
-
alignment_score: z.number(),
|
|
24
|
-
requirements: z.array(z.object({
|
|
25
|
-
id: z.string(),
|
|
26
|
-
status: z.enum(['covered', 'partial', 'uncovered']),
|
|
27
|
-
evidence: evidenceSchema,
|
|
28
|
-
})),
|
|
29
|
-
summary: z.string(),
|
|
30
|
-
};
|
|
31
|
-
export function registerVerifySpecConformance(server) {
|
|
32
|
-
server.registerTool('verify_spec_conformance', {
|
|
33
|
-
title: 'Verify Spec Conformance',
|
|
34
|
-
description: 'Analyze how well code conforms to its Specifica spec. Returns an ' +
|
|
35
|
-
'alignment score (0-100) and per-requirement coverage status ' +
|
|
36
|
-
'(covered/partial/uncovered). "partial" = matched with confidence < 0.7.',
|
|
37
|
-
inputSchema,
|
|
38
|
-
outputSchema,
|
|
39
|
-
}, async ({ spec_dir, code_root }) => {
|
|
40
|
-
const { codePath, results } = await loadCircleIR(code_root);
|
|
41
|
-
const specGap = await analyzeSpecGap(codePath, results, { specDir: spec_dir });
|
|
42
|
-
const payload = toVerifyConformance(specGap);
|
|
43
|
-
return {
|
|
44
|
-
content: [{ type: 'text', text: JSON.stringify(payload) }],
|
|
45
|
-
structuredContent: payload,
|
|
46
|
-
};
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=verify-spec-conformance.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify-spec-conformance.js","sourceRoot":"","sources":["../../src/tools/verify-spec-conformance.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,WAAW,GAAG;IAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;IACrF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACnE,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC;KACrB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;CACnD,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,YAAY,GAAG;IACnB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,YAAY,EAAE,CAAC,CAAC,KAAK,CACnB,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACnD,QAAQ,EAAE,cAAc;KACzB,CAAC,CACH;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC;AAEF,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC7D,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EACT,mEAAmE;YACnE,8DAA8D;YAC9D,yEAAyE;QAC3E,WAAW;QACX,YAAY;KACb,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;QAChC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,iBAAiB,EAAE,OAA6C;SACjE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/walk.d.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File walker for the MCP server.
|
|
3
|
-
*
|
|
4
|
-
* Recursively collects files under a root directory, applying default and
|
|
5
|
-
* caller-supplied exclude globs via `minimatch` (per the repo convention of
|
|
6
|
-
* never hand-rolling glob translation). Language detection is delegated to
|
|
7
|
-
* circle-ir's `detectLanguage`.
|
|
8
|
-
*/
|
|
9
|
-
import { type SupportedLanguage } from 'circle-ir';
|
|
10
|
-
/** Directories/patterns excluded by default for every walk. */
|
|
11
|
-
export declare const DEFAULT_EXCLUDES: string[];
|
|
12
|
-
export interface WalkOptions {
|
|
13
|
-
/** Additional exclude globs (matched against the path relative to root). */
|
|
14
|
-
exclude?: string[];
|
|
15
|
-
/** Hard cap on number of files returned. Default 5000. */
|
|
16
|
-
maxFiles?: number;
|
|
17
|
-
/** Skip files larger than this many bytes. Default 1 MiB. */
|
|
18
|
-
maxFileBytes?: number;
|
|
19
|
-
}
|
|
20
|
-
export interface WalkedFile {
|
|
21
|
-
/** Absolute path. */
|
|
22
|
-
absolutePath: string;
|
|
23
|
-
/** Path relative to the walk root (used for matching/snippets). */
|
|
24
|
-
relativePath: string;
|
|
25
|
-
}
|
|
26
|
-
export interface SourceFile extends WalkedFile {
|
|
27
|
-
language: SupportedLanguage;
|
|
28
|
-
}
|
|
29
|
-
/** Walk all (non-excluded, size-bounded) files under `root`. */
|
|
30
|
-
export declare function walkFiles(root: string, options?: WalkOptions): WalkedFile[];
|
|
31
|
-
/** Walk and keep only files whose language circle-ir can detect. */
|
|
32
|
-
export declare function collectSourceFiles(root: string, options?: WalkOptions): SourceFile[];
|
|
33
|
-
//# sourceMappingURL=walk.d.ts.map
|
package/dist/walk.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../src/walk.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnE,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,UAS5B,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,UAAU,EAAE,CA6C/E;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,UAAU,EAAE,CAUxF"}
|