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,70 @@
|
|
|
1
|
+
import type { Check, CheckArea, Finding } from "./checks/types.js";
|
|
2
|
+
import type { ClientProfile } from "./profiles/types.js";
|
|
3
|
+
import type { ServerSnapshot, Target } from "./snapshot.js";
|
|
4
|
+
export type Status = "pass" | "warn" | "fail" | "info" | "skip";
|
|
5
|
+
export interface Row {
|
|
6
|
+
checkId: string;
|
|
7
|
+
area: CheckArea;
|
|
8
|
+
status: Status;
|
|
9
|
+
message: string;
|
|
10
|
+
subject?: string;
|
|
11
|
+
fix?: string;
|
|
12
|
+
source?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ClientVerdict {
|
|
15
|
+
client: string;
|
|
16
|
+
displayName: string;
|
|
17
|
+
rows: Row[];
|
|
18
|
+
summary: Record<Status, number>;
|
|
19
|
+
}
|
|
20
|
+
export interface Report {
|
|
21
|
+
schemaVersion: 1;
|
|
22
|
+
tool: {
|
|
23
|
+
name: string;
|
|
24
|
+
version: string;
|
|
25
|
+
};
|
|
26
|
+
generatedAt: string;
|
|
27
|
+
target: Target;
|
|
28
|
+
server: {
|
|
29
|
+
connected: boolean;
|
|
30
|
+
/** Protocol generation the checks ran over. */
|
|
31
|
+
era: "legacy" | "modern" | "both";
|
|
32
|
+
/** Per protocol version: did it work, and what did the server answer (--version-matrix). */
|
|
33
|
+
versions?: Array<{
|
|
34
|
+
version: string;
|
|
35
|
+
ok: boolean;
|
|
36
|
+
negotiated?: string;
|
|
37
|
+
}>;
|
|
38
|
+
name?: string;
|
|
39
|
+
version?: string;
|
|
40
|
+
protocolVersion?: string;
|
|
41
|
+
counts: {
|
|
42
|
+
tools: number;
|
|
43
|
+
resources: number;
|
|
44
|
+
resourceTemplates: number;
|
|
45
|
+
prompts: number;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
checks: Array<{
|
|
49
|
+
id: string;
|
|
50
|
+
area: CheckArea;
|
|
51
|
+
description: string;
|
|
52
|
+
ran: boolean;
|
|
53
|
+
}>;
|
|
54
|
+
/** Everything the checks found, client-independent and client-specific. */
|
|
55
|
+
findings: Finding[];
|
|
56
|
+
clients: ClientVerdict[];
|
|
57
|
+
}
|
|
58
|
+
export declare function runChecks(snapshot: ServerSnapshot, checks: Check[], profiles: ClientProfile[]): {
|
|
59
|
+
ran: Set<string>;
|
|
60
|
+
findings: Finding[];
|
|
61
|
+
};
|
|
62
|
+
/** Status of a client-independent finding for one client (see plan §5). */
|
|
63
|
+
export declare function statusFor(finding: Finding, profile: ClientProfile): {
|
|
64
|
+
status: Status;
|
|
65
|
+
note?: string;
|
|
66
|
+
source?: string;
|
|
67
|
+
};
|
|
68
|
+
export declare function evaluate(snapshot: ServerSnapshot, checks: Check[], profiles: ClientProfile[]): Report;
|
|
69
|
+
export declare function sortFindings(findings: Finding[]): Finding[];
|
|
70
|
+
//# sourceMappingURL=evaluate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5D,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,MAAM;IACrB,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QACN,SAAS,EAAE,OAAO,CAAC;QACnB,+CAA+C;QAC/C,GAAG,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;QAClC,4FAA4F;QAC5F,QAAQ,CAAC,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,OAAO,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACxE,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,iBAAiB,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1F,CAAC;IACF,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAClF,2EAA2E;IAC3E,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAID,wBAAgB,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;;;EAS7F;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAYtH;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,CA+DrG;AAUD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAQ3D"}
|
package/dist/evaluate.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { TOOL_NAME, VERSION } from "./version.js";
|
|
2
|
+
const SEVERITY_STATUS = { error: "fail", warn: "warn", info: "info" };
|
|
3
|
+
export function runChecks(snapshot, checks, profiles) {
|
|
4
|
+
const ran = new Set();
|
|
5
|
+
const findings = [];
|
|
6
|
+
for (const check of checks) {
|
|
7
|
+
if (!check.appliesTo(snapshot))
|
|
8
|
+
continue;
|
|
9
|
+
ran.add(check.id);
|
|
10
|
+
findings.push(...check.run(snapshot, { profiles }));
|
|
11
|
+
}
|
|
12
|
+
return { ran, findings };
|
|
13
|
+
}
|
|
14
|
+
/** Status of a client-independent finding for one client (see plan §5). */
|
|
15
|
+
export function statusFor(finding, profile) {
|
|
16
|
+
const base = SEVERITY_STATUS[finding.severity];
|
|
17
|
+
if (!finding.affects?.length || base === "info")
|
|
18
|
+
return { status: base };
|
|
19
|
+
const unsupported = finding.affects.map((f) => profile.supports[f]).filter((s) => s?.value === false);
|
|
20
|
+
if (unsupported.length === finding.affects.length) {
|
|
21
|
+
return {
|
|
22
|
+
status: "info",
|
|
23
|
+
note: `Not relevant to ${profile.displayName}: it does not use ${finding.affects.join("/")}.`,
|
|
24
|
+
source: unsupported[0].source,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return { status: base };
|
|
28
|
+
}
|
|
29
|
+
export function evaluate(snapshot, checks, profiles) {
|
|
30
|
+
const { ran, findings } = runChecks(snapshot, checks, profiles);
|
|
31
|
+
const clients = profiles.map((profile) => {
|
|
32
|
+
const rows = [];
|
|
33
|
+
for (const check of checks) {
|
|
34
|
+
if (!ran.has(check.id)) {
|
|
35
|
+
rows.push({ checkId: check.id, area: check.area, status: "skip", message: "Not applicable" });
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const relevant = findings.filter((f) => f.checkId === check.id && (!f.client || f.client === profile.id));
|
|
39
|
+
if (relevant.length === 0) {
|
|
40
|
+
rows.push({ checkId: check.id, area: check.area, status: "pass", message: check.description });
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
for (const f of relevant) {
|
|
44
|
+
const { status, note, source } = f.client ? { status: SEVERITY_STATUS[f.severity], note: undefined, source: f.source } : statusFor(f, profile);
|
|
45
|
+
rows.push({
|
|
46
|
+
checkId: f.checkId,
|
|
47
|
+
area: check.area,
|
|
48
|
+
status,
|
|
49
|
+
message: note ? `${f.message} (${note})` : f.message,
|
|
50
|
+
subject: f.subject,
|
|
51
|
+
fix: f.fix,
|
|
52
|
+
source: source ?? f.source,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { client: profile.id, displayName: profile.displayName, rows, summary: summarize(rows) };
|
|
57
|
+
});
|
|
58
|
+
const count = (kind) => snapshot.lists[kind]?.items.length ?? 0;
|
|
59
|
+
const info = snapshot.initialize?.serverInfo;
|
|
60
|
+
return {
|
|
61
|
+
schemaVersion: 1,
|
|
62
|
+
tool: { name: TOOL_NAME, version: VERSION },
|
|
63
|
+
generatedAt: new Date().toISOString(),
|
|
64
|
+
target: snapshot.target,
|
|
65
|
+
server: {
|
|
66
|
+
connected: snapshot.connect.ok,
|
|
67
|
+
era: snapshot.era ?? "legacy",
|
|
68
|
+
versions: snapshot.versionMatrix
|
|
69
|
+
? [
|
|
70
|
+
...snapshot.versionMatrix.map((v) => ({ version: v.requested, ok: v.ok, negotiated: v.negotiated })),
|
|
71
|
+
...(snapshot.modern
|
|
72
|
+
? [{ version: snapshot.modern.version, ok: snapshot.modern.supported, negotiated: snapshot.modern.supported ? snapshot.modern.version : undefined }]
|
|
73
|
+
: []),
|
|
74
|
+
]
|
|
75
|
+
: undefined,
|
|
76
|
+
name: typeof info?.name === "string" ? info.name : undefined,
|
|
77
|
+
version: typeof info?.version === "string" ? info.version : undefined,
|
|
78
|
+
protocolVersion: snapshot.initialize?.negotiatedProtocolVersion,
|
|
79
|
+
counts: {
|
|
80
|
+
tools: count("tools"),
|
|
81
|
+
resources: count("resources"),
|
|
82
|
+
resourceTemplates: count("resourceTemplates"),
|
|
83
|
+
prompts: count("prompts"),
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
checks: checks.map((c) => ({ id: c.id, area: c.area, description: c.description, ran: ran.has(c.id) })),
|
|
87
|
+
findings: sortFindings(findings),
|
|
88
|
+
clients,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function summarize(rows) {
|
|
92
|
+
const summary = { pass: 0, warn: 0, fail: 0, info: 0, skip: 0 };
|
|
93
|
+
for (const r of rows)
|
|
94
|
+
summary[r.status]++;
|
|
95
|
+
return summary;
|
|
96
|
+
}
|
|
97
|
+
const SEVERITY_ORDER = { error: 0, warn: 1, info: 2 };
|
|
98
|
+
export function sortFindings(findings) {
|
|
99
|
+
return [...findings].sort((a, b) => SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity] ||
|
|
100
|
+
a.checkId.localeCompare(b.checkId) ||
|
|
101
|
+
(a.client ?? "").localeCompare(b.client ?? "") ||
|
|
102
|
+
(a.subject ?? "").localeCompare(b.subject ?? ""));
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../src/explain.ts"],"names":[],"mappings":"AAMA,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAiCzD;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG/C"}
|
package/dist/explain.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ALL_CHECKS } from "./checks/index.js";
|
|
2
|
+
import { EXPLANATIONS } from "./checks/explanations.js";
|
|
3
|
+
import { UsageError } from "./cli.js";
|
|
4
|
+
import { ALL_PROFILES } from "./profiles/index.js";
|
|
5
|
+
/** Renders the explanation for one check (id matching is case-insensitive). */
|
|
6
|
+
export function renderExplanation(checkId) {
|
|
7
|
+
const id = checkId.toUpperCase();
|
|
8
|
+
const check = ALL_CHECKS.find((c) => c.id === id);
|
|
9
|
+
if (!check) {
|
|
10
|
+
const words = id.split("_").filter((w) => w.length > 2);
|
|
11
|
+
const similar = ALL_CHECKS.filter((c) => words.some((w) => c.id.includes(w))).map((c) => c.id);
|
|
12
|
+
throw new UsageError(`Unknown check "${checkId}".${similar.length ? ` Did you mean: ${similar.slice(0, 5).join(", ")}?` : ""} See list-checks.`);
|
|
13
|
+
}
|
|
14
|
+
const e = EXPLANATIONS[id];
|
|
15
|
+
const lines = [`${check.id} (${check.area})`, "", check.description + ".", ""];
|
|
16
|
+
if (e) {
|
|
17
|
+
lines.push(e.why, "");
|
|
18
|
+
if (e.sources?.length)
|
|
19
|
+
lines.push("Sources:", ...e.sources.map((s) => ` ${s}`), "");
|
|
20
|
+
const facts = [];
|
|
21
|
+
for (const p of ALL_PROFILES) {
|
|
22
|
+
for (const key of e.limits ?? []) {
|
|
23
|
+
const fact = p.limits[key];
|
|
24
|
+
if (fact)
|
|
25
|
+
facts.push(` ${p.displayName}: ${key} = ${format(fact.value)} (${fact.source}, ${fact.verifiedOn})`);
|
|
26
|
+
}
|
|
27
|
+
for (const feature of e.features ?? []) {
|
|
28
|
+
const fact = p.supports[feature];
|
|
29
|
+
if (fact)
|
|
30
|
+
facts.push(` ${p.displayName}: ${feature} = ${format(fact.value)} (${fact.source}, ${fact.verifiedOn})`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (e.limits?.length || e.features?.length) {
|
|
34
|
+
lines.push("Client facts used:", ...(facts.length ? facts : [" (no client has a sourced value yet, so the check never fires)"]), "");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return lines.join("\n");
|
|
38
|
+
}
|
|
39
|
+
export function explain(checkId) {
|
|
40
|
+
process.stdout.write(renderExplanation(checkId));
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
function format(value) {
|
|
44
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=explain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain.js","sourceRoot":"","sources":["../src/explain.ts"],"names":[],"mappings":"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"}
|
package/dist/fix.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type FixOptions } from "./cli.js";
|
|
2
|
+
import type { RawItem } from "./snapshot.js";
|
|
3
|
+
export interface FixChange {
|
|
4
|
+
tool: string;
|
|
5
|
+
change: string;
|
|
6
|
+
/** Needs a human: we removed something invalid but can't write the replacement. */
|
|
7
|
+
todo?: string;
|
|
8
|
+
}
|
|
9
|
+
/** Reads tools from a snapshot, a { tools: [...] } object, or a bare array. */
|
|
10
|
+
export declare function loadTools(path: string): RawItem[];
|
|
11
|
+
/** Applies mechanical, behaviour-preserving fixes. Never invents content. */
|
|
12
|
+
export declare function fixTools(tools: RawItem[], options: {
|
|
13
|
+
rename: boolean;
|
|
14
|
+
}): {
|
|
15
|
+
tools: RawItem[];
|
|
16
|
+
changes: FixChange[];
|
|
17
|
+
};
|
|
18
|
+
export declare function runFix(options: FixOptions): number;
|
|
19
|
+
//# sourceMappingURL=fix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../src/fix.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAKD,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAajD;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAAC,OAAO,EAAE,SAAS,EAAE,CAAA;CAAE,CAmCnH;AAyCD,wBAAgB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAoBlD"}
|
package/dist/fix.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { SPEC_TOOL_NAME } from "./checks/tools.js";
|
|
3
|
+
import { UsageError } from "./cli.js";
|
|
4
|
+
const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
5
|
+
const clone = (v) => JSON.parse(JSON.stringify(v));
|
|
6
|
+
/** Reads tools from a snapshot, a { tools: [...] } object, or a bare array. */
|
|
7
|
+
export function loadTools(path) {
|
|
8
|
+
let data;
|
|
9
|
+
try {
|
|
10
|
+
data = JSON.parse(readFileSync(path, "utf8"));
|
|
11
|
+
}
|
|
12
|
+
catch (err) {
|
|
13
|
+
throw new UsageError(`${path}: ${err.message}`);
|
|
14
|
+
}
|
|
15
|
+
if (Array.isArray(data))
|
|
16
|
+
return data.filter(isObject);
|
|
17
|
+
if (isObject(data) && isObject(data.lists) && isObject(data.lists.tools) && Array.isArray(data.lists.tools.items)) {
|
|
18
|
+
return data.lists.tools.items.filter(isObject);
|
|
19
|
+
}
|
|
20
|
+
if (isObject(data) && Array.isArray(data.tools))
|
|
21
|
+
return data.tools.filter(isObject);
|
|
22
|
+
throw new UsageError(`${path}: expected a snapshot, { "tools": [...] }, or an array of tools.`);
|
|
23
|
+
}
|
|
24
|
+
/** Applies mechanical, behaviour-preserving fixes. Never invents content. */
|
|
25
|
+
export function fixTools(tools, options) {
|
|
26
|
+
const changes = [];
|
|
27
|
+
const names = new Set(tools.map((t) => t.name).filter((n) => typeof n === "string"));
|
|
28
|
+
const fixed = tools.map((original) => {
|
|
29
|
+
const tool = clone(original);
|
|
30
|
+
const name = typeof tool.name === "string" ? tool.name : "(unnamed)";
|
|
31
|
+
const note = (change, todo) => changes.push({ tool: name, change, ...(todo ? { todo } : {}) });
|
|
32
|
+
if (tool.description === null || (typeof tool.description === "string" && tool.description.trim() === "")) {
|
|
33
|
+
delete tool.description;
|
|
34
|
+
note("Removed null/empty description (absent is valid; null breaks SDK clients).", "Write a description of what the tool does and when to use it.");
|
|
35
|
+
}
|
|
36
|
+
if (!isObject(tool.inputSchema)) {
|
|
37
|
+
tool.inputSchema = { type: "object", properties: {} };
|
|
38
|
+
note('Added inputSchema { "type": "object", "properties": {} }.', "If the tool takes arguments, describe them.");
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
fixSchema(tool.inputSchema, "inputSchema", note, true);
|
|
42
|
+
}
|
|
43
|
+
if (isObject(tool.outputSchema))
|
|
44
|
+
fixSchema(tool.outputSchema, "outputSchema", note, true);
|
|
45
|
+
if (options.rename && typeof tool.name === "string" && !/^[A-Za-z0-9_-]{1,64}$/.test(tool.name)) {
|
|
46
|
+
let renamed = tool.name.replace(/[^A-Za-z0-9_-]/g, "_").slice(0, 64) || "tool";
|
|
47
|
+
while (names.has(renamed) && renamed !== tool.name)
|
|
48
|
+
renamed = `${renamed.slice(0, 62)}_2`;
|
|
49
|
+
names.add(renamed);
|
|
50
|
+
note(`Renamed to "${renamed}" (letters, digits, _ and - only; ≤ 64 characters).`, "Update callers, prompts and docs that use the old name.");
|
|
51
|
+
tool.name = renamed;
|
|
52
|
+
}
|
|
53
|
+
else if (typeof tool.name === "string" && !SPEC_TOOL_NAME.test(tool.name)) {
|
|
54
|
+
note("Name is not a valid MCP tool name.", "Rename it, or run fix with --rename.");
|
|
55
|
+
}
|
|
56
|
+
return tool;
|
|
57
|
+
});
|
|
58
|
+
return { tools: fixed, changes };
|
|
59
|
+
}
|
|
60
|
+
function fixSchema(schema, path, note, root) {
|
|
61
|
+
if (root && schema.type !== "object") {
|
|
62
|
+
if (isObject(schema.properties)) {
|
|
63
|
+
note(`${path}: set root type to "object" (was ${JSON.stringify(schema.type ?? null)}).`);
|
|
64
|
+
schema.type = "object";
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
note(`${path}: root type is ${JSON.stringify(schema.type ?? null)}, but MCP requires "object"; not changed automatically.`, 'Wrap the argument in an object, e.g. { "type": "object", "properties": { "value": <old schema> }, "required": ["value"] }, and update the handler.');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if ("required" in schema && !Array.isArray(schema.required)) {
|
|
71
|
+
note(`${path}: removed invalid required: ${JSON.stringify(schema.required)} (must be a list of property names).`);
|
|
72
|
+
delete schema.required;
|
|
73
|
+
}
|
|
74
|
+
const props = isObject(schema.properties) ? schema.properties : undefined;
|
|
75
|
+
if (Array.isArray(schema.required) && props) {
|
|
76
|
+
const unknown = schema.required.filter((r) => typeof r !== "string" || !(r in props));
|
|
77
|
+
if (unknown.length) {
|
|
78
|
+
schema.required = schema.required.filter((r) => typeof r === "string" && r in props);
|
|
79
|
+
note(`${path}: removed ${unknown.map((u) => JSON.stringify(u)).join(", ")} from required (not in properties).`, "If they are real arguments, add them to properties instead.");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (Array.isArray(schema.enum) && schema.enum.length === 0) {
|
|
83
|
+
delete schema.enum;
|
|
84
|
+
note(`${path}: removed an empty enum (no value could satisfy it).`, "List the allowed values if there are any.");
|
|
85
|
+
}
|
|
86
|
+
if (props) {
|
|
87
|
+
for (const [name, sub] of Object.entries(props))
|
|
88
|
+
if (isObject(sub))
|
|
89
|
+
fixSchema(sub, `${path}.${name}`, note, false);
|
|
90
|
+
}
|
|
91
|
+
if (isObject(schema.items))
|
|
92
|
+
fixSchema(schema.items, `${path}[]`, note, false);
|
|
93
|
+
}
|
|
94
|
+
export function runFix(options) {
|
|
95
|
+
const { tools, changes } = fixTools(loadTools(options.input), { rename: options.rename });
|
|
96
|
+
const output = JSON.stringify({ tools }, null, 2) + "\n";
|
|
97
|
+
if (options.out)
|
|
98
|
+
writeFileSync(options.out, output);
|
|
99
|
+
else if (options.format === "json")
|
|
100
|
+
process.stdout.write(output);
|
|
101
|
+
if (changes.length === 0) {
|
|
102
|
+
console.error("✔ Nothing to fix mechanically.");
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
console.error(`${changes.length} change(s)${options.out ? ` written to ${options.out}` : ""}:`);
|
|
106
|
+
for (const c of changes)
|
|
107
|
+
console.error(` ${c.tool}: ${c.change}${c.todo ? `\n → TODO: ${c.todo}` : ""}`);
|
|
108
|
+
console.error(options.out
|
|
109
|
+
? "\nApply these to your server code; the corrected definitions are in the output file."
|
|
110
|
+
: options.format === "json"
|
|
111
|
+
? "\nApply these to your server code; the corrected definitions are on stdout."
|
|
112
|
+
: "\nApply these to your server code. Use --json or --out <file> to get the corrected definitions.");
|
|
113
|
+
}
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=fix.js.map
|
package/dist/fix.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../src/fix.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { isCommanderExit, parseCommandLine, UsageError } from "./cli.js";
|
|
3
|
+
import { runDiff } from "./diff.js";
|
|
4
|
+
import { explain } from "./explain.js";
|
|
5
|
+
import { runFix } from "./fix.js";
|
|
6
|
+
import { runUpgrade } from "./upgrade.js";
|
|
7
|
+
import { listChecks, listClients, run, runCall, runOAuthLogin, runOAuthLogout, runOAuthStatus } from "./run.js";
|
|
8
|
+
async function dispatch(invocation) {
|
|
9
|
+
switch (invocation.command) {
|
|
10
|
+
case "check":
|
|
11
|
+
return run(invocation.options);
|
|
12
|
+
case "call":
|
|
13
|
+
return runCall(invocation.options);
|
|
14
|
+
case "diff":
|
|
15
|
+
return runDiff(invocation.options);
|
|
16
|
+
case "upgrade":
|
|
17
|
+
return runUpgrade(invocation.options);
|
|
18
|
+
case "fix":
|
|
19
|
+
return runFix(invocation.options);
|
|
20
|
+
case "explain":
|
|
21
|
+
return explain(invocation.checkId);
|
|
22
|
+
case "oauth-login":
|
|
23
|
+
return runOAuthLogin(invocation.options);
|
|
24
|
+
case "oauth-status":
|
|
25
|
+
return runOAuthStatus();
|
|
26
|
+
case "oauth-logout":
|
|
27
|
+
return runOAuthLogout(invocation.url);
|
|
28
|
+
case "list-checks":
|
|
29
|
+
return listChecks();
|
|
30
|
+
case "list-clients":
|
|
31
|
+
return listClients();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function main() {
|
|
35
|
+
try {
|
|
36
|
+
return await dispatch(parseCommandLine(process.argv.slice(2)));
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
if (isCommanderExit(err))
|
|
40
|
+
return err.exitCode === 0 ? 0 : 2;
|
|
41
|
+
if (err instanceof UsageError) {
|
|
42
|
+
console.error(`error: ${err.message}\nRun with --help for usage.`);
|
|
43
|
+
return 2;
|
|
44
|
+
}
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
main().then((code) => {
|
|
49
|
+
process.exitCode = code;
|
|
50
|
+
}, (err) => {
|
|
51
|
+
console.error(err instanceof Error ? (err.stack ?? err.message) : err);
|
|
52
|
+
process.exitCode = 2;
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAmB,MAAM,UAAU,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEhH,KAAK,UAAU,QAAQ,CAAC,UAAsB;IAC5C,QAAQ,UAAU,CAAC,OAAO,EAAE,CAAC;QAC3B,KAAK,OAAO;YACV,OAAO,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACrC,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACrC,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxC,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACrC,KAAK,aAAa;YAChB,OAAO,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3C,KAAK,cAAc;YACjB,OAAO,cAAc,EAAE,CAAC;QAC1B,KAAK,cAAc;YACjB,OAAO,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACxC,KAAK,aAAa;YAChB,OAAO,UAAU,EAAE,CAAC;QACtB,KAAK,cAAc;YACjB,OAAO,WAAW,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,eAAe,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,8BAA8B,CAAC,CAAC;YACnE,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CACT,CAAC,IAAI,EAAE,EAAE;IACP,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC1B,CAAC,EACD,CAAC,GAAY,EAAE,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CACF,CAAC"}
|
package/dist/oauth.d.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { type OAuthClientProvider, type OAuthDiscoveryState } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
2
|
+
import type { OAuthClientInformationMixed, OAuthClientMetadata, OAuthTokens } from "@modelcontextprotocol/sdk/shared/auth.js";
|
|
3
|
+
export interface StoredCredentials {
|
|
4
|
+
clientInformation?: OAuthClientInformationMixed;
|
|
5
|
+
/** How the client got its id. */
|
|
6
|
+
registration?: "cimd" | "dcr" | "preregistered";
|
|
7
|
+
tokens?: OAuthTokens;
|
|
8
|
+
/** Epoch ms when tokens were saved; with expires_in gives the expiry. */
|
|
9
|
+
tokensSavedAt?: number;
|
|
10
|
+
codeVerifier?: string;
|
|
11
|
+
discoveryState?: OAuthDiscoveryState;
|
|
12
|
+
}
|
|
13
|
+
/** Credentials per MCP server URL in ~/.config/mcp-use-compat/oauth.json (mode 0600). */
|
|
14
|
+
export declare class CredentialStore {
|
|
15
|
+
readonly path: string;
|
|
16
|
+
constructor(path?: string);
|
|
17
|
+
all(): Record<string, StoredCredentials>;
|
|
18
|
+
get(url: string): StoredCredentials;
|
|
19
|
+
update(url: string, change: (current: StoredCredentials) => StoredCredentials | undefined): void;
|
|
20
|
+
}
|
|
21
|
+
export declare function defaultStorePath(): string;
|
|
22
|
+
export interface ProviderOptions {
|
|
23
|
+
redirectUrl?: string;
|
|
24
|
+
clientId?: string;
|
|
25
|
+
clientSecret?: string;
|
|
26
|
+
/** HTTPS URL of a Client ID Metadata Document you host (used when the AS supports CIMD). */
|
|
27
|
+
clientMetadataUrl?: string;
|
|
28
|
+
scope?: string;
|
|
29
|
+
/** Called with the authorization URL. Without it, needing a login is an error. */
|
|
30
|
+
onRedirect?: (url: URL) => void | Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
/** SDK OAuthClientProvider backed by the credential store. */
|
|
33
|
+
export declare class StoredOAuthProvider implements OAuthClientProvider {
|
|
34
|
+
private readonly serverUrl;
|
|
35
|
+
private readonly store;
|
|
36
|
+
private readonly options;
|
|
37
|
+
readonly clientMetadataUrl?: string;
|
|
38
|
+
private readonly stateValue;
|
|
39
|
+
constructor(serverUrl: string, store: CredentialStore, options?: ProviderOptions);
|
|
40
|
+
/**
|
|
41
|
+
* Non-interactive providers (no onRedirect) still report a redirect URL so the SDK
|
|
42
|
+
* takes the authorization-code path and reaches redirectToAuthorization, which
|
|
43
|
+
* explains how to log in, instead of attempting a client-credentials grant.
|
|
44
|
+
*/
|
|
45
|
+
get redirectUrl(): string | undefined;
|
|
46
|
+
get clientMetadata(): OAuthClientMetadata;
|
|
47
|
+
state(): string;
|
|
48
|
+
clientInformation(): OAuthClientInformationMixed | undefined;
|
|
49
|
+
private notLoggedIn;
|
|
50
|
+
saveClientInformation(info: OAuthClientInformationMixed): void;
|
|
51
|
+
tokens(): OAuthTokens | undefined;
|
|
52
|
+
saveTokens(tokens: OAuthTokens): void;
|
|
53
|
+
redirectToAuthorization(url: URL): Promise<void>;
|
|
54
|
+
saveCodeVerifier(codeVerifier: string): void;
|
|
55
|
+
codeVerifier(): string;
|
|
56
|
+
saveDiscoveryState(state: OAuthDiscoveryState): void;
|
|
57
|
+
discoveryState(): OAuthDiscoveryState | undefined;
|
|
58
|
+
invalidateCredentials(scope: "all" | "client" | "tokens" | "verifier" | "discovery"): void;
|
|
59
|
+
}
|
|
60
|
+
export interface LoginOptions {
|
|
61
|
+
url: string;
|
|
62
|
+
callbackPort: number;
|
|
63
|
+
clientId?: string;
|
|
64
|
+
clientSecret?: string;
|
|
65
|
+
clientMetadataUrl?: string;
|
|
66
|
+
scope?: string;
|
|
67
|
+
openBrowser: boolean;
|
|
68
|
+
timeoutMs: number;
|
|
69
|
+
store?: CredentialStore;
|
|
70
|
+
/** Opens the authorization URL; defaults to the system browser. Tests pass a fake. */
|
|
71
|
+
browser?: (url: string) => void;
|
|
72
|
+
log: (msg: string) => void;
|
|
73
|
+
/** Verifies the new token with an authenticated MCP request; returns a summary. */
|
|
74
|
+
verify: (provider: StoredOAuthProvider) => Promise<string>;
|
|
75
|
+
}
|
|
76
|
+
export interface LoginStep {
|
|
77
|
+
step: string;
|
|
78
|
+
ok: boolean;
|
|
79
|
+
detail: string;
|
|
80
|
+
}
|
|
81
|
+
/** Runs the full browser login and records each step. Throws only on programmer errors. */
|
|
82
|
+
export declare function oauthLogin(options: LoginOptions): Promise<LoginStep[]>;
|
|
83
|
+
/** Human summary of stored credentials, without secrets. */
|
|
84
|
+
export declare function describeCredentials(url: string, c: StoredCredentials): string;
|
|
85
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|