mcp-use-compat 0.3.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 +23 -0
- package/LICENSE +21 -0
- package/README.md +375 -0
- package/dist/checks/auth.d.ts +2 -0
- package/dist/checks/auth.d.ts.map +1 -0
- package/dist/checks/auth.js +229 -0
- package/dist/checks/auth.js.map +1 -0
- package/dist/checks/calls.d.ts +4 -0
- package/dist/checks/calls.d.ts.map +1 -0
- package/dist/checks/calls.js +192 -0
- package/dist/checks/calls.js.map +1 -0
- package/dist/checks/discovery.d.ts +3 -0
- package/dist/checks/discovery.d.ts.map +1 -0
- package/dist/checks/discovery.js +47 -0
- package/dist/checks/discovery.js.map +1 -0
- package/dist/checks/explanations.d.ts +15 -0
- package/dist/checks/explanations.d.ts.map +1 -0
- package/dist/checks/explanations.js +346 -0
- package/dist/checks/explanations.js.map +1 -0
- package/dist/checks/index.d.ts +3 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +23 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/protocol.d.ts +5 -0
- package/dist/checks/protocol.d.ts.map +1 -0
- package/dist/checks/protocol.js +380 -0
- package/dist/checks/protocol.js.map +1 -0
- package/dist/checks/resources.d.ts +10 -0
- package/dist/checks/resources.d.ts.map +1 -0
- package/dist/checks/resources.js +144 -0
- package/dist/checks/resources.js.map +1 -0
- package/dist/checks/schema.d.ts +21 -0
- package/dist/checks/schema.d.ts.map +1 -0
- package/dist/checks/schema.js +412 -0
- package/dist/checks/schema.js.map +1 -0
- package/dist/checks/sdk.d.ts +10 -0
- package/dist/checks/sdk.d.ts.map +1 -0
- package/dist/checks/sdk.js +68 -0
- package/dist/checks/sdk.js.map +1 -0
- package/dist/checks/tools.d.ts +18 -0
- package/dist/checks/tools.d.ts.map +1 -0
- package/dist/checks/tools.js +422 -0
- package/dist/checks/tools.js.map +1 -0
- package/dist/checks/transport.d.ts +2 -0
- package/dist/checks/transport.d.ts.map +1 -0
- package/dist/checks/transport.js +123 -0
- package/dist/checks/transport.js.map +1 -0
- package/dist/checks/types.d.ts +37 -0
- package/dist/checks/types.d.ts.map +1 -0
- package/dist/checks/types.js +5 -0
- package/dist/checks/types.js.map +1 -0
- package/dist/checks/ui.d.ts +2 -0
- package/dist/checks/ui.d.ts.map +1 -0
- package/dist/checks/ui.js +207 -0
- package/dist/checks/ui.js.map +1 -0
- package/dist/checks/util.d.ts +20 -0
- package/dist/checks/util.d.ts.map +1 -0
- package/dist/checks/util.js +42 -0
- package/dist/checks/util.js.map +1 -0
- package/dist/cli.d.ts +110 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +317 -0
- package/dist/cli.js.map +1 -0
- package/dist/connect/calls.d.ts +13 -0
- package/dist/connect/calls.d.ts.map +1 -0
- package/dist/connect/calls.js +130 -0
- package/dist/connect/calls.js.map +1 -0
- package/dist/connect/http.d.ts +14 -0
- package/dist/connect/http.d.ts.map +1 -0
- package/dist/connect/http.js +122 -0
- package/dist/connect/http.js.map +1 -0
- package/dist/connect/index.d.ts +41 -0
- package/dist/connect/index.d.ts.map +1 -0
- package/dist/connect/index.js +168 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connect/lists.d.ts +12 -0
- package/dist/connect/lists.d.ts.map +1 -0
- package/dist/connect/lists.js +70 -0
- package/dist/connect/lists.js.map +1 -0
- package/dist/connect/modern.d.ts +13 -0
- package/dist/connect/modern.d.ts.map +1 -0
- package/dist/connect/modern.js +169 -0
- package/dist/connect/modern.js.map +1 -0
- package/dist/connect/session.d.ts +29 -0
- package/dist/connect/session.d.ts.map +1 -0
- package/dist/connect/session.js +96 -0
- package/dist/connect/session.js.map +1 -0
- package/dist/connect/stdio.d.ts +36 -0
- package/dist/connect/stdio.d.ts.map +1 -0
- package/dist/connect/stdio.js +127 -0
- package/dist/connect/stdio.js.map +1 -0
- package/dist/diff.d.ts +23 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +255 -0
- package/dist/diff.js.map +1 -0
- package/dist/evaluate.d.ts +70 -0
- package/dist/evaluate.d.ts.map +1 -0
- package/dist/evaluate.js +104 -0
- package/dist/evaluate.js.map +1 -0
- package/dist/explain.d.ts +4 -0
- package/dist/explain.d.ts.map +1 -0
- package/dist/explain.js +46 -0
- package/dist/explain.js.map +1 -0
- package/dist/fix.d.ts +19 -0
- package/dist/fix.d.ts.map +1 -0
- package/dist/fix.js +116 -0
- package/dist/fix.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +85 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +287 -0
- package/dist/oauth.js.map +1 -0
- package/dist/policy.d.ts +29 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +63 -0
- package/dist/policy.js.map +1 -0
- package/dist/profiles/chatgpt.d.ts +3 -0
- package/dist/profiles/chatgpt.d.ts.map +1 -0
- package/dist/profiles/chatgpt.js +29 -0
- package/dist/profiles/chatgpt.js.map +1 -0
- package/dist/profiles/claude-code.d.ts +3 -0
- package/dist/profiles/claude-code.d.ts.map +1 -0
- package/dist/profiles/claude-code.js +62 -0
- package/dist/profiles/claude-code.js.map +1 -0
- package/dist/profiles/claude-desktop.d.ts +3 -0
- package/dist/profiles/claude-desktop.d.ts.map +1 -0
- package/dist/profiles/claude-desktop.js +51 -0
- package/dist/profiles/claude-desktop.js.map +1 -0
- package/dist/profiles/cline.d.ts +4 -0
- package/dist/profiles/cline.d.ts.map +1 -0
- package/dist/profiles/cline.js +118 -0
- package/dist/profiles/cline.js.map +1 -0
- package/dist/profiles/codex.d.ts +4 -0
- package/dist/profiles/codex.d.ts.map +1 -0
- package/dist/profiles/codex.js +168 -0
- package/dist/profiles/codex.js.map +1 -0
- package/dist/profiles/continue.d.ts +4 -0
- package/dist/profiles/continue.d.ts.map +1 -0
- package/dist/profiles/continue.js +93 -0
- package/dist/profiles/continue.js.map +1 -0
- package/dist/profiles/cursor.d.ts +3 -0
- package/dist/profiles/cursor.d.ts.map +1 -0
- package/dist/profiles/cursor.js +52 -0
- package/dist/profiles/cursor.js.map +1 -0
- package/dist/profiles/gemini-cli.d.ts +4 -0
- package/dist/profiles/gemini-cli.d.ts.map +1 -0
- package/dist/profiles/gemini-cli.js +137 -0
- package/dist/profiles/gemini-cli.js.map +1 -0
- package/dist/profiles/goose.d.ts +4 -0
- package/dist/profiles/goose.d.ts.map +1 -0
- package/dist/profiles/goose.js +114 -0
- package/dist/profiles/goose.js.map +1 -0
- package/dist/profiles/index.d.ts +7 -0
- package/dist/profiles/index.d.ts.map +1 -0
- package/dist/profiles/index.js +43 -0
- package/dist/profiles/index.js.map +1 -0
- package/dist/profiles/opencode.d.ts +3 -0
- package/dist/profiles/opencode.d.ts.map +1 -0
- package/dist/profiles/opencode.js +47 -0
- package/dist/profiles/opencode.js.map +1 -0
- package/dist/profiles/types.d.ts +86 -0
- package/dist/profiles/types.d.ts.map +1 -0
- package/dist/profiles/types.js +2 -0
- package/dist/profiles/types.js.map +1 -0
- package/dist/profiles/vscode-copilot.d.ts +3 -0
- package/dist/profiles/vscode-copilot.d.ts.map +1 -0
- package/dist/profiles/vscode-copilot.js +71 -0
- package/dist/profiles/vscode-copilot.js.map +1 -0
- package/dist/profiles/windsurf.d.ts +4 -0
- package/dist/profiles/windsurf.d.ts.map +1 -0
- package/dist/profiles/windsurf.js +49 -0
- package/dist/profiles/windsurf.js.map +1 -0
- package/dist/project.d.ts +52 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +291 -0
- package/dist/project.js.map +1 -0
- package/dist/reporters/escape.d.ts +7 -0
- package/dist/reporters/escape.d.ts.map +1 -0
- package/dist/reporters/escape.js +15 -0
- package/dist/reporters/escape.js.map +1 -0
- package/dist/reporters/github.d.ts +7 -0
- package/dist/reporters/github.d.ts.map +1 -0
- package/dist/reporters/github.js +19 -0
- package/dist/reporters/github.js.map +1 -0
- package/dist/reporters/index.d.ts +6 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +10 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/json.d.ts +3 -0
- package/dist/reporters/json.d.ts.map +1 -0
- package/dist/reporters/json.js +4 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/markdown.d.ts +3 -0
- package/dist/reporters/markdown.d.ts.map +1 -0
- package/dist/reporters/markdown.js +98 -0
- package/dist/reporters/markdown.js.map +1 -0
- package/dist/run.d.ts +14 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +163 -0
- package/dist/run.js.map +1 -0
- package/dist/sdk-facts.d.ts +27 -0
- package/dist/sdk-facts.d.ts.map +1 -0
- package/dist/sdk-facts.js +63 -0
- package/dist/sdk-facts.js.map +1 -0
- package/dist/snapshot.d.ts +189 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +22 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/ui.d.ts +18 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +22 -0
- package/dist/ui.js.map +1 -0
- package/dist/upgrade.d.ts +12 -0
- package/dist/upgrade.d.ts.map +1 -0
- package/dist/upgrade.js +115 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +65 -0
- package/schema/report.schema.json +327 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
import { Ajv } from "ajv";
|
|
2
|
+
import { Ajv2020 } from "ajv/dist/2020.js";
|
|
3
|
+
import { connected, isObject, items, str, withNote } from "./util.js";
|
|
4
|
+
import { defineCheck } from "./types.js";
|
|
5
|
+
const MAX_DEPTH = 5;
|
|
6
|
+
const COMBINATORS = ["oneOf", "anyOf", "allOf", "not"];
|
|
7
|
+
const ajv2020 = new Ajv2020({ strict: false, validateSchema: false, logger: false });
|
|
8
|
+
const ajv07 = new Ajv({ strict: false, validateSchema: false, logger: false });
|
|
9
|
+
const hasTools = (s) => connected(s) && items(s, "tools").length > 0;
|
|
10
|
+
const toolName = (t) => str(t.name) ?? "(unnamed)";
|
|
11
|
+
/** Tools whose schema at `key` is an object (ignores missing/invalid ones). */
|
|
12
|
+
function schemas(s, key) {
|
|
13
|
+
return items(s, "tools").flatMap((t) => (isObject(t[key]) ? [[t, t[key]]] : []));
|
|
14
|
+
}
|
|
15
|
+
/** Meta-validates against the draft named in $schema (2020-12 by default, per the MCP spec). */
|
|
16
|
+
export function metaValidate(schema) {
|
|
17
|
+
const dialect = str(schema.$schema) ?? "https://json-schema.org/draft/2020-12/schema";
|
|
18
|
+
const validator = /draft-0[67]/.test(dialect) ? ajv07 : /2020-12/.test(dialect) ? ajv2020 : undefined;
|
|
19
|
+
if (!validator)
|
|
20
|
+
return undefined; // Unknown dialect: don't guess.
|
|
21
|
+
const valid = validator.validateSchema(schema);
|
|
22
|
+
if (valid)
|
|
23
|
+
return [];
|
|
24
|
+
return (validator.errors ?? []).map((e) => `${e.instancePath || "/"} ${e.message ?? "is invalid"}`);
|
|
25
|
+
}
|
|
26
|
+
/** Walks subschemas and collects keywords, nesting depth, and properties without a type. */
|
|
27
|
+
export function analyze(schema) {
|
|
28
|
+
const stats = { keywords: new Set(), depth: 0, untypedProperties: [], typeArrays: [] };
|
|
29
|
+
const visit = (node, depth, path) => {
|
|
30
|
+
if (!isObject(node))
|
|
31
|
+
return;
|
|
32
|
+
stats.depth = Math.max(stats.depth, depth);
|
|
33
|
+
if (Array.isArray(node.type))
|
|
34
|
+
stats.typeArrays.push(path.replace(/\.$/, "") || "(root)");
|
|
35
|
+
for (const key of Object.keys(node))
|
|
36
|
+
stats.keywords.add(key);
|
|
37
|
+
if (isObject(node.properties)) {
|
|
38
|
+
for (const [name, sub] of Object.entries(node.properties)) {
|
|
39
|
+
const p = `${path}${name}`;
|
|
40
|
+
if (isObject(sub) && !hasTypeInfo(sub))
|
|
41
|
+
stats.untypedProperties.push(p);
|
|
42
|
+
visit(sub, depth + 1, `${p}.`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const key of ["items", "additionalProperties", "not", "if", "then", "else", "contains"]) {
|
|
46
|
+
visit(node[key], depth + 1, `${path}${key}.`);
|
|
47
|
+
}
|
|
48
|
+
for (const key of ["anyOf", "oneOf", "allOf", "prefixItems"]) {
|
|
49
|
+
if (Array.isArray(node[key]))
|
|
50
|
+
node[key].forEach((sub) => visit(sub, depth + 1, path));
|
|
51
|
+
}
|
|
52
|
+
for (const key of ["$defs", "definitions", "patternProperties"]) {
|
|
53
|
+
if (isObject(node[key]))
|
|
54
|
+
Object.values(node[key]).forEach((sub) => visit(sub, depth, path));
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
visit(schema, 0, "");
|
|
58
|
+
return stats;
|
|
59
|
+
}
|
|
60
|
+
/** Every enum in the schema with its path. */
|
|
61
|
+
function enumPaths(schema, path = "", out = []) {
|
|
62
|
+
if (!isObject(schema))
|
|
63
|
+
return out;
|
|
64
|
+
if (Array.isArray(schema.enum))
|
|
65
|
+
out.push([path || "(root)", schema.enum]);
|
|
66
|
+
if (isObject(schema.properties)) {
|
|
67
|
+
for (const [name, sub] of Object.entries(schema.properties))
|
|
68
|
+
enumPaths(sub, path ? `${path}.${name}` : name, out);
|
|
69
|
+
}
|
|
70
|
+
if (isObject(schema.items))
|
|
71
|
+
enumPaths(schema.items, `${path}[]`, out);
|
|
72
|
+
for (const key of ["anyOf", "oneOf", "allOf"]) {
|
|
73
|
+
if (Array.isArray(schema[key]))
|
|
74
|
+
schema[key].forEach((sub) => enumPaths(sub, path, out));
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Mirrors Cline's normalizeToolInputSchema (sdk/packages/shared/src/tools/create.ts @ 252082b):
|
|
80
|
+
* schemas with a string `type`, or with properties/required/additionalProperties, pass.
|
|
81
|
+
* Otherwise the first non-empty root oneOf/anyOf/allOf decides: oneOf/anyOf need every
|
|
82
|
+
* branch to be `type: "object"`, allOf needs at least one such branch.
|
|
83
|
+
*/
|
|
84
|
+
export function rootCombinatorBreaks(schema) {
|
|
85
|
+
if (typeof schema.type === "string")
|
|
86
|
+
return false;
|
|
87
|
+
if ("properties" in schema || "required" in schema || "additionalProperties" in schema)
|
|
88
|
+
return false;
|
|
89
|
+
const isObjectBranch = (b) => isObject(b) && b.type === "object";
|
|
90
|
+
for (const key of ["oneOf", "anyOf", "allOf"]) {
|
|
91
|
+
const branches = schema[key];
|
|
92
|
+
if (!Array.isArray(branches) || branches.length === 0)
|
|
93
|
+
continue;
|
|
94
|
+
return key === "allOf" ? !branches.some(isObjectBranch) : !branches.every(isObjectBranch);
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
function hasTypeInfo(schema) {
|
|
99
|
+
return ["type", "enum", "const", "$ref", ...COMBINATORS].some((k) => k in schema);
|
|
100
|
+
}
|
|
101
|
+
export const schemaChecks = [
|
|
102
|
+
defineCheck({
|
|
103
|
+
id: "SCHEMA_MISSING",
|
|
104
|
+
area: "schema",
|
|
105
|
+
description: "Every tool has an inputSchema object",
|
|
106
|
+
appliesTo: hasTools,
|
|
107
|
+
run: (s) => items(s, "tools")
|
|
108
|
+
.filter((t) => !isObject(t.inputSchema))
|
|
109
|
+
.map((t) => ({
|
|
110
|
+
checkId: "SCHEMA_MISSING",
|
|
111
|
+
severity: "error",
|
|
112
|
+
subject: toolName(t),
|
|
113
|
+
message: "Tool has no inputSchema object. The spec requires one; the TypeScript SDK rejects the whole tools/list response, so SDK-based clients see no tools at all.",
|
|
114
|
+
fix: 'Use { "type": "object", "properties": {} } for tools without arguments.',
|
|
115
|
+
})),
|
|
116
|
+
}),
|
|
117
|
+
defineCheck({
|
|
118
|
+
id: "SCHEMA_NOT_OBJECT",
|
|
119
|
+
area: "schema",
|
|
120
|
+
description: 'inputSchema and outputSchema have type "object" at the root',
|
|
121
|
+
appliesTo: hasTools,
|
|
122
|
+
run: (s) => ["inputSchema", "outputSchema"].flatMap((key) => schemas(s, key)
|
|
123
|
+
.filter(([, schema]) => schema.type !== "object")
|
|
124
|
+
.map(([t, schema]) => ({
|
|
125
|
+
checkId: "SCHEMA_NOT_OBJECT",
|
|
126
|
+
severity: "error",
|
|
127
|
+
subject: toolName(t),
|
|
128
|
+
message: `${key} root type is ${JSON.stringify(schema.type ?? null)}, but MCP requires "object"; the TypeScript SDK rejects the whole tools/list response.`,
|
|
129
|
+
fix: 'Wrap arguments in an object schema: { "type": "object", "properties": { ... } }.',
|
|
130
|
+
}))),
|
|
131
|
+
}),
|
|
132
|
+
defineCheck({
|
|
133
|
+
id: "SCHEMA_INVALID",
|
|
134
|
+
area: "schema",
|
|
135
|
+
description: "Schemas are valid JSON Schema",
|
|
136
|
+
appliesTo: hasTools,
|
|
137
|
+
run: (s) => ["inputSchema", "outputSchema"].flatMap((key) => schemas(s, key).flatMap(([t, schema]) => {
|
|
138
|
+
const errors = metaValidate(schema);
|
|
139
|
+
if (!errors || errors.length === 0)
|
|
140
|
+
return [];
|
|
141
|
+
return [
|
|
142
|
+
{
|
|
143
|
+
checkId: "SCHEMA_INVALID",
|
|
144
|
+
severity: "error",
|
|
145
|
+
subject: toolName(t),
|
|
146
|
+
message: `${key} is not valid JSON Schema: ${errors.slice(0, 3).join("; ")}`,
|
|
147
|
+
evidence: { errors },
|
|
148
|
+
fix: "Generate schemas with your SDK's schema helper instead of writing them by hand.",
|
|
149
|
+
},
|
|
150
|
+
];
|
|
151
|
+
})),
|
|
152
|
+
}),
|
|
153
|
+
defineCheck({
|
|
154
|
+
id: "SCHEMA_REQUIRED_UNKNOWN",
|
|
155
|
+
area: "schema",
|
|
156
|
+
description: "required only lists declared properties",
|
|
157
|
+
appliesTo: hasTools,
|
|
158
|
+
run: (s) => schemas(s, "inputSchema").flatMap(([t, schema]) => {
|
|
159
|
+
if (!Array.isArray(schema.required))
|
|
160
|
+
return [];
|
|
161
|
+
const props = isObject(schema.properties) ? schema.properties : {};
|
|
162
|
+
const unknown = schema.required.filter((r) => typeof r === "string" && !(r in props));
|
|
163
|
+
if (unknown.length === 0)
|
|
164
|
+
return [];
|
|
165
|
+
return [
|
|
166
|
+
{
|
|
167
|
+
checkId: "SCHEMA_REQUIRED_UNKNOWN",
|
|
168
|
+
severity: "warn",
|
|
169
|
+
subject: toolName(t),
|
|
170
|
+
message: `required lists ${unknown.map((u) => JSON.stringify(u)).join(", ")}, which ${unknown.length === 1 ? "is" : "are"} not in properties; the model can't know their type.`,
|
|
171
|
+
fix: "Add the missing properties or remove them from required.",
|
|
172
|
+
},
|
|
173
|
+
];
|
|
174
|
+
}),
|
|
175
|
+
}),
|
|
176
|
+
defineCheck({
|
|
177
|
+
id: "SCHEMA_TOP_LEVEL_COMBINATOR",
|
|
178
|
+
area: "schema",
|
|
179
|
+
description: "inputSchema has no root-level oneOf/anyOf/allOf/not",
|
|
180
|
+
appliesTo: hasTools,
|
|
181
|
+
run: (s) => schemas(s, "inputSchema").flatMap(([t, schema]) => {
|
|
182
|
+
const used = COMBINATORS.filter((k) => k in schema);
|
|
183
|
+
if (used.length === 0)
|
|
184
|
+
return [];
|
|
185
|
+
return [
|
|
186
|
+
{
|
|
187
|
+
checkId: "SCHEMA_TOP_LEVEL_COMBINATOR",
|
|
188
|
+
severity: "info",
|
|
189
|
+
subject: toolName(t),
|
|
190
|
+
message: `inputSchema uses ${used.join("/")} at the root. Valid JSON Schema, but clients handle it differently: some rewrite it (Claude Code), and some fail on it (see client-specific results).`,
|
|
191
|
+
fix: "Use one flat object schema; express variants with optional properties or an enum discriminator.",
|
|
192
|
+
},
|
|
193
|
+
];
|
|
194
|
+
}),
|
|
195
|
+
}),
|
|
196
|
+
defineCheck({
|
|
197
|
+
id: "SCHEMA_UNSUPPORTED_KEYWORD",
|
|
198
|
+
area: "schema",
|
|
199
|
+
description: "Schemas avoid keywords a client rejects or drops",
|
|
200
|
+
appliesTo: hasTools,
|
|
201
|
+
run: (s, { profiles }) => profiles.flatMap((p) => {
|
|
202
|
+
const rule = p.limits.schemaUnsupported;
|
|
203
|
+
if (!rule)
|
|
204
|
+
return [];
|
|
205
|
+
return schemas(s, "inputSchema").flatMap(([t, schema]) => {
|
|
206
|
+
const { keywords } = analyze(schema);
|
|
207
|
+
const bad = rule.value.filter((k) => keywords.has(k));
|
|
208
|
+
if (bad.length === 0)
|
|
209
|
+
return [];
|
|
210
|
+
return [
|
|
211
|
+
{
|
|
212
|
+
checkId: "SCHEMA_UNSUPPORTED_KEYWORD",
|
|
213
|
+
severity: "warn",
|
|
214
|
+
subject: toolName(t),
|
|
215
|
+
client: p.id,
|
|
216
|
+
source: rule.source,
|
|
217
|
+
message: withNote(`inputSchema uses ${bad.join(", ")}, which ${p.displayName} does not support.`, rule.note),
|
|
218
|
+
fix: "Inline definitions and simplify the schema for maximum compatibility.",
|
|
219
|
+
},
|
|
220
|
+
];
|
|
221
|
+
});
|
|
222
|
+
}),
|
|
223
|
+
}),
|
|
224
|
+
defineCheck({
|
|
225
|
+
id: "SCHEMA_PROPERTY_NAME_REJECTED",
|
|
226
|
+
area: "schema",
|
|
227
|
+
description: "Top-level input property names match each client's rules",
|
|
228
|
+
appliesTo: hasTools,
|
|
229
|
+
run: (s, { profiles }) => profiles.flatMap((p) => {
|
|
230
|
+
const rule = p.limits.inputPropertyNamePattern;
|
|
231
|
+
if (!rule)
|
|
232
|
+
return [];
|
|
233
|
+
const pattern = new RegExp(rule.value);
|
|
234
|
+
return schemas(s, "inputSchema").flatMap(([t, schema]) => {
|
|
235
|
+
const names = isObject(schema.properties) ? Object.keys(schema.properties) : [];
|
|
236
|
+
const bad = names.filter((n) => !pattern.test(n));
|
|
237
|
+
if (bad.length === 0)
|
|
238
|
+
return [];
|
|
239
|
+
return [
|
|
240
|
+
{
|
|
241
|
+
checkId: "SCHEMA_PROPERTY_NAME_REJECTED",
|
|
242
|
+
severity: "warn",
|
|
243
|
+
subject: toolName(t),
|
|
244
|
+
client: p.id,
|
|
245
|
+
source: rule.source,
|
|
246
|
+
message: withNote(`Property name(s) ${bad.map((b) => JSON.stringify(b)).join(", ")} don't match /${rule.value}/, so ${p.displayName} may drop this tool.`, rule.note),
|
|
247
|
+
fix: "Rename arguments to 1-64 characters of letters, digits, _, - and .",
|
|
248
|
+
},
|
|
249
|
+
];
|
|
250
|
+
});
|
|
251
|
+
}),
|
|
252
|
+
}),
|
|
253
|
+
defineCheck({
|
|
254
|
+
id: "SCHEMA_EMPTY_ENUM",
|
|
255
|
+
area: "schema",
|
|
256
|
+
description: "enum lists have at least one value",
|
|
257
|
+
appliesTo: hasTools,
|
|
258
|
+
run: (s) => schemas(s, "inputSchema").flatMap(([t, schema]) => {
|
|
259
|
+
const empty = enumPaths(schema).filter(([, values]) => values.length === 0).map(([path]) => path);
|
|
260
|
+
if (empty.length === 0)
|
|
261
|
+
return [];
|
|
262
|
+
return [
|
|
263
|
+
{
|
|
264
|
+
checkId: "SCHEMA_EMPTY_ENUM",
|
|
265
|
+
severity: "warn",
|
|
266
|
+
subject: toolName(t),
|
|
267
|
+
message: `Empty enum at ${empty.join(", ")}: no value can satisfy it, so the tool can never be called correctly.`,
|
|
268
|
+
fix: "List the allowed values, or remove enum.",
|
|
269
|
+
},
|
|
270
|
+
];
|
|
271
|
+
}),
|
|
272
|
+
}),
|
|
273
|
+
defineCheck({
|
|
274
|
+
id: "SCHEMA_ROOT_COMBINATOR_CLIENT",
|
|
275
|
+
area: "schema",
|
|
276
|
+
description: "Root-level oneOf/anyOf/allOf is shaped the way each client can handle",
|
|
277
|
+
appliesTo: hasTools,
|
|
278
|
+
run: (s, { profiles }) => profiles.flatMap((p) => {
|
|
279
|
+
const rule = p.limits.rootCombinatorNonObject;
|
|
280
|
+
if (!rule)
|
|
281
|
+
return [];
|
|
282
|
+
const bad = schemas(s, "inputSchema").filter(([, schema]) => rootCombinatorBreaks(schema));
|
|
283
|
+
if (bad.length === 0)
|
|
284
|
+
return [];
|
|
285
|
+
return [
|
|
286
|
+
{
|
|
287
|
+
checkId: "SCHEMA_ROOT_COMBINATOR_CLIENT",
|
|
288
|
+
severity: "error",
|
|
289
|
+
subject: bad.map(([t]) => toolName(t)).join(", "),
|
|
290
|
+
client: p.id,
|
|
291
|
+
source: rule.source,
|
|
292
|
+
message: `${bad.length} tool(s) have no root type and a root-level oneOf/anyOf with a branch that isn't type: "object" (or an allOf without one); ${p.displayName} fails to register them and drops every tool from this server.`,
|
|
293
|
+
fix: 'Add "type": "object" at the root (MCP requires it anyway), or make every branch type: "object".',
|
|
294
|
+
},
|
|
295
|
+
];
|
|
296
|
+
}),
|
|
297
|
+
}),
|
|
298
|
+
defineCheck({
|
|
299
|
+
id: "SCHEMA_TYPE_ARRAY_CLIENT",
|
|
300
|
+
area: "schema",
|
|
301
|
+
description: 'Type arrays (e.g. ["string","null"]) avoided for clients that fail on them',
|
|
302
|
+
appliesTo: hasTools,
|
|
303
|
+
run: (s, { profiles }) => profiles.flatMap((p) => {
|
|
304
|
+
const rule = p.limits.typeArraysRejected;
|
|
305
|
+
if (!rule?.value)
|
|
306
|
+
return [];
|
|
307
|
+
const bad = schemas(s, "inputSchema").filter(([, schema]) => analyze(schema).typeArrays.length > 0);
|
|
308
|
+
if (bad.length === 0)
|
|
309
|
+
return [];
|
|
310
|
+
return [
|
|
311
|
+
{
|
|
312
|
+
checkId: "SCHEMA_TYPE_ARRAY_CLIENT",
|
|
313
|
+
severity: "warn",
|
|
314
|
+
subject: bad.map(([t]) => toolName(t)).join(", "),
|
|
315
|
+
client: p.id,
|
|
316
|
+
source: rule.source,
|
|
317
|
+
message: withNote(`${bad.length} tool(s) use type arrays such as ["string","null"], which ${p.displayName}'s argument validation rejects.`, rule.note),
|
|
318
|
+
fix: "Make the property optional instead of nullable, or use a single type.",
|
|
319
|
+
},
|
|
320
|
+
];
|
|
321
|
+
}),
|
|
322
|
+
}),
|
|
323
|
+
defineCheck({
|
|
324
|
+
id: "SCHEMA_KEYWORDS_DROPPED",
|
|
325
|
+
area: "schema",
|
|
326
|
+
description: "Notes schema constraints a client removes before the model sees them",
|
|
327
|
+
appliesTo: hasTools,
|
|
328
|
+
run: (s, { profiles }) => profiles.flatMap((p) => {
|
|
329
|
+
const rule = p.limits.schemaDroppedKeywords;
|
|
330
|
+
if (!rule)
|
|
331
|
+
return [];
|
|
332
|
+
const used = new Set(schemas(s, "inputSchema").flatMap(([, schema]) => [...analyze(schema).keywords]));
|
|
333
|
+
const dropped = rule.value.filter((k) => used.has(k));
|
|
334
|
+
if (dropped.length === 0)
|
|
335
|
+
return [];
|
|
336
|
+
return [
|
|
337
|
+
{
|
|
338
|
+
checkId: "SCHEMA_KEYWORDS_DROPPED",
|
|
339
|
+
severity: "info",
|
|
340
|
+
client: p.id,
|
|
341
|
+
source: rule.source,
|
|
342
|
+
message: `${p.displayName} silently removes ${dropped.join(", ")} from schemas, so the model never sees those constraints.`,
|
|
343
|
+
fix: "Validate arguments on the server and state important constraints in descriptions.",
|
|
344
|
+
},
|
|
345
|
+
];
|
|
346
|
+
}),
|
|
347
|
+
}),
|
|
348
|
+
defineCheck({
|
|
349
|
+
id: "SCHEMA_TOO_LARGE",
|
|
350
|
+
area: "schema",
|
|
351
|
+
description: "inputSchema fits each client's size limit",
|
|
352
|
+
appliesTo: hasTools,
|
|
353
|
+
run: (s, { profiles }) => profiles.flatMap((p) => {
|
|
354
|
+
const limit = p.limits.maxSchemaChars;
|
|
355
|
+
if (!limit)
|
|
356
|
+
return [];
|
|
357
|
+
return schemas(s, "inputSchema")
|
|
358
|
+
.map(([t, schema]) => [toolName(t), JSON.stringify(schema).length])
|
|
359
|
+
.filter(([, size]) => size > limit.value)
|
|
360
|
+
.map(([name, size]) => ({
|
|
361
|
+
checkId: "SCHEMA_TOO_LARGE",
|
|
362
|
+
severity: "warn",
|
|
363
|
+
subject: name,
|
|
364
|
+
client: p.id,
|
|
365
|
+
source: limit.source,
|
|
366
|
+
message: withNote(`inputSchema is about ${size} characters; ${p.displayName} compacts schemas over ${limit.value}.`, limit.note),
|
|
367
|
+
fix: "Trim long descriptions and nested definitions, or split the tool.",
|
|
368
|
+
}));
|
|
369
|
+
}),
|
|
370
|
+
}),
|
|
371
|
+
defineCheck({
|
|
372
|
+
id: "SCHEMA_PROPERTY_NO_TYPE",
|
|
373
|
+
area: "schema",
|
|
374
|
+
description: "Every input property declares a type",
|
|
375
|
+
appliesTo: hasTools,
|
|
376
|
+
run: (s) => schemas(s, "inputSchema").flatMap(([t, schema]) => {
|
|
377
|
+
const { untypedProperties } = analyze(schema);
|
|
378
|
+
if (untypedProperties.length === 0)
|
|
379
|
+
return [];
|
|
380
|
+
return [
|
|
381
|
+
{
|
|
382
|
+
checkId: "SCHEMA_PROPERTY_NO_TYPE",
|
|
383
|
+
severity: "info",
|
|
384
|
+
subject: toolName(t),
|
|
385
|
+
message: `Properties without a type: ${untypedProperties.slice(0, 5).join(", ")}${untypedProperties.length > 5 ? ", …" : ""}.`,
|
|
386
|
+
fix: "Give every property a type so the model sends the right kind of value.",
|
|
387
|
+
},
|
|
388
|
+
];
|
|
389
|
+
}),
|
|
390
|
+
}),
|
|
391
|
+
defineCheck({
|
|
392
|
+
id: "SCHEMA_TOO_DEEP",
|
|
393
|
+
area: "schema",
|
|
394
|
+
description: `inputSchema nests at most ${MAX_DEPTH} levels`,
|
|
395
|
+
appliesTo: hasTools,
|
|
396
|
+
run: (s) => schemas(s, "inputSchema").flatMap(([t, schema]) => {
|
|
397
|
+
const { depth } = analyze(schema);
|
|
398
|
+
if (depth <= MAX_DEPTH)
|
|
399
|
+
return [];
|
|
400
|
+
return [
|
|
401
|
+
{
|
|
402
|
+
checkId: "SCHEMA_TOO_DEEP",
|
|
403
|
+
severity: "info",
|
|
404
|
+
subject: toolName(t),
|
|
405
|
+
message: `inputSchema nests ${depth} levels deep; models fill deeply nested arguments unreliably.`,
|
|
406
|
+
fix: "Flatten the arguments where you can.",
|
|
407
|
+
},
|
|
408
|
+
];
|
|
409
|
+
}),
|
|
410
|
+
}),
|
|
411
|
+
];
|
|
412
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/checks/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type UpgradeAdvice } from "../sdk-facts.js";
|
|
2
|
+
import type { ServerSnapshot } from "../snapshot.js";
|
|
3
|
+
export declare function adviceFor(s: ServerSnapshot): UpgradeAdvice[];
|
|
4
|
+
/**
|
|
5
|
+
* The concrete next step for protocol findings: the exact upgrade command when
|
|
6
|
+
* we know the project, otherwise how to get one.
|
|
7
|
+
*/
|
|
8
|
+
export declare function upgradeHint(s: ServerSnapshot, wantModern?: boolean): string;
|
|
9
|
+
export declare const sdkChecks: import("./types.js").Check[];
|
|
10
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/checks/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKrD,wBAAgB,SAAS,CAAC,CAAC,EAAE,cAAc,GAAG,aAAa,EAAE,CAE5D;AAOD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,cAAc,EAAE,UAAU,UAAQ,GAAG,MAAM,CAYzE;AAED,eAAO,MAAM,SAAS,8BAoCrB,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { adviseUpgrade, SDK_FACTS } from "../sdk-facts.js";
|
|
2
|
+
import { defineCheck } from "./types.js";
|
|
3
|
+
const LATEST_HANDSHAKE = "2025-11-25";
|
|
4
|
+
export function adviceFor(s) {
|
|
5
|
+
return (s.project?.sdks ?? []).map(adviseUpgrade);
|
|
6
|
+
}
|
|
7
|
+
const protocolIsOld = (s) => {
|
|
8
|
+
const v = s.initialize?.negotiatedProtocolVersion;
|
|
9
|
+
return s.era !== "modern" && !!v && v < LATEST_HANDSHAKE;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* The concrete next step for protocol findings: the exact upgrade command when
|
|
13
|
+
* we know the project, otherwise how to get one.
|
|
14
|
+
*/
|
|
15
|
+
export function upgradeHint(s, wantModern = false) {
|
|
16
|
+
const advice = adviceFor(s);
|
|
17
|
+
const actionable = advice.filter((a) => a.command && (a.kind === "minor" || a.kind === "major") && (!wantModern || a.addsModern));
|
|
18
|
+
if (actionable.length)
|
|
19
|
+
return actionable.map((a) => `${a.summary} Run: ${a.command}`).join(" ");
|
|
20
|
+
const migrate = advice.find((a) => a.kind === "migrate");
|
|
21
|
+
if (wantModern && migrate)
|
|
22
|
+
return `${migrate.summary}`;
|
|
23
|
+
if (advice.length && advice.every((a) => a.kind === "current")) {
|
|
24
|
+
return "Your MCP SDK is already the latest release; check whether the server pins an older protocolVersion.";
|
|
25
|
+
}
|
|
26
|
+
return s.target.kind === "stdio"
|
|
27
|
+
? "Upgrade your MCP SDK. Run `mcp-use-compat upgrade -- <your server command>` in the server's project for the exact command."
|
|
28
|
+
: "Upgrade the server's MCP SDK. Run `mcp-use-compat upgrade -- <server command>` in its project for the exact command.";
|
|
29
|
+
}
|
|
30
|
+
export const sdkChecks = [
|
|
31
|
+
defineCheck({
|
|
32
|
+
id: "SDK_OUTDATED",
|
|
33
|
+
area: "sdk",
|
|
34
|
+
description: "The server's MCP SDK is the latest release",
|
|
35
|
+
appliesTo: (s) => (s.project?.sdks.length ?? 0) > 0,
|
|
36
|
+
run: (s) => adviceFor(s).flatMap((a) => {
|
|
37
|
+
if (a.kind === "current" || a.kind === "unknown")
|
|
38
|
+
return [];
|
|
39
|
+
const fact = SDK_FACTS[a.sdk.name];
|
|
40
|
+
if (a.kind === "migrate") {
|
|
41
|
+
if (s.discover?.ok)
|
|
42
|
+
return [];
|
|
43
|
+
return [
|
|
44
|
+
{
|
|
45
|
+
checkId: "SDK_OUTDATED",
|
|
46
|
+
severity: "info",
|
|
47
|
+
subject: a.sdk.name,
|
|
48
|
+
message: a.summary,
|
|
49
|
+
source: fact?.source,
|
|
50
|
+
fix: `Plan a migration to ${fact?.migrateTo} when your target clients need 2026-07-28.`,
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
return [
|
|
55
|
+
{
|
|
56
|
+
checkId: "SDK_OUTDATED",
|
|
57
|
+
severity: protocolIsOld(s) ? "warn" : "info",
|
|
58
|
+
subject: a.sdk.name,
|
|
59
|
+
message: `${a.summary}${protocolIsOld(s) ? ` The server negotiates ${s.initialize.negotiatedProtocolVersion}; upgrading is the usual fix.` : ""}`,
|
|
60
|
+
evidence: { installed: a.sdk.installed, declared: a.sdk.declared, latest: a.sdk.latest, manifest: a.sdk.manifest, manager: a.sdk.manager },
|
|
61
|
+
source: fact?.source,
|
|
62
|
+
fix: `Run: ${a.command}${a.kind === "major" ? " (major upgrade: read the release notes first)" : ""}`,
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
}),
|
|
66
|
+
}),
|
|
67
|
+
];
|
|
68
|
+
//# sourceMappingURL=sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/checks/sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ClientProfile } from "../profiles/types.js";
|
|
2
|
+
import type { ServerSnapshot } from "../snapshot.js";
|
|
3
|
+
/** Tool name format from the MCP spec (SEP-986), as enforced by the SDK. */
|
|
4
|
+
export declare const SPEC_TOOL_NAME: RegExp;
|
|
5
|
+
/** The first word of a tool name, lowercased: get_user → get, createEvent → create, files.read → files. */
|
|
6
|
+
export declare function leadingVerb(name: string): string;
|
|
7
|
+
/** "read" / "write" from the tool name's leading verb, or undefined if it doesn't say. */
|
|
8
|
+
export declare function nameIntent(name: string): "read" | "write" | undefined;
|
|
9
|
+
/** Replaces characters outside the allowed class with "_". */
|
|
10
|
+
export declare function sanitize(name: string, allowed: string): string;
|
|
11
|
+
/** The prefix a client puts in front of this server's tool names ("" if none/unknown). */
|
|
12
|
+
export declare function clientPrefix(s: ServerSnapshot, p: ClientProfile): string;
|
|
13
|
+
/** The name the client ends up using, applying only documented replace/truncate behaviour. */
|
|
14
|
+
export declare function clientToolName(s: ServerSnapshot, p: ClientProfile, name: string): string;
|
|
15
|
+
/** Start and end joined by "..." (Gemini CLI's scheme: 30 + "..." + 30 for a 63 limit). */
|
|
16
|
+
export declare function truncateMiddle(name: string, max: number): string;
|
|
17
|
+
export declare const toolChecks: import("./types.js").Check[];
|
|
18
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/checks/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAI9D,4EAA4E;AAC5E,eAAO,MAAM,cAAc,QAA4B,CAAC;AAexD,2GAA2G;AAC3G,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAGrE;AAID,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CASxE;AAED,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CASxF;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,eAAO,MAAM,UAAU,8BA+XtB,CAAC"}
|