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.
Files changed (225) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE +21 -0
  3. package/README.md +375 -0
  4. package/dist/checks/auth.d.ts +2 -0
  5. package/dist/checks/auth.d.ts.map +1 -0
  6. package/dist/checks/auth.js +229 -0
  7. package/dist/checks/auth.js.map +1 -0
  8. package/dist/checks/calls.d.ts +4 -0
  9. package/dist/checks/calls.d.ts.map +1 -0
  10. package/dist/checks/calls.js +192 -0
  11. package/dist/checks/calls.js.map +1 -0
  12. package/dist/checks/discovery.d.ts +3 -0
  13. package/dist/checks/discovery.d.ts.map +1 -0
  14. package/dist/checks/discovery.js +47 -0
  15. package/dist/checks/discovery.js.map +1 -0
  16. package/dist/checks/explanations.d.ts +15 -0
  17. package/dist/checks/explanations.d.ts.map +1 -0
  18. package/dist/checks/explanations.js +346 -0
  19. package/dist/checks/explanations.js.map +1 -0
  20. package/dist/checks/index.d.ts +3 -0
  21. package/dist/checks/index.d.ts.map +1 -0
  22. package/dist/checks/index.js +23 -0
  23. package/dist/checks/index.js.map +1 -0
  24. package/dist/checks/protocol.d.ts +5 -0
  25. package/dist/checks/protocol.d.ts.map +1 -0
  26. package/dist/checks/protocol.js +380 -0
  27. package/dist/checks/protocol.js.map +1 -0
  28. package/dist/checks/resources.d.ts +10 -0
  29. package/dist/checks/resources.d.ts.map +1 -0
  30. package/dist/checks/resources.js +144 -0
  31. package/dist/checks/resources.js.map +1 -0
  32. package/dist/checks/schema.d.ts +21 -0
  33. package/dist/checks/schema.d.ts.map +1 -0
  34. package/dist/checks/schema.js +412 -0
  35. package/dist/checks/schema.js.map +1 -0
  36. package/dist/checks/sdk.d.ts +10 -0
  37. package/dist/checks/sdk.d.ts.map +1 -0
  38. package/dist/checks/sdk.js +68 -0
  39. package/dist/checks/sdk.js.map +1 -0
  40. package/dist/checks/tools.d.ts +18 -0
  41. package/dist/checks/tools.d.ts.map +1 -0
  42. package/dist/checks/tools.js +422 -0
  43. package/dist/checks/tools.js.map +1 -0
  44. package/dist/checks/transport.d.ts +2 -0
  45. package/dist/checks/transport.d.ts.map +1 -0
  46. package/dist/checks/transport.js +123 -0
  47. package/dist/checks/transport.js.map +1 -0
  48. package/dist/checks/types.d.ts +37 -0
  49. package/dist/checks/types.d.ts.map +1 -0
  50. package/dist/checks/types.js +5 -0
  51. package/dist/checks/types.js.map +1 -0
  52. package/dist/checks/ui.d.ts +2 -0
  53. package/dist/checks/ui.d.ts.map +1 -0
  54. package/dist/checks/ui.js +207 -0
  55. package/dist/checks/ui.js.map +1 -0
  56. package/dist/checks/util.d.ts +20 -0
  57. package/dist/checks/util.d.ts.map +1 -0
  58. package/dist/checks/util.js +42 -0
  59. package/dist/checks/util.js.map +1 -0
  60. package/dist/cli.d.ts +110 -0
  61. package/dist/cli.d.ts.map +1 -0
  62. package/dist/cli.js +317 -0
  63. package/dist/cli.js.map +1 -0
  64. package/dist/connect/calls.d.ts +13 -0
  65. package/dist/connect/calls.d.ts.map +1 -0
  66. package/dist/connect/calls.js +130 -0
  67. package/dist/connect/calls.js.map +1 -0
  68. package/dist/connect/http.d.ts +14 -0
  69. package/dist/connect/http.d.ts.map +1 -0
  70. package/dist/connect/http.js +122 -0
  71. package/dist/connect/http.js.map +1 -0
  72. package/dist/connect/index.d.ts +41 -0
  73. package/dist/connect/index.d.ts.map +1 -0
  74. package/dist/connect/index.js +168 -0
  75. package/dist/connect/index.js.map +1 -0
  76. package/dist/connect/lists.d.ts +12 -0
  77. package/dist/connect/lists.d.ts.map +1 -0
  78. package/dist/connect/lists.js +70 -0
  79. package/dist/connect/lists.js.map +1 -0
  80. package/dist/connect/modern.d.ts +13 -0
  81. package/dist/connect/modern.d.ts.map +1 -0
  82. package/dist/connect/modern.js +169 -0
  83. package/dist/connect/modern.js.map +1 -0
  84. package/dist/connect/session.d.ts +29 -0
  85. package/dist/connect/session.d.ts.map +1 -0
  86. package/dist/connect/session.js +96 -0
  87. package/dist/connect/session.js.map +1 -0
  88. package/dist/connect/stdio.d.ts +36 -0
  89. package/dist/connect/stdio.d.ts.map +1 -0
  90. package/dist/connect/stdio.js +127 -0
  91. package/dist/connect/stdio.js.map +1 -0
  92. package/dist/diff.d.ts +23 -0
  93. package/dist/diff.d.ts.map +1 -0
  94. package/dist/diff.js +255 -0
  95. package/dist/diff.js.map +1 -0
  96. package/dist/evaluate.d.ts +70 -0
  97. package/dist/evaluate.d.ts.map +1 -0
  98. package/dist/evaluate.js +104 -0
  99. package/dist/evaluate.js.map +1 -0
  100. package/dist/explain.d.ts +4 -0
  101. package/dist/explain.d.ts.map +1 -0
  102. package/dist/explain.js +46 -0
  103. package/dist/explain.js.map +1 -0
  104. package/dist/fix.d.ts +19 -0
  105. package/dist/fix.d.ts.map +1 -0
  106. package/dist/fix.js +116 -0
  107. package/dist/fix.js.map +1 -0
  108. package/dist/index.d.ts +3 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +54 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/oauth.d.ts +85 -0
  113. package/dist/oauth.d.ts.map +1 -0
  114. package/dist/oauth.js +287 -0
  115. package/dist/oauth.js.map +1 -0
  116. package/dist/policy.d.ts +29 -0
  117. package/dist/policy.d.ts.map +1 -0
  118. package/dist/policy.js +63 -0
  119. package/dist/policy.js.map +1 -0
  120. package/dist/profiles/chatgpt.d.ts +3 -0
  121. package/dist/profiles/chatgpt.d.ts.map +1 -0
  122. package/dist/profiles/chatgpt.js +29 -0
  123. package/dist/profiles/chatgpt.js.map +1 -0
  124. package/dist/profiles/claude-code.d.ts +3 -0
  125. package/dist/profiles/claude-code.d.ts.map +1 -0
  126. package/dist/profiles/claude-code.js +62 -0
  127. package/dist/profiles/claude-code.js.map +1 -0
  128. package/dist/profiles/claude-desktop.d.ts +3 -0
  129. package/dist/profiles/claude-desktop.d.ts.map +1 -0
  130. package/dist/profiles/claude-desktop.js +51 -0
  131. package/dist/profiles/claude-desktop.js.map +1 -0
  132. package/dist/profiles/cline.d.ts +4 -0
  133. package/dist/profiles/cline.d.ts.map +1 -0
  134. package/dist/profiles/cline.js +118 -0
  135. package/dist/profiles/cline.js.map +1 -0
  136. package/dist/profiles/codex.d.ts +4 -0
  137. package/dist/profiles/codex.d.ts.map +1 -0
  138. package/dist/profiles/codex.js +168 -0
  139. package/dist/profiles/codex.js.map +1 -0
  140. package/dist/profiles/continue.d.ts +4 -0
  141. package/dist/profiles/continue.d.ts.map +1 -0
  142. package/dist/profiles/continue.js +93 -0
  143. package/dist/profiles/continue.js.map +1 -0
  144. package/dist/profiles/cursor.d.ts +3 -0
  145. package/dist/profiles/cursor.d.ts.map +1 -0
  146. package/dist/profiles/cursor.js +52 -0
  147. package/dist/profiles/cursor.js.map +1 -0
  148. package/dist/profiles/gemini-cli.d.ts +4 -0
  149. package/dist/profiles/gemini-cli.d.ts.map +1 -0
  150. package/dist/profiles/gemini-cli.js +137 -0
  151. package/dist/profiles/gemini-cli.js.map +1 -0
  152. package/dist/profiles/goose.d.ts +4 -0
  153. package/dist/profiles/goose.d.ts.map +1 -0
  154. package/dist/profiles/goose.js +114 -0
  155. package/dist/profiles/goose.js.map +1 -0
  156. package/dist/profiles/index.d.ts +7 -0
  157. package/dist/profiles/index.d.ts.map +1 -0
  158. package/dist/profiles/index.js +43 -0
  159. package/dist/profiles/index.js.map +1 -0
  160. package/dist/profiles/opencode.d.ts +3 -0
  161. package/dist/profiles/opencode.d.ts.map +1 -0
  162. package/dist/profiles/opencode.js +47 -0
  163. package/dist/profiles/opencode.js.map +1 -0
  164. package/dist/profiles/types.d.ts +86 -0
  165. package/dist/profiles/types.d.ts.map +1 -0
  166. package/dist/profiles/types.js +2 -0
  167. package/dist/profiles/types.js.map +1 -0
  168. package/dist/profiles/vscode-copilot.d.ts +3 -0
  169. package/dist/profiles/vscode-copilot.d.ts.map +1 -0
  170. package/dist/profiles/vscode-copilot.js +71 -0
  171. package/dist/profiles/vscode-copilot.js.map +1 -0
  172. package/dist/profiles/windsurf.d.ts +4 -0
  173. package/dist/profiles/windsurf.d.ts.map +1 -0
  174. package/dist/profiles/windsurf.js +49 -0
  175. package/dist/profiles/windsurf.js.map +1 -0
  176. package/dist/project.d.ts +52 -0
  177. package/dist/project.d.ts.map +1 -0
  178. package/dist/project.js +291 -0
  179. package/dist/project.js.map +1 -0
  180. package/dist/reporters/escape.d.ts +7 -0
  181. package/dist/reporters/escape.d.ts.map +1 -0
  182. package/dist/reporters/escape.js +15 -0
  183. package/dist/reporters/escape.js.map +1 -0
  184. package/dist/reporters/github.d.ts +7 -0
  185. package/dist/reporters/github.d.ts.map +1 -0
  186. package/dist/reporters/github.js +19 -0
  187. package/dist/reporters/github.js.map +1 -0
  188. package/dist/reporters/index.d.ts +6 -0
  189. package/dist/reporters/index.d.ts.map +1 -0
  190. package/dist/reporters/index.js +10 -0
  191. package/dist/reporters/index.js.map +1 -0
  192. package/dist/reporters/json.d.ts +3 -0
  193. package/dist/reporters/json.d.ts.map +1 -0
  194. package/dist/reporters/json.js +4 -0
  195. package/dist/reporters/json.js.map +1 -0
  196. package/dist/reporters/markdown.d.ts +3 -0
  197. package/dist/reporters/markdown.d.ts.map +1 -0
  198. package/dist/reporters/markdown.js +98 -0
  199. package/dist/reporters/markdown.js.map +1 -0
  200. package/dist/run.d.ts +14 -0
  201. package/dist/run.d.ts.map +1 -0
  202. package/dist/run.js +163 -0
  203. package/dist/run.js.map +1 -0
  204. package/dist/sdk-facts.d.ts +27 -0
  205. package/dist/sdk-facts.d.ts.map +1 -0
  206. package/dist/sdk-facts.js +63 -0
  207. package/dist/sdk-facts.js.map +1 -0
  208. package/dist/snapshot.d.ts +189 -0
  209. package/dist/snapshot.d.ts.map +1 -0
  210. package/dist/snapshot.js +22 -0
  211. package/dist/snapshot.js.map +1 -0
  212. package/dist/ui.d.ts +18 -0
  213. package/dist/ui.d.ts.map +1 -0
  214. package/dist/ui.js +22 -0
  215. package/dist/ui.js.map +1 -0
  216. package/dist/upgrade.d.ts +12 -0
  217. package/dist/upgrade.d.ts.map +1 -0
  218. package/dist/upgrade.js +115 -0
  219. package/dist/upgrade.js.map +1 -0
  220. package/dist/version.d.ts +3 -0
  221. package/dist/version.d.ts.map +1 -0
  222. package/dist/version.js +5 -0
  223. package/dist/version.js.map +1 -0
  224. package/package.json +65 -0
  225. 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"}
@@ -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,4 @@
1
+ /** Renders the explanation for one check (id matching is case-insensitive). */
2
+ export declare function renderExplanation(checkId: string): string;
3
+ export declare function explain(checkId: string): number;
4
+ //# sourceMappingURL=explain.d.ts.map
@@ -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"}
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.js","sourceRoot":"","sources":["../src/fix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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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"}