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,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":"AAGA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGtB;IACA;IAHX,YACE,OAAe,EACN,IAAa,EACb,IAAc;QAEvB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,SAAI,GAAJ,IAAI,CAAS;QACb,SAAI,GAAJ,IAAI,CAAU;IAGzB,CAAC;CACF;AAQD;;;;GAIG;AACH,MAAM,OAAO,UAAU;IAMQ;IALrB,MAAM,GAAG,CAAC,CAAC;IACX,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IACrC,WAAW,CAAS;IACnB,aAAa,GAAgD,EAAE,CAAC;IAEzE,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;QAC/C,SAAS,CAAC,SAAS,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3D,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACjF,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;YACvB,4DAA4D;QAC9D,CAAC,CAAC;IACJ,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,MAAc,EAAE,MAA2C,EAAE,SAAiB;QACpF,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9D,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,MAAM,oBAAoB,SAAS,IAAI,CAAC,CAAC,CAAC;YAChE,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAoB,CAAC;YAChG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;gBAChD,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,MAAgC;QAC3D,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAoB,CAAC,CAAC;IACzG,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAEO,SAAS,CAAC,OAAuB;QACvC,MAAM,GAAG,GAAG,OAAkC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC;QAEvE,IAAI,KAAK,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC5C,uFAAuF;YACvF,MAAM,KAAK,GACT,GAAG,CAAC,MAAM,KAAK,MAAM;gBACnB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC5C,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,qBAAqB,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;YAC1G,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAuB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACnC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACtE,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAY,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAY,CAAC,CAAC;QACtC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE5B,IAAI,GAAG,CAAC,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,KAA4D,CAAC;YAC7E,OAAO,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,eAAe,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACnF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,OAAO,CAAC,GAAU;QACxB,IAAI,CAAC,WAAW,KAAK,GAAG,CAAC;QACzB,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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
|
package/dist/diff.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
|