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,96 @@
1
+ export class RpcError extends Error {
2
+ code;
3
+ data;
4
+ constructor(message, code, data) {
5
+ super(message);
6
+ this.code = code;
7
+ this.data = data;
8
+ }
9
+ }
10
+ /**
11
+ * Minimal JSON-RPC session over an MCP transport. Unlike the SDK Client it
12
+ * returns results unvalidated, so malformed server output is observable rather
13
+ * than thrown away.
14
+ */
15
+ export class RpcSession {
16
+ transport;
17
+ nextId = 1;
18
+ pending = new Map();
19
+ closedError;
20
+ notifications = [];
21
+ constructor(transport) {
22
+ this.transport = transport;
23
+ transport.onmessage = (message) => this.onMessage(message);
24
+ transport.onclose = () => this.failAll(new Error("Connection closed by server"));
25
+ transport.onerror = () => {
26
+ // Transport errors surface via onclose or request timeouts.
27
+ };
28
+ }
29
+ start() {
30
+ return this.transport.start();
31
+ }
32
+ request(method, params, timeoutMs) {
33
+ if (this.closedError)
34
+ return Promise.reject(this.closedError);
35
+ const id = this.nextId++;
36
+ return new Promise((resolve, reject) => {
37
+ const timer = setTimeout(() => {
38
+ this.pending.delete(id);
39
+ reject(new Error(`${method} timed out after ${timeoutMs}ms`));
40
+ }, timeoutMs);
41
+ this.pending.set(id, { resolve, reject, timer });
42
+ const message = { jsonrpc: "2.0", id, method, ...(params ? { params } : {}) };
43
+ this.transport.send(message).catch((err) => {
44
+ clearTimeout(timer);
45
+ this.pending.delete(id);
46
+ reject(err);
47
+ });
48
+ });
49
+ }
50
+ async notify(method, params) {
51
+ await this.transport.send({ jsonrpc: "2.0", method, ...(params ? { params } : {}) });
52
+ }
53
+ async close() {
54
+ this.failAll(new Error("Session closed"));
55
+ await this.transport.close();
56
+ }
57
+ onMessage(message) {
58
+ const msg = message;
59
+ const hasId = typeof msg.id === "string" || typeof msg.id === "number";
60
+ if (hasId && typeof msg.method === "string") {
61
+ // Server → client request. We advertise no client capabilities, so only ping is valid.
62
+ const reply = msg.method === "ping"
63
+ ? { jsonrpc: "2.0", id: msg.id, result: {} }
64
+ : { jsonrpc: "2.0", id: msg.id, error: { code: -32601, message: `Method not found: ${msg.method}` } };
65
+ this.transport.send(reply).catch(() => { });
66
+ return;
67
+ }
68
+ if (!hasId) {
69
+ if (typeof msg.method === "string") {
70
+ this.notifications.push({ method: msg.method, params: msg.params });
71
+ }
72
+ return;
73
+ }
74
+ const pending = this.pending.get(msg.id);
75
+ if (!pending)
76
+ return;
77
+ this.pending.delete(msg.id);
78
+ clearTimeout(pending.timer);
79
+ if (msg.error && typeof msg.error === "object") {
80
+ const err = msg.error;
81
+ pending.reject(new RpcError(err.message ?? "Unknown error", err.code, err.data));
82
+ }
83
+ else {
84
+ pending.resolve(msg.result);
85
+ }
86
+ }
87
+ failAll(err) {
88
+ this.closedError ??= err;
89
+ for (const [id, p] of this.pending) {
90
+ clearTimeout(p.timer);
91
+ p.reject(err);
92
+ this.pending.delete(id);
93
+ }
94
+ }
95
+ }
96
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/connect/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
2
+ import { type JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js";
3
+ export interface StdioOptions {
4
+ command: string;
5
+ args: string[];
6
+ cwd: string;
7
+ env: Record<string, string>;
8
+ }
9
+ /**
10
+ * stdio transport that, unlike the SDK's, records what it sees: non-JSON-RPC
11
+ * lines on stdout (a common server bug) and the tail of stderr.
12
+ */
13
+ export declare class CapturingStdioTransport implements Transport {
14
+ private readonly options;
15
+ onclose?: () => void;
16
+ onerror?: (error: Error) => void;
17
+ onmessage?: (message: JSONRPCMessage) => void;
18
+ readonly stdoutNonJsonLines: string[];
19
+ readonly stderrTail: string[];
20
+ exitCode: number | null;
21
+ exitSignal: NodeJS.Signals | null;
22
+ private process?;
23
+ private buffer;
24
+ private stderrBuffer;
25
+ constructor(options: StdioOptions);
26
+ start(): Promise<void>;
27
+ send(message: JSONRPCMessage): Promise<void>;
28
+ close(): Promise<void>;
29
+ private onStdout;
30
+ private handleLine;
31
+ private recordNonJson;
32
+ private onStderr;
33
+ private flushStderr;
34
+ private pushStderr;
35
+ }
36
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/connect/stdio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAI/F,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,SAAS;IAc3C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAbpC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAE9C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAM;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAM;IACnC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/B,UAAU,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAQ;IAEzC,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAM;gBAEG,OAAO,EAAE,YAAY;IAElD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgChB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,UAAU;CAKnB"}
@@ -0,0 +1,127 @@
1
+ import { spawn } from "node:child_process";
2
+ import { JSONRPCMessageSchema } from "@modelcontextprotocol/sdk/types.js";
3
+ const MAX_CAPTURED_LINES = 50;
4
+ /**
5
+ * stdio transport that, unlike the SDK's, records what it sees: non-JSON-RPC
6
+ * lines on stdout (a common server bug) and the tail of stderr.
7
+ */
8
+ export class CapturingStdioTransport {
9
+ options;
10
+ onclose;
11
+ onerror;
12
+ onmessage;
13
+ stdoutNonJsonLines = [];
14
+ stderrTail = [];
15
+ exitCode = null;
16
+ exitSignal = null;
17
+ process;
18
+ buffer = "";
19
+ stderrBuffer = "";
20
+ constructor(options) {
21
+ this.options = options;
22
+ }
23
+ start() {
24
+ return new Promise((resolve, reject) => {
25
+ const child = spawn(this.options.command, this.options.args, {
26
+ cwd: this.options.cwd,
27
+ env: { ...process.env, ...this.options.env },
28
+ stdio: ["pipe", "pipe", "pipe"],
29
+ shell: process.platform === "win32",
30
+ windowsHide: true,
31
+ });
32
+ this.process = child;
33
+ child.once("error", (err) => {
34
+ reject(err);
35
+ this.onerror?.(err);
36
+ });
37
+ child.once("spawn", () => resolve());
38
+ child.once("close", (code, signal) => {
39
+ this.exitCode = code;
40
+ this.exitSignal = signal;
41
+ this.flushStderr();
42
+ this.onclose?.();
43
+ });
44
+ child.stdout.setEncoding("utf8");
45
+ child.stdout.on("data", (chunk) => this.onStdout(chunk));
46
+ child.stderr.setEncoding("utf8");
47
+ child.stderr.on("data", (chunk) => this.onStderr(chunk));
48
+ // A server that exits early closes stdin; don't crash on EPIPE.
49
+ child.stdin.on("error", (err) => this.onerror?.(err));
50
+ });
51
+ }
52
+ async send(message) {
53
+ const stdin = this.process?.stdin;
54
+ if (!stdin || stdin.destroyed)
55
+ throw new Error("Server process is not running");
56
+ await new Promise((resolve, reject) => {
57
+ stdin.write(JSON.stringify(message) + "\n", (err) => (err ? reject(err) : resolve()));
58
+ });
59
+ }
60
+ async close() {
61
+ const child = this.process;
62
+ if (!child || child.exitCode !== null || child.signalCode !== null)
63
+ return;
64
+ const closed = new Promise((resolve) => child.once("close", () => resolve()));
65
+ child.stdin?.end();
66
+ child.kill("SIGTERM");
67
+ const timer = setTimeout(() => child.kill("SIGKILL"), 2000);
68
+ await closed;
69
+ clearTimeout(timer);
70
+ }
71
+ onStdout(chunk) {
72
+ this.buffer += chunk;
73
+ let index;
74
+ while ((index = this.buffer.indexOf("\n")) !== -1) {
75
+ const line = this.buffer.slice(0, index).replace(/\r$/, "");
76
+ this.buffer = this.buffer.slice(index + 1);
77
+ this.handleLine(line);
78
+ }
79
+ }
80
+ handleLine(line) {
81
+ if (line.trim() === "")
82
+ return;
83
+ let parsed;
84
+ try {
85
+ parsed = JSON.parse(line);
86
+ }
87
+ catch {
88
+ this.recordNonJson(line);
89
+ return;
90
+ }
91
+ const result = JSONRPCMessageSchema.safeParse(parsed);
92
+ if (!result.success) {
93
+ this.recordNonJson(line);
94
+ return;
95
+ }
96
+ this.onmessage?.(result.data);
97
+ }
98
+ recordNonJson(line) {
99
+ if (this.stdoutNonJsonLines.length < MAX_CAPTURED_LINES) {
100
+ this.stdoutNonJsonLines.push(truncate(line));
101
+ }
102
+ }
103
+ onStderr(chunk) {
104
+ this.stderrBuffer += chunk;
105
+ let index;
106
+ while ((index = this.stderrBuffer.indexOf("\n")) !== -1) {
107
+ this.pushStderr(this.stderrBuffer.slice(0, index).replace(/\r$/, ""));
108
+ this.stderrBuffer = this.stderrBuffer.slice(index + 1);
109
+ }
110
+ }
111
+ flushStderr() {
112
+ if (this.stderrBuffer)
113
+ this.pushStderr(this.stderrBuffer);
114
+ this.stderrBuffer = "";
115
+ }
116
+ pushStderr(line) {
117
+ if (line.trim() === "")
118
+ return;
119
+ this.stderrTail.push(truncate(line));
120
+ if (this.stderrTail.length > MAX_CAPTURED_LINES)
121
+ this.stderrTail.shift();
122
+ }
123
+ }
124
+ function truncate(line) {
125
+ return line.length > 500 ? line.slice(0, 500) + "…" : line;
126
+ }
127
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/connect/stdio.ts"],"names":[],"mappings":"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"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { type DiffOptions } from "./cli.js";
2
+ import type { ServerSnapshot } from "./snapshot.js";
3
+ export type ChangeLevel = "breaking" | "change" | "notable";
4
+ export interface Change {
5
+ level: ChangeLevel;
6
+ kind: "tool" | "resource" | "resourceTemplate" | "prompt" | "capability" | "protocol" | "compat";
7
+ subject: string;
8
+ message: string;
9
+ }
10
+ export interface DiffReport {
11
+ before: string;
12
+ after: string;
13
+ changes: Change[];
14
+ summary: Record<ChangeLevel, number>;
15
+ }
16
+ /** Compares two snapshots of the same server. */
17
+ export declare function diffSnapshots(before: ServerSnapshot, after: ServerSnapshot): Change[];
18
+ export declare function loadDiffInput(path: string): ServerSnapshot;
19
+ export declare function buildDiff(beforePath: string, afterPath: string): DiffReport;
20
+ export declare function renderDiffMarkdown(report: DiffReport): string;
21
+ export declare function renderDiffGithub(report: DiffReport): string;
22
+ export declare function runDiff(options: DiffOptions): number;
23
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAIxD,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,eAAe,CAAC;AAE7D,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,kBAAkB,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;IACjG,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;CACtC;AAOD,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CA2FrF;AAiGD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAY1D;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAK3E;AAID,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAY7D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAM3D;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAmBpD"}
package/dist/diff.js ADDED
@@ -0,0 +1,255 @@
1
+ import { readFileSync, writeFileSync } from "node:fs";
2
+ import { ALL_CHECKS } from "./checks/index.js";
3
+ import { UsageError } from "./cli.js";
4
+ import { evaluate } from "./evaluate.js";
5
+ import { ALL_PROFILES } from "./profiles/index.js";
6
+ import { cell } from "./reporters/escape.js";
7
+ const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
8
+ const byKey = (items, key) => new Map((items ?? []).filter((i) => typeof i[key] === "string").map((i) => [i[key], i]));
9
+ /** Compares two snapshots of the same server. */
10
+ export function diffSnapshots(before, after) {
11
+ const changes = [];
12
+ const add = (c) => changes.push(c);
13
+ // Tools
14
+ const oldTools = byKey(before.lists.tools?.items, "name");
15
+ const newTools = byKey(after.lists.tools?.items, "name");
16
+ for (const [name, tool] of oldTools) {
17
+ const next = newTools.get(name);
18
+ if (!next) {
19
+ add({ level: "breaking", kind: "tool", subject: name, message: "Tool removed." });
20
+ continue;
21
+ }
22
+ compareSchema([], schemaOf(tool.inputSchema), schemaOf(next.inputSchema), "input", add, name);
23
+ if (isObject(tool.outputSchema) && !isObject(next.outputSchema)) {
24
+ add({ level: "breaking", kind: "tool", subject: name, message: "outputSchema removed; consumers of structuredContent lose their contract." });
25
+ }
26
+ else if (!isObject(tool.outputSchema) && isObject(next.outputSchema)) {
27
+ add({ level: "change", kind: "tool", subject: name, message: "outputSchema added." });
28
+ }
29
+ else if (isObject(tool.outputSchema) && isObject(next.outputSchema)) {
30
+ compareSchema([], tool.outputSchema, next.outputSchema, "output", add, name);
31
+ }
32
+ if (tool.description !== next.description) {
33
+ add({ level: "notable", kind: "tool", subject: name, message: "Description changed; models may use the tool differently." });
34
+ }
35
+ compareAnnotations(name, tool.annotations, next.annotations, add);
36
+ }
37
+ for (const name of newTools.keys()) {
38
+ if (!oldTools.has(name))
39
+ add({ level: "change", kind: "tool", subject: name, message: "Tool added." });
40
+ }
41
+ // Resources, templates, prompts
42
+ compareSet(byKey(before.lists.resources?.items, "uri"), byKey(after.lists.resources?.items, "uri"), "resource", add);
43
+ compareSet(byKey(before.lists.resourceTemplates?.items, "uriTemplate"), byKey(after.lists.resourceTemplates?.items, "uriTemplate"), "resourceTemplate", add);
44
+ const oldPrompts = byKey(before.lists.prompts?.items, "name");
45
+ const newPrompts = byKey(after.lists.prompts?.items, "name");
46
+ compareSet(oldPrompts, newPrompts, "prompt", add);
47
+ for (const [name, prompt] of oldPrompts) {
48
+ const next = newPrompts.get(name);
49
+ if (!next)
50
+ continue;
51
+ const args = (p) => (Array.isArray(p.arguments) ? p.arguments.filter(isObject) : []);
52
+ const oldArgs = new Map(args(prompt).map((a) => [String(a.name), a]));
53
+ for (const a of args(next)) {
54
+ const was = oldArgs.get(String(a.name));
55
+ if (!was && a.required === true) {
56
+ add({ level: "breaking", kind: "prompt", subject: name, message: `New required argument "${String(a.name)}".` });
57
+ }
58
+ else if (was && was.required !== true && a.required === true) {
59
+ add({ level: "breaking", kind: "prompt", subject: name, message: `Argument "${String(a.name)}" became required.` });
60
+ }
61
+ }
62
+ for (const argName of oldArgs.keys()) {
63
+ if (!args(next).some((a) => String(a.name) === argName)) {
64
+ add({ level: "breaking", kind: "prompt", subject: name, message: `Argument "${argName}" removed.` });
65
+ }
66
+ }
67
+ }
68
+ // Capabilities and protocol
69
+ const oldCaps = before.initialize?.capabilities ?? {};
70
+ const newCaps = after.initialize?.capabilities ?? {};
71
+ for (const cap of Object.keys(oldCaps)) {
72
+ if (!(cap in newCaps))
73
+ add({ level: "breaking", kind: "capability", subject: cap, message: "Capability no longer declared." });
74
+ }
75
+ for (const cap of Object.keys(newCaps)) {
76
+ if (!(cap in oldCaps))
77
+ add({ level: "change", kind: "capability", subject: cap, message: "Capability added." });
78
+ }
79
+ const oldVersion = before.initialize?.negotiatedProtocolVersion;
80
+ const newVersion = after.initialize?.negotiatedProtocolVersion;
81
+ if (oldVersion !== newVersion) {
82
+ add({ level: "notable", kind: "protocol", subject: "protocolVersion", message: `Negotiated protocol changed from ${oldVersion ?? "none"} to ${newVersion ?? "none"}.` });
83
+ }
84
+ // Compatibility regressions: failures and warnings that are new in `after`.
85
+ const key = (f) => `${f.checkId}|${f.client ?? ""}|${f.subject ?? ""}`;
86
+ const oldFindings = new Set(evaluate(before, ALL_CHECKS, ALL_PROFILES).findings.map(key));
87
+ for (const f of evaluate(after, ALL_CHECKS, ALL_PROFILES).findings) {
88
+ if (f.severity === "info" || oldFindings.has(key(f)))
89
+ continue;
90
+ add({
91
+ level: f.severity === "error" ? "breaking" : "notable",
92
+ kind: "compat",
93
+ subject: [f.checkId, f.client, f.subject].filter(Boolean).join(" · "),
94
+ message: `New ${f.severity}: ${f.message}`,
95
+ });
96
+ }
97
+ const order = { breaking: 0, change: 1, notable: 2 };
98
+ return changes.sort((a, b) => order[a.level] - order[b.level] || a.kind.localeCompare(b.kind) || a.subject.localeCompare(b.subject));
99
+ }
100
+ function schemaOf(value) {
101
+ return isObject(value) ? value : {};
102
+ }
103
+ function compareSet(before, after, kind, add) {
104
+ for (const k of before.keys())
105
+ if (!after.has(k))
106
+ add({ level: "breaking", kind, subject: k, message: `${label(kind)} removed.` });
107
+ for (const k of after.keys())
108
+ if (!before.has(k))
109
+ add({ level: "change", kind, subject: k, message: `${label(kind)} added.` });
110
+ }
111
+ function label(kind) {
112
+ return { resource: "Resource", resourceTemplate: "Resource template", prompt: "Prompt" }[kind] ?? kind;
113
+ }
114
+ function typeOf(schema) {
115
+ if (Array.isArray(schema.type))
116
+ return [...schema.type].sort().join("|");
117
+ return typeof schema.type === "string" ? schema.type : undefined;
118
+ }
119
+ /**
120
+ * Walks object properties. For inputs, callers are the model/clients, so
121
+ * removing or requiring things breaks them; for outputs, consumers read the
122
+ * result, so removing fields breaks them. `at` is the property path so far.
123
+ */
124
+ function compareSchema(at, before, after, direction, add, tool) {
125
+ if (at.length > 8)
126
+ return;
127
+ const quote = (path) => `"${path.join(".")}"`;
128
+ const noun = direction === "input" ? "Argument" : "Output field";
129
+ const change = (level, message) => add({ level, kind: "tool", subject: tool, message });
130
+ const oldType = typeOf(before);
131
+ const newType = typeOf(after);
132
+ if (at.length > 0 && oldType && newType && oldType !== newType) {
133
+ change("breaking", `${noun} ${quote(at)} changed type from ${oldType} to ${newType}.`);
134
+ return;
135
+ }
136
+ const oldEnum = Array.isArray(before.enum) ? before.enum : undefined;
137
+ const newEnum = Array.isArray(after.enum) ? after.enum : undefined;
138
+ if (oldEnum && newEnum) {
139
+ const where = at.length ? ` for ${quote(at)}` : "";
140
+ const list = (values) => values.map((v) => JSON.stringify(v)).join(", ");
141
+ const removed = oldEnum.filter((v) => !newEnum.includes(v));
142
+ const added = newEnum.filter((v) => !oldEnum.includes(v));
143
+ // Inputs: fewer accepted values breaks callers. Outputs: new values can surprise consumers.
144
+ if (removed.length)
145
+ change(direction === "input" ? "breaking" : "change", `Enum value(s) ${list(removed)} removed${where}.`);
146
+ if (added.length)
147
+ change(direction === "output" ? "notable" : "change", `Enum value(s) ${list(added)} added${where}.`);
148
+ }
149
+ const oldProps = isObject(before.properties) ? before.properties : {};
150
+ const newProps = isObject(after.properties) ? after.properties : {};
151
+ const oldRequired = new Set(Array.isArray(before.required) ? before.required : []);
152
+ const newRequired = new Set(Array.isArray(after.required) ? after.required : []);
153
+ for (const prop of Object.keys(oldProps)) {
154
+ if (!(prop in newProps))
155
+ change("breaking", `${noun} ${quote([...at, prop])} removed.`);
156
+ }
157
+ for (const prop of Object.keys(newProps)) {
158
+ const path = [...at, prop];
159
+ const isNew = !(prop in oldProps);
160
+ if (direction === "input") {
161
+ if (isNew && newRequired.has(prop))
162
+ change("breaking", `New required argument ${quote(path)}.`);
163
+ else if (isNew)
164
+ change("change", `New optional argument ${quote(path)}.`);
165
+ else if (!oldRequired.has(prop) && newRequired.has(prop))
166
+ change("breaking", `Argument ${quote(path)} became required.`);
167
+ else if (oldRequired.has(prop) && !newRequired.has(prop))
168
+ change("change", `Argument ${quote(path)} became optional.`);
169
+ }
170
+ else if (isNew) {
171
+ change("change", `New output field ${quote(path)}.`);
172
+ }
173
+ else if (oldRequired.has(prop) && !newRequired.has(prop)) {
174
+ change("breaking", `Output field ${quote(path)} is no longer guaranteed (was required).`);
175
+ }
176
+ if (!isNew && isObject(oldProps[prop]) && isObject(newProps[prop])) {
177
+ compareSchema(path, oldProps[prop], newProps[prop], direction, add, tool);
178
+ }
179
+ }
180
+ if (isObject(before.items) && isObject(after.items)) {
181
+ compareSchema([...at, "[]"], before.items, after.items, direction, add, tool);
182
+ }
183
+ }
184
+ function compareAnnotations(tool, before, after, add) {
185
+ const a = isObject(before) ? before : {};
186
+ const b = isObject(after) ? after : {};
187
+ for (const hint of ["readOnlyHint", "destructiveHint", "idempotentHint", "openWorldHint"]) {
188
+ if (a[hint] !== b[hint]) {
189
+ add({ level: "notable", kind: "tool", subject: tool, message: `${hint} changed from ${JSON.stringify(a[hint] ?? null)} to ${JSON.stringify(b[hint] ?? null)}; clients may prompt for confirmation differently.` });
190
+ }
191
+ }
192
+ }
193
+ export function loadDiffInput(path) {
194
+ let data;
195
+ try {
196
+ data = JSON.parse(readFileSync(path, "utf8"));
197
+ }
198
+ catch (err) {
199
+ throw new UsageError(`${path}: ${err.message}`);
200
+ }
201
+ if (data.snapshotVersion === 1)
202
+ return data;
203
+ if (data.schemaVersion !== undefined) {
204
+ throw new UsageError(`${path} is a report, not a snapshot. Create snapshots with: check --save-snapshot <file> ...`);
205
+ }
206
+ throw new UsageError(`${path} is not an mcp-use-compat snapshot.`);
207
+ }
208
+ export function buildDiff(beforePath, afterPath) {
209
+ const changes = diffSnapshots(loadDiffInput(beforePath), loadDiffInput(afterPath));
210
+ const summary = { breaking: 0, change: 0, notable: 0 };
211
+ for (const c of changes)
212
+ summary[c.level]++;
213
+ return { before: beforePath, after: afterPath, changes, summary };
214
+ }
215
+ const LEVEL_LABEL = { breaking: "❌ breaking", change: "➕ change", notable: "⚠️ notable" };
216
+ export function renderDiffMarkdown(report) {
217
+ const { summary } = report;
218
+ const lines = [
219
+ `# MCP Surface Diff`,
220
+ "",
221
+ `\`${report.before}\` → \`${report.after}\`: ${summary.breaking} breaking, ${summary.change} non-breaking, ${summary.notable} notable.`,
222
+ "",
223
+ ];
224
+ if (report.changes.length === 0)
225
+ return lines.concat("_No changes._", "").join("\n");
226
+ lines.push("| Level | Kind | Subject | Change |", "|---|---|---|---|");
227
+ for (const c of report.changes)
228
+ lines.push(`| ${LEVEL_LABEL[c.level]} | ${c.kind} | ${cell(c.subject)} | ${cell(c.message)} |`);
229
+ return lines.concat("").join("\n");
230
+ }
231
+ export function renderDiffGithub(report) {
232
+ return report.changes
233
+ .filter((c) => c.level !== "change")
234
+ .map((c) => `::${c.level === "breaking" ? "error" : "warning"} title=${c.kind}: ${c.subject.replace(/[:,\n]/g, " ")}::${c.message.replace(/\n/g, "%0A")}`)
235
+ .join("\n")
236
+ .concat(report.changes.some((c) => c.level !== "change") ? "\n" : "");
237
+ }
238
+ export function runDiff(options) {
239
+ const report = buildDiff(options.before, options.after);
240
+ const output = options.format === "json"
241
+ ? JSON.stringify(report, null, 2) + "\n"
242
+ : options.format === "github"
243
+ ? renderDiffGithub(report)
244
+ : renderDiffMarkdown(report);
245
+ if (options.out)
246
+ writeFileSync(options.out, output);
247
+ else
248
+ process.stdout.write(output);
249
+ const failed = options.failOn === "any" ? report.changes.length > 0 : options.failOn === "breaking" ? report.summary.breaking > 0 : false;
250
+ console.error(failed
251
+ ? `\n✖ ${report.summary.breaking} breaking change(s)${options.failOn === "any" ? ` and ${report.changes.length - report.summary.breaking} other change(s)` : ""}.`
252
+ : `\n✔ No changes matched --fail-on=${options.failOn}.`);
253
+ return failed ? 1 : 0;
254
+ }
255
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}