mcp-lint 0.6.0 → 0.7.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/README.md +60 -2
- package/dist/cli/commands/check.js +123 -31
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/snapshot.d.ts +2 -0
- package/dist/cli/commands/snapshot.js +56 -0
- package/dist/cli/commands/snapshot.js.map +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/installed/config.d.ts +34 -0
- package/dist/installed/config.js +130 -0
- package/dist/installed/config.js.map +1 -0
- package/dist/installed/format.d.ts +2 -0
- package/dist/installed/format.js +72 -0
- package/dist/installed/format.js.map +1 -0
- package/dist/installed/lint.d.ts +19 -0
- package/dist/installed/lint.js +49 -0
- package/dist/installed/lint.js.map +1 -0
- package/dist/loaders/index.d.ts +1 -0
- package/dist/loaders/index.js +1 -0
- package/dist/loaders/index.js.map +1 -1
- package/dist/loaders/map-tools.d.ts +16 -0
- package/dist/loaders/map-tools.js +33 -0
- package/dist/loaders/map-tools.js.map +1 -0
- package/dist/loaders/remote-loader.d.ts +2 -0
- package/dist/loaders/remote-loader.js +37 -0
- package/dist/loaders/remote-loader.js.map +1 -0
- package/dist/loaders/sse-loader.d.ts +1 -1
- package/dist/loaders/sse-loader.js +3 -17
- package/dist/loaders/sse-loader.js.map +1 -1
- package/dist/loaders/stdio-loader.d.ts +8 -1
- package/dist/loaders/stdio-loader.js +58 -12
- package/dist/loaders/stdio-loader.js.map +1 -1
- package/dist/mcp-server.js +1 -1
- package/dist/recover/probe.js +1 -1
- package/dist/rules/index.js +2 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/tool-name.d.ts +2 -0
- package/dist/rules/tool-name.js +44 -0
- package/dist/rules/tool-name.js.map +1 -0
- package/dist/snapshot/serialize.d.ts +2 -0
- package/dist/snapshot/serialize.js +17 -0
- package/dist/snapshot/serialize.js.map +1 -0
- package/examples/github-action.yml +1 -1
- package/examples/names/unsafe.json +22 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|
**Lint MCP server tool schemas, then check whether an agent can recover when a tool fails.**
|
|
11
11
|
|
|
12
|
+
Proof page, with a live bench: [mcp-lint-alpha.vercel.app](https://mcp-lint-alpha.vercel.app/)
|
|
13
|
+
|
|
12
14
|
MCP servers expose tool schemas consumed by **Claude**, **Cursor**, **Gemini**, **VS Code Copilot**, **Windsurf**, **Cline**, **OpenAI Agents SDK**, and **Continue.dev**. Each client has different JSON Schema support and quirks — a schema that works in Claude may silently break in Cursor or OpenAI. `mcp-lint` catches these issues before your users do.
|
|
13
15
|
|
|
14
16
|
```
|
|
@@ -63,6 +65,13 @@ mcp-lint-server
|
|
|
63
65
|
|
|
64
66
|
# Score whether a tool failure tells the agent which tool to call next
|
|
65
67
|
mcp-lint recover examples/recover/bad-credential.json
|
|
68
|
+
|
|
69
|
+
# Lint the stdio servers already configured for Cursor, Claude, and VS Code
|
|
70
|
+
mcp-lint check --installed
|
|
71
|
+
|
|
72
|
+
# Save a live tool list, then fail CI when a later snapshot gets worse
|
|
73
|
+
mcp-lint snapshot -o tools.json --server stdio -- node server.js
|
|
74
|
+
mcp-lint diff tools.json tools.next.json
|
|
66
75
|
```
|
|
67
76
|
|
|
68
77
|
---
|
|
@@ -185,6 +194,41 @@ mcp-lint diff tools-v1.json tools-v2.json --format json
|
|
|
185
194
|
|
|
186
195
|
---
|
|
187
196
|
|
|
197
|
+
### `mcp-lint check --installed`
|
|
198
|
+
|
|
199
|
+
Reads the MCP configs already on this machine and lints each local stdio server. Nothing is uploaded. Remote URLs are skipped unless you pass `--remote`.
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
mcp-lint check --installed
|
|
203
|
+
mcp-lint check --from .cursor/mcp.json
|
|
204
|
+
mcp-lint check --from .mcp.json --timeout 10000 --strict
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Looked-up files:
|
|
208
|
+
|
|
209
|
+
| Client | Path |
|
|
210
|
+
|--------|------|
|
|
211
|
+
| Cursor | `~/.cursor/mcp.json` and `./.cursor/mcp.json` |
|
|
212
|
+
| Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) |
|
|
213
|
+
| Claude Code | `~/.claude.json`, `~/.claude/settings.json`, and `./.mcp.json` |
|
|
214
|
+
| VS Code | `~/Library/Application Support/Code/User/mcp.json` and `./.vscode/mcp.json` |
|
|
215
|
+
|
|
216
|
+
`--strict` also exits 1 when a configured server fails to start. Without it, a start failure is printed and the exit code follows the schema errors.
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
### `mcp-lint snapshot`
|
|
221
|
+
|
|
222
|
+
Writes the live `tools/list` as a stable JSON file. Commit that file and compare it with `diff` when the server changes. `diff` exits 1 when the new file introduces an error the old file did not have.
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
mcp-lint snapshot -o tools.json --server stdio -- node server.js
|
|
226
|
+
mcp-lint snapshot -o tools.json --server http --url http://127.0.0.1:3000/mcp
|
|
227
|
+
mcp-lint diff tools.json tools.next.json
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
188
232
|
### `mcp-lint fix [input]`
|
|
189
233
|
|
|
190
234
|
Auto-fixes issues that are safe to fix automatically (no semantic changes).
|
|
@@ -225,6 +269,14 @@ mcp-lint init --force # overwrite existing
|
|
|
225
269
|
| `max-depth` | 🟡 warning | ❌ | Schema nesting deeper than 5 levels hurts LLM comprehension |
|
|
226
270
|
| `no-unsupported-formats` | 🟡 warning | ✅ | Obscure `format` values (`iri`, `json-pointer`, `regex`…) not widely supported |
|
|
227
271
|
|
|
272
|
+
### Tool names
|
|
273
|
+
|
|
274
|
+
| Rule | Severity | Fixable | Description |
|
|
275
|
+
|------|----------|---------|-------------|
|
|
276
|
+
| `tool-name/client-safe` | 🔴 error, 🟡 warning | ❌ | Names must match `^[A-Za-z0-9_-]{1,64}$`. A leading digit is a warning because Gemini rejects it. |
|
|
277
|
+
|
|
278
|
+
OpenAI and Azure use that pattern. A space, slash, or dot makes the tool disappear. See `examples/names/unsafe.json`.
|
|
279
|
+
|
|
228
280
|
### Claude-specific
|
|
229
281
|
|
|
230
282
|
| Rule | Severity | Fixable | Description |
|
|
@@ -335,7 +387,7 @@ jobs:
|
|
|
335
387
|
runs-on: ubuntu-latest
|
|
336
388
|
steps:
|
|
337
389
|
- uses: actions/checkout@v4
|
|
338
|
-
- uses: robert19001-cmyk/mcp-lint@v0.
|
|
390
|
+
- uses: robert19001-cmyk/mcp-lint@v0.7.0
|
|
339
391
|
with:
|
|
340
392
|
input: tools.json
|
|
341
393
|
severity: warning
|
|
@@ -674,7 +726,13 @@ The proof page is in `site/`. It runs the same recovery scorer as the CLI.
|
|
|
674
726
|
npm run site
|
|
675
727
|
```
|
|
676
728
|
|
|
677
|
-
|
|
729
|
+
The public page is https://mcp-lint-alpha.vercel.app/. The same page runs locally:
|
|
730
|
+
|
|
731
|
+
```bash
|
|
732
|
+
npm run site
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
Open http://127.0.0.1:4731. The built page is not part of the npm package.
|
|
678
736
|
|
|
679
737
|
---
|
|
680
738
|
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { watch } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
2
3
|
import { loadFile } from '../../loaders/file-loader.js';
|
|
3
4
|
import { loadStdio } from '../../loaders/stdio-loader.js';
|
|
5
|
+
import { loadRemote } from '../../loaders/remote-loader.js';
|
|
4
6
|
import { loadSSE } from '../../loaders/sse-loader.js';
|
|
7
|
+
import { collectInstalledServers } from '../../installed/config.js';
|
|
8
|
+
import { formatInstalled } from '../../installed/format.js';
|
|
9
|
+
import { lintInstalledServers } from '../../installed/lint.js';
|
|
5
10
|
import { LintEngine } from '../../core/engine.js';
|
|
6
11
|
import { allRules } from '../../rules/index.js';
|
|
7
12
|
import { formatTerminal } from '../formatters/terminal.js';
|
|
@@ -27,8 +32,13 @@ export function registerCheckCommand(program) {
|
|
|
27
32
|
.option('--clients <clients>', 'Comma-separated client filter: claude,cursor,gemini,vscode')
|
|
28
33
|
.option('--ignore <tools>', 'Comma-separated tool names to skip')
|
|
29
34
|
.option('--quiet', 'Only output errors (no warnings/info)')
|
|
30
|
-
.option('--server <type>', 'Server transport: stdio|sse')
|
|
31
|
-
.option('--url <url>', '
|
|
35
|
+
.option('--server <type>', 'Server transport: stdio|sse|http')
|
|
36
|
+
.option('--url <url>', 'Remote server URL (use with --server sse|http)')
|
|
37
|
+
.option('--installed', 'Lint stdio servers declared in local Cursor, Claude, and VS Code configs')
|
|
38
|
+
.option('--from <path>', 'Lint servers declared in this MCP config. Repeatable.', collectPath, [])
|
|
39
|
+
.option('--remote', 'Also connect to URL servers. Off by default, so a scan stays on this machine.')
|
|
40
|
+
.option('--timeout <ms>', 'Per-server timeout in milliseconds for --installed, --from, and --server')
|
|
41
|
+
.option('--strict', 'With --installed or --from, exit 1 when a server fails to start')
|
|
32
42
|
.option('--output-file <path>', 'Write results to a file instead of stdout')
|
|
33
43
|
.option('--watch', 'Re-lint on file change (only works with file input)')
|
|
34
44
|
.option('--score', 'Show quality score (0–100) per tool')
|
|
@@ -48,35 +58,74 @@ export function registerCheckCommand(program) {
|
|
|
48
58
|
...(options.ignore ? options.ignore.split(',').map((s) => s.trim()) : []),
|
|
49
59
|
],
|
|
50
60
|
};
|
|
61
|
+
const from = options.from ?? [];
|
|
62
|
+
const scanning = Boolean(options.installed) || from.length > 0;
|
|
63
|
+
if (scanning && (input || options.server || options.watch)) {
|
|
64
|
+
throw new Error('Use --installed or --from on their own, without a tools file, --server, or --watch.');
|
|
65
|
+
}
|
|
66
|
+
const floor = severityFloor(options);
|
|
51
67
|
let tools;
|
|
52
|
-
|
|
53
|
-
|
|
68
|
+
let diagnostics;
|
|
69
|
+
let output;
|
|
70
|
+
if (scanning) {
|
|
71
|
+
const timeoutMs = parseTimeout(options.timeout, 20_000);
|
|
72
|
+
const collected = await collectInstalledServers({
|
|
73
|
+
scanInstalled: Boolean(options.installed),
|
|
74
|
+
from,
|
|
75
|
+
home: homedir(),
|
|
76
|
+
platform: process.platform,
|
|
77
|
+
cwd: process.cwd(),
|
|
78
|
+
});
|
|
79
|
+
if (collected.servers.length === 0 && collected.errors.length === 0) {
|
|
80
|
+
const where = options.installed
|
|
81
|
+
? 'the Cursor, Claude, and VS Code configs on this machine'
|
|
82
|
+
: from.join(', ');
|
|
83
|
+
throw new Error(`No MCP servers found in ${where}.`);
|
|
84
|
+
}
|
|
85
|
+
const pluginRules = await loadPluginRules(fileConfig);
|
|
86
|
+
const engine = new LintEngine([...allRules, ...pluginRules], config);
|
|
87
|
+
const reports = await lintInstalledServers(collected.servers, {
|
|
88
|
+
remote: Boolean(options.remote),
|
|
89
|
+
timeoutMs,
|
|
90
|
+
lint: (found) => filterBySeverity(engine.lint(found), floor),
|
|
91
|
+
});
|
|
92
|
+
for (const problem of collected.errors) {
|
|
93
|
+
reports.unshift(configFailure(problem.path, problem.message));
|
|
94
|
+
}
|
|
95
|
+
tools = reports.flatMap((report) => report.tools);
|
|
96
|
+
diagnostics = reports.flatMap((report) => report.diagnostics);
|
|
97
|
+
output = formatInstalled(reports, options.format, !options.color);
|
|
98
|
+
const failedStart = reports.some((report) => report.status === 'failed');
|
|
99
|
+
await emit(output, options, tools, diagnostics);
|
|
100
|
+
return diagnostics.some((item) => item.severity === 'error') || (Boolean(options.strict) && failedStart);
|
|
101
|
+
}
|
|
102
|
+
else if (options.server === 'stdio') {
|
|
54
103
|
const rawArgv = process.argv;
|
|
55
104
|
const sepIdx = rawArgv.indexOf('--');
|
|
56
105
|
if (sepIdx === -1 || sepIdx >= rawArgv.length - 1) {
|
|
57
106
|
throw new Error('--server stdio requires a command after --, e.g.: mcp-lint check --server stdio -- node server.js');
|
|
58
107
|
}
|
|
59
108
|
const [cmd, ...cmdArgs] = rawArgv.slice(sepIdx + 1);
|
|
60
|
-
tools = await loadStdio(cmd, cmdArgs);
|
|
109
|
+
tools = await loadStdio(cmd, cmdArgs, { timeoutMs: optionalTimeout(options.timeout) });
|
|
61
110
|
}
|
|
62
111
|
else if (options.server === 'sse') {
|
|
63
112
|
if (!options.url)
|
|
64
113
|
throw new Error('--server sse requires --url <url>');
|
|
65
|
-
tools = await loadSSE(options.url);
|
|
114
|
+
tools = await loadSSE(options.url, optionalTimeout(options.timeout));
|
|
115
|
+
}
|
|
116
|
+
else if (options.server === 'http') {
|
|
117
|
+
if (!options.url)
|
|
118
|
+
throw new Error('--server http requires --url <url>');
|
|
119
|
+
tools = await loadRemote(options.url, 'http', optionalTimeout(options.timeout));
|
|
66
120
|
}
|
|
67
121
|
else {
|
|
68
122
|
if (!input)
|
|
69
|
-
throw new Error('Specify an input file
|
|
123
|
+
throw new Error('Specify an input file, --server stdio|sse|http, --installed, or --from <mcp.json>');
|
|
70
124
|
tools = await loadFile(input);
|
|
71
125
|
}
|
|
72
126
|
const pluginRules = await loadPluginRules(fileConfig);
|
|
73
127
|
const engine = new LintEngine([...allRules, ...pluginRules], config);
|
|
74
|
-
|
|
75
|
-
const minSeverity = options.quiet
|
|
76
|
-
? 'error'
|
|
77
|
-
: options.severity ?? 'info';
|
|
78
|
-
diagnostics = filterBySeverity(diagnostics, minSeverity);
|
|
79
|
-
let output;
|
|
128
|
+
diagnostics = filterBySeverity(engine.lint(tools), floor);
|
|
80
129
|
if (options.format === 'json') {
|
|
81
130
|
output = formatJson(diagnostics);
|
|
82
131
|
}
|
|
@@ -86,23 +135,8 @@ export function registerCheckCommand(program) {
|
|
|
86
135
|
else {
|
|
87
136
|
output = formatTerminal(diagnostics, !options.color);
|
|
88
137
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
process.stdout.write(output);
|
|
94
|
-
}
|
|
95
|
-
if (options.score) {
|
|
96
|
-
const report = computeQualityReport(tools, diagnostics);
|
|
97
|
-
const gradeColor = (g) => g === 'A' ? chalk.green(g) : g === 'B' ? chalk.cyan(g) : g === 'C' ? chalk.yellow(g) : chalk.red(g);
|
|
98
|
-
process.stdout.write(chalk.bold('\nQuality Score\n'));
|
|
99
|
-
for (const t of report.tools) {
|
|
100
|
-
process.stdout.write(` ${t.toolName.padEnd(30)} ${String(t.score).padStart(3)}/100 ${gradeColor(t.grade)} (${t.errors} errors, ${t.warnings} warnings)\n`);
|
|
101
|
-
}
|
|
102
|
-
process.stdout.write(`\n Overall: ${chalk.bold(String(report.overall))}/100 ${gradeColor(report.grade)}\n\n`);
|
|
103
|
-
}
|
|
104
|
-
const hasErrors = diagnostics.some((d) => d.severity === 'error');
|
|
105
|
-
return hasErrors;
|
|
138
|
+
await emit(output, options, tools, diagnostics);
|
|
139
|
+
return diagnostics.some((item) => item.severity === 'error');
|
|
106
140
|
}
|
|
107
141
|
catch (err) {
|
|
108
142
|
process.stderr.write(`Error: ${err.message}\n`);
|
|
@@ -110,7 +144,7 @@ export function registerCheckCommand(program) {
|
|
|
110
144
|
}
|
|
111
145
|
}
|
|
112
146
|
if (options.watch) {
|
|
113
|
-
if (!input || options.server) {
|
|
147
|
+
if (!input || options.server || options.installed || (options.from?.length ?? 0) > 0) {
|
|
114
148
|
process.stderr.write('Error: --watch only works with file input\n');
|
|
115
149
|
process.exit(2);
|
|
116
150
|
}
|
|
@@ -132,4 +166,62 @@ export function registerCheckCommand(program) {
|
|
|
132
166
|
}
|
|
133
167
|
});
|
|
134
168
|
}
|
|
169
|
+
function collectPath(value, previous) {
|
|
170
|
+
previous.push(value);
|
|
171
|
+
return previous;
|
|
172
|
+
}
|
|
173
|
+
function severityFloor(options) {
|
|
174
|
+
if (options.quiet)
|
|
175
|
+
return 'error';
|
|
176
|
+
if (options.severity === 'error' || options.severity === 'warning' || options.severity === 'info') {
|
|
177
|
+
return options.severity;
|
|
178
|
+
}
|
|
179
|
+
return 'info';
|
|
180
|
+
}
|
|
181
|
+
function parseTimeout(value, fallback) {
|
|
182
|
+
if (value === undefined)
|
|
183
|
+
return fallback;
|
|
184
|
+
const timeoutMs = Number(value);
|
|
185
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs < 1) {
|
|
186
|
+
throw new Error('--timeout must be a positive number of milliseconds');
|
|
187
|
+
}
|
|
188
|
+
return timeoutMs;
|
|
189
|
+
}
|
|
190
|
+
function optionalTimeout(value) {
|
|
191
|
+
if (value === undefined)
|
|
192
|
+
return undefined;
|
|
193
|
+
return parseTimeout(value, 20_000);
|
|
194
|
+
}
|
|
195
|
+
function configFailure(path, message) {
|
|
196
|
+
return {
|
|
197
|
+
server: {
|
|
198
|
+
sourceLabel: 'config',
|
|
199
|
+
sourcePath: path,
|
|
200
|
+
name: '(config)',
|
|
201
|
+
kind: 'invalid',
|
|
202
|
+
args: [],
|
|
203
|
+
},
|
|
204
|
+
status: 'failed',
|
|
205
|
+
tools: [],
|
|
206
|
+
diagnostics: [],
|
|
207
|
+
error: message,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
async function emit(output, options, tools, diagnostics) {
|
|
211
|
+
if (options.outputFile) {
|
|
212
|
+
await writeFile(options.outputFile, output, 'utf8');
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
process.stdout.write(output);
|
|
216
|
+
}
|
|
217
|
+
if (!options.score)
|
|
218
|
+
return;
|
|
219
|
+
const report = computeQualityReport(tools, diagnostics);
|
|
220
|
+
const gradeColor = (grade) => grade === 'A' ? chalk.green(grade) : grade === 'B' ? chalk.cyan(grade) : grade === 'C' ? chalk.yellow(grade) : chalk.red(grade);
|
|
221
|
+
process.stdout.write(chalk.bold('\nQuality Score\n'));
|
|
222
|
+
for (const tool of report.tools) {
|
|
223
|
+
process.stdout.write(` ${tool.toolName.padEnd(30)} ${String(tool.score).padStart(3)}/100 ${gradeColor(tool.grade)} (${tool.errors} errors, ${tool.warnings} warnings)\n`);
|
|
224
|
+
}
|
|
225
|
+
process.stdout.write(`\n Overall: ${chalk.bold(String(report.overall))}/100 ${gradeColor(report.grade)}\n\n`);
|
|
226
|
+
}
|
|
135
227
|
//# sourceMappingURL=check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAIhE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,cAAc,GAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAEnF,SAAS,gBAAgB,CAAC,WAAyB,EAAE,GAAa;IAChE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,EAAE,UAAU,CAAC;SAChF,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC;SAC/C,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,oBAAoB,EAAE,gDAAgD,CAAC;SAC9E,MAAM,CAAC,qBAAqB,EAAE,4DAA4D,CAAC;SAC3F,MAAM,CAAC,kBAAkB,EAAE,oCAAoC,CAAC;SAChE,MAAM,CAAC,SAAS,EAAE,uCAAuC,CAAC;SAC1D,MAAM,CAAC,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import { loadRemote } from '../../loaders/remote-loader.js';
|
|
3
|
+
import { loadStdio } from '../../loaders/stdio-loader.js';
|
|
4
|
+
import { serializeTools } from '../../snapshot/serialize.js';
|
|
5
|
+
export function registerSnapshotCommand(program) {
|
|
6
|
+
program
|
|
7
|
+
.command('snapshot')
|
|
8
|
+
.description('Write a stable tools JSON snapshot from a live MCP server')
|
|
9
|
+
.option('-o, --output <path>', 'Write the snapshot to this file instead of stdout')
|
|
10
|
+
.option('--server <type>', 'Server transport: stdio|sse|http')
|
|
11
|
+
.option('--url <url>', 'Remote server URL (use with --server sse|http)')
|
|
12
|
+
.option('--timeout <ms>', 'How long to wait for tools/list, in milliseconds', '20000')
|
|
13
|
+
.allowExcessArguments(true)
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
try {
|
|
16
|
+
const timeoutMs = parseTimeout(options.timeout);
|
|
17
|
+
const tools = await loadSnapshot(options.server, options.url, timeoutMs);
|
|
18
|
+
const body = serializeTools(tools);
|
|
19
|
+
if (options.output) {
|
|
20
|
+
await writeFile(options.output, body, 'utf8');
|
|
21
|
+
process.stderr.write(`Wrote ${tools.length} tool${tools.length === 1 ? '' : 's'} to ${options.output}\n`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
process.stdout.write(body);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
process.stderr.write(`Error: ${err.message}\n`);
|
|
29
|
+
process.exit(2);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function parseTimeout(value) {
|
|
34
|
+
const timeoutMs = Number(value ?? '20000');
|
|
35
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs < 1) {
|
|
36
|
+
throw new Error('--timeout must be a positive number of milliseconds');
|
|
37
|
+
}
|
|
38
|
+
return timeoutMs;
|
|
39
|
+
}
|
|
40
|
+
async function loadSnapshot(server, url, timeoutMs) {
|
|
41
|
+
if (server === 'stdio') {
|
|
42
|
+
const separator = process.argv.indexOf('--');
|
|
43
|
+
if (separator === -1 || separator >= process.argv.length - 1) {
|
|
44
|
+
throw new Error('snapshot --server stdio requires a command after --, e.g.: mcp-lint snapshot -o tools.json --server stdio -- node server.js');
|
|
45
|
+
}
|
|
46
|
+
const [command, ...args] = process.argv.slice(separator + 1);
|
|
47
|
+
return loadStdio(command, args, { timeoutMs });
|
|
48
|
+
}
|
|
49
|
+
if (server === 'sse' || server === 'http') {
|
|
50
|
+
if (!url)
|
|
51
|
+
throw new Error(`snapshot --server ${server} requires --url <url>`);
|
|
52
|
+
return loadRemote(url, server, timeoutMs);
|
|
53
|
+
}
|
|
54
|
+
throw new Error('snapshot requires --server stdio|sse|http');
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/cli/commands/snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8,11 +8,12 @@ import { registerExplainCommand } from './cli/commands/explain.js';
|
|
|
8
8
|
import { registerDiffCommand } from './cli/commands/diff.js';
|
|
9
9
|
import { registerPreflightCommand } from './cli/commands/preflight.js';
|
|
10
10
|
import { registerRecoverCommand } from './cli/commands/recover.js';
|
|
11
|
+
import { registerSnapshotCommand } from './cli/commands/snapshot.js';
|
|
11
12
|
const program = new Command();
|
|
12
13
|
program
|
|
13
14
|
.name('mcp-lint')
|
|
14
15
|
.description('Lint MCP tool schemas and score whether an agent can recover from tool failures')
|
|
15
|
-
.version('0.
|
|
16
|
+
.version('0.7.0');
|
|
16
17
|
registerCheckCommand(program);
|
|
17
18
|
registerFixCommand(program);
|
|
18
19
|
registerInitCommand(program);
|
|
@@ -21,5 +22,6 @@ registerExplainCommand(program);
|
|
|
21
22
|
registerDiffCommand(program);
|
|
22
23
|
registerPreflightCommand(program);
|
|
23
24
|
registerRecoverCommand(program);
|
|
25
|
+
registerSnapshotCommand(program);
|
|
24
26
|
program.parse();
|
|
25
27
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,iFAAiF,CAAC;KAC9F,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface ConfigOrigin {
|
|
2
|
+
label: string;
|
|
3
|
+
path: string;
|
|
4
|
+
}
|
|
5
|
+
export interface InstalledServer {
|
|
6
|
+
sourceLabel: string;
|
|
7
|
+
sourcePath: string;
|
|
8
|
+
name: string;
|
|
9
|
+
kind: 'stdio' | 'remote' | 'invalid';
|
|
10
|
+
command?: string;
|
|
11
|
+
args: string[];
|
|
12
|
+
env?: Record<string, string>;
|
|
13
|
+
cwd?: string;
|
|
14
|
+
url?: string;
|
|
15
|
+
remoteType?: string;
|
|
16
|
+
detail?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function candidateConfigFiles(home: string, platform: NodeJS.Platform, cwd: string): ConfigOrigin[];
|
|
19
|
+
export declare function parseInstalledConfig(raw: unknown, origin: ConfigOrigin): InstalledServer[];
|
|
20
|
+
export interface CollectResult {
|
|
21
|
+
servers: InstalledServer[];
|
|
22
|
+
errors: Array<{
|
|
23
|
+
path: string;
|
|
24
|
+
message: string;
|
|
25
|
+
}>;
|
|
26
|
+
lookedAt: string[];
|
|
27
|
+
}
|
|
28
|
+
export declare function collectInstalledServers(input: {
|
|
29
|
+
scanInstalled: boolean;
|
|
30
|
+
from: string[];
|
|
31
|
+
home: string;
|
|
32
|
+
platform: NodeJS.Platform;
|
|
33
|
+
cwd: string;
|
|
34
|
+
}): Promise<CollectResult>;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export function candidateConfigFiles(home, platform, cwd) {
|
|
4
|
+
const files = [
|
|
5
|
+
{ label: 'Cursor', path: join(home, '.cursor', 'mcp.json') },
|
|
6
|
+
{ label: 'Cursor project', path: join(cwd, '.cursor', 'mcp.json') },
|
|
7
|
+
{ label: 'Project', path: join(cwd, '.mcp.json') },
|
|
8
|
+
{ label: 'VS Code project', path: join(cwd, '.vscode', 'mcp.json') },
|
|
9
|
+
{ label: 'Claude Code', path: join(home, '.claude.json') },
|
|
10
|
+
{ label: 'Claude Code settings', path: join(home, '.claude', 'settings.json') },
|
|
11
|
+
];
|
|
12
|
+
if (platform === 'darwin') {
|
|
13
|
+
files.push({ label: 'Claude Desktop', path: join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json') }, { label: 'VS Code', path: join(home, 'Library', 'Application Support', 'Code', 'User', 'mcp.json') });
|
|
14
|
+
}
|
|
15
|
+
else if (platform === 'win32') {
|
|
16
|
+
const appData = process.env.APPDATA ?? join(home, 'AppData', 'Roaming');
|
|
17
|
+
files.push({ label: 'Claude Desktop', path: join(appData, 'Claude', 'claude_desktop_config.json') }, { label: 'VS Code', path: join(appData, 'Code', 'User', 'mcp.json') });
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
files.push({ label: 'Claude Desktop', path: join(home, '.config', 'Claude', 'claude_desktop_config.json') }, { label: 'VS Code', path: join(home, '.config', 'Code', 'User', 'mcp.json') });
|
|
21
|
+
}
|
|
22
|
+
return files;
|
|
23
|
+
}
|
|
24
|
+
export function parseInstalledConfig(raw, origin) {
|
|
25
|
+
if (!isRecord(raw)) {
|
|
26
|
+
throw new Error(`Expected a JSON object in "${origin.path}"`);
|
|
27
|
+
}
|
|
28
|
+
const blocks = [];
|
|
29
|
+
if (isRecord(raw.mcpServers))
|
|
30
|
+
blocks.push(raw.mcpServers);
|
|
31
|
+
if (isRecord(raw.servers))
|
|
32
|
+
blocks.push(raw.servers);
|
|
33
|
+
if (isRecord(raw.mcp) && isRecord(raw.mcp.servers))
|
|
34
|
+
blocks.push(raw.mcp.servers);
|
|
35
|
+
const servers = [];
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
for (const block of blocks) {
|
|
38
|
+
for (const [name, value] of Object.entries(block)) {
|
|
39
|
+
if (!isRecord(value) || value.disabled === true)
|
|
40
|
+
continue;
|
|
41
|
+
const key = `${origin.path}\0${name}`;
|
|
42
|
+
if (seen.has(key))
|
|
43
|
+
continue;
|
|
44
|
+
seen.add(key);
|
|
45
|
+
servers.push(toServer(name, value, origin));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return servers;
|
|
49
|
+
}
|
|
50
|
+
export async function collectInstalledServers(input) {
|
|
51
|
+
const origins = input.from.map((path) => ({ label: 'File', path }));
|
|
52
|
+
if (input.scanInstalled) {
|
|
53
|
+
origins.push(...candidateConfigFiles(input.home, input.platform, input.cwd));
|
|
54
|
+
}
|
|
55
|
+
const servers = [];
|
|
56
|
+
const errors = [];
|
|
57
|
+
const lookedAt = [];
|
|
58
|
+
for (const origin of origins) {
|
|
59
|
+
lookedAt.push(origin.path);
|
|
60
|
+
let content;
|
|
61
|
+
try {
|
|
62
|
+
content = await readFile(origin.path, 'utf8');
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
const code = err.code;
|
|
66
|
+
if (code === 'ENOENT')
|
|
67
|
+
continue;
|
|
68
|
+
errors.push({ path: origin.path, message: err.message });
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const raw = JSON.parse(content);
|
|
73
|
+
servers.push(...parseInstalledConfig(raw, origin));
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
errors.push({ path: origin.path, message: err.message });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return { servers, errors, lookedAt };
|
|
80
|
+
}
|
|
81
|
+
function toServer(name, value, origin) {
|
|
82
|
+
const base = {
|
|
83
|
+
sourceLabel: origin.label,
|
|
84
|
+
sourcePath: origin.path,
|
|
85
|
+
name,
|
|
86
|
+
args: [],
|
|
87
|
+
};
|
|
88
|
+
const url = typeof value.url === 'string' ? value.url : undefined;
|
|
89
|
+
const type = typeof value.type === 'string' ? value.type.toLowerCase() : undefined;
|
|
90
|
+
const remote = Boolean(url) || type === 'sse' || type === 'http' || type === 'streamable-http';
|
|
91
|
+
if (remote) {
|
|
92
|
+
if (!url) {
|
|
93
|
+
return { ...base, kind: 'invalid', remoteType: type, detail: 'Remote server is missing a url' };
|
|
94
|
+
}
|
|
95
|
+
return { ...base, kind: 'remote', url, remoteType: type ?? 'http' };
|
|
96
|
+
}
|
|
97
|
+
if (typeof value.command !== 'string' || value.command.trim() === '') {
|
|
98
|
+
return { ...base, kind: 'invalid', detail: 'Server has no command' };
|
|
99
|
+
}
|
|
100
|
+
if (value.args !== undefined && !isStringArray(value.args)) {
|
|
101
|
+
return { ...base, kind: 'invalid', command: value.command, detail: 'args must be an array of strings' };
|
|
102
|
+
}
|
|
103
|
+
const env = stringRecord(value.env);
|
|
104
|
+
const cwd = typeof value.cwd === 'string' ? value.cwd : undefined;
|
|
105
|
+
return {
|
|
106
|
+
...base,
|
|
107
|
+
kind: 'stdio',
|
|
108
|
+
command: value.command,
|
|
109
|
+
args: isStringArray(value.args) ? value.args : [],
|
|
110
|
+
...(env ? { env } : {}),
|
|
111
|
+
...(cwd ? { cwd } : {}),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function isRecord(value) {
|
|
115
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
116
|
+
}
|
|
117
|
+
function isStringArray(value) {
|
|
118
|
+
return Array.isArray(value) && value.every((item) => typeof item === 'string');
|
|
119
|
+
}
|
|
120
|
+
function stringRecord(value) {
|
|
121
|
+
if (!isRecord(value))
|
|
122
|
+
return undefined;
|
|
123
|
+
const env = {};
|
|
124
|
+
for (const [key, item] of Object.entries(value)) {
|
|
125
|
+
if (typeof item === 'string')
|
|
126
|
+
env[key] = item;
|
|
127
|
+
}
|
|
128
|
+
return Object.keys(env).length > 0 ? env : undefined;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/installed/config.ts"],"names":[],"mappings":"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"}
|